0
    import React, {Component} from 'react';
import {
  Animated,
  Dimensions,
  Image,
  StyleSheet,
  Text,
  FlatList,
  TouchableOpacity,
  PermissionsAndroid,
  TouchableHighlight,
  View,
} from 'react-native';
import base64 from 'react-native-base64';
import {Container, Header, Content, Footer} from 'native-base';
import BLE from './BLE';
import {connect} from 'react-redux';
import {BleManager} from 'react-native-ble-plx';
import {
  changeStatus,
  connectedDevice,
  connectedDeviceServices,
  addBLE,
} from './actions/index.js';
// import {connectDevice,startScan} from './actions';
import DataActivityIndicator from './DataActivityIndicator';
const DeviceManager = new BleManager();
const requestLocationPermission = async () => {
  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) {
      console.log('Location permission for bluetooth scanning granted');
      return true;
    } else {
      console.log('Location permission for bluetooth scanning revoked');
      return false;
    }
  } catch (err) {
    console.warn(err);
    return false;
  }
};
class BLEList extends Component {
  constructor(props) {
    super(props);
  }
  componentDidMount() {
    const subscription = DeviceManager.onStateChange(state => {
      if (state === 'PoweredOn') {
        console.log('powered on');
        this.getPermission();
        subscription.remove();
      }
    }, true);
  }
  getPermission = async () => {
    const permission = await requestLocationPermission();
    if (permission) {
      DeviceManager.startDeviceScan(null, null, (error, device) => {
        this.props.dispatch(changeStatus('Scanning'));
        if (error) {
          console.log(error);
        }
        if (device) {
          this.props.dispatch(addBLE(device));
        }
      });
    } else {
      console.log('Error permission');
    }
  };
  discoverAllServices = async d => {
    await DeviceManager.discoverAllServicesAndCharacteristicsForDevice(
      d.id,
      null,
    ).then(response => {
      console.log('%%%%%%%%%%');
      console.log(response, 'discoverAllServicesAndCharacteristicsForDevice');
    });
  };
  discoveringCharastics = async d => {
    console.log('********discoveringCharastics********');
    console.log(d, 'd', d.id, d.serviceUUIDs[0]);
    let allCharacteristicsData = await DeviceManager.characteristicsForDevice(
      d.id,
      d.serviceUUIDs[0],
    );
    // ***********allCharacteristicsData**********
    console.log('***********allCharacteristicsData**********');
    console.log(Object.getOwnPropertyNames(allCharacteristicsData[0]));
    console.log(allCharacteristicsData, 'allCharacteristicsData');
    const data = await DeviceManager.readCharacteristicForDevice(
      d.id,
      d.serviceUUIDs[0],
      null,
      null,
    );
    console.log(data, 'data').then(response => {
      console.log(response, 'response');
    });
    discoverAllServices();
  };
  handleClick = async device => {
    // console.log(device,"device")
    this.props.dispatch(changeStatus('Connecting'));
    DeviceManager.stopDeviceScan();
    await DeviceManager.connectToDevice(device.id, null)
      .then(async device => {
        this.props.dispatch(changeStatus('Discovering'));
        let allCharacteristics = device.discoverAllServicesAndCharacteristics();
        this.props.dispatch(connectedDevice(device));
        let checkDeviceIConnected = await DeviceManager.isDeviceConnected(
          device.id,
        );
        console.log(
          checkDeviceIConnected,
          'status if device connected it returns true',
        );
        if (checkDeviceIConnected === true) {
          this.props.dispatch(changeStatus('Connected'));
        } else {
          this.props.dispatch(changeStatus('Disconnected'));
        }
        return allCharacteristics;
      })
      .then(device => {
        let services = device.services(device.id);
        return services;
      })
      .then(
        async services => {
          // ***********sevices*********
          console.log('***********sevices*********');
          console.log('found services: ', services);
          // const services1 = JSON.parse(services);
          console.log(
            services[0]._manager._eventEmitter._subscriber._subscriptionsForType
              .appStateDidChange[0].emitter._subscriber._subscriptionsForType
              .appStateDidChange[0].emitter._subscriber._subscriptionsForType,
          );
          this.props.dispatch(connectedDeviceServices(services));
          this.discoveringCharastics(device);
        },
        error => {
          console.log(this._logError('SCAN', error));
        },
      );
    const descriptor = await DeviceManager.descriptorsForDevice(
      '00:1F:FF:49:C8:6D',
      '4553867f-f809-49f4-aefc-e190a1f459f3',
      '22a4e311-a097-4517-9b81-cf32af60b982',
    );
    console.log('^^^^^^^^^^^');
    console.log('descriptor:', descriptor);
    console.log('^^^^^^^^^^^');
    const readDescriptorForService = await DeviceManager.readDescriptorForDevice(
      '4553867f-f809-49f4-aefc-e190a1f459f3',
      '22a4e311-a097-4517-9b81-cf32af60b982',
      '00002902-0000-1000-8000-00805f9b34fb',
    );
    // const edo = await readDescriptorForService;
    console.log('^^^^^***********^^^^^^');
    console.log('readDescriptorForService:', readDescriptorForService);
    console.log('^^^^^^*********^^^^^');
  };
  connectableString = item => {
    if (item.isConnectable) {
      if (item.name.toString().includes('PR BT')) {
      }
      return 'Tap to connect to: ' + item.name;
    } else {
      return item.name + item.name.toString().includes('PR BT')
        ? base64.decode(base64.encode(item.name))
        : ' ' + ' is not connectable';
    }
  };
  render() {
    return (
      <Container>
        <Header />
        <FlatList
          data={this.props.BLEList}
          renderItem={({item}) => (
            <>
              <TouchableHighlight
                onPress={() => this.handleClick(item)}
                style={item.isConnectable ? styles.rowFront : styles.rowBack}
                underlayColor={'#AAA'}>
                <View>
                  <Text>
                    {/* {item.name} + {item.id} */}
                    {this.connectableString(item)}
                  </Text>
                </View>
              </TouchableHighlight>
            </>
          )}
          keyExtractor={item => item.id.toString()}
          ListEmptyComponent={DataActivityIndicator}
        />
        <Footer>
          <BLE />
        </Footer>
      </Container>
    );
  }
}
const mapStateToProps = state => {
  return {
    BLEList: state.BLEs['BLEList'],
    status: state.BLEs['status'],
  };
};

Blockquote **我们连接了一个蓝牙设备并记录了该设备的服务、描述符和特性,但是当我们通过蓝牙连接时,我们无法理解如何获取有关该设备的内部数据,就像我们正在使用 philips respironics dreamStation 设备一样我们**块引用

4

0 回答 0