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
任何蓝牙专家都可以指导我,谢谢
简短版本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 = 0x80Run Code Online (Sandbox Code Playgroud)
通过使用位域乘法,属性可以具有多个值。例如,属性 0x30 是二进制的 00110000,这意味着通知+指示。您需要获取二进制数(8 位)并将二进制位从右到左放置在值列表中从上到下:
0 Broadcast
0 Read
0 WriteWithoutResponse
0 Write
1 Notify
1 Indicate
0 AuthenticatedSignedWrites
0 ExtendedPropertiesRun 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 个字节,一旦成功,您可以增加发送的字节,直到它停止工作,您就会知道已达到缓冲区限制。
| 归档时间: |
|
| 查看次数: |
2719 次 |
| 最近记录: |