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

Материал из Онлайн справочника
Версия от 17:50, 12 июня 2023; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


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

Синтаксис

NRF.setAdvertising(data, options)

Параметры

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

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

Описание

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

Эти данные могут быть в формате { UUID : data_as_byte_array }. В UUID должен быть задан ID Bluetooth-сервиса.

К примеру, чтобы вернуть данные о том, что заряд батареи составляет 95%, задайте следующее:

NRF.setAdvertising({
  0x180F : [95]
});

Или же можно сообщить текущую температуру:

setInterval(function() {
  NRF.setAdvertising({
    0x1809 : [Math.round(E.getTemperature())]
  });
}, 30000);

Кроме того, в аргументе data можно задать неформатированные данные объявления в виде массива. К примеру, чтобы разослать объявление о том, что вы являетесь маяком Eddystone, задайте следующее:

NRF.setAdvertising([0x03,  // размер списка сервисов
  0x03,  // Параметр: список сервисов
  0xAA, 0xFE,  // ID маяка Eddystone
  0x13,  // размер данных сервиса
  0x16,  // данные сервиса
  0xAA, 0xFE, // ID маяка Eddystone
  0x10,  // тип фрейма: URL
  0xF8, // мощность сигнала
  0x03, // https://
  'g','o','o','.','g','l','/','B','3','J','0','O','c'],
    {interval:100});

(Впрочем, для Eddystone мы посоветовали бы Espruino-библиотеку Eddystone).

Примечание

Если задать данные в виде массива, некоторые настройки вроде discoverable и showName не будут иметь никакого эффекта.

Примечание

Размер пакетов объявлений в BLE ограничен 31 байтом. Если вам нужно разослать в больше данных, рассмотрите вариант с использованием массива в аргументе data (см. ниже), или воспользуйтесь функцией NRF.setScanResponse().

Вы даже можете задать массив из массивов или объектов – в этом случае каждый пакет объявления будет использоваться по очереди. Например, чтобы ваше устройство рассылало в объявлении уровень заряда батареи и названия (одновременно Eddystone и iBeacon), задайте следующее:

NRF.setAdvertising([
  {0x180F : [Puck.getBatteryPercentage()]}, // обычная рассылка,
                                            // с процентным
                                            // зарядом батареи
  require("ble_ibeacon").get(...),   // iBeacon
  require("ble_eddystone").get(...), // Eddystone
], {interval:300});

Данные в аргументе options – это объект, содержащий следующее:

{
  name: "Hello"            // название устройства
  showName: true/false     // показывать ли полное название или ничего
  discoverable: true/false // обычная обнаруживаемость
                           // или ограниченная
                           // (по умолчанию – ограниченная)
  connectable: true/false  // можно ли подключиться к устройству
                           // (по умолчанию – можно, т.е. «true»)
  scannable : true/false   // может ли устройство быть просканировано
                           // на предмет ответных пакетов сканирования
                           // (по умолчанию – может, т.е. «true») 
  interval: 600            // интервал рассылки объявлений 
                           // между 20 и 10000 миллисекундами
                           // (по умолчанию – 375 миллисекунд)
  manufacturer: 0x0590     // если отправляются данные о производителе 
                           // то здесь будет ID производителя
  manufacturerData: [...]  // если отправляются данные о производителе 
                           // то здесь будет массив данных
}

Если задать в connectable и scannable значение false, это снизит энергопотребление до минимума, т.к. BLE-соединение уже не нужно будет прослушивать после отправки объявлений.

Примечание

Согласно спецификации BLE, при рассылке объявлений с отключенным connectable интервал рассылки объявлений не может быть меньше 100 мс.

Например, чтобы задать название Puck.js без рассылки каких-либо других данных, можно просто воспользоваться следующей командой:

NRF.setAdvertising({},{name:"Hello"});

Вы также можете задать «данные о производителе», которые являются еще одной формой данных объявления. Официальные Espruino-устройства зарегистрированы под ID производителя 0x0590 (Pur3 Ltd) – вы можете использовать его для рассылки каких угодно данных, но мы рекомендуем JSON.

Например, если не задать в объявлении название устройства, вы можете задать в ID производителя Espruino до 24 байтов в JSON-формате:

var data = {a:1,b:2};
NRF.setAdvertising({},{
  showName:false,
  manufacturer:0x0590,
  manufacturerData:JSON.stringify(data)
});

Если вы используете EspruinoHub, он автоматически расшифрует это в следующие MQTT-топики:

  • /ble/advertise/ma:c_:_a:dd:re:ss/espruino -> {"a":10,"b":15}
  • /ble/advertise/ma:c_:_a:dd:re:ss/a -> 1
  • /ble/advertise/ma:c_:_a:dd:re:ss/b -> 2

Помните, что использование JSON ограничено 24 символами, так что старайтесь использовать максимально короткие названия полей и избегать чисел с плавающей точкой, которые могут стать очень большими после конвертации в строку.

Примеры

См.также

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