public void CloseService() { XMLLogger.WriteLocalActivity("Closing Application..."); _GarbageCollectorTimer.Enabled = false; try { if (this.isRemoteServiceStarted == true) { _remoteHost.Close(); } if (this.isRemoteConnected == true) { _remoteChannel.Close(); } if (this.isLocalConnected == true) { _crs.Close(); _customResolver.Close(); } StopService(); //Calls the base.StopService method } catch (Exception e) { XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "App Fault on Exit"); } }
private bool StartLocalResolver() { bool bRet = false; _customResolver = new ServiceHost(_crs); XMLLogger.WriteLocalActivity("Starting Custom Local Peer Resolver Service..."); try { _crs.Open(); _customResolver.Open(); bRet = true; XMLLogger.WriteLocalActivity("Custom Local Peer Resolver Service is started"); } catch (Exception e) { XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Error in starting Custom Local Peer Resolver Service"); XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), e.ToString()); _crs.Close(); _customResolver.Abort(); bRet = false; } return(bRet); }
private void HelloResponse(HelloMessage message) { //Elaborates the Hello Message TempBuilding b = new TempBuilding(); #region setting fields b.Address = message.Address; b.Admin = message.Admin; b.EnBought = 0; b.EnSold = 0; b.EnPeak = message.EnPeak; b.EnPrice = message.EnPrice; b.EnProduced = message.EnProduced; b.EnType = message.EnType; b.Name = message.header.Sender; b.status = message.Status; b.iconPath = b.status == PeerStatus.Producer ? @"/WPF_Resolver;component/img/producer.png" : @"/WPF_Resolver;component/img/consumer.png"; #endregion lock (_lLock) _buildings.Add(b); XMLLogger.WriteLocalActivity("New Peer: " + b.Name + " is up!"); //Be polite! Send an HelloResponse Connector.channel.HelloResponse(MessageFactory.createHelloResponseMessage("@All", Tools.getResolverName(), Tools.getResolverName())); }
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); } } } }
private void _mainTimer_Elapsed(object sender, ElapsedEventArgs e) { //Check the energy level if ((getEnergyLevel() + _enBought) < _enPeak) { if (messageSent == false) { float enReq = _enPeak - (getEnergyLevel() + _enBought); Connector.channel.statusAdv(MessageFactory.createEnergyRequestMessage("@All", _name, _peerStatus, enReq)); messageSent = true; XMLLogger.WriteLocalActivity(enReq + "kW Energy Request Sent to Local Network..."); //start the timer to waiting for proposals if (_proposalCountdown.Enabled == false) { _proposalCountdown.Enabled = true; } } } else { messageSent = false; _proposalCountdown.Enabled = false; } }
public void StopService() { if (this.isConnected == true) { Connector.Disconnect(); XMLLogger.WriteLocalActivity("OffLine."); } }
private void ReceiveProposal(EnergyProposalMessage message) { if (message.header.Receiver == _name) { XMLLogger.WriteLocalActivity("Received Proposal for " + message.energyAvailable + "kW; price " + message.price + " From " + message.header.Sender); _proposalList.Add(message); } }
public void StopEnergyProduction() { _pwManager.ShutDown(); Connector.channel.sayGoodBye(MessageFactory.createGoodByeMessage("@All", _name, _name)); base.StopService(); XMLLogger.WriteLocalActivity("Leaving the Mesh..."); }
public void Start() { _pwManager.Start(); XMLLogger.WriteLocalActivity("Power Manager Started. Sending Hello Message."); //send hello message Connector.channel.sayHello(MessageFactory.CreateHelloMessage("@All", _name, _status, _enType, _enProduced, _enPeak, _price, _address, _adminName)); XMLLogger.WriteLocalActivity("Hello Message Sent."); }
public void StartService() { if (Connector.Connect()) { this.isConnected = true; XMLLogger.WriteLocalActivity("OnLine."); } else { this.isConnected = false; XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Connection Error"); } }
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; } } } }
private void removeBuildingByName(string name) { string leavingPeer = name; XMLLogger.WriteLocalActivity("Peer: " + leavingPeer + " is down!"); //Remove the deadly peer but first alert the folks. Connector.channel.peerDown(MessageFactory.createPeerIsDownMessage("@All", this.name, leavingPeer)); lock (_connectionLock) { //Alert Remote Resolvers foreach (var remConn in _remoteConnections) { NetTcpBinding tcpBinding = new NetTcpBinding(); EndpointAddress remoteEndpoint = new EndpointAddress(remConn.remoteResolver.netAddress); tcpBinding.Security.Mode = SecurityMode.None; ChannelFactory <IRemote> cf = new ChannelFactory <IRemote>(tcpBinding, remoteEndpoint); IRemote tChannel = cf.CreateChannel(); try { tChannel.PeerDownAlert(MessageFactory.createPeerIsDownMessage("@All", this.name, leavingPeer)); } catch (Exception ex) { XMLLogger.WriteErrorMessage(this.GetType().FullName.ToString(), "Error in sending Remote Peer Alert Message" + ex.ToString()); } } } updateLocalConnectionsList(leavingPeer); var itemToRemove = from b in _buildings where b.Name == leavingPeer select b; lock (_lLock) { if (itemToRemove.Count() > 0) { _buildings.Remove(itemToRemove.First()); } } }
private void EvaluateProposal() { var m = (from element in _proposalList orderby element.price ascending select element).First(); XMLLogger.WriteLocalActivity("The lowest price is " + m.price + " provided by " + m.header.Sender); EnergyAcceptMessage respMessage = MessageFactory.createEnergyAcceptMessage( m.header.MessageID, m.header.Sender, _name, this._name, _enPeak - (getEnergyLevel() + _enBought)); Connector.channel.acceptProposal(respMessage); }
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 } } }