如何将特性写入蓝牙低功耗设备而无需每次都削皮?

时间:2019-06-26 15:33:35

标签: asp.net asp.net-mvc model-view-controller bluetooth bluetooth-lowenergy

我正在使用此site中的以下代码通过asp.net MVC Web App的浏览器配对并连接到蓝牙低能耗打印机。

navigator.bluetooth.requestDevice({
  filters: [{ services: [0xffe5] }]
})
  .then(function(device) {
    // Step 2: Connect to it
    return device.gatt.connect();
  })
  .then(function(server) {
    // Step 3: Get the Service
    return server.getPrimaryService(0xffe5);
  })
  .then(function(service) {
    // Step 4: get the Characteristic
    return service.getCharacteristic(0xffe9);
  })
  .then(function(characteristic) {
    // Step 5: Write to the characteristic
    var data = new Uint8Array([0xbb, 0x25, 0x05, 0x44]);
    return characteristic.writeValue(data);
  })
  .catch(function(error) {
     // And of course: error handling!
     console.error('Connection failed!', error);
});

此代码可以正常工作,但是我不知道该怎么做,就是将“配对”,“连接”,“获取服务”和“写服务”与特征的实际编写脱钩。理想情况下,我想配对,连接一次即可获得服务和特性。然后只需不断地写值,这样我就可以打印多件东西,而不必每次都出现配对提示。我见过的每个示例都将它们全部以.then格式捆绑在一起,而不是独立捆绑在一起。

基本上如何解耦:

navigator.bluetooth.requestDevice({
  filters: [{ services: [0xffe5] }]
})
  .then(function(device) {
    // Step 2: Connect to it
    return device.gatt.connect();
  })
  .then(function(server) {
    // Step 3: Get the Service
    return server.getPrimaryService(0xffe5);
  })
  .then(function(service) {
    // Step 4: get the Characteristic
    return service.getCharacteristic(0xffe9);
  })
});

从此:

  .then(function(characteristic) {
    // Step 5: Write to the characteristic
    var data = new Uint8Array([0xbb, 0x25, 0x05, 0x44]);
    return characteristic.writeValue(data);
  })
});

谢谢。这是我第一次使用BTLE,因此很抱歉,这是一个愚蠢的问题,但是我有点挣扎。

1 个答案:

答案 0 :(得分:0)

我在Angular应用程序中所做的就是使用async / await模式并将响应对象分配给这样的全局变量:

this.bluetoothDevice = await navigator.bluetooth.requestDevice({acceptAllDevices: true});

然后我使用另一个变量来管理连接:

this.serverConnected = await this.connect(this.bluetoothDevice.gatt);

最后,我在类内部的单独方法中使用这些变量来管理断开连接:

onDisconnectButtonClick() {
    if (!this.bluetoothDevice) {
      return;
    }
    console.log('Disconnecting from Bluetooth Device...');
    if (this.bluetoothDevice.gatt.connected) {
      this.bluetoothDevice.gatt.disconnect();
    } else {
      console.log('> Bluetooth Device is already disconnected');
      this.deviceInfo = 'You have been disconnected.'
    }
  }

希望对您有帮助!