在 iOS SDK 中使用 BLE 从外部设备发送和接收数据
Posted
技术标签:
【中文标题】在 iOS SDK 中使用 BLE 从外部设备发送和接收数据【英文标题】:Send and Receive data from external device using BLE in iOS SDK 【发布时间】:2016-12-28 14:45:21 【问题描述】:我必须使用 BLE 从外部设备(数据记录器温度计)获取数据。请查看此设备的下图。
当我们发送一个命令时,这个设备只发送数据。我的意思是我们必须先将静态字节数据发送到设备,然后它将发送回图像中显示的 T1、T2、T3 和 T4 值的数据。
我可以使用BTLE Central Peripheral Transfer Demo 和answer 使用BLE 将数据发送到一台ios 设备到另一台iOS 设备。但是,我无法使用这种方式向这个外部设备发送和接收数据。
正如本演示中所述,我使用CBPeripheralManager
和CBCentralManager
使用BLE 发送和接收数据。我还可以使用EAAccessoryManager
显示附近所有 BLE 连接的列表。因此,当用户单击列表中的任何设备时,我会获取该设备的 UUID 并尝试使用该 UUID 发送和接收数据。
还有其他方法可以使用蓝牙向 iOS 设备发送和接收数据到任何外部设备吗?
我想分享一下,android 开发人员已经使用 SSP 而非 BLE 在 Android 中实现了这一点。在 iOS 中使用 BLE 可以做到这一点吗?
任何帮助将不胜感激。
【问题讨论】:
你确定设备真的支持BLE吗?经典蓝牙和 BLE 是两种不同的协议/堆栈。通过EAAccessoryManager
可见的设备是经典蓝牙设备,而不是 BLE 设备。要扫描 BLE 设备,你应该使用CBCentralManager scanForPeripheralsWithServices:options:
。
【参考方案1】:
我总是使用 CoreBluetooth 实现此协议(CBCentralManagerDelegate、CBPeripheralDelegate)并覆盖此方法:
func centralManagerDidUpdateState(_ central: CBCentralManager)
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?)
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?)
// Check if the service discovered is a valid Service
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?)
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?)
// And for getting the value changes in the BLE Device...
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?)
希望对你有帮助
【讨论】:
【参考方案2】:在写入或读取值之前,您需要知道哪些特征是可读的,哪些是可写的,而不是您可以读取或写入它。简单来说BTLE的流程是:
扫描外围设备->连接->查找服务->发现特征-> ...您需要的操作
如果你想给可写特性写值,你需要确认外设会响应这个写请求,否则你会在回调中收到错误:peripheral(_:didWriteValueFor:error)
可能是“未知错误”。
其他当您尝试读取您需要调用的特征值时:readValue(for:)
或setNotifyValue(_:for:)
,外围设备的更新结果将在peripheral(_:didUpdateValueFor:error:)
中响应
以上是我对BTLE数据传输的理解。希望能帮到你。
【讨论】:
以上是关于在 iOS SDK 中使用 BLE 从外部设备发送和接收数据的主要内容,如果未能解决你的问题,请参考以下文章
BLE 在将数据从 iOS 7.1 发送到 iOS 8 时花费了太多时间