Bluetooth 如何在蓝牙低能耗外设中正确设置日期和时间?

Bluetooth 如何在蓝牙低能耗外设中正确设置日期和时间?,bluetooth,bluetooth-lowenergy,Bluetooth,Bluetooth Lowenergy,我正在开发一个传感器设备和一个相应的iOS应用程序,它将使用蓝牙低能量进行通信。传感器设备需要在实时时钟中保持当前日期和时间。现在,如果我想尽可能多地实施蓝牙标准服务,我不知道在传感器设备中设置时间和日期的正确方法是什么,因为官方文档相互矛盾: 在“当前时间服务”中,它表示“当前时间”特性可以选择性地写入。这意味着GATT客户端(即智能手机)可以通过写入此特征来简单地设置传感器的时间 然而,在关于这项服务的报告中,它说,禁止以这种特征写作 与详细规范(2011年)相比,Service Vie

我正在开发一个传感器设备和一个相应的iOS应用程序,它将使用蓝牙低能量进行通信。传感器设备需要在实时时钟中保持当前日期和时间。现在,如果我想尽可能多地实施蓝牙标准服务,我不知道在传感器设备中设置时间和日期的正确方法是什么,因为官方文档相互矛盾:

  • 在“当前时间服务”中,它表示“当前时间”特性可以选择性地写入。这意味着GATT客户端(即智能手机)可以通过写入此特征来简单地设置传感器的时间
  • 然而,在关于这项服务的报告中,它说,禁止以这种特征写作
与详细规范(2011年)相比,Service Viewer中的信息(2014年)要新得多,因此可以安全地假设详细规范没有更新吗

尽管进行了大量的在线研究,我还是找不到任何有人在BT-LE传感器中设置当前日期和时间的例子


关于最好的方式是什么,有什么线索吗?

在iOS手机上启动计时服务。 将时间从手机(通过服务显示)读入传感器。(为此,您的iPHone充当外围设备) 在这种情况下,传感器充当主传感器。 从iPhone获取数据并将其设置到传感器中。
我希望您可以为传感器编码。

当前时间服务旨在提供当前时间;客户会用它来获取时间。因此,让客户机向其写入数据实际上没有意义。如果您的设备没有实时时钟,则无法提供时间服务。如果您的设备需要时间且没有RTC,则您的设备必须成为另一台可以提供RTC的设备的客户端。

我已经实现了这一点,它将在我这边工作

let date = Date()
let calendar = Calendar.current
var comp = calendar.dateComponents([.day, .month, .year, .hour, .minute, .second, .weekday, .nanosecond], from: date)
let milisecond = comp.nanosecond!/1000000
let quiterValue = milisecond/256
let year_mso = comp.year! & 0xFF
let year_lso = (comp.year! >> 8) & 0xFF
let ajjust_reason = 1

let timeZone = calendar.component(.timeZone, from: date)
let DSTZoon = Calendar.current.timeZone.isDaylightSavingTime()

let Year_MSO_Unsinged = Int8(bitPattern: UInt8(year_mso))
let Year_LSO_Unsinged = Int8(bitPattern: UInt8(year_lso))
let MONTH_Unsinged = Int8(bitPattern: UInt8(comp.month!))
let DAY_Unsinged = Int8(bitPattern: UInt8(comp.day!))
let HOUR_Unsinged = Int8(bitPattern: UInt8(comp.hour!))
let MINUTE_Unsinged = Int8(bitPattern: UInt8(comp.minute!))
let SECOND_Unsinged = Int8(bitPattern: UInt8(comp.second!))
let WEEKDAY_Unsinged = Int8(bitPattern: UInt8(comp.weekday!))
let QUITERVALUE_Unsinged = Int8(bitPattern: UInt8(quiterValue))
let AJRSON_Unsinged = Int8(bitPattern: UInt8(ajjust_reason))

//Current Time Write on tag

let currentTimeArray = [Year_MSO_BYTE, Year_LSO_BYTE, MONTH_BYTE, DAY_BYTE ,HOUR_BYTE ,MINUTE_BYTE ,SECOND_BYTE , WEEKDAY_BYTE , QUITERVALUE_BYTE , AJRSON_BYTE];
let currentTimeArray_data = NSData(bytes: currentTimeArray, length: currentTimeArray.length)
if Device.Current_Time != nil {
       deviceValue.peripheral.writeValue(currentTimeArray_data as Data, for:    GrillRightDevice.Current_Time!, type: CBCharacteristicWriteType.withResponse)
}

无论如何,你都必须编写一个应用程序来与设备对话,所以你使用哪种方法都无关紧要;您可以更新当前时间服务属性,也可以定义自己的属性。据我所知,iOS本机支持当前时间特性服务器实现。因此,如果在您的传感器设备中,如果您实现了当前时间特征客户端,那么您将在当前时间服务规范v1.0中收到每分钟的时间更新(如果您的设备已绑定),不允许写入到日期时间特征。更高版本V1.1将写支持指定为可选。如上@HarryQ所述,in-write是一个选项。