1

我一直在开发基于蓝牙的 KaiOS 移动应用程序,其中用户界面是使用 React.js 开发的,并且我创建了一个简单的 javascript 类来管理基于蓝牙的操作,例如扫描、连接/断开连接、数据传输等。我当设备被扫描时,一直试图从 Blemanager.js 类向反应组件发送数据或对象。

以下代码已用于检查具有特定地址的设备,如果找到,则解析承诺,以便将对象发送到 React 组件。现在,我确实想将扫描的设备对象发送到反应组件并检查通知的设备对象是否是必需的,然后停止扫描。如何在 Javascript 中实现这一点。

我是一名 iOS 开发人员,对于 iOS,我正在寻找委托或可观察模式。

startLeScan = () => {
    return new Promise((resolve, reject) => {
      navigator.mozBluetooth.defaultAdapter.startLeScan([])
      .then(function(handlerLE) {
        handlerLE.ondevicefound = function(eventLE) {
          if (eventLE.device.address === "ed:ec:90:87:5d:86") {
            navigator.mozBluetooth.defaultAdapter.stopLeScan(eventLE.target);
            console.log('FOUND:', 'Address:', eventLE.device.address, 'Name:', eventLE.device.name, 'Type:', eventLE.device.type);

            resolve({"eventLE":eventLE})
          }
        }
      })
      .catch(function(e) {
        console.log(e);
        reject({error: e })
      });
    })
  }
4

2 回答 2

1

假设您在应用程序中使用 redux,实用程序类和组件类之间的通信可以通过将存储对象传递给实用程序类来完成。

  1. 创建一个实用程序类,非组件。
import { bindActionCreators } from 'redux';
import { setBluetoothAddresses } from './some-action-file';

class BluetoothUtility {
  constructor(store) {
    this.actions = bindActionCreators(
      { setBluetoothAddresses },
      store.dispatch
    )
  }

  startLeScan = () => {
     // on promise done => call this.actions.setBluetoothAddresses with resolved value
  }
}

let instance;
export const initBluetoothUtility = (store) => {
  if (!instance) {
    instance = new BluetoothUtility(store);
  }
}
  1. 在根组件中,您使用 redux 提供程序
class App {
   componentDidMount() {
     initBluetoothUtility(store);
   }
}
  1. 然后在组件中,您可以使用来自 redux store 的值
于 2020-10-19T12:30:12.730 回答
1

我会参考有关蓝牙规范的文档,包括如何使用它的好例子。

https://developers.google.com/web/updates/2015/07/interact-with-ble-devices-on-the-web

有一个characteristics对象可以附加事件处理程序。这些反过来可以随意触发您的类方法。

还有一种onDisconnected方法也可以触发您的方法。

于 2020-10-19T12:22:39.743 回答