Espruino:Справочник по API/Класс NRF/setServices()

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Функция NRF.setServices()[1]

Синтаксис

NRF.setServices(data, options)

Параметры

  • data – сервис (и характеристики), данные о которых будут рассылаться в объявлениях
  • options – опциональный объект с настройками

Возвращаемое значение

Описание

Меняет названия и настройки сервисов и характеристик, которые Espruino рассылает в объявлениях.

Если вы хотите поменять значение характеристики, вам нужна не эта функция, а NRF.updateServices().

Чтобы показать информацию характеристики ABDC сервиса BCDE, можно сделать вот так:

NRF.setServices({
  0xBCDE : {
    0xABCD : {
      value : "Привет",
      readable : true
    }
  }
});

Или, например, чтобы управлять тремя светодиодами при помощи записи в характеристику чисел от 0 до 7, можно сделать вот так (evt.data – это ArrayBuffer):

NRF.setServices({
  0xBCDE : {
    0xABCD : {
      writable : true,
      onWrite : function(evt) {
        digitalWrite([LED3,LED2,LED1], evt.data[0]);
      }
    }
  }
});

Вы можете задать множество разных настроек:

NRF.setServices({
  0xBCDE : {
    0xABCD : {
      value : "Привет", // опционально
      maxLen : 5, // опционально (или размер исходного значения) 
      broadcast : false, // опционально (по умолчанию «false»)
      readable : true,   // опционально (по умолчанию «false») 
      writable : true,   // опционально (по умолчанию «false») 
      notify : true,     // опционально (по умолчанию «false») 
      indicate : true,   // опционально (по умолчанию «false») 
      description: "My Characteristic",  // опционально
                                         // по умолчанию «null»
      security: { // опционально, см. описание NRF.setSecurity()
        read: {   // опционально
          encrypted: false, // опционально (по умолчанию «false») 
          mitm: false,   // опционально (по умолчанию «false») 
          lesc: false,   // опционально (по умолчанию «false») 
          signed: false  // опционально (по умолчанию «false») 
        },
        write: {  // опционально
          encrypted: true,  // опционально (по умолчанию «false») 
          mitm: false,   // опционально (по умолчанию «false») 
          lesc: false,   // опционально (по умолчанию «false») 
          signed: false  // опционально (по умолчанию «false») 
        }
      },
      onWrite : function(evt) { // опционально
        console.log("Got ", evt.data); // объект ArrayBuffer
      }
    }
    // можно задать больше характеристик
  }
  // можно задать больше сервисов
});
Примечание

В UUID характеристик и сервисов можно задавать целые числа в диапазоне от 0 до 0xFFFF, строки в формате "ABCD" или строки в формате "ABCDABCD-ABCD-ABCD-ABCD-ABCDABCDABCD".

Аргумент options может иметь следующий формат:

NRF.setServices(undefined, {
  hid : new Uint8Array(...), // опционально (по умолчанию «undefined»)    
                             // включает поддержку BLE HID
  uart : true, // опционально (по умолчанию «true»),
               // включает поддержку BLE UART
  advertise: [ '180D' ] // опционально; список UUID сервисов,
                        // которые надо разослать в объявлениях
});

Чтобы включить BLE HID, в настройке hid нужно задать массив c дескриптором отчета HID. Проще всего это сделать с помощью модуля ble_hid_controls или ble_hid_keyboard.

Примечание

Если просто создать сервис, это еще не значит, что данные о нем будут рассылаться в объявлениях. Во-первых, для этого устройство должно подключиться, а во-вторых, UUID, которые нужно разослать в объявлениях, нужно задать в поле advertise во втором аргументе options. К примеру, код ниже создаст и начнет рассылать в объявлениях данные о сервисе сердцебиения.

NRF.setServices({
  0x180D: { // сердцебиение
    0x2A37: { // измерение сердцебиения
      notify: true,
      value : [0x06, heartrate],
    }
  }
}, { advertise: [ '180D' ] });

В списке UUID для рассылки можно задавать 128-битные UUID, но это может выдать исключение DATA_SIZE, потому что в BLE-пакете объявления недостаточно места для 128-битного UART-идентификатора (и, соответственно, для заданного вами UUID). В этом случае вы можете задать в options настройку uart:false после поля advertise, чтобы отключить UART, но тогда вы не сможете подключиться к консоли Puck.js по Bluetooth.

Если вам обязательно нужно задать два или более 128-битных UUID, вам нужно будет задать собственные пакеты объявлений с неформатированными данными с помощью функции NRF.setAdvertising().

Примечание

Сервисы на Espruino-устройстве можно модифицировать, только если к нему не подключено других устройств, т.к. это требует перезапуска стека Bluetooth. Кроме того, iOS-устройства кэшируют список сервисов, так что приложения вроде nRF Connect могут некорректно показывать старые сервисы даже после того, как вы их модифицировали. Чтобы исправить это, отключите и снова включите Bluetooth на своем iOS-устройстве или воспользуйтесь nRF Connect на Android-устройстве.

Примечание

Не все комбинации настроек безопасности корректны. Вот корректные варианты: encrypted, encrypted + mitm, lesc, signed, signed + mitm. Более подробно читайте в описании функции NRF.setSecurity().

Примеры

См.также

Внешние ссылки