无法使用 Noble 获取通知数据

Posted

技术标签:

【中文标题】无法使用 Noble 获取通知数据【英文标题】:Unable to get Notify data using Noble 【发布时间】:2020-12-07 15:39:23 【问题描述】:

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

我使用 ESP32 作为服务器,您可以在 Arduino 应用程序中找到“BLE_notify”代码(文件> 示例 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 应用程序,一旦连接到它,我就可以从该应用程序获取外围设备通知的所有消息。所以 noBLE 客户端缺少一些东西。

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

官方文档不清楚。任何人都可以启动并运行它吗?请帮忙。

【问题讨论】:

当您尝试订阅时,什么不起作用?根据贵族文档,您需要订阅一个特征才能接收通知 我无法获取任何数据。那些包含 console.log 的回调永远不会被调用。 你试过通知回调事件吗? github.com/abandonware/noble#event-notification-received 非常感谢您的提示。是的,我也试过once(notify, ...) 方法,但没有运气。我现在正在放弃并切换到 Python,希望为此目的找到一个更好、更有文档的库,但我很高兴确切地知道如何使用 node 和 Noble 从外围设备接收通知事件。如果有人知道更多,请帮忙! 【参考方案1】:

on.read/on.data/ 是事件监听器。他们没有错。当有特定事件时调用它们。

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

来自source:

发射时间:

特征读取已完成,characteristic.read(...) 的结果 在启用后,外围设备通过通知或指示更新了特征值 特征通知(真[,回调(错误)])

【讨论】:

以上是关于无法使用 Noble 获取通知数据的主要内容,如果未能解决你的问题,请参考以下文章

由于 Python 无法构建节点包

无法使用颤振在android中获取后台通知

samsung ble api 无法从多个 GATT 特征中获取通知

无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID

尝试使用 Parse.com 获取推送通知无法在设备上运行

在后台无法获取位置更改通知