【问题标题】:Writing to BLE peripheral from Swift从 Swift 写入 BLE 外围设备
【发布时间】:2017-04-23 02:32:21
【问题描述】:

我正在构建一个连接到BLE device (Redbear Labs Duo) 的 iOS Swift 应用程序。

什么有效?

  1. 我可以启动设备扫描
  2. 连接到设备
  3. 收集 BLE 设备的服务和特性 - 一切正常

问题出在哪里?

  1. BLE 设备 (Redbear Labs Duo) 还具有板载 Wifi 控制器,并且能够扫描可用网络。 The documentation 表示要扫描 Wifi 必须
    • 使用 UUID 3EC61400-89CD-49C3-A0D9-7A85669E901E 连接到主服务
    • 找到 UUID 3EC61401-89CD-49C3-A0D9-7A85669E901E 的命令特征
    • 向命令特征发送一个 2 字节的命令 [0x20, 0xA0]
    • 还将一个 1 字节状态指示器 0xB1 设置为 UUID 3EC61402-89CD-49C3-A0D9-7A85669E901E 的扫描特性

我执行上述步骤的代码如下..

func scanWifi() {
    print("[DEBUG] - Scanning for Wifi")

    let command:[UInt8] = [0x02, 0xA0]
    let commandData = NSData(bytes: command, length: command.count)
    BLE.sharedInstance.write(toCharacteristic: BLE.sharedInstance.RBL_CHAR_CMD_UUID, data: commandData, withType: .withResponse)

    let state:[UInt8] = [0xB1]
    let stateData = NSData(bytes: state, length: state.count)
    BLE.sharedInstance.write(toCharacteristic: BLE.sharedInstance.RBL_CHAR_SCN_UUID, data: stateData, withType: .withResponse)

    BLE.sharedInstance.read(fromCharacteristic: BLE.sharedInstance.RBL_CHAR_SCN_UUID)
}

一切正常......但是......在将上述数据写入外围设备后,我期待下面的方法被调用 - 它从来没有......我做错了什么?

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
        if error != nil {

            print("[ERROR] Error updating value. \(error!.localizedDescription)")
            return
        }

        if characteristic.uuid.uuidString == RBL_CHAR_CMD_UUID {

            self.delegate?.bleDidReceiveData(data: characteristic.value as NSData?)
        }
    }

更新:

我设置了一堆调试语句并得到以下输出 - 从下面很明显

  1. 我能够识别并连接到正确的设备和特征
  2. 我可以适当地设置通知值

[DEBUG] 连接外设:547BC3C9-4823-431C-B888-A8F3E8C699F5
[调试] 连接外设 547BC3C9-4823-431C-B888-A8F3E8C699F5
[DEBUG] 是否连接到外围设备
[调试] 发现服务:3EC61400-89CD-49C3-A0D9-7A85669E901E 外围设备:547BC3C9-4823-431C-B888-A8F3E8C699F5
[调试] 发现特性:3EC61401-89CD-49C3-A0D9-7A85669E901E 外围设备:547BC3C9-4823-431C-B888-A8F3E8C699F5
[调试] 发现特性:3EC61402-89CD-49C3-A0D9-7A85669E901E 外围设备:547BC3C9-4823-431C-B888-A8F3E8C699F5
("3EC61402-89CD-49C3-A0D9-7A85669E901E",)
("3EC61401-89CD-49C3-A0D9-7A85669E901E",)
[DEBUG] 特征 CBCharacteristic 的 didUpdateNotification 状态:0x1702a6c60,UUID = 3EC61401-89CD-49C3-A0D9-7A85669E901E,属性 = 0x14,值 =(null),通知 = 是外围设备:CBPeripheral:0x1740fba80,标识符 = 5431C9-4832 -B888-A8F3E8C699F5,名称 = Duo-ZKBY,状态 = 已连接
[DEBUG] 特性的 didUpdateNotification 状态:CBCharacteristic:0x1742a3c60,UUID = 3EC61402-89CD-49C3-A0D9-7A85669E901E,属性 = 0x10,值 =(null),外围设备上的通知 = YES:CBPeripheral:0x1740fba80,标识符 = 547BC3C9-482 431C-B888-A8F3E8C699F5,名称 = Duo-ZKBY,状态 = 已连接

【问题讨论】:

  • 快速查看文档,似乎特性支持notify,而不是read,因此您需要在外围设备上调用setNotifyValue
  • 我打电话给setNotifyValue - 做了更多研究,我的问题与这里的问题类似 - stackoverflow.com/questions/31275013/… - 但不同之处在于我使用制造商提供的 iOS 应用程序测试了设备它确实所有的工作。我犯了什么错误,没有给我设备的响应
  • 您是否将您的对象设置为外围设备的delegate
  • 您好@Paulw11 - 是的,我已在didConnect peripheral 方法中将该对象设置为外围委托。另请参阅我在上面包含的其他调试输入
  • 我想我明白了。文档指出,当我向 Command 特征写入 2 个字节时,必须写入 withoutResponse。我在写withResponse。此外,扫描特性仅用于通知,没有其他用途。

标签: ios swift bluetooth-lowenergy


【解决方案1】:

找到解决方案 - 在此处发布以帮助他人。

通读Redbear Labs提供的文档,需要注意的关键是Command特性只支持两种类型的属性——PROPERTY_WRITE_NO_RESPONSE | PROPERTY_NOTIFY

同样扫描特性只支持PROPERTY_NOTIFY

另外,要让设备扫描所有可用的 Wifi - 我们应该只向命令特征写入一个 2 字节的命令 [0x20, 0xA0] - 相同的代码如下

func scanWifi() {
        print("[DEBUG] - Scanning for Wifi")

        let command:[UInt8] = [0x02, 0xA0]
        let commandData = NSData(bytes: command, length: command.count)
        BLE.sharedInstance.writeTo(characteristic: BLE.sharedInstance.RBL_CHAR_CMD_UUID, data: commandData, withType: .withoutResponse)
}

无需将任何内容写入扫描特征。当 Wifi 扫描开始时,Scan 特性将发送一个值为0xB1 的通知以指示扫描开始,然后发送一个值为0xB2 的通知以指示扫描结束。

扫描的实际 Wifi 网络将通过命令特征本身的通知发送。

【讨论】:

    【解决方案2】:

    调用后

    peripheral.writeValue(dataToWrite, for: char, type: .withResponse)
    

    你需要在这个委托函数中调用读取:

    func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
    
    // Call your read functions here. 
         BLE.sharedInstance.read(fromCharacteristic: BLE.sharedInstance.RBL_CHAR_SCN_UUID)
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2017-02-08
      • 1970-01-01
      • 2020-01-18
      • 2017-01-24
      • 2020-10-15
      相关资源
      最近更新 更多