我正在使用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
任何蓝牙专家都可以指导我,谢谢
答案 0 :(得分:2)
简短版本
只需写入具有特性Write
或WriteWithoutResponse
的特征的任何非标准服务即可。请确保第一次写入少于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)