react-native-ble-managerでコネクトまでしてみた

いつもはiosのBluetoothを使って遊んでいるわけですが、今回はReact NativeでBluetooth通信を試してみました。とりあえずスキャンとコネクトです。

javaScript初挑戦だったのでpromiss, async awaitにかなり苦戦しました。接続に使用したデバイスはtoio core cubeです。コントローラアプリ出しているのでよかったらインストールしてみてください

環境構築にもだいぶ苦しんだのですが、ReactNative環境構築時にハマったポイントという記事にまとめたので環境で失敗する時は参照してみてください。特にMcAfee人は必見です。

導入[iOS]

① Librariesにコピー

プロジェクト > node_modules > react-native-ble-manager > ios > BleManager.xcodeprojをLibrariesにドラック&ドロップ

② リンクさせる

Linked Frameworks and LibrariesにlibBleManager.aを追加

BleManager.xcodeprojがLibrariesの中に入っていないとlibBleManager.aは表示されません。

③ pod でインストールする

iosのpodfileのあるディレクトリに移動してinstallを行って完了です。

pod install

コード

スキャンしたデバイスに対してをコネクトだけのシンプルなコードです。bluetooth通信を行っているデバイスはtoio core cubeです。

import React, { Component } from 'react';
import {
  Platform,
  NativeAppEventEmitter,
  NativeEventEmitter,
  NativeModules,
  StyleSheet,
  Button,
  View
} from 'react-native';
import BleManager from 'react-native-ble-manager';

const BleManagerModule = NativeModules.BleManager;
const bleManagerEmitter = new NativeEventEmitter(BleManagerModule);

export default class App extends Component {

  constructor(){
    super()
    this.handleDiscoverPeripheral = this.handleDiscoverPeripheral.bind(this);
  }

  onPressLearnMore() {

    (async () => {
      //配列にserviceUUIDを指定してデバイスを絞る
      await BleManager.scan(['10B20100-5B3B-4571-9508-CF3EFCD7BBAE'], 5, true);
      const peripheralsArray = await BleManager.getDiscoveredPeripherals([]);
      console.log('スキャン開始');

    })().catch((err) =>{
      console.error(err);
    })
  }

  handleDiscoverPeripheral(peripheral){
    //peripheralの持ってるデータの確認
    console.log(JSON.stringify(peripheral));
    //androidはmacID, iosはserviceUUIDが取得できる
    BleManager.connect(peripheral.id);
  }
  
  //componentDidMountはiosでいうviewDidLoadみたいなメソッド
  componentDidMount() {
    BleManager.start({showAlert: true});
    //peripheralを発見するとhandleDiscoverPeripheralに処理が飛ぶ
    this.handlerDiscover = bleManagerEmitter.addListener('BleManagerDiscoverPeripheral', this.handleDiscoverPeripheral );
  }
  
  //ここから下はレイアウトの処理---------------------------------
  render() {
    return (
      <View style={styles.container}>
        <Button
          onPress={this.onPressLearnMore}
          title="device connect"
          color="#841584"
          accessibilityLabel="Learn more about this purple button"
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

android端末で試す時は位置情報の許可が必要です!許可してないとスキャンできません。

参考文献

react-native-ble-manager