使用 CoreBluetooth 配置信标
一些重点
- 不需要任何功能。
- iPhone 以 Little Endian 格式存储字节,因此请检查蓝牙配件是否也使用 Little Endian。例:
- intel CPU 通常使用小端。
- ARM 体系结构在版本 3 之前是小端,当它变成 big-endian 时。
- 在单个或批量操作之后,连接将丢失,因此你必须在继续之前重新连接。
扫描服务 UUID
func SearchBLE(){
cb_manager.scanForPeripherals(withServices:[service_uuid], options: nil)
StopSearchBLE()
}
如何在没有文档的情况下发现 SERVICE UUID
func centralManager(_ central: CBCentralManager, didConnect peripheral:
CBPeripheral) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
for service in peripheral.services! {
print("Service: \(service)\n error: \(error)")
}
}
-
discoverServices(nil)
- NIL 表示将返回所有服务,这不是一个好的选择。(阅读备注 3) -
如果你还没有找到 SERVICE UUID 运行代码并在控制台中查找
-
我发现有 3 项服务:电池,设备信息(固件)和 FFF0
-
这个 uuid 服务不是标准服务,标准列表可以在这里找到
-
在这种情况下,FFF0 是 SERVICE UUID
将数据转换为 UInt16,相反
将此扩展添加到你的类
protocol DataConvertible {
init?(data: Data)
var data: Data { get }
}
extension DataConvertible {
init?(data: Data) {
guard data.count == MemoryLayout<Self>.size else { return nil }
self = data.withUnsafeBytes { $0.pointee }
}
var data: Data {
var value = self
return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
}
extension UInt16 : DataConvertible {
init?(data: Data) {
guard data.count == MemoryLayout<UInt16>.size else { return nil }
self = data.withUnsafeBytes { $0.pointee }
}
var data: Data {
var value = CFSwapInt16HostToBig(self)
return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
}
}