private void CreateProposal(StatusNotifyMessage message)
        {
            if (message.status == PeerStatus.Consumer)
            {
                if (_peerStatus == PeerStatus.Producer)
                {
                    XMLLogger.WriteLocalActivity(message.energyReq + "kW Energy Request Received from: " + message.header.Sender);

                    float enAvailable = getEnergyLevel() - (_enPeak + _enSold);

                    if (enAvailable > 0)
                    {
                        float enSold = enAvailable >= message.energyReq ? message.energyReq : enAvailable;

                        EnergyProposalMessage respMessage = MessageFactory.createEnergyProposalMessage(
                            message.header.MessageID,
                            message.header.Sender,
                            _name,
                            enSold,
                            _price
                            );

                        Connector.channel.energyProposal(respMessage);

                        XMLLogger.WriteLocalActivity(enSold + "kW Energy Proposal Sent to: " + message.header.Sender);
                    }
                }
            }
        }
示例#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);
        }
        //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;
        }
示例#4
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;
                }
            }
        }