无法使用Noble获取通知数据

ckocjqey  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(154)

无法接收从服务器外围设备发送的任何通知。

我使用ESP32作为服务器,带有“BLE_NOTIFY”代码,您可以在Arduino应用程序中找到(文件>示例ESP32 BLE Arduino>BLE_NOTIFY)。使用此代码,一旦客户端连接,ESP32就开始每秒通知新消息。使用的客户端是安装了Noble节点库的Raspberry PI(https://github.com/abandonware/noble)。这就是我正在使用的代码。

noble.on('discover', async (peripheral) => {
      console.log('found peripheral:', peripheral.advertisement);
      await noble.stopScanningAsync();
      await peripheral.connectAsync();
      console.log("Connected")

      try {
        const services = await peripheral.discoverServicesAsync([SERVICE_UUID]);
        const characteristics = await services[0].discoverCharacteristicsAsync([CHARACTERISTIC_UUID])
        const ch = characteristics[0]

        ch.on('read', function(data, isNotification) {
          console.log(isNotification)
          console.log('Temperature Value: ', data.readUInt8(0));
        })

        ch.on('data', function(data, isNotification) {
          console.log(isNotification)
          console.log('Temperature Value: ', data.readUInt8(0));
        })
        ch.notify(true, function(error) {
          console.log(error)
          console.log('temperature notification on');
        })

      } catch (e) {
        // handle error
        console.log("ERROR: ",e)
      }
    });

SERVICE_UUID和Characteristic_UUID显然是ESP32中编码的UUID。

此代码可以工作,它可以找到服务和特征,它可以成功连接到外围设备,但它不能接收消息通知。我还尝试了一款作为客户端的Android应用程序,一旦连接到它,我就可以从该应用程序获得外设通知的所有消息。因此,来宝客户端缺少一些东西。

我认为on.read/on.data/notify(true)回调方法有问题。也许这些不是从服务器接收通知的方法?我也尝试了subscribe方法,但仍然不起作用。

官方文件尚不清楚。有人能让它启动并运行吗?请帮帮忙。

xurqigkl

xurqigkl1#

on.read/on.data/是事件侦听器。他们没有什么问题。它们在发生特定事件时被调用。

例如,添加characteristic.read([callback(error, data)]);将调用on.read

从源头看:
在下列情况下发出:

  • 特征读取已完成,特征的结果。读取(...)
  • 启用特征后,外设已通过通知或指示更新了特征值。NOTIFY(TRUE[,Callback(Error)])
nmpmafwu

nmpmafwu2#

我使用以下两个环境NOBLE_MULTI_ROLE=1和NOBLE_REPORT_ALL_HCI_EVENTS=1进行解析(参见文档https://github.com/abandonware/noble)

相关问题