React NativeでBLE(Bluetooth Low Energy)を設定します。

【公式】React Native BLE Manager
GitHub innoveit / react-native-ble-manager

  1. React Native BLE Managerインストールします。
    npm install react-native-ble-manager
    
  2. パーミッションを設定します。Android 12から変更になっています。
    [BLUETOOTH]と[BLUETOOTH_ADMIN]は、Android 11( API レベル 30 )の場合に設定します。
    [BLUETOOTH_SCAN]はusesPermissionFlags="neverForLocation"を設定して、位置情報を取得しません。
    スキャンできるように[BLUETOOTH_CONNECT]を許可します。

    android\app\src\main\AndroidManifest.xml
        <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
    
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28"/>
        <uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" tools:targetApi="Q"/>
    
        <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                         android:usesPermissionFlags="neverForLocation" />
        <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    
  3. インポートします。
    import BleManager from 'react-native-ble-manager';
    import {NativeEventEmitter, NativeEventEmitter, PermissionsAndroid, Platform} from 'react-native';
    
    const BleManagerModule = NativeModules.BleManager;
    const bleManagerEmitter = new NativeEventEmitter(BleManagerModule);
    
  4. Androidはユーザーの許可をチェックします。
      const handleAndroidPermissionCheck = () => {
        if (Platform.OS === 'android') {
          if (Platform.Version >= 23 && Platform.Version < 31) {
            PermissionsAndroid.check(
              PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
            ).then(result => {
              if (result) {
                console.log('Permission is OK');
              } else {
                PermissionsAndroid.request(
                  PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
                ).then(result => {
                  if (result) {
                    console.log('User accept');
                  } else {
                    console.log('User refuse');
                  }
                });
              }
            });
          }
    
          if (Platform.Version >= 31) {
            PermissionsAndroid.requestMultiple([
              PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
              PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
            ]).then(result => {
              if (result) {
                console.log('User accept');
              } else {
                console.log('User refuse');
              }
            });
          }
        }
      };
  5. 初期化します。
      useEffect(() => {
        handleAndroidPermissionCheck();
    
        BleManager.start({showAlert: false})
          .then(() => {
            console.log('BleManager.start');
          })
          .catch(error => {
            console.log('BleManager.start Error: ' + error);
          });
    
        const discoverPeripheral = bleManagerEmitter.addListener(
          'BleManagerDiscoverPeripheral',
          args => {
            console.log('Discover.');
          },
        );
    
        const disconnectedPeripheral = bleManagerEmitter.addListener(
          'BleManagerDisconnectPeripheral',
          () => {
            console.log('Disconnected.');
          },
        );
    
        return () => {
          discoverPeripheral.remove();
          disconnectedPeripheral.remove();
        };
      }, []);
    
    
  6. 書き込みます。
    const write= async (text) => {
      await BleManager.connect(UUID);
      await BleManager.retrieveServices(UUID);
      await BleManager.write(
        UUID,
        SERVICE_UUID,
        CHARACTERRISTIC_UUID,
        stringToBytes(text),
      );
    };
    
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。