static public async Task InitIoTHub() { try { var fileToRead = new FileStream(await Helpers.GetFilePathAsync(strFileIoT), FileMode.Open, FileAccess.Read, FileShare.ReadWrite); long fileLength = fileToRead.Length; byte[] buf = new byte[fileLength]; //string mySetupString = ""; // Reads the data. fileToRead.Read(buf, 0, (int)fileLength); //await str.ReadAsync(buf, ) // convert the read into a string strconn = new string(Encoding.UTF8.GetChars(buf)); MessageIoT cmdmsg = new MessageIoT(); cmdmsg.command = GetStausCmd; cmdmsg.message = "ok"; //JsonConvert.SerializeObject(myParamRail); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); ReceiveDataFromAzure(); } catch (Exception ex) { Debug.WriteLine($"Error initializing Azure Iot Hub connection string: {ex.Message}"); } }
static private async Task ReceiveDataFromAzure() { if (strconn == "") { return; } DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(strconn, TransportType.Http1); Message receivedMessage = null; string messageData; try { while (true) { try { receivedMessage = await deviceClient.ReceiveAsync(); } catch (Exception ex) { Debug.WriteLine($"Error receiving from Azure Iot Hub: {ex.Message}"); } if (receivedMessage != null) { bool ballOK = true; // {"command":"addprogram","message":"{\"DateTimeStart\":\"2016-06-02T03:04:05+00:00\",\"Duration\":\"00:02:05\",\"SprinklerNumber\":3}"} //MessageIoT temp = new MessageIoT(); //temp.command = "test"; //temp.message = JsonConvert.SerializeObject(new SprinklerProgram(new DateTimeOffset(2016, 6, 2, 3, 4, 5, new TimeSpan(0, 0, 0)), new TimeSpan(0, 2, 5), 3)); //var ret = JsonConvert.SerializeObject(temp); //SendDataToAzure(ret); messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes()); MessageIoT cmdmsg = null; try { cmdmsg = JsonConvert.DeserializeObject <MessageIoT>(messageData); } catch (Exception) { try { await deviceClient.RejectAsync(receivedMessage); ballOK = false; } catch (Exception) { ballOK = false; } } if (!ballOK) { } else if (cmdmsg.command.ToLower() == "sprinklername") { cmdmsg.message = JsonConvert.SerializeObject(Sprinklers); Task.Delay(500); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); } else if (cmdmsg.command.ToLower() == "programs") { cmdmsg.message = JsonConvert.SerializeObject(SprinklerPrograms); Task.Delay(500); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); } else if (cmdmsg.command.ToLower() == "addprogram") { if (cmdmsg.message != null) { try { SprinklerPrograms.Add(JsonConvert.DeserializeObject <SprinklerProgram>(cmdmsg.message)); } catch (Exception) { ballOK = false; } } } else if (cmdmsg.command.ToLower() == "removeprogram") { if (cmdmsg.message != null) { try { //need to be smart how to remove a program //so loop and check the elements for (int i = 0; i < SprinklerPrograms.Count; i++) { SprinklerProgram MySpr = (SprinklerProgram)SprinklerPrograms[i]; SprinklerProgram spr = JsonConvert.DeserializeObject <SprinklerProgram>(cmdmsg.message); if ((MySpr.SprinklerNumber == spr.SprinklerNumber) && (MySpr.Duration.CompareTo(spr.Duration) == 0) && (MySpr.DateTimeStart.CompareTo(spr.DateTimeStart) == 0)) { SprinklerPrograms.RemoveAt(i); } } } catch (Exception) { ballOK = false; } } } else if ((cmdmsg.command.ToLower() == "pumpstart") || (cmdmsg.command.ToLower() == "pumpstop")) { int sprNum = -1; try { sprNum = Convert.ToInt32(cmdmsg.message); } catch { } if ((sprNum >= 0) && (sprNum < NUMBER_SPRINKLERS)) { if (cmdmsg.command.ToLower() == "pumpstart") { Sprinklers[sprNum].Open = true; } else { Sprinklers[sprNum].Open = false; } } } try { if (ballOK) { await deviceClient.CompleteAsync(receivedMessage); } else { await deviceClient.RejectAsync(receivedMessage); } } catch (Exception) { try { await deviceClient.RejectAsync(receivedMessage); } catch (Exception) { } //throw; } } } } catch (Exception) { ReceiveDataFromAzure(); } }
static private async Task ReceiveDataFromAzure() { if (strconn == "") { return; } DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(strconn, TransportType.Http1); Message receivedMessage = null; string messageData; while (true) { try { receivedMessage = await deviceClient.ReceiveAsync(); } catch (Exception ex) { Debug.WriteLine($"Error receiving from Azure Iot Hub: {ex.Message}"); } if (receivedMessage != null) { bool ballOK = true; // {"command":"addprogram","message":"{\"DateTimeStart\":\"2016-06-02T03:04:05+00:00\",\"Duration\":\"00:02:05\",\"SprinklerNumber\":3}"} //MessageIoT temp = new MessageIoT(); //temp.command = "test"; //temp.message = JsonConvert.SerializeObject(new SprinklerProgram(new DateTimeOffset(2016, 6, 2, 3, 4, 5, new TimeSpan(0, 0, 0)), new TimeSpan(0, 2, 5), 3)); //var ret = JsonConvert.SerializeObject(temp); //SendDataToAzure(ret); messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes()); MessageIoT cmdmsg = null; try { cmdmsg = JsonConvert.DeserializeObject <MessageIoT>(messageData); } catch (Exception) { try { await deviceClient.RejectAsync(receivedMessage); ballOK = false; } catch (Exception) { ballOK = false; } } if (!ballOK) { } else { if (string.Compare(cmdmsg.command, TrainCmd, StringComparison.OrdinalIgnoreCase) == 0) { try { //{"command":"train","message":"{\"TrainNumber\":\"3\",\"Speed\":\"0\"}"} var traincmd = JsonConvert.DeserializeObject <TrainCommand>(cmdmsg.message); if ((traincmd.TrainNumber >= 0) && (traincmd.TrainNumber < myParamRail.NumberOfTrains)) { if (traincmd.Speed == 0) { myLego.SingleOutputPWM(LegoPWM.BRK, (LegoPWMOutput)myParamRail.Trains[traincmd.TrainNumber].RedBlue, (LegoChannel)(myParamRail.Trains[traincmd.TrainNumber].Channel - 1)); } else if ((traincmd.Speed >= 8) || (traincmd.Speed <= -8)) { myLego.SingleOutputPWM(traincmd.Speed > 0 ? LegoPWM.FWD7: LegoPWM.REV7, (LegoPWMOutput)myParamRail.Trains[traincmd.TrainNumber].RedBlue, (LegoChannel)(myParamRail.Trains[traincmd.TrainNumber].Channel - 1)); } else { myLego.SingleOutputCST(traincmd.Speed > 0 ? LegoCST.INC_PWM : LegoCST.DEC_PWM, (LegoPWMOutput)myParamRail.Trains[traincmd.TrainNumber].RedBlue, (LegoChannel)(myParamRail.Trains[traincmd.TrainNumber].Channel - 1)); } } else { ballOK = false; } } catch (Exception) { ballOK = false; } } else if (string.Compare(cmdmsg.command, SignalCmd, StringComparison.OrdinalIgnoreCase) == 0) { try { //{"command":"signal","message":"{\"SignaSwitchNumber\":\"1\",\"State\":\"false\"}"} var sgcmd = JsonConvert.DeserializeObject <SignalSwitchCommand>(cmdmsg.message); if ((sgcmd.SignaSwitchNumber >= 0) && (sgcmd.SignaSwitchNumber < mySignal.NumberOfSignals)) { mySignal.ChangeSignal(sgcmd.SignaSwitchNumber, sgcmd.State); } else { ballOK = false; } } catch (Exception) { ballOK = false; } } else if (string.Compare(cmdmsg.command, SwitchCmd, StringComparison.OrdinalIgnoreCase) == 0) { try { //{ "command":"switch","message":"{\"SignaSwitchNumber\":\"1\",\"State\":\"false\"}"} var sgcmd = JsonConvert.DeserializeObject <SignalSwitchCommand>(cmdmsg.message); if ((sgcmd.SignaSwitchNumber >= 0) && (sgcmd.SignaSwitchNumber < mySwitch.NumberOfSwitch)) { mySwitch.ChangeSwitch(sgcmd.SignaSwitchNumber, sgcmd.State); } else { ballOK = false; } } catch (Exception) { ballOK = false; } } else if (string.Compare(cmdmsg.command, GetStausCmd, StringComparison.OrdinalIgnoreCase) == 0) { try { cmdmsg.message = JsonConvert.SerializeObject(myParamRail); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); } catch (Exception) { ballOK = false; } } else if (string.Compare(cmdmsg.command, GetSignalStatus, StringComparison.OrdinalIgnoreCase) == 0) { try { SignalSwitchCommand[] sig = new SignalSwitchCommand[myParamRail.NumberOfSignals]; for (byte i = 0; i < sig.Length; i++) { sig[i].SignaSwitchNumber = i; sig[i].State = mySignal.GetSignal(i); } cmdmsg.message = JsonConvert.SerializeObject(sig); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); } catch (Exception) { ballOK = false; } } else if (string.Compare(cmdmsg.command, GetSwitchStatus, StringComparison.OrdinalIgnoreCase) == 0) { try { SignalSwitchCommand[] sig = new SignalSwitchCommand[myParamRail.NumberOfSwitchs]; for (byte i = 0; i < sig.Length; i++) { sig[i].SignaSwitchNumber = i; sig[i].State = mySwitch.GetSwitch(i); } cmdmsg.message = JsonConvert.SerializeObject(sig); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); } catch (Exception) { ballOK = false; } } else if (string.Compare(cmdmsg.command, GetTrainStatus, StringComparison.OrdinalIgnoreCase) == 0) { try { TrainCommand[] tra = new TrainCommand[myParamRail.NumberOfTrains]; for (byte i = 0; i < tra.Length; i++) { tra[i].TrainNumber = i; //TODO: need to implement capturing train speed //tra[i].Speed = } cmdmsg.message = JsonConvert.SerializeObject(tra); SendDataToAzure(JsonConvert.SerializeObject(cmdmsg)); } catch (Exception) { ballOK = false; } } } try { if (ballOK) { await deviceClient.CompleteAsync(receivedMessage); } else { await deviceClient.RejectAsync(receivedMessage); } } catch (Exception) { try { await deviceClient.RejectAsync(receivedMessage); } catch (Exception) { } //throw; } } } }