在 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 设备。但是,我无法使用这种方式向这个外部设备发送和接收数据。

正如本演示中所述,我使用CBPeripheralManagerCBCentralManager 使用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 时花费了太多时间

ios 核心蓝牙与外部 BLE 设备配对

iOS 在后台模式下从广告中省略制造商数据

iOS 制作 iBeacon 相关SDK,在程序杀死后无法收到本地通知

iOS Ble开发丢包问题

将数据从 iOS 应用程序发送到外部连接的非 iOS 设备