iOS CoreBluetooth打印CBService和CBCharacteristic

Kev*_*ang 8 printing ios core-bluetooth swift

我正在使用Swift开发iOS应用程序来集成蓝牙打印机以打印出信息.我已经使用了CoreBluetooth框架,但无法知道哪些服务,我可以写入打印输出值

//find CBService
func peripheral(peripheral: CBPeripheral!, didDiscoverServices error: NSError!) {
    //println("CBPeripheralDelegate didDiscoverServices")

    for service in peripheral.services {

        println("Service: Discover service \(service)")
        println("Service: UUID \(service.UUID) ")

        peripheral.discoverCharacteristics(nil, forService: service as! CBService)

    }
}

//find CBCharacteristics
func peripheral(peripheral: CBPeripheral!, didDiscoverCharacteristicsForService service: CBService!, error: NSError!) {

    //if service.UUID == CBUUID(string: "18F0"){
        for characteristic in service.characteristics {

            let chara: CBCharacteristic? = characteristic as? CBCharacteristic
            println("Char: service \(service.UUID) Discover char \(chara)")
            println("Char: UUID \(chara!.UUID)")

            peripheral.readValueForCharacteristic(chara)

            /*
            println("0")

            switch chara!.UUID {

            case CBUUID(string: "2AF1"):
                println("1")

                var rawArray:[UInt8] = [0x01];
                let data = NSData(bytes: &rawArray, length: rawArray.count)

                peripheral.writeValue(data, forCharacteristic: chara, type: CBCharacteristicWriteType.WithoutResponse)

            default: println("")
            }
            */
        }
    //}

}
Run Code Online (Sandbox Code Playgroud)

系统显示结果如下:

服务:发现服务服务:UUID电池服务:发现服务服务:UUID 1803服务:发现服务服务:UUID 1802服务:发现服务服务:UUID 1811服务:发现服务服务:UUID 1804服务:发现服务服务:UUID 18F0服务:发现服务服务:UUID设备信息服务:发现服务服务:UUID E7810A71-73AE-499D-8C15-FAA9AEF0C3F2

Char:发现char Char:UUID Battery Level Char:发现char char:UUID 2A06 Char:发现char char:UUID 2A06 Char:发现char Char:UUID 2A47 Char:发现char char:UUID 2A46 Char:发现char char:UUID 2A48 Char :发现char char:UUID 2A45 Char:发现char Char:UUID 2A44 Char:发现char Char:UUID 2A07 Char:发现char char:UUID 2AF1 Char:发现char char:UUID 2AF0 Char:发现char Char:UUID System ID Char:发现char Char:UUID制造商名称String Char:Discover char Char:UUID BEF8D6C9-9C21-4C9E-B632-BD58C1009F9F

任何蓝牙专家都可以指导我,谢谢

Gio*_*gio 5

简短版本Write只需写入任何具有属性或 特征的非标准服务WriteWithoutResponse。确保第一次写入少于 20 个字节,以避免超过缓冲区限制。

长版: 我的蓝牙热敏打印机(QSPrinter 5801 蓝牙 LE)也遇到了同样的问题,该打印机具有与此问题中的设备完全相同的服务和特性。我发现:

18F0有特色的服务2AF1有属性WriteWithoutResponse

E7810A71-73AE-499D-8C15-FAA9AEF0C3F2有特色的 服务BEF8D6C9-9C21-4C9E-B632-BD58C1009F9F有属性Read+Write+Notify+Indicate

(其中的Write意思是Write with response)。

这是特征属性的官方列表:

Broadcast = 0x01,
Read = 0x02,
WriteWithoutResponse = 0x04,
Write = 0x08,
Notify = 0x10,
Indicate = 0x20,
AuthenticatedSignedWrites = 0x40,
ExtendedProperties = 0x80
Run Code Online (Sandbox Code Playgroud)

通过使用位域乘法,属性可以具有多个值。例如,属性 0x30 是二进制的 00110000,这意味着通知+指示。您需要获取二进制数(8 位)并将二进制位从右到左放置在值列表中从上到下:


0 Broadcast
0 Read
0 WriteWithoutResponse
0 Write
1 Notify
1 Indicate
0 AuthenticatedSignedWrites
0 ExtendedProperties
Run Code Online (Sandbox Code Playgroud)

最后我发现我可以使用以下方法成功写入任一特征:


let bytesToPrint: [UInt8] = [27, 64, 10, 10, 10, 99, 105, 97, 111, 10, 10, 10]
let data = Data(bytes: bytesToPrint)
Run Code Online (Sandbox Code Playgroud)

//Using Characteristic 2AF1 with Properties WriteWithoutResponse peripheral.writeValue(data, for: characteristic, type: CBCharacteristicWriteType.withoutResponse)

//Using Characteristic BEF8D6C9-9C21-4C9E-B632-BD58C1009F9F with Properties Write peripheral.writeValue(data, for: characteristic, type: CBCharacteristicWriteType.withResponse)

问题是我同时发送了太多字节的数据。每个蓝牙低功耗设备都有不同的缓冲区大小。我听说有人发现设备的缓冲区限制为 20、40、100、400 字节。在我的例子中,限制是 100,所以一旦我开始发送少于 100 个字节,蓝牙设备就会正确反应。我的建议是尝试先发送少于 20 个字节,一旦成功,您可以增加发送的字节,直到它停止工作,您就会知道已达到缓冲区限制。


Max*_*aev 0

尝试浅蓝色应用程序(iOS),您\xe2\x80\x99将一一找到合适的特征来书写。它可以选择从应用程序写入值

\n\n

浅蓝色

\n