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; } } } }
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(); } }