iOS CoreBluetooth打印CBService和CBCharacteristic

时间:2015-07-11 03:25:33

标签: ios swift printing core-bluetooth

我正在使用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("")
            }
            */
        }
    //}

}

,系统显示结果如下:

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

Char:发现char 字符:UUID电池电量 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 字符:UUID系统ID Char:发现char 字符:UUID制造商名称字符串 Char:发现char 字符:UUID BEF8D6C9-9C21-4C9E-B632-BD58C1009F9F

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

2 个答案:

答案 0 :(得分:2)

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

长版: 蓝牙热敏打印机(QSPrinter 5801 Bluetooth 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

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


0 Broadcast
0 Read
0 WriteWithoutResponse
0 Write
1 Notify
1 Indicate
0 AuthenticatedSignedWrites
0 ExtendedProperties

最后,我发现我可以使用以下命令成功写入任何一个特征:


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

//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个字节的开头,一旦发送成功,您可以增加发送的字节数,直到它停止工作,并且您将知道已达到缓冲区限制。

答案 1 :(得分:0)

尝试浅蓝色应用程序(iOS),然后一一找到适合您编写的特征。它具有从应用程序写入值的选项

Light Blue