Beispiel #1
0
        private bool StartRemoteService()
        {
            bool bRet = false;

            _remoteMessageHandler = new PeerServices();

            _remoteHost = new ServiceHost(_remoteMessageHandler);

            //To handle the remote traffic
            _remoteMessageHandler.OnRemoteEnergyRequest += new manageEnergyRequest(ManageRemoteEnergyRequest);
            _remoteMessageHandler.OnRemoteEnergyReply   += new replyEnergyRequest(ManageRemoteEnergyReply);
            _remoteMessageHandler.OnRemotePeerIsDown    += new remotePeerIsDown(RemotePeerIsDown);

            try
            {
                _remoteHost.Open();
                bRet = true;
                XMLLogger.WriteRemoteActivity("Remote service started.");
            }
            catch (Exception e)
            {
                XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Unable to start Remote Service.");
                //XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), e.ToString()); //For debug purpose
                _remoteHost.Abort();
            }

            return(bRet);
        }
Beispiel #2
0
        private void ForwardEnergyRequest(StatusNotifyMessage message)
        {
            XMLLogger.WriteRemoteActivity("Forwarding " + message.energyReq + "kW Energy Request from: " + message.header.Sender);
            XMLLogger.WriteRemoteActivity("MessageID: " + message.header.MessageID);

            _requestThread = new Thread(new ParameterizedThreadStart(ConnectToRemoteHost));
            _requestThread.Start(message);
        }
Beispiel #3
0
        private void ManageRemoteEnergyRequest(RemoteEnergyRequest message)
        {
            RemoteConnection remConn;

            Guid   MessageID  = message.enReqMessage.header.MessageID;
            string remotePeer = message.enReqMessage.header.Sender;

            XMLLogger.WriteRemoteActivity("Received Remote Energy Request from: " + message.enReqMessage.header.Sender + " by Remote Resolver: " + message.header.Sender);
            XMLLogger.WriteRemoteActivity("Message ID: " + message.enReqMessage.header.MessageID);

            remConn = GetConnection(message.IP, message.port, ConnectionType.Incoming);

            if (remConn == null)//If entry doesn't exist
            {
                remConn = new RemoteConnection()
                {
                    type = ConnectionType.Incoming,

                    remoteResolver = new RemoteHost()
                    {
                        name       = message.header.Sender,
                        IP         = message.IP,
                        port       = message.port,
                        netAddress = @"net.tcp://" + message.IP + ":" + message.port + @"/Remote"
                    }
                };

                remConn.requests.Add(MessageID, new RemoteRequest()
                {
                    localePeerName = "",
                    remotePeerName = remotePeer,
                    energy         = 0
                });

                _remoteConnections.Add(remConn);
            }
            else
            {
                remConn.requests.Add(MessageID, new RemoteRequest()
                {
                    localePeerName = "",
                    remotePeerName = remotePeer,
                    energy         = 0
                });
            }


            _broker.EnergyLookUp(message.enReqMessage);
        }
        //public void EnergyLookUp(object m)
        public void EnergyLookUp(StatusNotifyMessage message)
        {
            //StatusNotifyMessage message = (StatusNotifyMessage)m;

            _sem.Wait();

            _originPeerName = message.header.Sender;
            _enLookUp       = message.energyReq;
            _originGuid     = message.header.MessageID;

            message.header.Sender = this._name;

            XMLLogger.WriteRemoteActivity("Broker is serving: " + message.header.MessageID + " session.");

            Connector.channel.statusAdv(message);

            _proposalCountdown.Enabled = true;
        }
Beispiel #5
0
        void ForwardEnergyReply(EndProposalMessage message)
        {
            RemoteConnection conn = GetConnectionByMessageID(message.header.MessageID, ConnectionType.Incoming);

            XMLLogger.WriteRemoteActivity("Forwarding Remote Response about message: " + message.header.MessageID + " Status = " + message.endStatus);
            XMLLogger.WriteRemoteActivity("Message ID: " + message.header.MessageID);

            if (conn != null)
            {
                //Header re-handling
                conn.requests[message.header.MessageID].localePeerName = message.header.Sender;
                conn.requests[message.header.MessageID].energy         = message.energy;
                message.header.Receiver = conn.requests[message.header.MessageID].remotePeerName;

                #region Creating Channel
                NetTcpBinding   tcpBinding     = new NetTcpBinding();
                EndpointAddress remoteEndpoint = new EndpointAddress(conn.remoteResolver.netAddress);
                tcpBinding.Security.Mode = SecurityMode.None;

                ChannelFactory <IRemote> cf = new ChannelFactory <IRemote>(tcpBinding, remoteEndpoint);
                IRemote tChannel            = cf.CreateChannel();
                #endregion

                RemoteEndProposalMessage remoteEndMessage = (MessageFactory.createRemoteEndProposalMessage(message, conn.remoteResolver.name, this.name, Tools.getLocalIP(), Tools.getResolverServicePort()));

                try
                {
                    tChannel.ReplyEnergyRequest(remoteEndMessage);
                }
                catch (Exception e)
                {
                    XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Error in Forwarding Energy Reply Message: " + e.ToString());
                }
            }
            else
            {
                XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Could not find the following message: " + message.header.MessageID);
            }
        }
        private void _proposalCountdown_Elapsed(object sender, ElapsedEventArgs e)
        {
            _proposalCountdown.Enabled = false; //Stop the timer

            if (_proposalList.Count > 0)
            {
                _proposalTimeout = 0;
                EvaluateProposal();
            }
            else
            {
                _proposalTimeout++;

                if (_proposalTimeout > 2)  //Go Outbound
                {
                    float enReq = _enPeak - (getEnergyLevel() + _enBought);

                    XMLLogger.WriteRemoteActivity("Going Outside to find " + enReq + " KW/h");

                    Connector.channel.forwardEnergyRequest(MessageFactory.createEnergyRequestMessage(_resolverName, _name, _peerStatus, enReq));
                    messageSent = true;

                    _proposalTimeout = 0;

                    //start the timer to waiting for proposals
                    if (_proposalCountdown.Enabled == false)
                    {
                        _proposalCountdown.Enabled = true;
                    }
                }
                else
                {
                    XMLLogger.WriteLocalActivity("No Energy proposal receveid");
                    messageSent = false; //send the request message again
                }
            }
        }
Beispiel #7
0
 public virtual void peerDown(PeerIsDownMessage message)
 {
     XMLLogger.WriteRemoteActivity("Peer " + message.peerName + " is down");
 }
Beispiel #8
0
        void ManageRemoteEnergyReply(RemoteEndProposalMessage message)
        {
            string localBuilding  = message.endProposalMessage.header.Receiver;
            string remoteBuilding = message.endProposalMessage.header.Sender;
            float  energyBought   = message.endProposalMessage.energy;

            if (message.endProposalMessage.endStatus == true)
            {
                RemoteConnection oC;

                oC = GetConnection(message.IP, message.port, ConnectionType.Outgoing);

                if (oC == null)
                {
                    oC = new RemoteConnection()
                    {
                        type = ConnectionType.Outgoing,

                        remoteResolver = new RemoteHost()
                        {
                            name       = message.header.Sender,
                            IP         = message.IP,
                            port       = message.port,
                            netAddress = @"net.tcp://" + message.IP + ":" + message.port + @"/Remote"
                        }
                    };

                    oC.requests.Add(message.endProposalMessage.header.MessageID, new RemoteRequest()
                    {
                        localePeerName = localBuilding,
                        remotePeerName = remoteBuilding,
                        energy         = energyBought
                    });

                    _remoteConnections.Add(oC);
                }
                else
                {
                    oC.requests.Add(message.endProposalMessage.header.MessageID, new RemoteRequest()
                    {
                        localePeerName = localBuilding,
                        remotePeerName = remoteBuilding,
                        energy         = energyBought
                    });
                }

                XMLLogger.WriteRemoteActivity("Received Remote Energy Reply from: " + remoteBuilding + "@" + message.header.Sender);
                XMLLogger.WriteRemoteActivity("Message ID: " + message.endProposalMessage.header.MessageID);

                Connector.channel.endProposal(message.endProposalMessage);
            }
            else //No Energy From this remote resolver..Go with the next
            {
                Connector.channel.endProposal(message.endProposalMessage);

                lock (_counterLock)
                {
                    _nHostIndex++;
                }
            }
        }
Beispiel #9
0
        private void ConnectToRemoteHost(object m)
        {
            bool connected = false;
            StatusNotifyMessage message = (StatusNotifyMessage)m;

            _remoteResolvers = Tools.getRemoteHosts();

            while (connected == false && _nHostIndex < _remoteResolvers.Count)
            {
                lock (_counterLock)
                {
                    //localhost connections filter
                    if (_remoteResolvers[_nHostIndex].IP == "127.0.0.1" || _remoteResolvers[_nHostIndex].IP.ToLower() == "localhost")
                    {
                        if (_nHostIndex < (_remoteResolvers.Count - 1))
                        {
                            _nHostIndex++;
                        }
                        else
                        {
                            _nHostIndex = 0;
                        }

                        continue;
                    }

                    XMLLogger.WriteRemoteActivity("Connecting to " + _remoteResolvers[_nHostIndex].IP);

                    NetTcpBinding   tcpBinding     = new NetTcpBinding();
                    EndpointAddress remoteEndpoint = new EndpointAddress(_remoteResolvers[_nHostIndex].netAddress);
                    tcpBinding.Security.Mode = SecurityMode.None;

                    ChannelFactory <IRemote> cf = new ChannelFactory <IRemote>(tcpBinding, remoteEndpoint);
                    _remoteChannel = cf.CreateChannel();

                    try
                    {
                        _remoteChannel.Open();

                        //Retrieve Remote IP Addresses
                        foreach (var newRemote in _remoteChannel.RetrieveContactList())
                        {
                            if (!_remoteResolvers.Exists(delegate(RemoteHost x) { return(x.netAddress == newRemote.netAddress); }))
                            {
                                _remoteResolvers.Add(newRemote);
                                Tools.updateRemoteHosts(newRemote);
                            }
                        }

                        XMLLogger.WriteRemoteActivity("Connected to: " + _remoteResolvers[_nHostIndex].IP);

                        XMLLogger.WriteRemoteActivity("Forwarding Energy Request from: " + message.header.Sender + "To: " + _remoteResolvers[_nHostIndex]);
                        XMLLogger.WriteRemoteActivity("Message ID: " + message.header.MessageID);

                        _remoteChannel.ManageRemoteEnergyRequest(MessageFactory.createRemoteEnergyRequestMessage(message,
                                                                                                                 _remoteResolvers[_nHostIndex].name,
                                                                                                                 this.name,
                                                                                                                 Tools.getLocalIP(),
                                                                                                                 Tools.getResolverServicePort()
                                                                                                                 ));

                        this.isRemoteConnected = true;
                        connected = true;
                    }

                    catch (Exception e)
                    {
                        XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Unable to connect to remote host.");
                        //XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), e.ToString()); //For debug purpose
                        _nHostIndex++;
                        if (_nHostIndex >= _remoteResolvers.Count)
                        {
                            _nHostIndex = 0;
                            _remoteChannel.Abort();
                        }

                        connected = false;
                    }
                }
            }


            if (_nHostIndex >= _remoteResolvers.Count)
            {
                lock (_counterLock)
                {
                    _nHostIndex = 0;
                }
            }
        }