我找到了Objective-C示例
[manager scanForPeripheralsWithServices:nil
options:@{
CBCentralManagerScanOptionSolicitedServiceUUIDsKey:@[
[CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"]]}];
尝试转换Xamarin.iOS代码
PeripheralScanningOptions option = new PeripheralScanningOptions(NSDictionary.FromObjectAndKey(CBCentralManager.ScanOptionSolicitedServiceUUIDsKey, CBUUID.FromString("84C80001-4A61-60B9-3A2B-1300855E588C")));
CBCM.ScanForPeripherals(new []{ CBUUID.FromString("84C80001-4A61-60B9-3A2B-1300855E588C") }, option);
但无效,
如何在Xamarin.iOS中使用CBCentralManager.ScanOptionSolicitedServiceUUIDsKey?
答案 0 :(得分:1)
您的C#代码看起来不像ObjC代码。
[manager scanForPeripheralsWithServices:nil
表示第一个参数是null
,而不是CBUUID
数组。这将更接近:
CBCM.ScanForPeripherals (null, option);
ObjC惯例也是拥有对象和键(而不是键和对象),因此与FromObjectAndKey
一起使用的参数应该颠倒过来。
答案 1 :(得分:1)
根据documentation,您需要设置后台功能,以便在info.plist文件的后台使用它。启用后台模式并选择使用蓝牙LE附件。
答案 2 :(得分:1)
下面有一个您可以尝试的解决方案:
使用Plugin.BLE(https://www.nuget.org/packages/Plugin.BLE/),我可以使用广告记录来获取信标/设备的服务uuid,
foreach(e.Device.AdvertisementRecords中的AdvertisementRecord记录)
description = """
Jakobe Lamb Lorem ipsum dolor sit amet, Edwin Day consectetuer adipiscing elit. Jakobe Donec quam felis, ultricies nec, pellentesque
"""
name_list = ["Jakobe Lamb", "Edwin Day", "Josue Houston"] # this will have more than 10K names
names_regex = r"|".join(names_list)
cleaned_description = re.sub(names_regex,'', description)
然后我传递一个CBUUID列表,其中添加了ServiceUUID值:
{
if (record.Type == AdvertisementRecordType.UuidsComplete128Bit || record.Type == AdvertisementRecordType.UuidsComplete16Bit)
{
b.ServiceUUID = record.Data;
break;
}
}
答案 3 :(得分:0)
首先,你必须启用蓝牙LE配件的后台模式,就像本杰明说的那样。
其次,您必须使用UUID调用ScanForPeripherals,该UUID是外围设备的广告数据包中公开的主要服务。根据Apple的文档,这是背景BLE扫描的要求。 (https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html)
UUID的一个示例是:00000011-0000-1000-8000-00805F9B34FB,其中第一个段末尾的0011是服务的短UUID,其余是BASE_UUID(https://www.bluetooth.com/specifications/assigned-numbers/service-discovery) 。这将扫描广告人机接口设备配置文件(HID)的任何外围设备。
...
var serviceUuid = Guid.Parse("00000011-0000-1000-8000-00805F9B34FB");
var serviceUuids = new CBUUID[] { CBUUID.FromString(serviceUuid.ToString()) };
central.ScanForPeripherals(serviceUuids, new PeripheralScanningOptions { AllowDuplicatesKey = true });
这部分是可选的: new PeripheralScanningOptions {AllowDuplicatesKey = true}