![]() | ![]() | ![]() | ![]() | ![]() |
|---|
Эта библиотека Arduino для низкого энергопотребления для модулей Arduino для основных модулей Wisblock заботится обо всех Lora P2P, Lorawan, BLE, в функциональности команды. Вы можете сосредоточиться на своем применении и оставить остальное в API. Он сделан как компаньон в библиотеке SX126X-Aduino Lorawan
Это требует некоторого переосмысления в приложениях Arduino, потому что у вас нет функции setup() или loop() . Вместо этого все обусловлено событием. MCU спит, пока не потребуется действовать. Это может быть событие Lorawan, командование AT, полученное через USB -порт или событие приложения, например, прерывание, исходящее от датчика.
Этот подход позволяет легко создавать приложения, предназначенные для использования низкой мощности. Во время сна база Wisblock + Wisblock Core Rak4631 потребляет только 40UA.
Кроме того, API предлагает два варианта настройки настроек Lora P2P / Lorawan без необходимости жесткого кода в исходные коды.
V2 библиотеки изменил формат команды AT, чтобы быть совместимым с RUI3 в командах. Пожалуйста, проверьте руководство по команде AT для RUI3 для различий.
Выпуск V2 поддерживает только основной модуль Rakwireless Wisblock RAK4631
Поддержка RAK11310 и RAK1200 может быть добавлена в будущем
API обрабатывает все от setup() , loop() , инициализации Лоравана, обработки событий Lorawan, инициализации BLE, обработки событий BLE до командного интерфейса AT.
Замечание!
Пользовательское приложение не должно иметь функций setup() и loop() !
Пользовательское приложение имеет две функции инициализации, одна вызывается в начале setup() , а другая в самом конце. Другими функциями являются обратные вызовы событий, которые называются из loop() . Можно определить пользовательские события (например, прерывания из датчика).
Чтение датчика, управление приводом или другие задачи применения обрабатываются в app_event_handler() . app_event_handler() часто называется, время между вызовами определяется приложением. Кроме того, app_event_handler() вызывается на пользовательских событиях.
ble_data_handler() вызывается на BLE Events (события BLE UART RX на данный момент) от loop() . Его можно использовать для реализации пользовательской связи через Ble UART.
Замечание!
Эта функция не требуется на RAK11310!
lora_data_handler() вызывается на разных событиях Lorawan
График тд
[Boot] -> | Startup | B (настройка)
B -> | 1 | D (setup_app)
D -> B (настройка)
B -> | 2 | E [Инициализировать Lora и Ble]
E -> b (настройка)
B -> | 3 | G (init_app)
G -> k (установка закончена)
K -> | Start Loop | Я (петля)
Q [Событие LORA] -> | Wake Up | Дж
O [Сенсорное событие] -> | Wake Up | JP [BLE EVER] -> | Wake Up | JR [AT Command] -> | Wake Up | Jt [таймер] -> | Проснись | Ji -> j (спать)
K -> | Начало таймера | Т
J -> l (app_event_handler)
J -> m (lora_data_handler)
J -> n (ble_data_handler)
J -> s (у командования)
L -> u (чтение датчиков)
M -> V (События Join, TX и RX)
N -> w (обрабатывать блю в командах)
S -> aa (пользователь в командах)
U -> l
V -> м
W -> n
Аа -> с
L -> J.
M -> J.
N -> j
S -> J.

Все команды могут быть найдены в руководстве по команде. Не все rui3 в командах поддерживаются. Список доступных в командах может быть получен с помощью AT? с устройства
Два пользователя в командах были добавлены в RUI3 по умолчанию в наборе команды:
Описание: Установите интервал автоматической передачи
Эта команда позволяет устанавливать интервал в секундах между автоматическими передачами пакетов. Если установлено в 0, автоматическая передача пакетов отключена.
| Командование | Входной параметр | Возвращаемое значение | Вернуть код |
|---|---|---|---|
| ATC+Sendint? | - | ATC+SENDINT: "Get or Set the automatic send interval | OK |
| ATC+sendint =? | - | <interval in seconds> | OK |
ATC+sendint = <Input Parameter> | <interval in seconds> | - | OK или AT_PARAM_ERROR |
Примеры :
ATC+SENDINT?
ATC+SENDINT: Get or Set the automatic send interval
OK
ATC+SENDINT=?
ATC+SENDINT:60
OK
ATC+SENDINT=60
OK
Описание: Показать состояние устройства
Эта команда позволяет пользователю получить текущее состояние устройства.
| Командование | Входной параметр | Возвращаемое значение | Вернуть код |
|---|---|---|---|
| ATC+статус? | - | ATC+STATUS: Show LoRaWAN status | OK |
| ATC+Status =? | - | <Статус> | OK |
Примеры :
ATC+STATUS?
ATC+STATUS: Show LoRaWAN status
OK
// When in LoRaWAN mode:
ATC+STATUS=?
Device status:
RAK4631
Mode LPWAN
Auto join enabled
Network joined
LPWAN status:
Dev EUI AC1F09FFFE09016C
App EUI 70B3D57ED00201E1
App Key 2B84E0B09B68E5CB42176FE753DCEE79
Dev Addr 26021FB4
NWS Key 323D155A000DF335307A16DA0C9DF53F
Apps Key 3F6A66459D5EDCA63CBC4619CD61A11E
OTAA enabled
ADR disabled
Public Network
Dutycycle disabled
Join trials 5
TX Power 0
DR 3
Class 0
Subband 1
Fport 2
Unconfirmed Message
Region AS923-3
Send Frequency 300
// When in LoRa P2P mode:
ATC+STATUS=?
Device status:
RAK4631
Mode P2P
P2P frequency 916000000
P2P TX Power 22
P2P BW 125
P2P SF 7
P2P CR 0
P2P Preamble length 8
P2P Symbol Timeout 0
Send Frequency 300
Описание: Настройки порта
Эта команда позволяет пользователю получить доступ и настраивать настройки порта.
| Командование | Входной параметр | Возвращаемое значение | Вернуть код |
|---|---|---|---|
| ATC+порт? | - | AT+PORT=<Port><CR>. Get or Set the Port | OK |
| ATC+Port =? | - | 1-223 | ХОРОШО |
ATC+Port = <Input Parameter> | 1-223 | - | ОК или at_param_error |
Примеры :
ATC+PORT?
ATC+PORT: Get or Set the Port=[1..223]
OK
ATC+PORT=?
ATC+PORT:2
OK
ATC+PORT=2
OK
Назад
Начиная с Wisblock API v1.1.2, команды AT могут быть расширены пользователем, определенными в командах. Эта новая реализация использует функцию анализатора Wisblock API в командной функции. Кроме того, пользовательские команды будут перечислены, если AT? используется.
Замечание! В RUI3 пользователь в командах вызывается с ATC вместо AT !
Чтобы расширить команды AT, требуются три шага:
Пользовательские команды перечислены в массиве с форматом struct atcmd_t. Каждая запись состоит из команды AT, текста объяснения, который отображается, когда команда вызывается с помощью? и указатели на функции для запроса, выполнять с параметрами и выполнять без параметров. Вот пример для двух пользовательских команд:
atcmd_t g_user_at_cmd_list_example[] = {
/* | CMD | AT+CMD? | AT+CMD=? | AT+CMD=value | AT+CMD | Permissions | */
// GNSS commands
{ " +SETVAL " , " Get/Set custom variable " , at_query_value, at_exec_value, NULL , " RW " },
{ " +LIST " , " Show last packet content " , at_query_packet, NULL , NULL , " R " },
};
atcmd_t *g_user_at_cmd_list = g_user_at_cmd_list_example; Замечание 1
Структура для пользовательских команд расширена для совместимости RUI3. Старый код, написанный для Wisblock-API V1.x, должен быть настроен на эту новую структуру.
Замечание 2
Для функций, которые не поддерживаются командой AT, необходимо помещать в массив NULL .
Замечание 3
Имя g_user_at_cmd_list исправлено и не может быть изменено или пользовательские команды не обнаруживаются.
Замечание 4
Разрешения даны как строка. Допустимые записи «r» (только читать), "w" (только написать), "rw" (читать и написать)
Должна быть предоставлена переменная с количеством пользовательских команд:
/* * Number of user defined AT commands */
uint8_t g_user_at_cmd_num = sizeof (g_user_at_cmd_list_example) / sizeof ( atcmd_t ); Примечание
Имя g_user_at_cmd_num исправлено и не может быть изменено или пользовательские команды не обнаруживаются.
Для каждой пользовательской команды должны быть записаны команды запроса и выполнения. Имена этих функций должны соответствовать именам функций, используемых в массиве пользовательского в командах. Команда выполнения получает в качестве параметра значение команды AT после = значения.
Функции запроса ( =? ) Не получают и параметры и должны всегда возвращаться с 0. Функции запроса Сохранить результат запроса в глобальном массиве char g_at_query_buffer , массив имеет максимальный размер ATQUERY_SIZE , который составляет 128 символов.
Выполнить функции с параметрами ( =<value> ) Принять значения или настройки в качестве указателя на массив ChAR. Этот массив включает только значение или параметр без самой команды AT. Например, обработка функций выполнения ATC+SETDEV=12000 получит только 120000 . Полученное значение или параметр должен быть проверен на обоснованность, и если значение формата не соответствует, необходимо возвращать AT_ERRNO_PARA_VAL . Если значение или параметр правильный, функция должна вернуть 0 .
Выполнить функции без параметров используются для выполнения действия и возврата успеха действия как 0 , если успешно или AT_ERRNO_EXEC_FAIL , если выполнение не удалось.
Эти примеры используются для установки переменной в приложении.
/* ******************************************************************* */
// Example AT command to change the value of the variable new_val:
// Query the value AT+SETVAL=?
// Set the value AT+SETVAL=120000
// Second AT command to show last packet content
// Query with AT+LIST=?
/* ******************************************************************* */
int32_t new_val = 3000 ;
/* *
* @brief Returns the current value of the custom variable
*
* @return int always 0
*/
static int at_query_value ()
{
snprintf (g_at_query_buf, ATQUERY_SIZE, " Custom Value: %d " , new_val);
return 0 ;
}
/* *
* @brief Command to set the custom variable
*
* @param str the new value for the variable without the AT part
* @return int 0 if the command was succesfull, 5 if the parameter was wrong
*/
static int at_exec_value ( char *str)
{
new_val = strtol (str, NULL , 0 );
MYLOG ( " APP " , " Value number >>%ld<< " , new_val);
return 0 ;
}
/* *
* @brief Example how to show the last LoRa packet content
*
* @return int always 0
*/
static int at_query_packet ()
{
snprintf (g_at_query_buf, ATQUERY_SIZE, " Packet: %02X%02X%02X%02X " ,
g_lpwan_data. data_flag1 ,
g_lpwan_data. data_flag2 ,
g_lpwan_data. batt_1 ,
g_lpwan_data. batt_2 );
return 0 ;
}
/* *
* @brief List of all available commands with short help and pointer to functions
*
*/
atcmd_t g_user_at_cmd_list_example[] = {
/* | CMD | AT+CMD? | AT+CMD=? | AT+CMD=value | AT+CMD | Permission | */
// GNSS commands
{ " +SETVAL " , " Get/Set custom variable " , at_query_value, at_exec_value, NULL , " RW " },
{ " +LIST " , " Show last packet content " , at_query_packet, NULL , NULL , " R " },
};
atcmd_t *g_user_at_cmd_list = g_user_at_cmd_list_example;
/* * Number of user defined AT commands */
uint8_t g_user_at_cmd_num = sizeof (g_user_at_cmd_list_example) / sizeof ( atcmd_t );Эти пять примеров объясняют использование API. Во всех примерах обратные вызовы API и дополнительные функции (показания датчиков, обработка IRQ, служба местоположения GNSS) разделены на свои собственные наброски.
Wisblock-API-V2 также использовался в следующих проектах платформы:
При использовании с RAK4631 обновление прошивки по BLE уже включено в библиотеку. Обновления прошивки для RAK4631 могут быть сделаны с помощью Nordic NRF Toolbox (доступный для Android и iOS) или с помощью инструментов Wisblock (мое приложение для Android).
Для обновления скопируйте созданный файл обновления (обычно называемый Firmware.zip) из папки .pio/build/{device}, скопируйте его на телефон и используйте одно из приложений для обновления прошивки.
Если обновление прошивки с помощью BLE не сбои, обновите устройство до последнего загрузчика для RAK4631 с версией V0.4.3. Вы можете найти последний загрузчик в Wisblock Repo
API предоставляет некоторые звонки для управления, отправлять пакет Lorawan, отправлять данные BLE UART и запускать события.
void api_set_version(uint16_t sw_1 = 1, uint16_t sw_2 = 0, uint16_t sw_3 = 0);
Эта функция может быть вызвана для установки версии приложения. Версию приложения может быть запрошена в командах. Номер версии построен из трех цифр:
sw_1 ==> Увеличение основной версии при изменении API / не обратно совместимо
sw_2 ==> Увеличение незначительного изменения API -изменения / обратно совместимым
sw_3 ==> Увеличение версии патча на ошибках, нет влияния на API
Если api_set_version не называется, версия приложения по умолчанию на 1.0.0 .
void api_reset(void);
Выполняет сброс модуля Wisblock Core
void api_wake_loop(uint16_t reason);
Это используется для разбуждения петли с событием. reason должна быть определена в app.h После приложения Loop Spoak он позвонит в app_event_handler() со значением reason в g_task_event_type .
Например, это можно использовать для разбуждения устройства от прерывания датчика акселерометра. Здесь, в качестве примера извлечение из примера примера accelerometer .
В accelerometer.ino событие определено. Первым определением является установка сигнала, второе - очистить событие после его обработки.
/* * Define additional events */
# define ACC_TRIGGER 0b1000000000000000
# define N_ACC_TRIGGER 0b0111111111111111 Затем в lis3dh_acc.ino в функции обратного вызова прерывания void acc_int_handler(void) цикл проснулся с сигналом ACC_TRIGGER
void acc_int_handler ( void )
{
// Wake up the task to handle it
api_wake_loop (ACC_TRIGGER);
} И, наконец, в accelerometer.ino Это событие обрабатывается в app_event_handler()
// ACC triggered event
if ((g_task_event_type & ACC_TRIGGER) == ACC_TRIGGER)
{
g_task_event_type &= N_ACC_TRIGGER;
MYLOG ( " APP " , " ACC IRQ wakeup " );
// Reset ACC IRQ register
get_acc_int ();
// Set Status flag, it will trigger sending a packet
g_task_event_type = STATUS;
} void api_log_settings(void);
Эта функция может быть вызвана для перечисления полных настроек устройства Wisblock над USB. Вывод выглядит как:
Device status:
RAK11310
Auto join enabled
Mode LPWAN
Network joined
Send Frequency 120
LPWAN status:
Dev EUI AC1F09FFFE0142C8
App EUI 70B3D57ED00201E1
App Key 2B84E0B09B68E5CB42176FE753DCEE79
Dev Addr 26021FB4
NWS Key 323D155A000DF335307A16DA0C9DF53F
Apps Key 3F6A66459D5EDCA63CBC4619CD61A11E
OTAA enabled
ADR disabled
Public Network
Dutycycle disabled
Join trials 30
TX Power 0
DR 3
Class 0
Subband 1
Fport 2
Unconfirmed Message
Region AS923-3
LoRa P2P status:
P2P frequency 916000000
P2P TX Power 22
P2P BW 125
P2P SF 7
P2P CR 1
P2P Preamble length 8
P2P Symbol Timeout 0 void api_timer_stop(void)
Останавливает таймер, который часто разбудит MCU.
void api_timer_restart(uint32_t new_time)
Перезагружает таймер с новым значением. Ценность в миллисекундах
void api_read_credentials(void);
void api_set_credentials(void); Если настройки Lora P2P должны быть жестко кодированы (например, частота, полоса пропускания, ...) это можно сделать в setup_app() . Сначала сохраненные настройки должны быть считываются из Flash с помощью api_read_credentials(); , затем настройки могут быть изменены. После изменения настройки должны быть сохранены с помощью api_set_credentials() . Когда API Wisblock проверяет, если необходимо сохранить какие -либо изменения, измененные значения будут сохранены только на первой загрузке после прошивки приложения.
Пример:
// Read credentials from Flash
api_read_credentials ();
// Make changes to the credentials
g_lorawan_settings.p2p_frequency = 916000000 ; // Use 916 MHz to send and receive
g_lorawan_settings.p2p_bandwidth = 0 ; // Bandwidth 125 kHz
g_lorawan_settings.p2p_sf = 7 ; // Spreading Factor 7
g_lorawan_settings.p2p_cr = 1 ; // Coding Rate 4/5
g_lorawan_settings.p2p_preamble_len = 8 ; // Preample Length 8
g_lorawan_settings.p2p_tx_power = 22 ; // TX power 22 dBi
// Save hard coded LoRaWAN settings
api_set_credentials (); Замечание 1
Жесткодированные настройки должны быть установлены в void setup_app(void) !
Замечание 2
Имейте в виду, что параметры, которые изменяются с этим методом, могут быть изменены по команде или BLE , но будут сброшены после перезагрузки !
api_ble_printf() может использоваться для отправки данных по BLE UART. print , println и printf поддерживаются.
Примечание
Эта команда недоступна на RAK11310!
По умолчанию реклама BLE активна только в течение 30 секунд после включения/сброса, чтобы снизить энергопотребление. Вызовов void restart_advertising(uint16_t timeout); Реклама может быть перезапущена в течение секунд timeout .
Примечание
Эта команда недоступна на RAK11310!
lmh_error_status send_lora_packet(uint8_t *data, uint8_t size, uint8_t fport = 0); используется для отправки пакета данных на сервер Lorawan. *data - это указатель на буфер, содержащий данные, size - это размер пакета. Если Fort равен 0, используется FPORTDEFINED в структуре G_LORAWAN_SETTINGSS.
bool send_p2p_packet(uint8_t *data, uint8_t size); используется для отправки пакета данных через Lora P2P. *data - это указатель на буфер, содержащий данные, size - это размер пакета.
После того, как цикл TX (включая RX1 и RX2 Windows) завершен, результат удерживается в глобальном флаге g_rx_fin_result , событие LORA_TX_FIN запускается, и вызовов lora_data_handler() вызывается. В этом обратном вызове может быть проверен результат, и, если необходимо, могут быть приняты меры.
Cayennelpp - это формат, разработанный MyDevices для интеграции узлов Lorawan в свою платформу IoT.
Библиотека Cayennelpp расширяет доступные типы данных с несколькими типами данных IPSO, не включенными в исходную работу Йохана Стоккинга или большинства вилок и боковых работ других людей, эти дополнительные типы данных не поддерживаются MyDevices Cayenne.
В API Wisblock используется еще несколько типов данных, которые расширяют как оригинальные, так и Electroniccats Data, чтобы лучше поддержать широкий диапазон модулей датчиков Wisblock.
Для использования расширенных типов данных Wisblock API уже включает в себя необходимый файл заголовка.
Чтобы иметь возможность использовать функции LPP Cayenne, требуется экземпляр класса.
/* * LoRaWAN packet */
WisCayenne g_solution_data ( 255 );Перед добавлением данных необходимо сбросить буфер пакетов
// Reset the packet
g_solution_data.reset();В библиотеке Cayennelpp есть API вызовы для различных поддерживаемых типов данных. См. Cayennelpp API для деталей. В дополнение к этим вызовам API Wisblock API добавляет еще 5 вызовов. Эти вызовы API предназначены для разных форматов GNSS и для данных датчика VOC:
uint8_t addGNSS_4 ( uint8_t channel, int32_t latitude, int32_t longitude, int32_t altitude);
uint8_t addGNSS_6 ( uint8_t channel, int32_t latitude, int32_t longitude, int32_t altitude);
uint8_t addGNSS_H ( int32_t latitude, int32_t longitude, int16_t altitude, int16_t accuracy, int16_t battery);
uint8_t addGNSS_T ( int32_t latitude, int32_t longitude, int16_t altitude, float accuracy, int8_t sats);
uint8_t addVoc_index ( uint8_t channel, uint32_t voc_index); /* *
* @brief Add GNSS data in Cayenne LPP standard format
*
* @param channel LPP channel
* @param latitude Latitude as read from the GNSS receiver
* @param longitude Longitude as read from the GNSS receiver
* @param altitude Altitude as read from the GNSS receiver
* @return uint8_t bytes added to the data packet
*/
uint8_t WisCayenne::addGNSS_4 ( uint8_t channel, int32_t latitude, int32_t longitude, int32_t altitude) /* *
* @brief Add GNSS data in custom Cayenne LPP format
* Requires changed decoder in LNS and visualization
* Does not work with Cayenne LPP MyDevices
*
* @param channel LPP channel
* @param latitude Latitude as read from the GNSS receiver
* @param longitude Longitude as read from the GNSS receiver
* @param altitude Altitude as read from the GNSS receiver
* @return uint8_t bytes added to the data packet
*/
uint8_t WisCayenne::addGNSS_6 ( uint8_t channel, int32_t latitude, int32_t longitude, int32_t altitude) /* *
* @brief Add GNSS data in Helium Mapper format
*
* @param channel LPP channel
* @param latitude Latitude as read from the GNSS receiver
* @param longitude Longitude as read from the GNSS receiver
* @param altitude Altitude as read from the GNSS receiver
* @param accuracy Accuracy of reading from the GNSS receiver
* @param battery Device battery voltage in V
* @return uint8_t bytes added to the data packet
*/
uint8_t WisCayenne::addGNSS_H ( int32_t latitude, int32_t longitude, int16_t altitude, int16_t accuracy, int16_t battery) /* *
* @brief Add GNSS data in Field Tester format
*
* @param latitude Latitude as read from the GNSS receiver
* @param longitude Longitude as read from the GNSS receiver
* @param altitude Altitude as read from the GNSS receiver
* @param accuracy Accuracy of reading from the GNSS receiver
* @param sats Number of satellites of reading from the GNSS receiver
* @return uint8_t bytes added to the data packet
*/
uint8_t WisCayenne::addGNSS_T ( int32_t latitude, int32_t longitude, int16_t altitude, float accuracy, int8_t sats) /* *
* @brief Add the VOC index
*
* @param channel VOC channel
* @param voc_index VOC index
* @return uint8_t bytes added to the data packet
*/
uint8_t WisCayenne::addVoc_index ( uint8_t channel, uint32_t voc_index) Пакеты данных Cayennelpp всегда находятся в формате <Channel #><Channel ID><data bytes> .
Чтобы облегчить его в кодерах данных, используемых на серверах Lorawan, и данных интеграции, собранных датчиками Wisblock, всегда имеют один и тот же номер канала (если используется эти API). Вот список назначенных в настоящее время номера каналов, идентификаторы каналов и какие модули используют комбинацию.
| Данные | Канал # | Идентификатор канала | Длина | Комментарий | Требуемый модуль | Декодированное имя поля |
|---|---|---|---|---|---|---|
| Значение батареи | 1 | 116 | 2 байта | 0,01 В без знака MSB | RAK4631 | voltage_1 |
| Влажность | 2 | 104 | 1 байт | в %rh | RAK1901 | влажность_2 |
| Температура | 3 | 103 | 2 байта | в ° C. | RAK1901 | Температура_3 |
| Барометрическое давление | 4 | 115 | 2 байта | в HPA (MBAR) | RAK1902 | барометр_4 |
| Освещение | 5 | 101 | 2 байта | 1 Люкс без подписи | RAK1903 | Освещение_5 |
| Влажность 2 | 6 | 104 | 1 байт | в %rh | RAK1906 | влажность_6 |
| Температура 2 | 7 | 103 | 2 байта | в ° C. | RAK1906 | Температура_7 |
| Барометрическое давление 2 | 8 | 115 | 2 байта | в HPA (MBAR) | RAK1906 | барометр_8 |
| Газостойкость 2 | 9 | 2 | 2 байта | 0,01 подписано (kohm) | RAK1906 | аналог_9 |
| GNSS стоят. разрешение | 10 | 136 | 9 байтов | 3 байт LON/LAT 0,0001 °, 3 байта ALT 0,01 метра | RAK1910, RAK12500 | GPS_10 |
| Улучшенное разрешение GNSS | 10 | 137 | 11 байтов | 4 байт LON/LAT 0,000001 °, 3 байта ALT 0,01 метра | RAK1910, RAK12500 | GPS_10 |
| Температура почвы | 11 | 103 | 2 байта | в ° C. | Rak12023/rak12035 | Температура_11 |
| Влажность почвы | 12 | 104 | 1 байт | в %rh | Rak12023/rak12035 | влажность_12 |
| Влажность почвы сырой | 13 | 2 | 2 байта | 0,01 подписано | Rak12023/rak12035 | analog_in_13 |
| Данные почвы действительны | 14 | 102 | 1 байт | буль | Rak12023/rak12035 | Присутствие_14 |
| Освещение 2 | 15 | 101 | 2 байта | 1 Люкс без подписи | RAK12010 | Освещение_15 |
| Вокал | 16 | 138 | 2 байта | Индекс ЛОС | RAK12047 | voc_16 |
| MQ2 Газ | 17 | 2 | 2 байта | 0,01 подписано | RAK12004 | analog_in_17 |
| Процент газа MQ2 | 18 | 120 | 1 байт | 1-100% без знака | RAK12004 | процент_18 |
| MG812 Газ | 19 | 2 | 2 байта | 0,01 подписано | RAK12008 | analog_in_19 |
| MG812 Процент газа | 20 | 120 | 1 байт | 1-100% без знака | RAK12008 | процент_20 |
| MQ3 Алкогольный газ | 21 | 2 | 2 байта | 0,01 подписано | RAK12009 | analog_in_21 |
| MQ3 Алкогольный газ Perc. | 22 | 120 | 1 байт | 1-100% без знака | RAK12009 | процент_22 |
| TOF расстояние | 23 | 2 | 2 байта | 0,01 подписано | RAK12014 | analog_in_23 |
| Данные TOF верны | 24 | 102 | 1 байт | буль | RAK12014 | Присутствие_24 |
| Гироскоп вызван | 25 | 134 | 6 байтов | 2 байта на ось, 0,01 °/с | RAK12025 | Гирометр_25 |
| Гест обнаружен | 26 | 0 | 1 байт | 1 байт с удостоверением личности жеста | RAK14008 | Digital_in_26 |
| LTR390 UVI Значение | 27 | 2 | 2 байта | 0,01 подписано | RAK12019 | analog_in_27 |
| LTR390 UVS Значение | 28 | 101 | 2 байта | 1 Люкс без подписи | RAK12019 | Освещение_28 |
| INA219 ток | 29 | 2 | 2 байта | 0,01 подписано | RAK16000 | аналог_29 |
| INA219 напряжение | 30 | 2 | 2 байта | 0,01 подписано | RAK16000 | аналог_30 |
| INA219 Power | 31 | 2 | 2 байта | 0,01 подписано | RAK16000 | аналог_31 |
| Такпад ушел | 32 | 102 | 1 байт | буль | RAK14002 | Присутствие_32 |
| Такпад середина | 33 | 102 | 1 байт | буль | RAK14002 | Присутствие_33 |
| Touchpad Right | 34 | 102 | 1 байт | буль | RAK14002 | Присутствие_34 |
| Концентрация CO2 SCD30 | 35 | 125 | 2 байта | 1 ч / млн без знака | RAK12037 | концентрация_35 |
| SCD30 температура | 36 | 103 | 2 байта | в ° C. | RAK12037 | Температура_36 |
| SCD30 влажность | 37 | 104 | 1 байт | в %rh | RAK12037 | влажность_37 |
| MLX90632 Temp | 38 | 103 | 2 байта | в ° C. | RAK12003 | Температура_38 |
| MLX90632 Объект Temp | 39 | 103 | 2 байта | в ° C. | RAK12003 | Температура_39 |
| PM 1.0 Значение | 40 | 103 | 2 байта | в UG/M3 | RAK12003 | voc_40 |
| PM 2.5 Значение | 41 | 103 | 2 байта | в UG/M3 | RAK12003 | voc_41 |
| PM 10 Значение | 42 | 103 | 2 байта | в UG/M3 | RAK12003 | voc_42 |
| Землетрясение | 43 | 102 | 1 байт | буль | RAK12027 | Присутствие_43 |
| Землетрясение SI Значение | 44 | 2 | 2 байта | аналог 10 * м/с | RAK12027 | аналог_44 |
| Землетрясение PGA | 45 | 2 | 2 байта | аналог 10 * м/с2 | RAK12027 | аналог_45 |
| Землетрясение откладывающее предупреждение | 46 | 102 | 1 байт | буль | RAK12027 | Присутствие_46 |
| Lpp_channel_eq_collapse | 47 | 102 | 1 байт | буль | RAK12027 | Присутствие_47 |
| Статус переключения | 48 | 102 | 1 байт | буль | RAK13011 | Присутствие_48 |
Идентификаторы канала в курсе являются расширенным форматом и не поддерживаются стандартными декодерами данных Cayenne LPP.
Полный и обновленный список используемых форматов данных можно найти в нашем rakwireless_standardized_payload
Репо Rakwireless_standardized_payload включает в себя соответствующий декодер.
Используемый здесь код является примером API-test.ino.
Это необходимые включения и определения для пользовательского приложения и интерфейса API
В этом примере мы сильно кодировали полномочия Лоравана. Настоятельно рекомендуется не делать этого, чтобы избежать дублированных учетных данных узла
Альтернативные параметры для настройки учетных данных - это
# include < Arduino.h >
/* * Add you required includes after Arduino.h */
# include < Wire.h >
// Debug output set to 0 to disable app debug output
# ifndef MY_DEBUG
# define MY_DEBUG 1
# endif
# ifdef NRF52_SERIES
# if MY_DEBUG > 0
# define MYLOG (tag, ...)
do
{
if (tag)
PRINTF ( " [%s] " , tag);
PRINTF (__VA_ARGS__);
PRINTF ( " n " );
if (g_ble_uart_is_connected)
{
g_ble_uart. printf (__VA_ARGS__);
g_ble_uart. printf ( " n " );
}
} while ( 0 )
# else
# define MYLOG (...)
# endif
# endif
# ifdef ARDUINO_ARCH_RP2040
# if MY_DEBUG > 0
# define MYLOG (tag, ...)
do
{
if (tag)
Serial. printf ( " [%s] " , tag);
Serial. printf (__VA_ARGS__);
Serial. printf ( " n " );
} while ( 0 )
# else
# define MYLOG (...)
# endif
# endif
/* * Include the WisBlock-API-V2 */
# include < WisBlock-API-V2.h > // Click to install library: http://librarymanager/All#WisBlock-API-V2
/* * Define the version of your SW */
# define SW_VERSION_1 1 // major version increase on API change / not backwards compatible
# define SW_VERSION_2 0 // minor version increase on API change / backward compatible
# define SW_VERSION_3 0 // patch version increase on bugfix, no affect on API
/* *
Optional hard-coded LoRaWAN credentials for OTAA and ABP.
It is strongly recommended to avoid duplicated node credentials
Options to setup credentials are
- over USB with AT commands
- over BLE with My nRF52 Toolbox
*/
uint8_t node_device_eui[ 8 ] = { 0x00 , 0x0D , 0x75 , 0xE6 , 0x56 , 0x4D , 0xC1 , 0xF3 };
uint8_t node_app_eui[ 8 ] = { 0x70 , 0xB3 , 0xD5 , 0x7E , 0xD0 , 0x02 , 0x01 , 0xE1 };
uint8_t node_app_key[ 16 ] = { 0x2B , 0x84 , 0xE0 , 0xB0 , 0x9B , 0x68 , 0xE5 , 0xCB , 0x42 , 0x17 , 0x6F , 0xE7 , 0x53 , 0xDC , 0xEE , 0x79 };
uint8_t node_nws_key[ 16 ] = { 0x32 , 0x3D , 0x15 , 0x5A , 0x00 , 0x0D , 0xF3 , 0x35 , 0x30 , 0x7A , 0x16 , 0xDA , 0x0C , 0x9D , 0xF5 , 0x3F };
uint8_t node_apps_key[ 16 ] = { 0x3F , 0x6A , 0x66 , 0x45 , 0x9D , 0x5E , 0xDC , 0xA6 , 0x3C , 0xBC , 0x46 , 0x19 , 0xCD , 0x61 , 0xA1 , 0x1E };Пыряющие объявления о некоторых функциях (требуются при использовании Platformio)
/* * Application function definitions */
void setup_app ( void );
bool init_app ( void );
void app_event_handler ( void );
void ble_data_handler ( void ) __attribute__((weak));
void lora_data_handler ( void );Здесь имя приложения установлено на rak-test . Имя будет расширено с помощью уникального идентификатора чипа NRF52. Это имя используется в рекламе BLE.
/* * Application stuff */
/* * Set the device name, max length is 10 characters */
char g_ble_dev_name[ 10 ] = " RAK-TEST " ;Требуются некоторые флаги и сигналы
/* * Flag showing if TX cycle is ongoing */
bool lora_busy = false ;
/* * Send Fail counter * */
uint8_t send_fail = 0 ; Эта функция вызывается в самом начале начала приложения. В этой функции все должно быть настройке, которая требуется до выполнения arduino setup() . Это может быть, например, полномочия Лоравана. В этом примере мы сильно кодировали полномочия Лоравана. Настоятельно рекомендуется не делать этого, чтобы избежать дублированных учетных данных узла
Альтернативные параметры для настройки учетных данных - это
g_enable_ble . Если правда, интерфейс BLE инициализируется. Если ложно, интерфейс BLE не активирован, что может снизить энергопотребление. void setup_app ( void )
{
Serial. begin ( 115200 );
time_t serial_timeout = millis ();
// On nRF52840 the USB serial is not available immediately
while (!Serial)
{
if (( millis () - serial_timeout) < 5000 )
{
delay ( 100 );
digitalWrite (LED_GREEN, ! digitalRead (LED_GREEN));
}
else
{
break ;
}
}
digitalWrite (LED_GREEN, LOW);
MYLOG ( " APP " , " Setup WisBlock API Example " );
# ifdef NRF52_SERIES
// Enable BLE
g_enable_ble = true ;
# endif
// Set firmware version
api_set_version (SW_VERSION_1, SW_VERSION_2, SW_VERSION_3);
// Optional
// Setup LoRaWAN credentials hard coded
// It is strongly recommended to avoid duplicated node credentials
// Options to setup credentials are
// -over USB with AT commands
// -over BLE with My nRF52 Toolbox
// Read LoRaWAN settings from flash
api_read_credentials ();
// Change LoRaWAN settings
g_lorawan_settings. auto_join = true ; // Flag if node joins automatically after reboot
g_lorawan_settings. otaa_enabled = true ; // Flag for OTAA or ABP
memcpy (g_lorawan_settings. node_device_eui , node_device_eui, 8 ); // OTAA Device EUI MSB
memcpy (g_lorawan_settings. node_app_eui , node_app_eui, 8 ); // OTAA Application EUI MSB
memcpy (g_lorawan_settings. node_app_key , node_app_key, 16 ); // OTAA Application Key MSB
memcpy (g_lorawan_settings. node_nws_key , node_nws_key, 16 ); // ABP Network Session Key MSB
memcpy (g_lorawan_settings. node_apps_key , node_apps_key, 16 ); // ABP Application Session key MSB
g_lorawan_settings. node_dev_addr = 0x26021FB4 ; // ABP Device Address MSB
g_lorawan_settings. send_repeat_time = 120000 ; // Send repeat time in milliseconds: 2 * 60 * 1000 => 2 minutes
g_lorawan_settings. adr_enabled = false ; // Flag for ADR on or off
g_lorawan_settings. public_network = true ; // Flag for public or private network
g_lorawan_settings. duty_cycle_enabled = false ; // Flag to enable duty cycle (validity depends on Region)
g_lorawan_settings. join_trials = 5 ; // Number of join retries
g_lorawan_settings. tx_power = 0 ; // TX power 0 .. 15 (validity depends on Region)
g_lorawan_settings. data_rate = 3 ; // Data rate 0 .. 15 (validity depends on Region)
g_lorawan_settings. lora_class = 0 ; // LoRaWAN class 0: A, 2: C, 1: B is not supported
g_lorawan_settings. subband_channels = 1 ; // Subband channel selection 1 .. 9
g_lorawan_settings. app_port = 2 ; // Data port to send data
g_lorawan_settings. confirmed_msg_enabled = LMH_UNCONFIRMED_MSG; // Flag to enable confirmed messages
g_lorawan_settings. resetRequest = true ; // Command from BLE to reset device
g_lorawan_settings. lora_region = LORAMAC_REGION_AS923_3; // LoRa region
// Save LoRaWAN settings
api_set_credentials ();Эта функция называется после BLE, а Лора уже инициализируются. В идеале это место для инициализации конкретных материалов, таких как датчики или приводы. В этом примере это не используется
/* *
* @brief Application specific initializations
*
* @return true Initialization success
* @return false Initialization failure
*/
bool init_app ( void )
{
MYLOG ( " APP " , " init_app " );
return true ;
} Этот обратный вызов вызывается на событии статуса . Событие статуса часто запускается, время установлено send_repeat_time . Это также запускается событиями, определенными пользователями. См. Пример rak1904_example _ Как определены определенные пользовательские события. _ Важно, чтобы флаги событий были сброшены. В качестве примера событие статуса сбросится с помощью этой последовательности кода:
if ((g_task_event_type & STATUS) == STATUS)
{
g_task_event_type &= N_STATUS;
...
} Событие статуса используется для часто отправки пакетов восходящей линии связи на сервер Lorawan.
В этом примере код мы перезагружаем рекламу BLE в течение 15 секунд. В противном случае BLE Acverstising активно только в течение 30 секунд после включения/сброса.
void app_event_handler ( void )
{
// Timer triggered event
if ((g_task_event_type & STATUS) == STATUS)
{
g_task_event_type &= N_STATUS;
MYLOG ( " APP " , " Timer wakeup " );
# ifdef NRF52_SERIES
// If BLE is enabled, restart Advertising
if (g_enable_ble)
{
restart_advertising ( 15 );
}
# endif
if (lora_busy)
{
MYLOG ( " APP " , " LoRaWAN TX cycle not finished, skip this event " );
}
else
{
// Dummy packet
uint8_t dummy_packet[] = { 0x10 , 0x00 , 0x00 };
lmh_error_status result = send_lora_packet (dummy_packet, 3 );
switch (result)
{
case LMH_SUCCESS:
MYLOG ( " APP " , " Packet enqueued " );
// Set a flag that TX cycle is running
lora_busy = true ;
break ;
case LMH_BUSY:
MYLOG ( " APP " , " LoRa transceiver is busy " );
break ;
case LMH_ERROR:
MYLOG ( " APP " , " Packet error, too big to send with current DR " );
break ;
}
}
}
} Этот обратный вызов используется для обработки данных, полученных по BLE UART. Если вам не нужна функциональность BLE UART, вы можете полностью удалить эту функцию. В этом примере мы пересылаем полученные данные BLE UART в командный интерпретатор AT. Таким образом, мы можем отправить в командах либо через порт USB, либо через порт Ble Uart.
BLE Communication поддерживается только на RAK4631. RAK11310 не имеет BLE.
# ifdef NRF52_SERIES
void ble_data_handler ( void )
{
if (g_enable_ble)
{
/* ************************************************************ */
/* ************************************************************ */
// / todo BLE UART data arrived
// / todo or forward them to the AT command interpreter
// / todo parse them here
/* ************************************************************ */
/* ************************************************************ */
if ((g_task_event_type & BLE_DATA) == BLE_DATA)
{
MYLOG ( " AT " , " RECEIVED BLE " );
// BLE UART data arrived
// in this example we forward it to the AT command interpreter
g_task_event_type &= N_BLE_DATA;
while (g_ble_uart. available () > 0 )
{
at_serial_input ( uint8_t (g_ble_uart. read ()));
delay ( 5 );
}
at_serial_input ( uint8_t ( ' n ' ));
}
}
}
# endif Этот обратный вызов вызывается на трех разных событиях:
Событие Lora_Data запускается, если появился пакет нисходящей линии связи с сервера Lorawan или пакета Lora P2P. В этом примере мы не анализируем данные, они распечатываются только в журнал и через Ble UART (если устройство подключено)
Событие LORA_TX_FIN запускается после завершения отправки пакета восходящей линии связи, включая окна RX1 и RX2. Если подтверждены пакеты, глобальный флаг g_rx_fin_result содержит результат подтвержденной передачи. Если g_rx_fin_result верна, сервер Lorawan признал пакет восходящей линии связи, отправив ACK . В противном случае g_rx_fin_result устанавливается на FALSE, указывая на то, что пакет не был получен сервером Lorawan (без шлюза в диапазоне, пакет был поврежден в воздухе. Если отправляются неподтвержденные пакеты или если режим Lora P2P используется, то FLAG g_rx_fin_result всегда верно.
Событие LORA_JOIN_FIN вызывается после завершения цикла запроса на соединение/JOIN ACCECT/отклонить. Глобальный флаг g_task_event_type содержит результат запроса на соединение. Если это правда, узел присоединился к сети. Если ложь, соединение не удалось. В этом случае цикл соединения может быть перезапущен, или узел может сообщить об ошибке.
void lora_data_handler ( void )
{
// LoRa data handling
if ((g_task_event_type & LORA_DATA) == LORA_DATA)
{
/* ************************************************************ */
/* ************************************************************ */
// / todo LoRa data arrived
// / todo parse them here
/* ************************************************************ */
/* ************************************************************ */
g_task_event_type &= N_LORA_DATA;
MYLOG ( " APP " , " Received package over LoRa " );
char log_buff[g_rx_data_len * 3 ] = { 0 };
uint8_t log_idx = 0 ;
for ( int idx = 0 ; idx < g_rx_data_len; idx++)
{
sprintf (&log_buff[log_idx], " %02X " , g_rx_lora_data[idx]);
log_idx += 3 ;
}
lora_busy = false ;
MYLOG ( " APP " , " %s " , log_buff);
}
// LoRa TX finished handling
if ((g_task_event_type & LORA_TX_FIN) == LORA_TX_FIN)
{
g_task_event_type &= N_LORA_TX_FIN;
MYLOG ( " APP " , " LPWAN TX cycle %s " , g_rx_fin_result ? " finished ACK " : " failed NAK " );
if (!g_rx_fin_result)
{
// Increase fail send counter
send_fail++;
if (send_fail == 10 )
{
// Too many failed sendings, reset node and try to rejoin
delay ( 100 );
sd_nvic_SystemReset ();
}
}
// Clear the LoRa TX flag
lora_busy = false ;
}
// LoRa Join finished handling
if ((g_task_event_type & LORA_JOIN_FIN) == LORA_JOIN_FIN)
{
g_task_event_type &= N_LORA_JOIN_FIN;
if (g_join_result)
{
MYLOG ( " APP " , " Successfully joined network " );
}
else
{
MYLOG ( " APP " , " Join network failed " );
// / todo here join could be restarted.
// lmh_join();
}
}
} В Arduino невозможно определить настройки в файле .ino, которые могут управлять поведением включенных библиотек. Чтобы изменить журнал отладки и использование синего светодиода, вы должны открыть файл WisBlock-API-V2.h в папке источника библиотек.
Чтобы включить/отключить отладку API ( API_LOG() ) откройте файл WisBlock-API-V2.h в папке источника библиотек.
Искать
# define API_DEBUG 1в файле.
0 -> No debug output
1 -> API debug output
Чтобы включить/отключить приложение Debug ( MY_LOG() ), вы можете найти в примерах (либо в файле .ino или App.h)
# define MY_DEBUG 1в файле.
0 -> No debug output
1 -> Application debug output
Искать
# define NO_BLE_LED 1 В файле WisBlock-API-V2
0 -> the blue LED will be used to indicate BLE status
1 -> the blue LED will not used
Примечание
RAK11310 не имеет BLE, и синий светодиод может использоваться для других целей.
Вывод отладки можно контролировать с помощью определения в платформе API_DEBUG
0 -> No debug outpuy
1 -> WisBlock API debug output
MY_DEBUG CONTROLS DENAKUG Вывод самого приложения
0 -> No debug outpuy
1 -> Application debug output
NO_BLE_LED управляет использованием синего светодиода.
0 -> the blue LED will be used to indicate BLE status
1 -> the blue LED will not used
Пример отсутствия вывода отладки и без синего светодиода
build_flags =
- DAPI_DEBUG =0 ; 0 Disable WisBlock API debug output
- DMY_DEBUG =0 ; 0 Disable application debug output
- DNO_BLE_LED =1 ; 1 Disable blue LED as BLE notificatorБиблиотека опубликована по лицензии MIT
Кредиты:
В командных функциях: Тейлор Ли ([email protected])
Кодовые выпуски
api_read_credentials()api_set_credentials() сохраняет для вспышкиWisBlock API LoRaWAN вместо GNSS