async private void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
            // The timestamp of the event
            DateTimeOffset timestamp = eventArgs.Timestamp;

            // The type of advertisement
            BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType;

            // The received signal strength indicator (RSSI)
            Int16 rssi = eventArgs.RawSignalStrengthInDBm;

            // The local name of the advertising device contained within the payload, if any
            string localName = eventArgs.Advertisement.LocalName;

            // Check if there are any manufacturer-specific sections.
            // If there is, print the raw data of the first manufacturer section (if there are multiple).
            string manufacturerDataString = "";
            var    manufacturerSections   = eventArgs.Advertisement.ManufacturerData;
            var    res = String.Empty;

            if (manufacturerSections.Count > 0)
            {
                // Only print the first one of the list
                var manufacturerData = manufacturerSections[0];
                var data             = new byte[manufacturerData.Data.Length];
                using (var reader = DataReader.FromBuffer(manufacturerData.Data))
                {
                    reader.ReadBytes(data);
                }

                var str = BitConverter.ToString(data);


                //Char.ConvertFromUtf32(value);

                string[] hexValuesSplit = str.Split('-');
                foreach (String hex in hexValuesSplit)
                {
                    int    value       = Convert.ToInt32(hex, 16);
                    string stringValue = Char.ConvertFromUtf32(value);
                    char   charValue   = (char)value;
                    res += charValue;
                }


                // Print the company ID + the raw data in hex format
                manufacturerDataString = string.Format("0x{0}: {1}",
                                                       manufacturerData.CompanyId.ToString("X"), res);
            }

            // Serialize UI update to the main UI thread
            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                // Display these inf

                myTextBox.Text = $"[{timestamp.ToString("hh\\:mm\\:ss\\.fff")}]: {res}]";
            });
        }
        /// <summary>
        /// Invoked as an event handler when an advertisement is received.
        /// </summary>
        /// <param name="watcher">Instance of watcher that triggered the event.</param>
        /// <param name="eventArgs">Event data containing information about the advertisement event.</param>
        private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
            // We can obtain various information about the advertisement we just received by accessing
            // the properties of the EventArgs class

            // The timestamp of the event
            DateTimeOffset timestamp = eventArgs.Timestamp;

            // The type of advertisement
            BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType;

            // The received signal strength indicator (RSSI)
            Int16 rssi = eventArgs.RawSignalStrengthInDBm;

            // The local name of the advertising device contained within the payload, if any
            string localName = eventArgs.Advertisement.LocalName;

            // Check if there are any manufacturer-specific sections.
            // If there is, print the raw data of the first manufacturer section (if there are multiple).
            string manufacturerDataString = "";
            var    manufacturerSections   = eventArgs.Advertisement.ManufacturerData;

            if (manufacturerSections.Count > 0)
            {
                // Only print the first one of the list
                var manufacturerData = manufacturerSections[0];
                var data             = new byte[manufacturerData.Data.Length];
                using (var reader = DataReader.FromBuffer(manufacturerData.Data))
                {
                    reader.ReadBytes(data);
                }
                // Print the company ID + the raw data in hex format
                manufacturerDataString = string.Format("0x{0}: {1}",
                                                       manufacturerData.CompanyId.ToString("X"),
                                                       //BitConverter.ToString(data));
                                                       System.Text.Encoding.UTF8.GetString(data));
            }

            // Serialize UI update to the main UI thread
            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                // Display these information on the list
                //ReceivedAdvertisementListBox.Items.Add(string.Format("[{0}]: type={1}, rssi={2}, name={3}, manufacturerData=[{4}]",
                //    timestamp.ToString("hh\\:mm\\:ss\\.fff"),
                //    advertisementType.ToString(),
                //    rssi.ToString(),
                //    localName,
                //    manufacturerDataString));
                ReceivedAdvertisementListBox.Items.Add(string.Format("[{0}]: rssi={1}, data='{2}'",
                                                                     timestamp.ToString("hh\\:mm\\:ss\\.fff"),
                                                                     rssi.ToString(),
                                                                     manufacturerDataString));
                ReceivedAdvertisementListBox.ScrollIntoView(ReceivedAdvertisementListBox.Items[ReceivedAdvertisementListBox.Items.Count - 1]);
            });
        }
        /// <summary>
        /// Invoked as an event handler when an advertisement is received.
        /// </summary>
        /// <param name="watcher">Instance of watcher that triggered the event.</param>
        /// <param name="eventArgs">Event data containing information about the advertisement event.</param>
        private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
            // We can obtain various information about the advertisement we just received by accessing
            // the properties of the EventArgs class

            // The timestamp of the event
            DateTimeOffset timestamp = eventArgs.Timestamp;

            // The type of advertisement
            BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType;

            // The received signal strength indicator (RSSI)
            Int16 rssi = eventArgs.RawSignalStrengthInDBm;

            // The local name of the advertising device contained within the payload, if any
            string localName = eventArgs.Advertisement.LocalName;

            // Parse Data Here
            string manufacturerDataString = "";
            var    manufacturerSections   = eventArgs.Advertisement.ManufacturerData;

            var manufacturerData = manufacturerSections[0];
            var data             = new byte[manufacturerData.Data.Length];

            using (var reader = DataReader.FromBuffer(manufacturerData.Data))
            {
                reader.ReadBytes(data);
            }
            // Print the company ID + the raw data in hex format
            manufacturerDataString = ParseMPBID(data);

            // Serialize UI update to the main UI thread
            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                if (!ReceivedAdvertisementListBox.Items.Any(x => (x as ToolViewModel).MPBID.Equals(manufacturerDataString)))
                {
                    // Display these information on the list
                    ReceivedAdvertisementListBox.Items.Add(new ToolViewModel
                    {
                        BluetoothAddress = eventArgs.BluetoothAddress.ToString(),
                        MPBID            = manufacturerDataString,
                        Name             = ProductData.LookupProductName(manufacturerDataString),
                        RSSI             = eventArgs.RawSignalStrengthInDBm
                    });
                }
            });
        }
        /// <summary>
        /// Invoked as an event handler when an advertisement is received.
        /// </summary>
        /// <param name="watcher">Instance of watcher that triggered the event.</param>
        /// <param name="eventArgs">Event data containing information about the advertisement event.</param>
        private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
            // We can obtain various information about the advertisement we just received by accessing
            // the properties of the EventArgs class


            // The timestamp of the event
            DateTimeOffset timestamp = eventArgs.Timestamp;

            // The type of advertisement
            BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType;

            // The received signal strength indicator (RSSI)
            Int16 rssi = eventArgs.RawSignalStrengthInDBm;

            // The local name of the advertising device contained within the payload, if any
            string localName = eventArgs.Advertisement.LocalName;

            // Get iBeacon specific data
            var beaconData = eventArgs.Advertisement.iBeaconParseAdvertisement(eventArgs.RawSignalStrengthInDBm);

            if (beaconData == null)
            {
                return;
            }
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                var existing = beacons.FirstOrDefault(b => b.UUID == beaconData.UUID && b.Major == beaconData.Major && b.Minor == beaconData.Minor);
                if (existing != null)
                {
                    var idx = beacons.IndexOf(existing);
                    beacons.RemoveAt(idx);
                    beacons.Insert(idx, beaconData);
                }
                else
                {
                    //beacons.Insert(0, beaconData);
                    beacons.Add(beaconData);
                }
            });
        }
Beispiel #5
0
        /// <summary>
        /// Invoked as an event handler when an advertisement is received.
        /// </summary>
        /// <param name="watcher">Instance of watcher that triggered the event.</param>
        /// <param name="eventArgs">Event data containing information about the advertisement event.</param>
        private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
            // We can obtain various information about the advertisement we just received by accessing
            // the properties of the EventArgs class


            // The timestamp of the event
            DateTimeOffset timestamp = eventArgs.Timestamp;

            // The type of advertisement
            BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType;

            // The received signal strength indicator (RSSI)
            Int16 rssi = eventArgs.RawSignalStrengthInDBm;

            // The local name of the advertising device contained within the payload, if any
            string localName = eventArgs.Advertisement.LocalName;

            // Get iBeacon specific data
            var beaconData = eventArgs.Advertisement.iBeaconParseAdvertisement(eventArgs.RawSignalStrengthInDBm);


            if (beaconData == null)
            {
                return;
            }
            Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                if (dt.IsEnabled)
                {
                    dt.Stop();
                }
                lblDistance.Text   = "Distance to Beacon " + Math.Round(beaconData.Distance, 1) + " m";
                grdPage.Background = new SolidColorBrush(ColorFromDistance(beaconData.Distance));
                dt.Start();
            });
        }
Beispiel #6
0
        private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
        {
            System.Diagnostics.Debug.WriteLine("Watcher Received");
            //ToastHelper.ShowToast("Watcher Received");
            DateTimeOffset timestamp = eventArgs.Timestamp;
            BluetoothLEAdvertisementType advertisementType = eventArgs.AdvertisementType;
            Int16  rssi      = eventArgs.RawSignalStrengthInDBm;
            string localName = eventArgs.Advertisement.LocalName;
            string manufacturerDataString = "";
            var    manufacturerSections   = eventArgs.Advertisement.ManufacturerData;

            if (manufacturerSections.Count > 0)
            {
                var manufacturerData = manufacturerSections[0];
                var data             = new byte[manufacturerData.Data.Length];
                using (var reader = DataReader.FromBuffer(manufacturerData.Data))
                {
                    reader.ReadBytes(data);
                }
                manufacturerDataString = string.Format("0x{0}: {1}",
                                                       manufacturerData.CompanyId.ToString("X"),
                                                       BitConverter.ToString(data));
            }

            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                ReceivedAdvertisementListBox.Items.Add(string.Format("[{0}]: type={1}, rssi={2}, name={3}, manufacturerData=[{4}]",
                                                                     timestamp.ToString("hh\\:mm\\:ss\\.fff"),
                                                                     advertisementType.ToString(),
                                                                     rssi.ToString(),
                                                                     localName,
                                                                     manufacturerDataString));
            });

            // TODO filter by Blutooth name, connect with 2 device
            watcher.Stop();
            BluetoothLEDevice device = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress);

            GattDeviceServicesResult serviceResult = await device.GetGattServicesForUuidAsync(TimpointerServiceUUID);

            if (serviceResult.Status == GattCommunicationStatus.Success)
            {
                GattCharacteristicsResult serialCharsticsResult = await serviceResult.Services.ElementAt(0).GetCharacteristicsForUuidAsync(TimpointerSerialCharacteristicUUID);

                if (serialCharsticsResult.Status == GattCommunicationStatus.Success)
                {
                    characteristic = serialCharsticsResult.Characteristics.ElementAt(0);
                    try
                    {
                        var result = await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);

                        characteristic.ValueChanged += valueChangeHandler;
                    }
                    catch (Exception e)
                    {
                        System.Diagnostics.Debug.WriteLine("Notify set error" + e.StackTrace);
                    }
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine(serialCharsticsResult.Status);
                }
            }
            else
            {
                System.Diagnostics.Debug.WriteLine(serviceResult.Status);
            }
        }
Beispiel #7
0
        public void CheckArgs(BluetoothLEAdvertisementReceivedEventArgs args)
        {
            // アドバタイズパケットBluetoothLEAdvertisementReceivedEventArgsの中身をチェック
            // コメントに記載されているP25などの記載はオライリー「Bluetooth Low Energyをはじめよう」の参考ページ番号

            Console.WriteLine("★アドバタイズパケットスキャン");

            // タイムスタンプ(スキャン日時?)
            DateTimeOffset timestamp = args.Timestamp;

            //bleDev.Memo = $"{args.Timestamp:HH\\:mm\\:ss}, RSSI: {args.RawSignalStrengthInDBm}, Address: {args.BluetoothAddress.ToString("X")}, Type: {args.AdvertisementType} , Name={args.Advertisement.LocalName}";
            Console.WriteLine($"TimeStamp = {timestamp:HH\\:mm\\:ss}");

            // アドバタイズパケット発信元の Bluetoothデバイスアドレス-48bit(6byte)(P21)
            // パブリックデバイスアドレスとランダムデバイスアドレスがあるが、どちらなのか?
            var bleAddress = args.BluetoothAddress;

            Console.WriteLine($"BluetoothAddress = {bleAddress.ToString("X")}");

            // シグナル強度
            var bleRSSI = args.RawSignalStrengthInDBm;

            Console.WriteLine($"RSSI = {bleRSSI}");

            // アドバタイズパケット種別(P25)
            // https://docs.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.advertisement.bluetoothleadvertisementtype
            BluetoothLEAdvertisementType advertisementType = args.AdvertisementType;

            Console.WriteLine($"AdvertisementType = {advertisementType}");
            switch (advertisementType)
            {
            case BluetoothLEAdvertisementType.ConnectableUndirected:
                Console.WriteLine($"-> ADV_IND:コネクション可能、スキャン可能");
                break;

            case BluetoothLEAdvertisementType.ConnectableDirected:
                Console.WriteLine($"-> ADV_DIRECT_IND:コネクション可能、スキャン×");
                break;

            case BluetoothLEAdvertisementType.ScannableUndirected:
                Console.WriteLine($"-> ADV_SCAN_IND:コネクション×、スキャン可能");
                break;

            case BluetoothLEAdvertisementType.NonConnectableUndirected:
                Console.WriteLine($"-> ADV_NONCONN_IND:コネクション×、スキャン×");
                break;

            case BluetoothLEAdvertisementType.ScanResponse:
                Console.WriteLine($"-> SCAN_RSP:スキャン要求に対するスキャン応答");
                break;

            default:
                Console.WriteLine($"-> ???");
                break;
            }

            // アドバタイズデータ(P54)
            Console.WriteLine("");
            Console.WriteLine("Data");

            // Flags (DataSectionにも同じ情報あるが、こっちの方が見やすい)
            var bleFlags = args.Advertisement.Flags;

            Console.WriteLine($"Flags = {bleFlags}");

            // LocalName (DataSectionにも同じ情報あるが、こっちの方が見やすい)
            Console.WriteLine($"LocalName = {args.Advertisement.LocalName}");

            // Service UUID (DataSectionにも同じ情報あるが、こっちの方が見やすい)
            {
                var bleServiceUUIDs = args.Advertisement.ServiceUuids;
                Console.WriteLine($"Service UUID Num = {bleServiceUUIDs.Count}");
                foreach (var uuidone in bleServiceUUIDs)
                {
                    // サービスUUIDってなに?→http://jellyware.jp/kurage/bluejelly/uuid.html
                    Console.WriteLine($"-> Service UUID = {uuidone} -> {this.CheckServiceUUIDInfo(uuidone)}");
                }
                Console.WriteLine("");
            }

            {
                var manufacturerSections = args.Advertisement.ManufacturerData;
                Console.WriteLine($"Manufacturer Num = {manufacturerSections.Count}");
                if (manufacturerSections.Count > 0)
                {
                    foreach (var manuone in manufacturerSections)
                    {
                        Console.WriteLine($"<Manufacturer>");
                        Console.WriteLine($"-> CompanyId = {manuone.CompanyId.ToString("X2")}");
                        Console.WriteLine($"-> Data Length = {manuone.Data.Length}");
                        if (manuone.Data.Length > 0)
                        {
                            var data = new byte[manuone.Data.Length];
                            using (var reader = Windows.Storage.Streams.DataReader.FromBuffer(manuone.Data)) {
                                reader.ReadBytes(data);

                                var tmp = BitConverter.ToString(data);
                                Console.WriteLine($"-> Data = {tmp}");
                            }
                        }
                    }
                }
                Console.WriteLine("");
            }


            // DataSection
            {
                var bleDataSections = args.Advertisement.DataSections;
                Console.WriteLine($"Advertising Data Num = {bleDataSections.Count}");
                foreach (var datasecone in bleDataSections)
                {
                    byte type = datasecone.DataType;
                    Console.WriteLine($"<Data>");
                    Console.WriteLine($"-> AD Type = 0x{type.ToString("X2")} -> {this.CheckADTypeInfo(type)}");
                    Console.WriteLine($"-> Data Length = {datasecone.Data.Length}");

                    if (datasecone.Data.Length > 0)
                    {
                        var data = new byte[datasecone.Data.Length];
                        using (var reader = Windows.Storage.Streams.DataReader.FromBuffer(datasecone.Data)) {
                            reader.ReadBytes(data);

                            var tmp = BitConverter.ToString(data);
                            Console.WriteLine($"-> Data = {tmp}");
                        }
                    }
                }
            }

            Console.WriteLine("");
            Console.WriteLine("");
        }
Beispiel #8
0
 private bool IsConnectable(BluetoothLEAdvertisementType type)
 => type == BluetoothLEAdvertisementType.ConnectableDirected ||
 type == BluetoothLEAdvertisementType.ConnectableUndirected;