我在 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,但它只需要 List 所以我用characteristic.write(sendValue.buffer.asUint8List());以下是读取特性的值,在发送字节之前 - [ 58, 0, 0, 0, 0, 0, 0, 0, 0 ] 写入之后 - [ 5, 49, 171, 195, 96, 0, 0, 0 , 0 ] 读取后 - [ 58 , 49 ] 我需要从 epoch 总共 8 个字节,我不确定 sendValue.setUint32(1, timestamp.toInt(), Endian.little);将给出 8 个字节,因为当我 print(sendValue.lengthInBytes); /// 我得到了 9,包括 (0,5) 第一个索引。 要将整数转换为 8 个字节,您可以使用 setUint64。这不是在 DartPad 操场上实现的,但是因为 epoch 的值将适合 4 个字节,所以 setUint32 已经足够好了。 timeDataForBLEWrite 列表有 9 个字节长,您可以看到打印出的值。如果您使用List&lt;int&gt; timeDataForBLEWrite = [5, 167, 60, 194, 96, 0, 0, 0, 0]; 手动构建列表并发送它会发生什么?或以大端方式发送 ``List timeDataForBLEWrite = [5, 0, 0, 0, 0, 96, 196, 69, 52];`? 嗨 ukBaz,当我使用 setUint64 时,我在 1 索引中只得到一个字节,即在 9 中我在第 0 和第 1 索引中有值,我要求我将 epoch 转换为等于8 个字节,总共 9 个字节,包括第 0 个索引中的 5 个字节 请您使用您现在拥有的代码和您收到的任何错误消息更新问题。我不明白为什么我在答案中发布的代码在 dartpad.dev 上对我有用,但对你不起作用

以上是关于我在 dart 中使用 BLE,我需要将 9 个字节发送到特定的特征,其中第一个字节是 5,剩余的是 epoch的主要内容,如果未能解决你的问题,请参考以下文章

在 Internet Explorer 9 中进行 Dart HTML5 拖放

BLE 中的心率值

多个或单个 BLE 服务

了解循环功率测量的 BLE 特性值 0x2A63

无法通过 BLE 连接到 AirPods

您将如何进行智能手机 BLE 室内检测和定位? [关闭]