如何使用 react-native-ble-manager 读取通用访问服务/特征

Posted

技术标签:

【中文标题】如何使用 react-native-ble-manager 读取通用访问服务/特征【英文标题】:How to read Generic Access service/characteristics using react-native-ble-manager 【发布时间】:2020-09-18 09:04:30 【问题描述】:

我在 android 10 上有一个使用 react native 构建的客户端应用

Android SDK:
  API Levels: 23, 28
  Build Tools: 28.0.3
react: ^16.9.0 => 16.9.0
react-native: ^0.62.2 => 0.62.2

什么有效: 服务发现 连接 自定义(128 位)特性的读取/写入/通知

什么不起作用: 读取通用访问服务0x1800的特征

服务发现: BleManager.retrieveServices /snip/ “特征”:[“特征”:“2a00”,“属性”:[对象],“服务”:“1800”, 这是完整的设备名称特征。

我可以使用任何 BLE 客户端应用程序读取它,例如LightBlue,所以服务器端工作。

我已尝试读取 16 位短 UUID:

    BleManager.read(peripheral.id, 
      '1800', 
      '2a00').then((readData) => 
      console.log(readData);          
    ).catch((error) => 
      console.log(error); 
    );

还有完整的 128b 版本:

BleManager.read(peripheral.id, 
  '00001800-0000-1000-8000-00805f9b34fb', 
  '00002a00-0000-1000-8000-00805f9b34fb').then((readData) => 
  console.log(readData);          
).catch((error) => 
  console.log(error); 
);

在这两种情况下都捕获错误“00002a00-0000-1000-8000-00805f9b34fb not found”。

请注意,相同的代码适用于我自己的自定义 UUID。 peripheral.id 是我的服务器外围设备的 MAC 地址。

有什么想法可能是错的吗?谢谢!

【问题讨论】:

您的扫描有效吗?我的意思是设备发现? 【参考方案1】:

我发现了问题。这是一种竞争条件,在读取特征之前检索服务未完成。解决方案:

BleManager.retrieveServices(peripheral.id).then((peripheralInfo) => 
    BleManager.read(peripheral.id, 
      '1800', 
      '2a00').then((readData) => 
      console.log(readData);          
    ).catch((error) => 
      console.log(error); 
    );
)

【讨论】:

以上是关于如何使用 react-native-ble-manager 读取通用访问服务/特征的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?