在iOS上通过广告发送蓝牙LE数据

5

我的应用作为一个蓝牙LE外设运行,我试图在广告中发送一些自定义数据,仅仅只有几个字节。

func btStartBroadcasting(peripheral: CBPeripheralManager!) {

    // create an array of bytes to send
    var byteArray = [UInt8]()
    byteArray.append(0b11011110); // 'DE'
    byteArray.append(0b10101101); // 'AD'

    // convert that array into an NSData object
    var manufacturerData = NSData(bytes: byteArray,length: byteArray.count)

    // define a UIUD for the service
    let theUUid = CBUUID(NSUUID: uuid)

    // build the bundle of data
    let dataToBeAdvertised:[String: AnyObject!] = [
        CBAdvertisementDataLocalNameKey : "I wish this worked",
        CBAdvertisementDataManufacturerDataKey : manufacturerData,
        CBAdvertisementDataServiceUUIDsKey : [theUUid],
    ]

    peripheral.startAdvertising(dataToBeAdvertised)

}

但看起来CBAdvertisementDataManufacturerDataKey中的数据集被剥离并且不能通过无线电发出。我已经在苹果的文档和在线上阅读了每一点零碎的信息。共识似乎是Core Bluetooth将忽略该数据,因为只支持CBAdvertisementDataLocalNameKey和CBAdvertisementDataServiceUUIDsKey。上述内容编译和运行正常,在我的BT扫描应用程序中可以看到"I wish this worked",但我的两个自定义数据好像不起作用。
有没有任何方法可以规避这个问题?是否有任何可接受的CoreBluetooth替代品或者我忽略了任何愚蠢的事情?
谢谢,

你能发送一个iBeacon格式的广告吗?主/次要字段中您将获得四个字节的数据。 - Chris Stratton
除非在iOS 8中做出了改变,否则您将无法修改制造商数据:http://stackoverflow.com/a/23790973/2128900 - Michał Ciuba
2个回答

2

问题可能是你发送了太多的字节。

广告数据包的长度根据规范限制为31个字节。从你的示例中可以看出,字符串已经有18个字节,而UUID有16个字节,所以已经超出限制了。


1
问题在于,在CBPeripheralManager中发送自定义键CBAdvertisementDataManufacturerDataKey的值是不被支持的。
从iOS 12开始,当您设置CBAdvertisementDataManufacturerDataKey并开始广告时,甚至会在控制台中收到错误消息。

@eonist 怎样使用CBAdvertisementDataManufacturerDataKey数据?我找不到有关更改CBAdvertisementDataManufacturerDataKey值的参考资料。 - Star_Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接