无法使用React Native BLE PLX在iOS上读取大于184字节的软件包

时间:2019-10-09 21:24:19

标签: ios react-native bluetooth bluetooth-lowenergy react-native-ble-plx

我正在尝试读取一个特征,该特征发送一个JSON字符串作为值,该字符串大于185个字节,这在Android设备上进行测试时不是问题,但是当我在其中读取该字符串时,它就被切断了iOS。

复制步骤

  1. 扫描设备。
  2. 连接到设备
  3. 发现设备的所有服务和特征。
  4. 发送写入特征并带有响应,以使用usernamepassword登录设备。
  5. 发送设备的读取特征(读取和写入均使用相同的服务和特征)。
  6. 当我读取该值时,它将被切断并重复3次。

我在Android上获得的正确答案:

Base 64:

eyJqc29ucnBjIjoiMi4wIiwicmVzdWx0IjpbMCx7InVidXNfcnBjX3Nlc3Npb24iOiJ4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIsInRpbWVvdXQiOjMwMCwiZXhwaXJlcyI6Mjk5LCJhY2xzIjp7ImFjY2Vzcy1ncm91cCI6eyJ4eHh4eC11c2VyIjpbInJlYWQiLCJ3cml0ZSJdfSwidWJ1cyI6eyJmd21hbiI6WyIqIl0sInh4eHh4LmFjcyI6WyJyZWJ1aWxkX3h4eHhfcHJvZmlsZXMiXSwieHh4eHguYXBwIjpbIioiXSwibmV0d29yayI6WyJyZWxvYWQiXSwibmV0d29yay5pbnRlcmZhY2UueHh4IjpbInN0YXR1cyJdLCJuZXR3b3JrLmludGVyZmFjZS54eHgiOlsic3RhdHVzIl0sInVjaSI6WyIqIl19LCJ1Y2kiOnsiKiI6WyJyZWFkIiwid3JpdGUiXX19LCJkYXRhIjp7InVzZXJuYW1lIjoieHh4eHgifX1dLCJpZCI6MX0=

JSON字符串:

{"jsonrpc":"2.0","result":[0,{"ubus_rpc_session":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","timeout":300,"expires":299,"acls":{"access-group":{"xxxxx-user":["read","write"]},"ubus":{"fwman":["*"],"xxxxx.acs":["rebuild_xxxx_profiles"],"xxxxx.app":["*"],"network":["reload"],"network.interface.xxx":["status"],"network.interface.xxx":["status"],"uci":["*"]},"uci":{"*":["read","write"]}},"data":{"username":"xxxxx"}}],"id":1}

我在iOS上收到的回复:

Base 64:

eyJqc29ucnBjIjoiMi4wIiwicmVzdWx0IjpbMCx7InVidXNfcnBjX3Nlc3Npb24iOiJ4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIsInRpbWVvdXQiOjMwMCwiZXhwaXJlcyI6Mjk5LCJhY2xzIjp7ImFjY2Vzcy1ncm91cCI6eyJ4eHh4eC11c2VyIjpbInJlYWQiLCJ3cml0ZSJdfSwidWJ1cyI6eyJmd21hbiI6W3sianNvbnJwYyI6IjIuMCIsInJlc3VsdCI6WzAseyJ1YnVzX3JwY19zZXNzaW9uIjoieHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiLCJ0aW1lb3V0IjozMDAsImV4cGlyZXMiOjI5OSwiYWNscyI6eyJhY2Nlc3MtZ3JvdXAiOnsieHh4eHgtdXNlciI6WyJyZWFkIiwid3JpdGUiXX0sInVidXMiOnsiZndtYW4iOlt7Impzb25ycGMiOiIyLjAiLCJyZXN1bHQiOlswLHsidWJ1c19ycGNfc2Vzc2lvbiI6Inh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IiwidGltZW91dCI6MzAwLCJleHBpcmVzIjoyOTksImFjbHMiOnsiYWNjZXNzLWdyb3VwIjp7Inh4eHh4LXVzZXIiOlsicmVhZCIsIndyaXRlIl19LCJ1YnVzIjp7ImZ3bWFuIjpb

JSON字符串:

{"jsonrpc":"2.0","result":[0,{"ubus_rpc_session":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","timeout":300,"expires":299,"acls":{"access-group":{"xxxxx-user":["read","write"]},"ubus":{"fwman":[{"jsonrpc":"2.0","result":[0,{"ubus_rpc_session":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","timeout":300,"expires":299,"acls":{"access-group":{"xxxxx-user":["read","write"]},"ubus":{"fwman":[{"jsonrpc":"2.0","result":[0,{"ubus_rpc_session":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","timeout":300,"expires":299,"acls":{"access-group":{"xxxxx-user":["read","write"]},"ubus":{"fwman":[

  • 库版本:react-native-BLE-PLX v.1.1.0
  • 平台:iOS 11.4.1。
  • 平台记录XCode:
[RxBLEKit|VERB|15:55:51.878]: CentralManager(7522903616) didDiscover(peripheral: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")),
rssi: -53)
[RxBLEKit|DEBG|15:55:52.126]: CentralManager(7522903616) stopScan()
[RxBLEKit|DEBG|15:55:52.128]: CentralManager(7522903616) retrievePeripherals(
withIdentifiers: [A0AA0000-000A-00AA-AAAA-AA000AA00A00])
[RxBLEKit|DEBG|15:55:52.137]: CentralManager(7522903616) connect(
peripheral: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")),
options: nil)
[RxBLEKit|DEBG|15:55:53.288]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) discoverServices(
serviceUUIDs: nil)
[RxBLEKit|DEBG|15:55:53.925]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) didDiscoverServices(services
: Optional("[Service(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7520873408)]"),
error: nil)
[RxBLEKit|DEBG|15:55:53.928]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) discoverCharacteristics(
characteristicUUIDs: nil,
for: Service(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7520873408))
[RxBLEKit|DEBG|15:55:53.985]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) didDiscoverCharacteristicsFor(for:
Service(uuid: B5DF559F-F530-4661-84C6-F3B9D5F76985, id: 7520873408), characteristics:
Optional("[Characteristic(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696)]"),
error: nil)
[RxBLEKit|DEBG|15:55:53.987]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) discoverDescriptors(
for: Characteristic(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696))
[RxBLEKit|DEBG|15:55:53.992]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) didDiscoverDescriptorsFor
(for:Characteristic(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696), descriptors:
Optional("[]"),
error: nil)
[RxBLEKit|DEBG|15:55:54.570]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) writeValue(
data: 7b226a736f6e727063223a22322e30222c226964223a312c226d6574686f64223a2263616c6c222c22706172616d73223a5b223030303030303030303030303030303030303030303030303030303030303030222c2273657373696f6e222c226c6f67696e222c7b22757365726e616d65223a227878787878222c2270617373776f7264223a22303030303030227d5d7d,
for: Characteristic(uuid:A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696),
type: withResponse)
[RxBLEKit|DEBG|15:55:54.644]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) didWriteValueFor(for:Characteristic(uuid:A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696),
value: nil,
error: nil)
[RxBLEKit|DEBG|15:55:54.661]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) readValue(
for: Characteristic(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696))
[RxBLEKit|DEBG|15:55:54.889]: Peripheral(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, name: Optional("BlueZ 5.49")) didUpdateValueFor(for:Characteristic(uuid: A0AA0000-000A-00AA-AAAA-AA000AA00A00, id: 7584057696),
value: Optional("227b6a736f6e727063223a22322e30222c22726573756c74223a5b302c7b22756275735f7270635f73657373696f6e223a227878787878787878787878787878787878787878787878787878787878787878222c2274696d656f7574223a3330302c2265787069726573223a3239392c2261636c73223a7b226163636573732d67726f7570223a7b2278787878782d75736572223a5b2272656164222c227772697465225d7d2c2275627573223a7b2266776d616e223a5b7b226a736f6e727063223a22322e30222c22726573756c74223a5b302c7b22756275735f7270635f73657373696f6e223a227878787878787878787878787878787878787878787878787878787878787878222c2274696d656f7574223a3330302c2265787069726573223a3239392c2261636c73223a7b226163636573732d67726f7570223a7b2278787878782d75736572223a5b2272656164222c227772697465225d7d2c2275627573223a7b2266776d616e223a5b7b226a736f6e727063223a22322e30222c22726573756c74223a5b302c7b22756275735f7270635f73657373696f6e223a227878787878787878787878787878787878787878787878787878787878787878222c2274696d656f7574223a3330302c2265787069726573223a3239392c2261636c73223a7b226163636573732d67726f7570223a7b2278787878782d75736572223a5b2272656164222c227772697465225d7d2c2275627573223a7b2266776d616e223a5b"),
error: nil)
  • 示例代码:
  const bluetooth = () => {
    const deviceUUID =
      Platform.OS === 'ios'
        ? 'A0AA0000-000A-00AA-AAAA-AA000AA00A00'
        : 'A0:00:0A:00:A0:00'
    manager.startDeviceScan(null, null, async (error, device) => {
      if (error) {
        console.error(error)
        manager.cancelDeviceConnection(deviceUUID)
      }
      console.log(device)
      if (device && device.localName === 'Device XX-00') {
        const jsonDataServiceUUID = 'A0AA0000-000A-00AA-AAAA-AA000AA00A00'

        const jsonFormattedCharacteristicUUID =
          'A0AA0000-000A-00AA-AAAA-AA000AA00A00'

        manager.stopDeviceScan()
        await manager.connectToDevice(deviceUUID)

        await manager.discoverAllServicesAndCharacteristicsForDevice(deviceUUID)
        let write
        try {
          write = await manager.writeCharacteristicWithResponseForDevice(
            deviceUUID,
            jsonDataServiceUUID,
            jsonFormattedCharacteristicUUID,
            Buffer.from(
              JSON.stringify({
                jsonrpc: '2.0',
                id: 1,
                method: 'call',
                params: [
                  '00000000000000000000000000000000',
                  'session',
                  'login',
                  {
                    username: 'xxxxx',
                    password: '000000',
                  },
                ],
              }),
            ).toString('base64'),
          )
        } catch (err) {
          console.error(err)
        }
        console.log({ write })

        const read = await manager.readCharacteristicForDevice(
          deviceUUID,
          jsonDataServiceUUID,
          jsonFormattedCharacteristicUUID,
        )
        if (read.value) {
          console.log(read)
          const responseJson = Buffer.from(read.value, 'base64').toString()
          console.log(responseJson)
        }
      }
    })
  }
  bluetooth()

0 个答案:

没有答案