Xamarin.iOS中的蓝牙背景扫描

时间:2016-03-21 05:49:35

标签: ios xamarin bluetooth xamarin.ios

我找到了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?

4 个答案:

答案 0 :(得分:1)

您的C#代码看起来不像ObjC代码。

[manager scanForPeripheralsWithServices:nil

表示第一个参数是null,而不是CBUUID数组。这将更接近:

CBCM.ScanForPeripherals (null, option);

ObjC惯例也是拥有对象和键(而不是键和对象),因此与FromObjectAndKey一起使用的参数应该颠倒过来。

答案 1 :(得分:1)

根据documentation,您需要设置后台功能,以便在info.plist文件的后台使用它。启用后台模式并选择使用蓝牙LE附件。

以下是info.plist文件的屏幕截图,其中包含在后台使用BLE的设置。  Screenshot

答案 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}