gpt4 book ai didi

iOS CoreBluetooth打印CBService和CBCharacteristic

转载 作者:IT王子 更新时间:2023-10-29 05:53:24 28 4
gpt4 key购买 nike

我正在使用 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 电池电量字符:发现字符字符:UUID 2A06字符:发现字符字符:UUID 2A06字符:发现字符字符:UUID 2A47字符:发现字符字符:UUID 2A46字符:发现字符字符:UUID 2A48字符:发现字符字符:UUID 2A45字符:发现字符字符:UUID 2A44字符:发现字符字符:UUID 2A07字符:发现字符字符:UUID 2AF1字符:发现字符字符:UUID 2AF0字符:发现字符字符:UUID 系统 ID字符:发现字符Char: UUID 制造商名称字符串字符:发现字符字符:UUID BEF8D6C9-9C21-4C9E-B632-BD58C1009F9F

哪位蓝牙高手可以指导一下,谢谢

最佳答案

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

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

具有特征 2AF1 的服务 18F0 具有属性 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)


//使用特性 2AF1 和属性 WriteWithoutResponse
peripheral.writeValue(data, for: characteristic, type: CBCharacteristicWriteType.withoutResponse)


//使用具有属性写入的特性 BEF8D6C9-9C21-4C9E-B632-BD58C1009F9F
peripheral.writeValue(data, for: characteristic, type: CBCharacteristicWriteType.withResponse)

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

关于iOS CoreBluetooth打印CBService和CBCharacteristic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31353112/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com