Невозможно прочитать пакет размером более 184 байт на iOS с использованием собственного BLE PLX. - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь прочитать характеристику, которая отправляет строку JSON в качестве значения, эта строка больше 185 байт, что не является проблемой при тестировании на устройстве Android, но отключается при чтении вiOS.

Шаги для воспроизведения

  1. Сканирование для устройств.
  2. подключение к устройству
  3. Обнаружение всех служб и характеристик для устройства.
  4. отправка характеристики записи с ответом для входа устройства в устройство с помощью username и password.
  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()
...