我在 dart 中使用 BLE,我需要将 9 个字节发送到特定的特征,其中第一个字节是 5,剩余的是 epoch
Posted
技术标签:
【中文标题】我在 dart 中使用 BLE,我需要将 9 个字节发送到特定的特征,其中第一个字节是 5,剩余的是 epoch【英文标题】:I am working with BLE in dart, where I need to send 9 bytes to the specific characteristic , where first byte is 5 and remaining is epoch 【发布时间】:2021-08-27 13:00:24 【问题描述】:您好,我尝试将 9 个字节发送到特定特征,其中第一个字节是 0x05 ,即 5 ,接下来的 8 个字节作为纪元(以秒为单位),
我试过了,
List<int> timeDataForBLEWrite = [0x5, 0, 0, 0, 0, 0, 0, 0, 0 ]; // here 0 will be replaced by 8 bytes of epoch
为了在几秒钟内获得纪元,我尝试了这个,
int timestampEpochInSeconds = DateTime.now().millisecondsSinceEpoch ~/ 1000; // 1623331779
将纪元转换为字节我已经尝试过了,
List<int> bytes = utf8.encode(timestampEpochInSeconds.toString());
但在这里我得到 10 个字节,因为 timestampEpochInSeconds 是 1623331779 // 10 位
print(bytes); // [49, 54, 50, 51, 51, 51, 49, 55, 55, 57]
如何从秒纪元中获取 8 个整数,以便我可以向特征发送总共 9 个字节。如下图,
characteristic.write(timeDataForBLEWrite);
【问题讨论】:
【参考方案1】:我假设您不想要以字节为单位的字符串,而是以字节为单位的值。
蓝牙中的大多数数据都采用 Little Endian 格式,因此我将时间戳假设为字节。
我在 DartPad 上做了以下示例:
import 'dart:typed_data';
List<int> epoch()
var timestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;
var sendValueBytes = ByteData(9);
sendValueBytes.setUint8(0, 5);
// setUint64 not implemented on some systems so use setUint32 in
// those cases. Leading zeros to pad to equal 64 bit.
// Epoch as 32-bit good until 2038 Jan 19 @ 03:14:07
try
sendValueBytes.setUint64(1, timestamp.toInt(), Endian.little);
on UnsupportedError
sendValueBytes.setUint32(1, timestamp.toInt(), Endian.little);
return sendValueBytes.buffer.asUint8List();
void main()
print('Epoch Bytes (plus 0x05): $epoch()');
它给出了以下输出:
Epoch Bytes (plus 0x05): [5, 167, 60, 194, 96, 0, 0, 0, 0]
【讨论】:
嗨 ukBaz,我尝试编写带有 sendvalue 的characterisitcs,但它只需要 ListtimeDataForBLEWrite
列表有 9 个字节长,您可以看到打印出的值。如果您使用List<int> timeDataForBLEWrite = [5, 167, 60, 194, 96, 0, 0, 0, 0];
手动构建列表并发送它会发生什么?或以大端方式发送 ``List以上是关于我在 dart 中使用 BLE,我需要将 9 个字节发送到特定的特征,其中第一个字节是 5,剩余的是 epoch的主要内容,如果未能解决你的问题,请参考以下文章