You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows平台下基于noble-winrt或SimpleBLE配置BLE MTU大小的方法问询

Windows平台下基于noble-winrt或SimpleBLE配置BLE MTU大小的方法问询

各位大佬好,我现在用Node.js开发Windows 10/11平台的BLE应用,主要是给工业传感器做Modbus over BLE的通信,目前遇到了吞吐量的瓶颈:默认BLE连接的MTU只有23字节,去掉3字节的ATT头之后,可用的payload才20字节,批量传输大区块数据的时候效率特别低。我想把MTU调到247或者512字节来提升读写效率,目前备选的库是noble-winrt或者SimpleBLE(通过Node.js N-API addon调用),有没有大佬能说说这两个库分别怎么配置MTU啊?

一、使用noble-winrt配置MTU的尝试方向

我查了下noble-winrt的文档,知道MTU协商要在设备连接成功后操作,但具体的调用细节还没摸透,有没有用过的老哥给个实操示例?比如:

  • 是不是要在connect的回调里调用requestMtu方法?
  • 怎么确认MTU协商是否成功?
  • 有没有需要注意的坑,比如请求的MTU值会不会被设备限制?

附一段我自己写的测试代码框架,麻烦帮忙看看哪里不对:

const noble = require('@abandonware/noble-winrt');

noble.on('stateChange', (state) => {
  if (state === 'poweredOn') {
    noble.startScanning();
  }
});

noble.on('discover', (peripheral) => {
  if (peripheral.name === 'My-Industrial-Sensor') {
    noble.stopScanning();
    peripheral.connect((err) => {
      if (err) {
        console.error('连接失败:', err);
        return;
      }
      // 这里调用requestMtu对吗?
      peripheral.requestMtu(247, (err, mtu) => {
        if (err) {
          console.error('MTU请求失败:', err);
          return;
        }
        console.log(`协商后的MTU: ${mtu}`);
        // 之后开始Modbus数据读写
      });
    });
  }
});

二、使用SimpleBLE(Node.js N-API Addon)配置MTU的疑问

我也考虑用SimpleBLE的C++库配合Node.js addon来实现,因为听说SimpleBLE对Windows的BLE支持更底层,但我对N-API的封装不太熟:

  • 自己写addon的时候,怎么把SimpleBLE的request_mtu方法暴露给Node.js?
  • Node.js端调用的时候是同步还是异步?会不会阻塞事件循环?
  • 有没有现成的封装好的SimpleBLE Node.js包支持MTU配置?

通用疑问

另外还有几个通用问题想请教:

  • 是不是请求多少MTU就能拿到多少?比如我请求512,会不会因为传感器只支持247而自动降到247?
  • Windows 10/11对BLE MTU的最大值有没有限制?比如能不能到512?
  • MTU调整后,Modbus的数据包要怎么适配?比如原来20字节的payload,现在是不是可以用244字节(247-3)来打包请求?

麻烦各位老哥帮忙解答下,多谢啦!如果有实操过的经验或者踩过的坑,也欢迎分享出来,我这边测试后会及时反馈结果~

火山引擎 最新活动