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); } }); }
/// <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(); }); }
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); } }
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(""); }
private bool IsConnectable(BluetoothLEAdvertisementType type) => type == BluetoothLEAdvertisementType.ConnectableDirected || type == BluetoothLEAdvertisementType.ConnectableUndirected;