当前位置: 首页 > 知识库问答 >
问题:

“关贸总协定错误:未配对。”当设备显示为已连接时,使用网络蓝牙

於宏大
2023-03-14

我试图连接到微芯片"RN4678"双模蓝牙设备从我的Windows 10机器使用BLE与网络蓝牙api。我能找到装置-

我的JavaScript经验很少,所以我想我可能把我的promise联系错了,但是在尝试添加特性之前直接打印出设备信息会显示“连接”的值为真。

我还验证了设备、服务和特性与我的android设备上的“nRF Connect”应用程序的预期工作一致。

这是我的代码:

let targetService = '49535343-fe7d-4ae5-8fa9-9fafd205e455';
let txCharacteristicId = '49535343-1e4d-4bd9-ba61-23c647249616';
let rxCharacteristicId = '49535343-8841-43f4-a8d4-ecbe34729bb3';

function onButtonClick(event) {

  // Find bluetooth device
  console.log('Requesting Bluetooth Device...');
  navigator.bluetooth.requestDevice({
    acceptAllDevices: true,
    optionalServices: [targetService]
  })
  // Connect to device
  .then(device => device.gatt.connect())
  // Get the server we want
  .then(server => {
    console.log('Getting UART transparent service...');
    return server.getPrimaryService(targetService);
  })
  // Handle the characteristics we need
  .then(service => {
    return service.getCharacteristic(txCharacteristicId)
  })
  .then(characteristic => {
    console.dir(characteristic.service.device);
    return characteristic.startNotifications();
  })
  .then(characteristic => {
    characteristic.addEventListener('characteristicvaluechanged',
                                    handleTx);
  })
  .catch(error => { 
    console.log(error);
    console.log(error.code);
    console.log(error.message); 
    console.log(error.name); 
  });

}

function handleTx(event) {
  console.log(event.target.value);
}

以下是我收到的控制台信息:

index.html:18 Requesting Bluetooth Device...
index.html:27 Getting UART transparent service...
index.html:35 BluetoothDevice
                gatt: BluetoothRemoteGATTServer
                  connected: true
                  device: BluetoothDevice {id: "p+lJYscejR+Xl4eX+VbNkA==", name: "Dual-SPP", gatt: BluetoothRemoteGATTServer, ongattserverdisconnected: null}
                  __proto__: BluetoothRemoteGATTServer
                id: "p+lJYscejR+Xl4eX+VbNkA=="
                name: "Dual-SPP"
                ongattserverdisconnected: null
                __proto__: BluetoothDevice
index.html:44 DOMException
index.html:45 19
index.html:46 GATT Error: Not paired.
index.html:47 NetworkError

这里是留档的网页蓝牙starNoti的()函数(https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-startnotifications):

调用starNoti 方法时,必须返回一个新的promisepromise,并并行运行以下步骤。有关接收通知的详细信息,请参见§5.6.4响应通知和指示。

>

如果该特性具有客户端特性配置描述符,则使用任何特性描述符过程来确保设置了特性的客户端特性配置描述符中的通知或指示位之一,以匹配特性属性中的约束。UA应该避免设置两个位,如果两个位都设置了,则必须删除重复的值更改事件。按照§5.7错误处理中的描述处理错误。注意:某些设备具有特性,其属性包括通知或指示位,但没有客户端特性配置描述符。这些不符合标准的特性倾向于无条件地发送通知或指示,因此该规范允许应用程序简单地订阅它们的消息。

如果上一步返回错误,请拒绝带有该错误的promise并中止这些步骤。

编辑:我使用的是Chrome版本74,Windows 10.0.17134

共有1个答案

莫乐
2023-03-14

我为我的设备找到了解决方案,我希望它也能为你工作。事实证明,在通过网络蓝牙建立连接之前,该设备必须与Windows操作系统配对。因此,尽管Web Bluetooth可以“连接”并显示所有GATT属性,但当设备接收到startNotifications()命令时,它实际上正在断开连接(因为它没有通过操作系统配对)。此外,(在我的例子中,但这可能是特定于设备的)我的“默认密码”是000000(需要正好是6个零)。在与Windows操作系统配对时,请务必仔细检查。

编辑:这种行为(在建立Web Bluetooth连接之前必须将设备与操作系统配对)是在macOS和Windows上发现的一个错误。有关更多信息,请参阅此chrome bug。

 类似资料:
  • 我只能找到如何显示配对的蓝牙设备,而不是当前连接的蓝牙设备。这是显示配对的代码: 有人知道如何显示当前连接的蓝牙设备和未配对的设备吗?谢谢

  • 我在连接时遇到问题。起初它有效,而不是不起作用,除非我取消配对设备。我已经得到了所有可能发生的异常,套接字关闭,管道关闭,连接被拒绝,端口已经在使用中,等等。 我知道android 4.2之前版本的蓝牙存在问题(https://code.google.com/p/android/issues/detail?id=37725). 我在连接这些设备时遇到问题的设备: Htc one(Android4.

  • 我想要/期望看到的是下面的搜索显示连接的。当pubsub演示运行时,查询返回为空。它是空的这一事实告诉我,pubsub示例是作为MQTT客户机连接的,而不是作为设备连接的。如何作为设备连接? 请注意,我已经通过AWS CLI启用了。 评论中的其他细节:

  • 我正在Visual Studio 2015中用C语言为运行Windows IoT Core的Raspberry PI 2设备开发。 对于我的应用程序,我需要配对和取消配对蓝牙设备 我可以获得配对/未配对/所有蓝牙设备的列表吗<类似于内置管理网站的蓝牙页面(http://[设备IP]:8080/Bluetooth.htm) 我找到了一个例子(https://github.com/Microsoft/

  • 我可以在Android中看到蓝牙设备的两种状态。1、配对2。已连接-<我正在尝试在Android系统中使用当前连接的蓝牙设备。但我只从适配器获得配对设备列表。getBondedDevices() 我需要当前连接的设备。我怎么能得到这个。请有人帮我实现这一点。提前谢谢。

  • 连接设备 接口说明 用于连接 扫描出来的蓝牙设备。 参数说明 字段 类型 必须? 说明 device RKBLEDevice 是 蓝牙设备 示例代码 Swift: RokidMobileSDK.binder.connect(device: RKBLEDevice) Objc: [RokidMobileSDK.binder connect:device]; 断开设备 接口说明 用于断开已经连接的