Конвертировать BLE текущее время в дату - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь прочитать текущее время с устройства Bluetooth.

В настоящее время я получаю 10-байтовый массив, но я не уверен, как преобразовать его во что-то читаемое.

Здесьэто код, с которого я читаю.

private func printTime(from characteristic: CBCharacteristic) {
        guard let timeData = characteristic.value else { return }
        let byteArray = [UInt8](timeData)


        print("Time ",byteArray, "timeData ", timeData)
    }

Вот вывод.

Time  [224, 7, 1, 3, 4, 36, 5, 0, 0, 1] timeData  10 bytes

Вот характеристики, которые я получил для устройства по этой характеристике.

3.2.1.  Current Time        
3.2.1.1.    UUID:       2A2B
3.2.1.2.    Read:       Yes
3.2.1.3.    Write:      Yes
3.2.1.4.    Notify:     Yes
3.2.1.5.    Value:      byte[10]    
3.2.1.6.    Description:        0 – 1:  Year
                                2:  Month
                                3:  Day
                                4:  Hour
                                5:  Minute
                                6:  Seconds
                                7:  Day of Week
                                8:  256 Fractions of a Seconds
                                9:  Adjust Reason

Итак, я знаю, что год - 224, 7. Я предполагаю, что это 2016 год, но я не уверен, как преобразовать это в код.

1 Ответ

1 голос
/ 16 октября 2019

Чтобы преобразовать данные / байты в числовые типы, вы можете проверить это post

extension Numeric {
    init<D: DataProtocol>(_ data: D) {
        var value: Self = .zero
        let size = withUnsafeMutableBytes(of: &value, { data.copyBytes(to: $0)} )
        assert(size == MemoryLayout.size(ofValue: value))
        self = value
    }
}

extension DataProtocol {
    func value<N: Numeric>() -> N { .init(self) }
    var uint16: UInt16 { value() }
}

Теперь вы можете легко преобразовать байты в любойчисловой тип:

let timeData: [UInt8] = [224, 7, 1, 3, 4, 36, 5, 0, 0, 1]
let timeDate = DateComponents(calendar: .current,
                               timeZone: .current,
                               year: Int(timeData[0..<2].uint16),
                               month: Int(timeData[2]),
                               day: Int(timeData[3]),
                               hour: Int(timeData[4]),
                               minute: Int(timeData[5]),
                               second: Int(timeData[6])).date!
timeDate // "Jan 3, 2016 at 4:36 AM"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...