首页 文章

从Swift写入BLE外设

提问于
浏览
1

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

什么有用?

  • 我能够启动设备扫描

  • 连接到设备

  • 收集BLE设备的服务和特性 - 一切都很好

问题出在哪儿?

  • BLE设备(Redbear Labs Duo)也有板载Wifi控制器,能够扫描可用的网络 . The documentation表示要扫描Wifi必须

  • 使用UUID连接到主服务3EC61400-89CD-49C3-A0D9-7A85669E901E

  • 使用UUID 3EC61401-89CD-49C3-A0D9-7A85669E901E查找命令特征

  • 向命令特征发送2字节命令[0x20,0xA0]

  • 还使用UUID 3EC61402-89CD-49C3-A0D9-7A85669E901E将1字节状态指示器0xB1设置为扫描特性

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

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?)
        }
    }

Update:

我设置了一堆调试语句,得到了以下输出 - 从下面可以看出

  • 我能够识别并连接到正确的设备和特性

  • 我能够适当地设置通知值

[DEBUG]连接到外围设备:547BC3C9-4823-431C-B888-A8F3E8C699F5 [DEBUG]连接到外围设备547BC3C9-4823-431C-B888-A8F3E8C699F5 [DEBUG]连接到外围设备[DEBUG]找到服务:3EC61400-89CD-49C3 -A0D9-7A85669E901E外设:547BC3C9-4823-431C-B888-A8F3E8C699F5 [DEBUG]发现特性:3EC61401-89CD-49C3-A0D9-7A85669E901E外设:547BC3C9-4823-431C-B888-A8F3E8C699F5 [DEBUG]发现特性:3EC61402 -89CD-49C3-A0D9-7A85669E901E用于外围设备:547BC3C9-4823-431C-B888-A8F3E8C699F5(“3EC61402-89CD-49C3-A0D9-7A85669E901E”,)(“3EC61401-89CD-49C3-A0D9-7A85669E901E”,)[DEBUG ] didUpdateNotification状态为特征CBC特性:0x1702a6c60,UUID = 3EC61401-89CD-49C3-A0D9-7A85669E901E,属性= 0x14,值=(null),通知= YES外设:CBPeripheral:0x1740fba80,identifier = 547BC3C9-4823-431C-B888 -A8F3E8C699F5,name = Duo-ZKBY,state = connected [DEBUG] didUpdate特征的通知状态:CBCharacteristic:0 x1742a3c60,UUID = 3EC61402-89CD-49C3-A0D9-7A85669E901E,properties = 0x10,value =(null),通知= YES外设:CBPeripheral:0x1740fba80,identifier = 547BC3C9-4823-431C-B888-A8F3E8C699F5,name = Duo- ZKBY,state = connected

1 回答

  • 2

    找到解决方案 - 在这里张贴以造福他人 .

    阅读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扫描开始时,扫描特性将发送值为 0xB1 的通知以指示扫描开始,然后发送值为 0xB2 的通知以指示扫描结束 .

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

相关问题