代码之家  ›  专栏  ›  技术社区  ›  kockburn

如何使用react native ble plx发现服务uuid和特征uuid?

  •  0
  • kockburn  · 技术社区  · 6 年前

    问题:

    我正在尝试连接到我的蓝牙设备,但是在连接并发现所有服务和特征时,由于返回的信息不足,我无法前进。我没有收到任何服务uuid或任何特征uuid。

    我需要做什么才能访问uuid,然后才能从特征中读取?

    我试过的:

    打电话后我的设备 device.discoverAllServicesAndCharacteristics(); 返回:

    { _40: 0, _65: 0, _55: null, _72: null }

    当我登录时 device 我得到:

    06-23 16:36:54.758  4397  4597 I ReactNativeJS: { isConnectable: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   rssi: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   serviceData: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   overflowServiceUUIDs: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   mtu: 23,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   localName: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   manufacturerData: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   txPowerLevel: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   id: '00:1E:C0:65:D7:DB',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   solicitedServiceUUIDs: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   name: 'RND7DB',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   serviceUUIDs: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:   _manager:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:    { _eventEmitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:       { _subscriber:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:          { _subscriptionsForType:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:             { appStateDidChange:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       isAvailable: true,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       _eventHandlers: { change: {}, memoryWarning: {} },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       currentState: 'active' },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: undefined,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'appStateDidChange',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 } ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               websocketMessage: [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               websocketOpen: [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               websocketClosed: [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               websocketFailed: [ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               didUpdateDimensions:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       sharedSubscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       _currentSubscription: null },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: undefined,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'didUpdateDimensions',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 } ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               hardwareBackPress:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       sharedSubscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       _currentSubscription: null },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: undefined,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'hardwareBackPress',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 } ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               collectBugExtraData:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       sharedSubscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       _currentSubscription: null },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function: collectExtraData],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'collectBugExtraData',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 } ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               collectRedBoxExtraData:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       sharedSubscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       _currentSubscription: null },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function: collectExtraData],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: null,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'collectRedBoxExtraData',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 } ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               url:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter: { _subscriber: [Circular] },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: undefined,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'url',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                  { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter: { _subscriber: [Circular] },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: undefined,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'url',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 1 } ],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:               toggleElementInspector:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                [ { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       sharedSubscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       _currentSubscription: null },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    listener: [Function],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    context: undefined,
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    eventType: 'toggleElementInspector',
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    key: 0 },
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                  { subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                    emitter:
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                     { _subscriber: [Circular],
    06-23 16:36:54.758  4397  4597 I ReactNativeJS:                       sharedSubscribe
    

    在这一点上,我不知道该怎么做,因为我没有收到任何有价值的信息来进一步从一个特征中获取信息。

    根据 docs ,我需要uuid从我的设备中读取。

    device.readCharacteristicForService(
      serviceUUID: UUID,
      characteristicUUID: UUID,
      transactionId: ?TransactionId
    ): Promise<Characteristic>
    

    注意:当我在Android上使用BLE扫描仪应用程序时,我能够用UUID接收所有的服务和特性。

    代码段:

        @action connect = (deviceName) => {
    
            const device = this.devices.find(device=>device.name === deviceName);
    
            if(device === undefined){
                this.info = "Couldn't find device";
                return;
            }
    
            this.manager.stopDeviceScan();
            this.selectedDevice = device;
            this.selectedDevice
                .connect()
                .then((device) => {
                    this.info = "Discovering services and characteristics";
                    return device.discoverAllServicesAndCharacteristics();
                })
                .then((device) => {
                    this.info = "Setting notifications";
                    return this.setupNotifications(device)
                })
                .then(() => {
                    this.info = "Listening..."
                }, (error) => {
                    this.info = error.message;
                })
        };
    
     async setupNotifications(device) {
        console.log(device);
        console.log(this.manager.servicesForDevice(device.id));
    }
    

    github issue #293

    1 回复  |  直到 6 年前
        1
  •  2
  •   Hurobaki    6 年前

    我就是这么用的,希望能帮上忙

     const { updateCharacteristic } = this.props
     const connectedDevice = await manager.connectToDevice(device.id)
     const services = await connectedDevice.discoverAllServicesAndCharacteristics()
     const characteristic = await this.getServicesAndCharacteristics(services)
    
    getServicesAndCharacteristics(device) {
                return new Promise((resolve, reject) => {
                    device.services().then(services => {
                        const characteristics = []
    
                        services.forEach((service, i) => {
                            service.characteristics().then(c => {
                                characteristics.push(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(dialog)
                                }
                            })
                        })
                    })
                })
            }
    

    谨致问候。