【问题标题】:Get Manufacturer Data from BLE on iOS devices从 iOS 设备上的 BLE 获取制造商数据
【发布时间】:2019-03-11 15:56:20
【问题描述】:

在我的 Xamarin.Android 应用中,我可以使用以下代码从 BLE 读取制造商数据:

public class CustomScanCallback : ScanCallback
{
    public override void OnScanResult([GeneratedEnum] ScanCallbackType callbackType, ScanResult result)
    {
        base.OnScanResult(callbackType, result);

        if (result.ScanRecord.ManufacturerSpecificData != null)
        {
            var dataByteResult = result.ScanRecord.GetManufacturerSpecificData(0xFFFE);

            if (dataByteResult != null)
            {
                Guid dataResult = new Guid(dataByteResult);

                if (dataResult.ToString() == "myUuid")
                {
                    // found the uuid from my UWP app
                }
            }
        }
    }
}

如何在 Xamarin.iOS 上做同样的事情?当外围设备被发现时,我有一个回调:

_cbCentralManager.DiscoveredPeripheral += CBCentralManager_DiscoveredPeripheral;

private void CBCentralManager_DiscoveredPeripheral(object sender, CBDiscoveredPeripheralEventArgs e)
{
    // how to find "myUuid" ?
}

并且尝试了很多方法来找到它,但找不到。 Swift/Obective-C 中的答案也会有所帮助,因为我可以将其翻译成 C#。

编辑

我用键CBAdvertisementDataManufacturerDataKey查看了广告数据参数,找到了值:

<06000109 2002aa4e 7e54b91f 2212c398 74eb0fe9 9fc3ecce 4ce76d8f aa>

看起来它是用十六进制格式编码的,但不要以为我要找的是我的 uuid...

【问题讨论】:

标签: ios xamarin


【解决方案1】:

十六进制代码是NSData,您可以从these 文档中看到它。要将其转换为字符串,我将使用以下内容。

     NSData data = NSData.FromData(theValueFromDictionary);
     string uuidString = data.ToString();
     //Try this if the other line doesn't work. But string encoding should be UTF-16 (the default) or UTF-8
     //string uuidString = data.ToString(NSStringEncoding.UTF8);

如果那不是您想要的字符串,那么您可以尝试使用您正在使用的编码类型,但根据我的经验,苹果通常会在数据和字符串之间使用UTF-8

也许 UUID 是这个字典中的另一个键。看看所有可用的密钥here

【讨论】:

  • data.ToString() 以十六进制格式返回相同的字符串。 data.ToString(NSStringEncoding.UTF8) 抛出异常
  • 你看过其他键了吗?
  • 是的,我搜索了所有这些。在我的 Android 实现中,我正在寻找 0xFFFE 作为键,不知道如何在 iOS 中做到这一点..
【解决方案2】:

您可以在广告数据中获取制造商信息。 遵循此代码。

#pragma mark - CBCentralManagerDelegate
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
    NSString *manufacturer = [advertisementData objectForKey:CBAdvertisementDataManufacturerDataKey];
    NSLog(@"manufacturer:%@", manufacturer); 
}

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 2013-08-21
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多