private void ProposalAccepted(EnergyAcceptMessage message)
        {
            if (message.header.Receiver == _name)
            {
                Boolean status        = false;
                float   energyCanSell = 0;

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

                if (enAvailable > 0)
                {
                    energyCanSell = enAvailable >= message.energy ? message.energy : enAvailable;

                    status   = true;
                    _enSold += energyCanSell;

                    XMLLogger.WriteLocalActivity("Ok, " + energyCanSell + " KW/h sold to " + message.header.Sender);

                    EnergyLink link = new EnergyLink(message.peerName, energyCanSell, _price);
                    consumers.Add(link);

                    //Advise the Local Resolver About the energy status change.
                    Connector.channel.updateEnergyStatus(MessageFactory.createUpdateStatusMessage(_resolverName, _name, _enSold, _enBought));

                    XMLLogger.WriteLocalActivity("Updating Stutus");
                    XMLLogger.WriteLocalActivity("Peer " + message.header.Sender + " - Energy Sold: " + _enSold);
                    XMLLogger.WriteLocalActivity("Peer " + message.header.Sender + " - Energy Bought: " + _enBought);
                }

                EndProposalMessage respMessage = MessageFactory.createEndProposalMessage(
                    message.header.MessageID,
                    message.header.Sender,
                    _name,
                    status,
                    energyCanSell,
                    _price
                    );

                if (message.header.Sender == _resolverName)
                {
                    Connector.channel.forwardEnergyReply(respMessage);
                }
                else
                {
                    Connector.channel.endProposal(respMessage);
                }
            }
        }
        private void EndProposal(EndProposalMessage message)
        {
            if (message.header.Receiver == _name)
            {
                if (message.endStatus == true)
                {
                    _enBought += message.energy;

                    XMLLogger.WriteLocalActivity("Energy received from " + message.header.Sender);

                    EnergyLink link = new EnergyLink(message.header.Sender, message.energy, message.price);
                    producers.Add(link);

                    //Advise the Local Resolver About the energy status change.
                    Connector.channel.updateEnergyStatus(MessageFactory.createUpdateStatusMessage(_resolverName, _name, _enSold, _enBought));

                    _proposalList.Clear();

                    if ((getEnergyLevel() + _enBought) < _enPeak)
                    {
                        messageSent = false;
                    }
                }
                else
                {
                    //Nothing to do..Delete this Producer and go on with the next.
                    for (int i = 0; i < _proposalList.Count; i++)
                    {
                        if (_proposalList[i].header.Sender == message.header.Sender)
                        {
                            _proposalList.RemoveAt(i);
                            break;
                        }
                    }

                    //More Proposal? Evaluate it or Start again
                    if (_proposalList.Count > 0)
                    {
                        EvaluateProposal();
                    }
                    else
                    {
                        messageSent = false;
                    }
                }
            }
        }
Beispiel #3
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)
            {
                EvaluateProposal();
            }
            else
            {
                EndProposalMessage respMessage = MessageFactory.createEndProposalMessage(
                    _originGuid,
                    _name,
                    "Broker",
                    false,
                    0,
                    0
                    );

                Connector.channel.forwardEnergyReply(respMessage);
                _sem.Release();
            }
        }