#flutter #dart #bluetooth #type-conversion
Вопрос:
Я использую flutter_blue для связи с устройством Bluetooth. Мне нужно передать двойное значение на устройство Bluetooth с помощью метода записи flutter_blue ().
Значение должно быть передано методу в виде списка целых чисел, который, насколько я понимаю, должен представлять список байтов.
Метод записи flutter_blue:
Future<Null> write(
List<int> value,
{bool withoutResponse = false}
)
Существует ли способ преобразовать значение double в список целых чисел, который представляет значение double в виде списка байтов, чтобы передать его методу записи flutter_blues?
Например:
double value = 10.52;
List<Int> convertedValue = someConversionMethod(value);
await bluetoothCharacteristic.write(convertedValue);
Комментарии:
1. Итак, вы хотите
convertedValue
, чтобы значение было aList
только с преобразованным значением в качестве элемента ?2. Передавая a
double
как «список целых чисел», вы имеете в виду список байтов ? Непонятно, о чем вы просите.3. С помощью Bluetooth обычно передается информация в виде списка байтов(целых чисел). Это стандартная служба Bluetooth, в которую вы пытаетесь передать значения? Возможно, взгляните на Дополнение 4 к спецификации ГАТТ , особенно на раздел 2 «Ценности и представленные ценности», поскольку это может помочь ответить на некоторые из ваших вопросов
4. @jamesdlin Спасибо, что указали на это, я собираюсь отредактировать свой вопрос.
Ответ №1:
С помощью Bluetooth обычно передается информация в виде списка байтов(Uint8List). Решение для float
ценности состоит в том, чтобы иметь ожидаемый показатель. Более подробная информация содержится в Дополнении 4 к Спецификации ГАТТ, особенно в разделе 2 «Значения и представленные значения».
Если число достаточно велико, его нужно будет преобразовать в байты в формате little endian. В качестве примера:
import 'dart:typed_data';
import 'dart:math';
void main() {
double value = 10.52;
var rawValue = value * pow(10, 2); // multiply value to remove decimal places
print('Raw value to send: $rawValue'); // Raw value to send 1052
var sendValue = ByteData(2);
sendValue.setUint16(0, rawValue.toInt(), Endian.little);
print('As Uint8List of values: ${sendValue.buffer.asUint8List()}');
// As Uint8List of values: [28, 4]
}
Ответ №2:
Библиотека dart:typed_data содержит несколько полезных методов преобразования данных в байты. Этот метод сработал для меня.
import 'dart:typed_data';
List<int> doubleToListInt(double value) {
ByteData bytes = ByteData(8);
bytes.setFloat64(0, value);
List<int> response =
bytes.buffer.asInt8List().toList();
return response;
}
print(doubleToListInt(10.52)); // Returns [64, 37, 10, 61, 112, -93, -41, 10]