如何在 Swift iOS App 中从 Arduino 读取 0-1023 传感器值
How to read 0-1023 sensor value from Arduino in Swift iOS App
我有一个 Arduino BLE 设备发送传感器模拟读取 0-1023 的 int 值。我可以使用 LightBlue 应用程序读取值并使用小端读取特征。在我的 iOS Swift 应用程序中,我可以连接到外围设备并读取我的自定义 UUID 特征并报告它实际上正在接收数据,但我不知道如何打印它调试 window 中的数据。它只说“收到的价值”。最终我想在应用程序 UI 的 UI 文本字段中显示该数据。这是 'didUpdateValueFor' 代码:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
var characteristicFUELValue = NSString()
guard rxFuelCharacteristic == characteristic,
let rxFuelCharacteristic = characteristic.value,
let dataString = NSString(data: rxFuelCharacteristic, encoding: String.Encoding.utf8.rawValue) else { return }
characteristicFUELValue = dataString
print("Value Recieved: \((characteristicFUELValue as String))")
NotificationCenter.default.post(name:NSNotification.Name(rawValue: "Notify"), object: "\((characteristicFUELValue as String))")
}
这是调试 window 读数:
已开机。
函数:centralManager(:didDiscover:advertisementData:rssi:),行:160
发现外围设备:
函数:centralManager( :didDiscover:advertisementData:rssi:),行:160
发现重复。
发现外围设备:
找到 1 个特征。
我的特征:D1DF5080-8938-11EC-A8A3-0242AC120002
函数:外设(_:didUpdateNotificationStateFor:error:),行:297
订阅的特征值
已订阅。通知已开始:D1DF5080-8938-11EC-A8A3-0242AC120002
收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:
如有任何帮助,我们将不胜感激。谢谢
您提到您想要将值 读取为 Int,但在代码中您试图将值 读取为字符串。
如果您确定您的数据至少有 2 个字节,请将其读取为 UInt16:
let fuelValue: UInt16 = rxFuelCharacteristic.withUnsafeBytes { [=12=].load(as: UInt16.self) }
如果您不确定数据大小,我建议使用 readFuelValue()
功能实现数据扩展,这里是 playground:
import Foundation
extension Data {
func readFuelValue() -> UInt? {
if count >= 2 {
return UInt(withUnsafeBytes { [=10=].load(as: UInt16.self) })
} else if count == 1 {
return UInt(withUnsafeBytes { [=10=].load(as: UInt8.self) })
} else {
return nil
}
}
}
func demo(_ bytes: [UInt8]) {
let data = Data(bytes)
let fuelValue = data.readFuelValue()
print("\(bytes) => \(fuelValue)")
}
demo([])
demo([0])
demo([5])
demo([0x00, 0x00])
demo([0x09, 0x00])
demo([0xFF, 0x00])
demo([0x00, 0x01])
demo([0x00, 0x02])
demo([0x01, 0x02])
demo([0x01, 0x02, 150])
输出为:
[] => nil
[0] => Optional(0)
[5] => Optional(5)
[0, 0] => Optional(0)
[9, 0] => Optional(9)
[255, 0] => Optional(255)
[0, 1] => Optional(256)
[0, 2] => Optional(512)
[1, 2] => Optional(513)
[1, 2, 150] => Optional(513)
我有一个 Arduino BLE 设备发送传感器模拟读取 0-1023 的 int 值。我可以使用 LightBlue 应用程序读取值并使用小端读取特征。在我的 iOS Swift 应用程序中,我可以连接到外围设备并读取我的自定义 UUID 特征并报告它实际上正在接收数据,但我不知道如何打印它调试 window 中的数据。它只说“收到的价值”。最终我想在应用程序 UI 的 UI 文本字段中显示该数据。这是 'didUpdateValueFor' 代码:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
var characteristicFUELValue = NSString()
guard rxFuelCharacteristic == characteristic,
let rxFuelCharacteristic = characteristic.value,
let dataString = NSString(data: rxFuelCharacteristic, encoding: String.Encoding.utf8.rawValue) else { return }
characteristicFUELValue = dataString
print("Value Recieved: \((characteristicFUELValue as String))")
NotificationCenter.default.post(name:NSNotification.Name(rawValue: "Notify"), object: "\((characteristicFUELValue as String))")
}
这是调试 window 读数:
已开机。
函数:centralManager(:didDiscover:advertisementData:rssi:),行:160
发现外围设备:
函数:外设(_:didUpdateNotificationStateFor:error:),行:297 订阅的特征值 已订阅。通知已开始:D1DF5080-8938-11EC-A8A3-0242AC120002 收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:收到的价值:
如有任何帮助,我们将不胜感激。谢谢
您提到您想要将值 读取为 Int,但在代码中您试图将值 读取为字符串。
如果您确定您的数据至少有 2 个字节,请将其读取为 UInt16:
let fuelValue: UInt16 = rxFuelCharacteristic.withUnsafeBytes { [=12=].load(as: UInt16.self) }
如果您不确定数据大小,我建议使用 readFuelValue()
功能实现数据扩展,这里是 playground:
import Foundation
extension Data {
func readFuelValue() -> UInt? {
if count >= 2 {
return UInt(withUnsafeBytes { [=10=].load(as: UInt16.self) })
} else if count == 1 {
return UInt(withUnsafeBytes { [=10=].load(as: UInt8.self) })
} else {
return nil
}
}
}
func demo(_ bytes: [UInt8]) {
let data = Data(bytes)
let fuelValue = data.readFuelValue()
print("\(bytes) => \(fuelValue)")
}
demo([])
demo([0])
demo([5])
demo([0x00, 0x00])
demo([0x09, 0x00])
demo([0xFF, 0x00])
demo([0x00, 0x01])
demo([0x00, 0x02])
demo([0x01, 0x02])
demo([0x01, 0x02, 150])
输出为:
[] => nil
[0] => Optional(0)
[5] => Optional(5)
[0, 0] => Optional(0)
[9, 0] => Optional(9)
[255, 0] => Optional(255)
[0, 1] => Optional(256)
[0, 2] => Optional(512)
[1, 2] => Optional(513)
[1, 2, 150] => Optional(513)