簡體   English   中英

在iOS設備上發布的Windows上接收BLE廣告包

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM