Декодирование необработанного флаттера данных Ble

Я разрабатываю приложение flutter, используя библиотеку flutter_blue для взаимодействия с плиткой BlueNRG от STMicroelectronics. Я получаю необработанные данные из желаемых характеристик, после чего я могу преобразовать их в строку с помощью функции utf8.decode ().

Это полученные данные в виде списка и проблема.

I/flutter (32277): Teste conversion : [121, 85, 0, 0, 209, 133, 1, 0, 5, 10, 237, 0, 0, 0]
E/flutter (32277): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: FormatException: Missing extension byte (at offset 11).

код с платы in st:

tBleStatus Environmental_Update(int32_t Press,int32_t Press2,uint16_t Hum, int16_t Temp,int16_t Temp2) {
    uint8_t BuffPos = 0;

    STORE_LE_16(buff, (getTimestamp()));
    BuffPos = 2;

    STORE_LE_32(buff + BuffPos, Press);
    BuffPos += 4;

    STORE_LE_16(buff + BuffPos, Hum);
    BuffPos += 2;

    STORE_LE_16(buff + BuffPos, Temp);
    BuffPos += 2;
    STORE_LE_16(buff + BuffPos, Temp2);
    

    return aci_gatt_update_char_value(HWServW2STHandle, EnvironmentalCharHandle, 0, EnvironmentalCharSize, buff);

}

Environmental_Update(PressToSend,PressToSend2, HumToSend, TempToSend,TempToSend2);

Спасибо.


person thilor    schedule 22.04.2021    source источник


Ответы (1)


Вы не можете преобразовать свои данные RAW в строку, потому что вы отправляете их не как строку, а в виде байтов.

Возьмем, к примеру, вашу температуру: вы получаете температуру как int16_t, 16-битное число, хранящее значения от –32768 до 32767. Это число требует сохранения двух байтов, поэтому вы использовали BuffPos += 2; и увеличили позицию на 2 байта.

Вам нужно таким же образом, побайтно, извлечь значения из полученного массива. Взгляните на этот пример:

import 'dart:typed_data';

int fromBytesToInt16(int b1, int b0) {
    final int8List = new Int8List(2)
      ..[1] = b1
      ..[0] = b0;
  
    return ByteData.sublistView(int8List).getInt16(0);
}

void main() {
    var received = [121, 85, 0, 0, 209, 133, 1, 0, 5, 10, 237, 0, 0, 0];
    var temp = fromBytesToInt16(received[8], received[9]) / 100;
    print('temperature: $temp');
}

Температура хранилась как int16 с индексами 8 и 9, поэтому я преобразовал ее таким же образом. В результате получается temp значение 2565, которое при делении на 100 дает довольно приятную температуру 25,65 градуса.

person Michael Kotzjan    schedule 23.04.2021