// Refer to http://aka.ms/azure-iot-hub-vs-cs-2017-wiki for more information on Connected Service for Azure IoT Hub public static async Task SendDeviceToCloudMessageAsync(TrainSpotterMessage trainData) { CreateClient(); var btData = trainData; string json = JsonConvert.SerializeObject(btData, Formatting.Indented); var message = new Message(Encoding.ASCII.GetBytes(json)); await deviceClient.SendEventAsync(message); Analytics.TrackEvent("SendDeviceToCloudMessageAsync", new Dictionary <string, string> { { "Category", "D2C:" + trainData.LastUpdate + ", " + trainData.Name + ", " + trainData.Url }, { "Function", "SendD2C" } }); }
private async void StartBeaconMonitoringAsync(object sender, Beacon beacon) { Ts trainMetaData = new Ts(); trainMetaData.Date = beacon.Timestamp; var trainData = new TrainSpotterMessage(); try { trainData.Rssi = beacon.Rssi; trainData.Mac = beacon.BluetoothAddressAsString; trainData.TrainBeacon = beacon.BluetoothAddressAsString; trainData.LastUpdate = beacon.Timestamp; Analytics.TrackEvent("StartBeaconMonitoringAsync", new Dictionary <string, string> { { "Category", "Beacon:" + trainData.TrainBeacon }, { "Function", "StartBeaconMonitoringAsync" } }); foreach (var bluetoothBeacon in _beaconManager.BluetoothBeacons.ToList()) { foreach (var beaconFrame in bluetoothBeacon.BeaconFrames.ToList()) //beacon.BeaconFrames.ToList()) { if (beaconFrame is UidEddystoneFrame) //https://github.com/google/eddystone/tree/master/eddystone-uid { trainData.BeaconType = "UidEddystoneFrame"; trainData.Name = "Eddystone UID Frame"; trainData.Distance = ((UidEddystoneFrame)beaconFrame).RangingData; //Calibrated Tx power at 0 m - value is an 8-bit integer and ranges from -100 dBm to +20 dBm // Note to developers: the best way to determine the precise value to put into this field is to measure the actual output of your beacon from 1 meter away and then add 41 dBm to that. 41dBm is the signal loss that occurs over 1 meter. trainData.Namespace = ((UidEddystoneFrame)beaconFrame).NamespaceIdAsNumber.ToString("X") + " / " + ((UidEddystoneFrame)beaconFrame).InstanceIdAsNumber.ToString("X"); } else if (beaconFrame is UrlEddystoneFrame) //https://github.com/google/eddystone/tree/master/eddystone-url { trainData.BeaconType = "UrlEddystoneFrame"; trainData.Name = "Eddystone URL Frame"; trainData.Url = ((UrlEddystoneFrame)beaconFrame).CompleteUrl; trainData.Distance = ((UrlEddystoneFrame)beaconFrame).RangingData; } else if (beaconFrame is TlmEddystoneFrame) //https://github.com/google/eddystone/tree/master/eddystone-tlm { trainData.BeaconType = "TlmEddystoneFrame"; trainData.Name = "Eddystone Telemetry Frame"; trainData.Temperature = ((TlmEddystoneFrame)beaconFrame).TemperatureInC; trainData.Battery = ((TlmEddystoneFrame)beaconFrame).BatteryInMilliV; trainData.Uptime = ((TlmEddystoneFrame)beaconFrame).TimeSincePowerUp; trainData.PacketsSent = ((TlmEddystoneFrame)beaconFrame).AdvertisementFrameCount; } else if (beaconFrame is EidEddystoneFrame) //https://github.com/google/eddystone/tree/master/eddystone-eid { trainData.BeaconType = "EidEddystoneFrame"; trainData.Name = "Eddystone EID Frame"; trainData.Distance = ((EidEddystoneFrame)beaconFrame).RangingData; //trainData.Eid = BitConverter.ToString(((EidEddystoneFrame)beaconFrame).EphemeralIdentifier); } await AzureIoTHub.SendDeviceToCloudMessageAsync(trainData); //send the data only for recognized data types Analytics.TrackEvent("Sent Data", new Dictionary <string, string> { { "Category", "Beacon:" + trainData.LastUpdate + ", " + trainData.Name + ", " + trainData.Url }, { "Function", "StartBeaconMonitoringAsync" } }); await Task.Delay(1000); } } } catch (Exception ex) { Debug.WriteLine("Error in Parsing Data: " + ex.Message); await AzureIoTHub.SendDeviceToCloudMessageAsync(trainData); //send what we can... Analytics.TrackEvent("Error Sent Data", new Dictionary <string, string> { { "Category", "Error:" + ex.Message.ToString() }, { "Function", "StartBeaconMonitoringAsync" } }); } //StopWatchingBeaconManager(); //causes it to crash //await Task.Delay(1000); //StartBeaconManager(); }
public static string ToJson(this TrainSpotterMessage self) => JsonConvert.SerializeObject(self);