gpt4 book ai didi

c# - Windows 接收 iOS 设备发布的 BLE 广播包

转载 作者:行者123 更新时间:2023-11-28 08:18:18 28 4
gpt4 key购买 nike

我正在尝试使用蓝牙在 Windows 和 iOS 之间进行通信。

在 iOS 端,我正在发布广告,而在 Windows 端,我正在“观看”广告。

目前在收到我的 iOS 设备发布的广告时,这些广告是……空的。没有服务,没有 ManufacturerData,DataSections 列表包含 1 个数据长度为 1(?)的 DataSection 本地名称为空,此广告包中基本上没有任何用处。

当我调用 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 观看)它也不太顺利,如果有兴趣,这是我发布的关于这个主题的另一个问题:Listening to and accepting a BLE Connect request in 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

关于c# - Windows 接收 iOS 设备发布的 BLE 广播包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976556/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com