예제 #1
0
        // 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" }
            });
        }
예제 #2
0
        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();
        }
예제 #3
0
 public static string ToJson(this TrainSpotterMessage self) => JsonConvert.SerializeObject(self);