Espruino:Справочник по API/Класс NRF/setAdvertising(): различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= ==Синтакс...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Функция NRF.setAdvertising()<ref>[ www.espruino.com - ]</ref>= | ||
==Синтаксис== | ==Синтаксис== | ||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
NRF.setAdvertising(data, options) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==Параметры== | ==Параметры== | ||
* '''data''' – данные, которые будут рассылаться в объявлениях (в виде объекта). Более подробно см. ниже | |||
* '''options''' – опциональный объект с настройками | |||
==Возвращаемое значение== | ==Возвращаемое значение== | ||
Строка 21: | Строка 22: | ||
==Описание== | ==Описание== | ||
Меняет данные, которые Espruino рассылает в объявлениях. | |||
Эти данные могут быть в формате { UUID : data_as_byte_array }. В UUID должен быть задан [https://www.bluetooth.com/develop-with-bluetooth//gatt/services/Pages/ServicesHome.aspx ID Bluetooth-сервиса]. | |||
К примеру, чтобы вернуть данные о том, что заряд батареи составляет 95%, задайте следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
NRF.setAdvertising({ | |||
0x180F : [95] | |||
}); | |||
</syntaxhighlight> | |||
Или же можно сообщить текущую температуру: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
setInterval(function() { | |||
NRF.setAdvertising({ | |||
0x1809 : [Math.round(E.getTemperature())] | |||
}); | |||
}, 30000); | |||
</syntaxhighlight> | |||
Кроме того, в аргументе data можно задать неформатированные данные объявления в виде массива. К примеру, чтобы разослать объявление о том, что вы являетесь маяком Eddystone, задайте следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
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}); | |||
</syntaxhighlight> | |||
(Впрочем, для Eddystone мы посоветовали бы [https://www.espruino.com/Eddystone Espruino-библиотеку Eddystone]). | |||
'''Примечание:''' Если задать данные в виде массива, некоторые настройки вроде discoverable и showName не будут иметь никакого эффекта. | |||
'''Примечание:''' Размер пакетов объявлений в BLE ограничен 31 байтом. Если вам нужно разослать в больше данных, рассмотрите вариант с использованием массива в аргументе data (см. ниже), или воспользуйтесь функцией [https://www.espruino.com/Reference#l_NRF_setScanResponse NRF.setScanResponse()]. | |||
Вы даже можете задать массив из массивов или объектов – в этом случае каждый пакет объявления будет использоваться по очереди. Например, чтобы ваше устройство рассылало в объявлении уровень заряда батареи и названия (одновременно Eddystone и iBeacon), задайте следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
NRF.setAdvertising([ | |||
{0x180F : [Puck.getBatteryPercentage()]}, // обычная рассылка, | |||
// с процентным | |||
// зарядом батареи | |||
require("ble_ibeacon").get(...), // iBeacon | |||
require("ble_eddystone").get(...), // Eddystone | |||
], {interval:300}); | |||
</syntaxhighlight> | |||
Данные в аргументе options – это объект, содержащий следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
{ | |||
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: [...] // если отправляются данные о производителе | |||
// то здесь будет массив данных | |||
} | |||
</syntaxhighlight> | |||
Если задать в connectable и scannable значение false, это снизит энергопотребление до минимума, т.к. BLE-соединение уже не нужно будет прослушивать после отправки объявлений. | |||
'''Примечание:''' Согласно спецификации BLE, при рассылке объявлений с отключенным connectable интервал рассылки объявлений не может быть меньше 100 мс. | |||
Например, чтобы задать название Puck.js без рассылки каких-либо других данных, можно просто воспользоваться следующей командой: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
NRF.setAdvertising({},{name:"Hello"}); | |||
</syntaxhighlight> | |||
Вы также можете задать «данные о производителе», которые являются еще одной формой данных объявления. Официальные Espruino-устройства зарегистрированы под ID производителя 0x0590 (Pur3 Ltd) – вы можете использовать его для рассылки каких угодно данных, но мы рекомендуем JSON. | |||
Например, если не задать в объявлении название устройства, вы можете задать в ID производителя Espruino до 24 байтов в JSON-формате: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
var data = {a:1,b:2}; | |||
NRF.setAdvertising({},{ | |||
showName:false, | |||
manufacturer:0x0590, | |||
manufacturerData:JSON.stringify(data) | |||
}); | |||
</syntaxhighlight> | |||
Если вы используете [https://github.com/espruino/EspruinoHub 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 символами, так что старайтесь использовать максимально короткие названия полей и избегать чисел с плавающей точкой, которые могут стать очень большими после конвертации в строку. | |||
== Примеры == | == Примеры == |
Версия от 17:20, 7 февраля 2021
Функция 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 символами, так что старайтесь использовать максимально короткие названия полей и избегать чисел с плавающей точкой, которые могут стать очень большими после конвертации в строку.
Примеры
См.также
Внешние ссылки
- ↑ [ www.espruino.com - ]