iOS swift 将 BLE 数据传递给单独的 class 函数
iOS swift passing BLE data to a separate class function
我确定这已在某处得到解答,但我不确定要搜索什么。我正处于一个简单的 BLE iOS 应用程序的早期阶段,并试图弄清楚如何将传入的 BLE 数据传输到一个单独的函数。来自 BLE 的数据正在转换成数组,但我相信不可能将其发送到不同的函数。我尝试将其作为字符串发送,但似乎无法将字符串分解为数组。
有人可以建议将传入的 BLE 数据传输到单独的函数的最有效方法是什么吗?
这是func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
中的代码:
// Decode the incoming BLE into bytes
let data2 = characteristic.value
let count = (data2?.count)! / MemoryLayout<UInt8>.size
var array = [UInt8](repeating: 0, count: count)
data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size)
// Transfer the incoming BLE data to a sepurate class to decode
var stringFromData = String(data: characteristic.value!, encoding: String.Encoding.ascii)
// How to transfer the incoming BLE data to a sepurate class?
BLE_Element_One_DataExtract_class.DummyFunc(_IncomingElementOneData: stringFromData!, _IncomingUUID: characteristic.uuid)
print("BLE incoming data in an array = ")
let x=0
for x in array
{
print("\(array) BLE data \n")
}
// Separate class and function to decode the BLE data and store in the MVVM
// This code does not work, as it does not treat the incoming data as a string
class BLE_Element_One_DataExtract
{
func DummyFunc(_IncomingElementOneData:String, _IncomingUUID:CBUUID)
{
let data
let data2 = _IncomingElementOneData
let count = (data2?.count)! / MemoryLayout<UInt8>.size
var array = [UInt8](repeating: 0, count: count)
data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size)
print("data is -> : ", terminator : "")
if(_IncomingUUID.isEqual(CBUUIDs.ECHO_DISPLAY_ELEMENT_STATUS_ONE_UUID_CHAR))
{
print ("Found ECHO_DISPLAY_ELEMENT_STATUS_ONE_UUID_CHAR inner func")
// BLE_Element_One_DataExtract(?? send data string ??)
}
}
}
我想你想将 characteristic.value
(它的类型为 Data?
)转换为 String
.
类型的变量
你提到你想要 String
,但在代码中你也使用 [UInt8]
,所以我不确定我是否理解你想要做什么。
您已经实现了使用 func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
侦听更新并从 characteristic.value
读取传入数据,因此仍然需要将数据转换为所需的类型。
转换示例(如果characteristic.value为nil,或转换错误,结果将为空字符串):
let data = characteristic.value ?? Data()
let stringValue = String(data: data, encoding: .utf8) ?? ""
// pass stringValue where you need it
您还可以使用类型 Data?
“按原样”将数据传递给目标函数,因此目标函数的工作将决定如何处理它:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
DataDestinationClass.doSomething(data: characteristic.value, uuid: characteristic.uuid)
}
class DataDestinationClass {
static func doSomething(data: Data?, uuid: CBUUID) {
let stringValue = String(data: data ?? Data(), encoding: .utf8) ?? ""
print("MYLOG: stringValue = '\(stringValue)'")
}
}
这里是将收到的 characteristic.value
放入文本字段的示例:https://github.com/alexanderlavrushko/BLEProof-collection/blob/5cbb089dbfed42cfb8aad0db236a376ff1cce620/iOS/BLEProofCentral/BLEProofCentral/BLECentralViewController.swift#L295
“从 BLE 传入的数据正在转换为数组,但我认为不可能将其发送到不同的函数。”
不,将数据数组传递给另一个函数很简单:
// Your code
var array = [UInt8](repeating: 0, count: count)
data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size)
// At this point you can simply pass your array to another
// function (which could be in a different class)
otherClass.processData(data: array)
接收数据的 class / 函数可能看起来像这样:
class OtherClass {
func processData(data: [UInt8]) {
// Do something with your data
}
}
我确定这已在某处得到解答,但我不确定要搜索什么。我正处于一个简单的 BLE iOS 应用程序的早期阶段,并试图弄清楚如何将传入的 BLE 数据传输到一个单独的函数。来自 BLE 的数据正在转换成数组,但我相信不可能将其发送到不同的函数。我尝试将其作为字符串发送,但似乎无法将字符串分解为数组。
有人可以建议将传入的 BLE 数据传输到单独的函数的最有效方法是什么吗?
这是func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
中的代码:
// Decode the incoming BLE into bytes
let data2 = characteristic.value
let count = (data2?.count)! / MemoryLayout<UInt8>.size
var array = [UInt8](repeating: 0, count: count)
data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size)
// Transfer the incoming BLE data to a sepurate class to decode
var stringFromData = String(data: characteristic.value!, encoding: String.Encoding.ascii)
// How to transfer the incoming BLE data to a sepurate class?
BLE_Element_One_DataExtract_class.DummyFunc(_IncomingElementOneData: stringFromData!, _IncomingUUID: characteristic.uuid)
print("BLE incoming data in an array = ")
let x=0
for x in array
{
print("\(array) BLE data \n")
}
// Separate class and function to decode the BLE data and store in the MVVM
// This code does not work, as it does not treat the incoming data as a string
class BLE_Element_One_DataExtract
{
func DummyFunc(_IncomingElementOneData:String, _IncomingUUID:CBUUID)
{
let data
let data2 = _IncomingElementOneData
let count = (data2?.count)! / MemoryLayout<UInt8>.size
var array = [UInt8](repeating: 0, count: count)
data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size)
print("data is -> : ", terminator : "")
if(_IncomingUUID.isEqual(CBUUIDs.ECHO_DISPLAY_ELEMENT_STATUS_ONE_UUID_CHAR))
{
print ("Found ECHO_DISPLAY_ELEMENT_STATUS_ONE_UUID_CHAR inner func")
// BLE_Element_One_DataExtract(?? send data string ??)
}
}
}
我想你想将 characteristic.value
(它的类型为 Data?
)转换为 String
.
你提到你想要 String
,但在代码中你也使用 [UInt8]
,所以我不确定我是否理解你想要做什么。
您已经实现了使用 func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
侦听更新并从 characteristic.value
读取传入数据,因此仍然需要将数据转换为所需的类型。
转换示例(如果characteristic.value为nil,或转换错误,结果将为空字符串):
let data = characteristic.value ?? Data()
let stringValue = String(data: data, encoding: .utf8) ?? ""
// pass stringValue where you need it
您还可以使用类型 Data?
“按原样”将数据传递给目标函数,因此目标函数的工作将决定如何处理它:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
DataDestinationClass.doSomething(data: characteristic.value, uuid: characteristic.uuid)
}
class DataDestinationClass {
static func doSomething(data: Data?, uuid: CBUUID) {
let stringValue = String(data: data ?? Data(), encoding: .utf8) ?? ""
print("MYLOG: stringValue = '\(stringValue)'")
}
}
这里是将收到的 characteristic.value
放入文本字段的示例:https://github.com/alexanderlavrushko/BLEProof-collection/blob/5cbb089dbfed42cfb8aad0db236a376ff1cce620/iOS/BLEProofCentral/BLEProofCentral/BLECentralViewController.swift#L295
“从 BLE 传入的数据正在转换为数组,但我认为不可能将其发送到不同的函数。”
不,将数据数组传递给另一个函数很简单:
// Your code
var array = [UInt8](repeating: 0, count: count)
data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size)
// At this point you can simply pass your array to another
// function (which could be in a different class)
otherClass.processData(data: array)
接收数据的 class / 函数可能看起来像这样:
class OtherClass {
func processData(data: [UInt8]) {
// Do something with your data
}
}