60/5000 Соедините mi band 4 с реактивным родным приложением, как приложение mi fit - PullRequest
0 голосов
/ 28 октября 2019

Я недавно купил mi band 4, я тестирую с response-native, но я не знаю, как подключить устройство, как приложение mi fit, приложение mi fit отправляет запрос на браслет, и появляется сообщениена ее экране. подтвердить и пара. Может ли кто-нибудь помочь мне соединить браслет так, как это делает приложение mi fit? Я использую response-native-ble-plx для подключения к нему.

Я использую реагировать-native-ble-plx. Я могу отсканировать и найти браслет, я также могу подключиться к нему и прочитать сервисы, но когда я пытаюсь что-то написать, это выдает мне такую ​​ошибку: исключение GATT из MAC-адреса EC: AC: 59: E9: 80: 9Fс типом BleGattOperation {description = 'CHARACTERISTIC_READ'}. Я предполагаю, что это потому, что она не спарена, как приложение mi fit.

// Мой код

import React, {Component} from 'react';
import {
  SafeAreaView, 
  PermissionsAndroid,
  ScrollView, 
  TouchableOpacity, 
  StatusBar,
} from 'react-native';

import {BleManager, Service} from 'react-native-ble-plx'; 

export default class App extends Component {
  constructor() {
    super();
    this.manager = new BleManager();
    this.state = {characteristic: [], info: '', values: {}, array_services: []};

  }



  async setupNotifications(device) {
    for (const id in this.sensors) {
      const service = this.serviceUUID(id);
      const characteristicW = this.writeUUID(id);
      const characteristicN = this.notifyUUID(id);

      const characteristic = await device.writeCharacteristicWithResponseForService(
        service,
        characteristicW,
        'AQ==' /* 0x01 in hex */,
      );

      device.monitorCharacteristicForService(
        service,
        characteristicN,
        (error, characteristic) => {
          if (error) {
            this.error(error.message);
            return;
          }
          this.updateValue(characteristic.uuid, characteristic.value);
        },
      );
    }
  }

  async requestLocationPermission() {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION,
        {
          title: 'Location permission for bluetooth scanning',
          message: 'wahtever',
          buttonNeutral: 'Ask Me Later',
          buttonNegative: 'Cancel',
          buttonPositive: 'OK',
        },
      );
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        return true;
      } else {
        return false;
      }
    } catch (err) {
      return false;
    }
  }

  async _discoveryServices() { 
    const connectedDevice = await this.manager.connectToDevice(
      'EC:AC:59:E9:80:9F',
    );
    const services = await connectedDevice.discoverAllServicesAndCharacteristics();
    const characteristic = await this.getServicesAndCharacteristics(services);

    this.setState({characteristic});
  }

  getServicesAndCharacteristics(device) {
    return new Promise((resolve, reject) => {
      device.services().then(services => {
        const characteristics = [];
        const services_and_characteristics = [];
        services.forEach((service, i) => {
          service.characteristics().then(c => {
            services_and_characteristics.push({...c});


            characteristics.push(c);
            console.log({c});


            if (i === services.length - 1) {
              const temp = characteristics.reduce((acc, current) => {
                return [...acc, ...current];
              }, []);
              const dialog = temp.find(
                characteristic => characteristic.isWritableWithoutResponse,
              );
              if (!dialog) {
                reject('No writable characteristic');
              }
              resolve(services_and_characteristics);
            }
          });
        });
      });
    });
  }

  _read() {
    const characteristic = this.state.characteristic; 
    if (characteristic.length > 0) {
      for (let index = 0; index < 2; index++) { 
        characteristic[3][index]
          .read()
          .then(res => {
            console.log({res}, index, '++++++++++++++++++++++++==');
          })
          .catch(err => {
            console.log({err}, '++++++++++++++++++++++++==');
          });

        if (characteristic[3][index].isWritableWithResponse) {
          let valueBase64 = 'VjAuMjUuMTcuNQ==';
          characteristic[3][index]
            .writeWithResponse(valueBase64)
            .then(res => {
              console.log({res}, index, '++++++++++++++++++++++++==');
            })
            .catch(err => {
              console.log({err}, '++++++++++++++++++++++++==');
            });
        }

        if (characteristic[3][index].isWritableWithoutResponse) {
          let valueBase64 = ' VjAuMjUuMTcuNQ==';
          characteristic[3][index]
            .writeWithoutResponse(valueBase64)
            .then(res => {
              console.log({res}, index, '++++++++++++++++++++++++==');
            })
            .catch(err => {
              console.log({err}, '++++++++++++++++++++++++==');
            });
        }
      }
    }
  }

  render() {
    return (
      <>
          <StatusBar barStyle="dark-content" />
        <SafeAreaView>
          <ScrollView contentInsetAdjustmentBehavior="automatic">
            <TouchableOpacity
              onPress={() => this._discoveryServices()}
              style={{
                height: 50,
                width: 50,
                margin: 5,
                backgroundColor: 'grey',
              }}
            />
            <TouchableOpacity
              onPress={() => this._read()}
              style={{height: 50, width: 50, margin: 5, backgroundColor: 'red'}}
            />
          </ScrollView>
        </SafeAreaView>
      </>
    );
  }
}



// My package-json
{
  "name": "miBand4",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "start": "react-native start",
    "test": "jest",
    "lint": "eslint ."
  },
  "dependencies": {
    "react": "16.9.0",
    "react-native": "0.61.2",
    "react-native-ble-manager": "^6.6.10",
    "react-native-ble-plx": "^1.1.0"
  },
  "devDependencies": {
    "@babel/core": "^7.6.4",
    "@babel/runtime": "^7.6.3",
    "@react-native-community/eslint-config": "^0.0.5",
    "babel-jest": "^24.9.0",
    "eslint": "^6.5.1",
    "jest": "^24.9.0",
    "metro-react-native-babel-preset": "^0.56.0",
    "react-test-renderer": "16.9.0"
  },
  "jest": {
    "preset": "react-native"
  }
}

Я надеюсь, что смогу выполнить сопряжение устройства, как приложение mi fit ичтение и запись данных, но я не получаю их, и при попытке сделать это я получаю сообщение об ошибке.

...