Swift:如何从 Sensortag 2.0 设备恢复数据

Posted

技术标签:

【中文标题】Swift:如何从 Sensortag 2.0 设备恢复数据【英文标题】:Swift : How to recover data from a Sensortag 2.0 device 【发布时间】:2019-02-18 09:29:25 【问题描述】:

我需要您的帮助来了解如何从 Sensortag 2.0 设备中恢复数据。

我有以下信息:

传输:BLE

服务:f000fff0-0451-4000-b000-000000000000

特性:f000fff1-0451-4000-b000-000000000000

具有以下特征的通知: f000fff2-0451-4000-b000-000000000000

启动命令:0x73 或 0x53

结束命令:0x65 或 0x45

1 个数据包 20B​​yte

第二个字节作为判别码。

我的测试:

为了帮助我理解,我使用这个源代码: https://github.com/degtiarev/DataCollector

1) 在 Device.swift 文件中,我添加了这样的 UUID:

static let TestServiceUUID = "f000fff0-0451-4000-b000-000000000000"
static let TestCharacteristicsUUID = "f000fff1-0451-4000-b000-000000000000"
static let TestNotificationUUID = "f000fff1-0451-4000-b000-000000000000"

2) 在 CollectingDataVC.swift 上,我像这样更改了 sensorTagName:

let sensorTagName = "my-device"

3) 我添加了我的服务:

if let services = peripheral.services 
    for service in services 
        print("Discovered service \(service)")
        // If we found movement service, discover the characteristics for those services.
        if (service.uuid == CBUUID(string: Device.MovementServiceUUID)) ||
            (service.uuid == CBUUID(string: Device.TestServiceUUID)) ||
            (service.uuid == CBUUID(string: Device.ioserviceUUID)) || (service.uuid == CBUUID(string: Device.SimpleKeyUUID)) 
            peripheral.discoverCharacteristics(nil, for: service)
        
    

4)我添加了特征

for characteristic in characteristics 

    // Test
    if characteristic.uuid == CBUUID(string: Device.TestCharacteristicsUUID) 
        movementCharacteristics[peripheral.identifier.uuidString] = characteristic
        sensorTags[peripheral.identifier.uuidString]?.setNotifyValue(true, for: characteristic)
    

    if characteristic.uuid == CBUUID(string: Device.TestNotificationUUID) 
        movementCharacteristics[peripheral.identifier.uuidString] = characteristic
        sensorTags[peripheral.identifier.uuidString]?.setNotifyValue(true, for: characteristic)
    


该程序有效,因为我的设备已连接,并且我的控制台上有以下信息:

SENSOR TAG FOUND! ADDING NOW!!!
**** SUCCESSFULLY CONNECTED TO SENSOR TAG!!!


======= SERVICES ========
▿ Optional([<CBService: 0x1c0677a40, isPrimary = YES, UUID = Device Information>, <CBService: 0x1c0678180, isPrimary = YES, UUID = F000FFF0-0451-4000-B000-000000000000>])
  ▿ some: 2 elements
    - <CBService: 0x1c0677a40, isPrimary = YES, UUID = Device Information> #0
      - super: CBAttribute
        - super: NSObject
    - <CBService: 0x1c0678180, isPrimary = YES, UUID = F000FFF0-0451-4000-B000-000000000000> #1
      - super: CBAttribute
        - super: NSObject
==========


Discovered service <CBService: 0x1c0677a40, isPrimary = YES, UUID = Device Information>
Discovered service <CBService: 0x1c0678180, isPrimary = YES, UUID = F000FFF0-0451-4000-B000-000000000000>


======= CHARACTERISTICS ========
▿ 2 elements
  - <CBCharacteristic: 0x1c42a3c60, UUID = F000FFF1-0451-4000-B000-000000000000, properties = 0xA, value = (null), notifying = NO> #0
    - super: CBAttribute
      - super: NSObject
  - <CBCharacteristic: 0x1c42a4320, UUID = F000FFF2-0451-4000-B000-000000000000, properties = 0x12, value = (null), notifying = NO> #1
    - super: CBAttribute
      - super: NSObject
==========

4) 从这里开始,我不知道该怎么办。

我创建了一个“Hello World”:

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) 

  print("Hello World!")


但是这段代码永远不会被执行。 这是我在 swift 上的第一个程序,所以我需要一些帮助来理解和知道我必须做什么。

【问题讨论】:

【参考方案1】:

我已经检查了您正在使用的项目,他们已经给出了有关方法使用以及何时调用的描述:

 Invoked when you retrieve a specified characteristic’s value,
 or when the peripheral device notifies your app that the characteristic’s value has changed.

 This method is invoked when your app calls the readValueForCharacteristic: method,
 or when the peripheral notifies your app that the value of the characteristic for
 which notifications and indications are enabled has changed.

 If successful, the error parameter is nil.
 If unsuccessful, the error parameter returns the cause of the failure.

还有

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) 

上面的方法是CBPeripheralDelegate的委托方法

optional public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)

【讨论】:

感谢您的快速答复。确切地说,这个方法永远不会被调用 func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) print("Hello World!") 你为CBPeripheralDelegate设置了代理吗?

以上是关于Swift:如何从 Sensortag 2.0 设备恢复数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 2.0 中获取子数组

如何在带有USB 4.0 BLE Dongle的Windows桌面上使用TI Sensortag

如何在 Swift 2.0 中滑动删除核心数据表视图

使用 UIPanGestureRecognizer 从 CGRect 获取 UIView - Swift 2.0

核心数据和数组 swift 2.0

尝试使用 Photos Framework [Swift 2.0] 从 imagepickercontroller 检索 NSURL