[英]Receiving BLE advertisement packets on Windows published by iOS device
我正在嘗試使用藍牙在Windows和iOS之間進行通信。
在iOS方面我發布廣告,在窗口方面我正在“觀看”廣告。
目前,在收到我的iOS設備正在發布的廣告時,這些廣告是空的。 沒有服務,沒有ManufacturerData,DataSections列表包含1個DataSection,數據長度為1(?)本地名稱為null,這個廣告包中基本上沒有任何用處。
當我調用BluetoothLEDevice.FromBluetoothAddressAsync
(藍牙地址)時,我得到一個對象,但是當所有內容都為空時,沒有服務,當我調用GetGattService時,找不到異常的元素,DeviceInformation為空......就我所見,沒什么用處。
我不知道我在iOS上發布的廣告是否有問題,或者我是如何在Windows端處理它的。
這是iOS代碼:
import Foundation
import CoreBluetooth
class BluetoothController : NSObject, CBPeripheralManagerDelegate {
var delegate : BluetoothControllerDelegate?
var manager : CBPeripheralManager?
init(_ delegate : BluetoothControllerDelegate) {
super.init()
manager = CBPeripheralManager(delegate: self, queue: nil)
self.delegate = delegate
self.delegate?.statusUpdate("init")
}
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager){
delegate?.statusUpdate("Perepheral did update state : \(peripheral.state)")
if(peripheral.state == CBManagerState.poweredOn){
addServices()
}
}
func addServices(){
let service = CBMutableService(type: CBUUID.init(string: "e1fa36b4-9700-414b-a4e0-382a3e249e56"), primary: true)
// service.
manager?.add(service)
}
func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?){
delegate?.statusUpdate("Service was added : \(service.uuid)")
manager?.startAdvertising(getAdvertisementData(service))
}
func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?){
delegate?.statusUpdate("peripheralManagerDidStartAdvertising : \(peripheral.isAdvertising) : \(error.debugDescription)")
}
private func getAdvertisementData(_ service : CBService) -> Dictionary<String, Any>{
var data : Dictionary<String, Any> = Dictionary<String, Any>()
data["CBAdvertisementDataLocalNameKey"] = "e1fa36b4-9700-414b-a4e0-382a3e249e56"
data["CBAdvertisementDataServiceUUIDsKey"] = [service.uuid]
return data
}
}
這里是Windows C#代碼(目前一個簡單的控制台應用程序):
class Program
{
static void Main(string[] args)
{
BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
watcher.ScanningMode = BluetoothLEScanningMode.Active;
watcher.Received += Watcher_Received;
DeviceWatcher devWatcher = DeviceInformation.CreateWatcher();
devWatcher.Added += DevWatcher_Added;
devWatcher.Updated += DevWatcher_Updated;
watcher.Start();
devWatcher.Start();
while (true)
{
}
}
private static void DevWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
{
Console.Write("\nUpdated\n");
}
private static void DevWatcher_Added(DeviceWatcher sender, DeviceInformation args)
{
// Console.Write("Added : "+args.Name+"\n");
}
static List<ulong> tried = new List<ulong>();
private static async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
if (tried.Contains(args.BluetoothAddress)) {
return;
}
tried.Add(args.BluetoothAddress);
Console.Write("Device found =================================================");
Console.Write("\nDataSections: " + args.Advertisement.DataSections[0].Data);
//BluetoothLEDevice device =
BluetoothLEDevice device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
try
{
Console.Write("\n GattServices: " + device.GetGattService(Guid.Parse("e1fa36b4-9700-414b-a4e0-382a3e249e56")).Uuid);
}catch(Exception e)
{
Console.Write(e.ToString());
}
if(device.DeviceInformation == null)
{
Console.Write("DeviceInformation null");
return;
}
if(device.DeviceInformation.Pairing == null)
{
Console.Write("Pairing null");
return;
}
var res = await device.DeviceInformation.Pairing.PairAsync(DevicePairingProtectionLevel.None);
Console.Write("Pair complete (?) ========================================"+res.Status);
}
}
對不起,它有點亂......
提前感謝您的幫助,我也在另一個方向(Windows廣告和iOS觀看)嘗試它也不順利,如果感興趣的話,這是我在這個主題上發布的另一個問題: 聽取並接受BLE在Windows中連接請求
廣告是被動的,因此您應該將代碼從活動更改為被動,例如:watcher.ScanningMode = BluetoothLEScanningMode.Passive;
public sealed partial class MainPage : Page
{
Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher advertisementWatcher;
public MainPage()
{
this.InitializeComponent();
advertisementWatcher = new Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher();
advertisementWatcher.ScanningMode = Windows.Devices.Bluetooth.Advertisement.BluetoothLEScanningMode.Passive;
advertisementWatcher.Received += AdvertisementWatcher_Received;
advertisementWatcher.Start();
}
private void AdvertisementWatcher_Received(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher sender, Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementReceivedEventArgs args)
{
System.Diagnostics.Debug.WriteLine("Address: {0:X}", args.BluetoothAddress);
}
}
只需.Received回調,您就應該開始看到數據如下:
地址:A45E60F3E896地址:4BF5661A4EF2地址:549F476B5F37地址:4CB6DF3019A9地址:4BF5661A4EF2地址:106070EB42B1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.