![]() | ![]() | ![]() | ![]() | ![]() |
|---|
Menargetkan konsumsi daya rendah, perpustakaan Arduino ini untuk modul inti Wisblock Rakwireless menangani semua Lora P2P, Lorawan, BLE, pada fungsionalitas komando. Anda dapat berkonsentrasi pada aplikasi Anda dan meninggalkan sisanya ke API. Itu dibuat sebagai pendamping Perpustakaan Lorawan SX126X-ODUINO
Ini membutuhkan beberapa pemikiran ulang tentang aplikasi Arduino, karena Anda tidak memiliki fungsi setup() atau loop() . Sebaliknya semuanya didorong oleh acara. MCU sedang tidur sampai perlu mengambil tindakan. Ini bisa berupa acara Lorawan, perintah AT yang diterima melalui port USB atau acara aplikasi, misalnya interupsi yang berasal dari sensor.
Pendekatan ini memudahkan untuk membuat aplikasi yang dirancang untuk penggunaan daya rendah. Selama tidur basis Wisblock + Wisblock Core RAK4631 hanya mengkonsumsi 40UA.
Selain itu API menawarkan dua opsi untuk mengatur pengaturan Lora P2P / Lorawan tanpa perlu kode hard mereka ke dalam kode sumber.
V2 perpustakaan mengubah format perintah AT menjadi kompatibel dengan RUI3 AT Command. Silakan periksa manual perintah AT untuk RUI3 untuk perbedaan.
Rilis V2 hanya mendukung modul inti Wisblock Rakwireless Rak4631
Dukungan untuk RAK11310 dan RAK1200 mungkin ditambahkan di masa depan
API menangani segala sesuatu mulai dari setup() , loop() , inisialisasi Lorawan, penanganan acara Lorawan, inisialisasi, penanganan peristiwa ke antarmuka AT Command.
KOMENTAR!
Aplikasi pengguna tidak boleh memiliki setup() dan loop() !
Aplikasi pengguna memiliki dua fungsi inisialisasi, satu dipanggil pada awal setup() , yang lain di bagian paling akhir. Fungsi lainnya adalah panggilan balik acara yang dipanggil dari loop() . Dimungkinkan untuk mendefinisikan peristiwa khusus (seperti interupsi dari sensor) juga.
Pembacaan sensor, kontrol aktuator atau tugas aplikasi lainnya ditangani dalam app_event_handler() . app_event_handler() sering dipanggil, waktu antara panggilan ditentukan oleh aplikasi. Selain itu app_event_handler() dipanggil pada acara khusus.
ble_data_handler() dipanggil pada acara BLE (acara BLE UART RX untuk saat ini) dari loop() . Ini dapat digunakan untuk mengimplementasikan komunikasi khusus melalui BLE UART.
KOMENTAR!
Fungsi ini tidak diperlukan pada RAK11310!
lora_data_handler() dipanggil pada acara Lorawan yang berbeda
grafik td
A [boot] -> | startup | B (Pengaturan)
B -> | 1 | D (setup_app)
D -> B (Pengaturan)
B -> | 2 | E [inisialisasi lora dan ble]
E -> B (Pengaturan)
B -> | 3 | G (init_app)
G -> k (pengaturan selesai)
K -> | Mulai Loop | I (loop)
Q [Lora Event] -> | Bangun | J
O [acara sensor] -> | bangun | JP [acara ble] -> | bangun | Jr [AT Command] -> | Bangun | JT [timer] -> | bangun | Ji -> j (tidur)
K -> | Mulai Timer | T
J -> l (app_event_handler)
J -> m (lora_data_handler)
J -> n (ble_data_handler)
J -> S (AT Command Handler)
L -> u (Baca sensor)
M -> v (bergabung, acara TX dan RX)
N -> w (menangani perintah di perintah)
S -> aa (pengguna di perintah)
U -> l
V -> m
W -> n
Aa -> s
L -> j
M -> j
N -> j
S -> j

Semua perintah dapat ditemukan dalam manual di-komandan tidak semua RUI3 pada perintah didukung. Daftar perintah AT yang tersedia dapat diambil dengan AT? dari perangkat
Dua perintah khusus AT telah ditambahkan ke rUI3 default di set perintah:
Deskripsi: Atur interval transmisi otomatis
Perintah ini memungkinkan untuk mengatur interval dalam detik antara transmisi paket otomatis. Jika diatur ke 0, transmisi paket otomatis dinonaktifkan.
| Memerintah | Parameter input | Nilai pengembalian | Kode pengembalian |
|---|---|---|---|
| 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 atau AT_PARAM_ERROR |
Contoh :
ATC+SENDINT?
ATC+SENDINT: Get or Set the automatic send interval
OK
ATC+SENDINT=?
ATC+SENDINT:60
OK
ATC+SENDINT=60
OK
Deskripsi: Tampilkan status perangkat
Perintah ini memungkinkan pengguna untuk mendapatkan status perangkat saat ini.
| Memerintah | Parameter input | Nilai pengembalian | Kode pengembalian |
|---|---|---|---|
| Status ATC+? | - | ATC+STATUS: Show LoRaWAN status | OK |
| ATC+Status =? | - | <tatus> | OK |
Contoh :
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
Deskripsi: Pengaturan port
Perintah ini memungkinkan pengguna untuk mengakses dan mengonfigurasi pengaturan port.
| Memerintah | Parameter input | Nilai pengembalian | Kode pengembalian |
|---|---|---|---|
| ATC+Port? | - | AT+PORT=<Port><CR>. Get or Set the Port | OK |
| ATC+port =? | - | 1-223 | OKE |
ATC+Port = <Input Parameter> | 1-223 | - | OK atau AT_PARAM_ERROR |
Contoh :
ATC+PORT?
ATC+PORT: Get or Set the Port=[1..223]
OK
ATC+PORT=?
ATC+PORT:2
OK
ATC+PORT=2
OK
Kembali
Dimulai dengan WisBlock API v1.1.2 Perintah AT dapat diperpanjang oleh pengguna yang ditentukan pada perintah. Implementasi baru ini menggunakan fungsi parser dari fungsi perintah Wisblock API. Selain itu, perintah AT khusus akan terdaftar jika AT? digunakan.
KOMENTAR! Di RUI3 Custom AT Command dipanggil dengan ATC , bukan AT !
Untuk memperluas perintah AT, tiga langkah diperlukan:
Perintah AT khusus terdaftar dalam array dengan format struct atCMD_T. Setiap entri terdiri dari perintah AT, teks penjelasan yang ditampilkan ketika perintah dipanggil dengan A? dan pointer ke fungsi untuk kueri, jalankan dengan parameter dan jalankan tanpa parameter. Berikut adalah contoh untuk dua perintah khusus di:
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; KATAAN 1
Struktur untuk perintah AT khusus diperpanjang untuk kompatibilitas RUI3. Kode lama yang ditulis untuk WisBlock-API V1.X perlu disesuaikan dengan struktur baru ini.
KATAAN 2
Untuk fungsi yang tidak didukung oleh perintah AT A NULL harus dimasukkan ke dalam array.
KATAAN 3
Nama g_user_at_cmd_list diperbaiki dan tidak dapat diubah atau perintah khusus tidak terdeteksi.
KATAAN 4
Izin diberikan sebagai string. Entri yang valid adalah "r" (hanya baca), "w" (hanya menulis), "rw" (baca dan tulis)
Variabel dengan jumlah perintah AT khusus harus disediakan:
/* * Number of user defined AT commands */
uint8_t g_user_at_cmd_num = sizeof (g_user_at_cmd_list_example) / sizeof ( atcmd_t ); KOMENTAR
Nama g_user_at_cmd_num diperbaiki dan tidak dapat diubah atau perintah khusus tidak terdeteksi.
Untuk setiap perintah kustom kueri dan jalankan perintah harus ditulis. Nama -nama fungsi -fungsi ini harus cocok dengan nama fungsi yang digunakan dalam array perintah AT khusus. Perintah Execute menerima sebagai parameter nilai dari perintah AT setelah = dari nilai.
Fungsi kueri ( =? ) Jangan menerima dan parameter dan harus selalu kembali dengan 0. Fungsi kueri Simpan hasil kueri di array char global g_at_query_buffer , array memiliki ukuran maksimum ATQUERY_SIZE yang merupakan 128 karakter.
Jalankan fungsi dengan parameter ( =<value> ) menerima nilai atau pengaturan sebagai pointer ke array char. Array ini hanya mencakup nilai atau parameter tanpa perintah AT itu sendiri. Misalnya fungsi Execute Handling ATC+SETDEV=12000 hanya akan menerima 120000 . Nilai atau parameter yang diterima harus diperiksa untuk validitas dan jika nilai format tidak cocok, AT_ERRNO_PARA_VAL harus dikembalikan. Jika nilai atau parameternya benar, fungsi harus mengembalikan 0 .
Eksekusi fungsi tanpa parameter digunakan untuk melakukan tindakan dan mengembalikan keberhasilan tindakan sebagai 0 jika sukses atau AT_ERRNO_EXEC_FAIL jika eksekusi gagal.
Contoh ini digunakan untuk mengatur variabel dalam aplikasi.
/* ******************************************************************* */
// 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 );Lima contoh ini menjelaskan penggunaan API. Dalam semua contoh panggilan balik API dan fungsi tambahan (pembacaan sensor, penanganan IRQ, layanan lokasi GNSS) dipisahkan menjadi sketsa mereka sendiri.
Wisblock-API-V2 juga telah digunakan dalam proyek-proyek platformio berikut:
Ketika digunakan dengan RAK4631, pembaruan firmware atas BLE sudah termasuk dalam perpustakaan. Pembaruan firmware untuk RAK4631 dapat dilakukan dengan menggunakan Nordic NRF Toolbox (tersedia untuk Android dan iOS) atau dengan WisBlock Toolbox (aplikasi Android saya).
Untuk pembaruan, salin file pembaruan yang dibuat (biasanya disebut firmware.zip) dari folder .pio/build/{device}, salin ke ponsel Anda dan gunakan salah satu aplikasi untuk memperbarui firmware.
Jika pembaruan firmware melalui BLE gagal, perbarui perangkat ke bootloader terbaru untuk RAK4631 dengan versi v0.4.3. Anda dapat menemukan bootloader terbaru di repo Wisblock
API memberikan beberapa panggilan untuk manajemen, untuk mengirim paket Lorawan, untuk mengirim data BLE UART dan untuk memicu acara.
void api_set_version(uint16_t sw_1 = 1, uint16_t sw_2 = 0, uint16_t sw_3 = 0);
Fungsi ini dapat dipanggil untuk mengatur versi aplikasi. Versi aplikasi dapat diminta oleh perintah AT. Nomor versi dibangun dari tiga digit:
sw_1 ==> Versi utama meningkat pada perubahan API / tidak kompatibel ke belakang
sw_2 ==> Versi minor meningkat pada perubahan API / kompatibel ke belakang
sw_3 ==> Versi patch meningkat pada perbaikan bug, tidak ada pengaruh pada API
Jika api_set_version tidak dipanggil, versi aplikasi default ke 1.0.0 .
void api_reset(void);
Melakukan reset modul inti Wisblock
void api_wake_loop(uint16_t reason);
Ini digunakan untuk membangunkan loop dengan suatu acara. reason harus didefinisikan dalam app.h Setelah aplikasi Loop Woke, itu akan menghubungi app_event_handler() dengan nilai reason di g_task_event_type .
Sebagai contoh, ini dapat digunakan untuk membangunkan perangkat dari interupsi sensor accelerometer. Di sini sebagai contoh ekstrak dari kode contoh accelerometer .
Di accelerometer.ino acara ini didefinisikan. Definisi pertama adalah mengatur sinyal, yang kedua adalah untuk menghapus acara setelah ditangani.
/* * Define additional events */
# define ACC_TRIGGER 0b1000000000000000
# define N_ACC_TRIGGER 0b0111111111111111 Kemudian di lis3dh_acc.ino dalam fungsi callback interupsi void acc_int_handler(void) Loop terbangun dengan sinyal ACC_TRIGGER
void acc_int_handler ( void )
{
// Wake up the task to handle it
api_wake_loop (ACC_TRIGGER);
} Dan akhirnya di accelerometer.ino acara ini ditangani di 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);
Fungsi ini dapat dipanggil untuk mendaftar pengaturan lengkap perangkat Wisblock melalui USB. Output terlihat seperti:
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)
Menghentikan pengatur waktu yang sering membangunkan MCU.
void api_timer_restart(uint32_t new_time)
Mulai ulang timer dengan nilai baru. Nilainya dalam milidetik
void api_read_credentials(void);
void api_set_credentials(void); Jika pengaturan Lora P2P perlu hardcoded (misalnya frekuensi, bandwidth, ...) Ini dapat dilakukan di setup_app() . Pertama, pengaturan yang disimpan harus dibaca dari Flash dengan api_read_credentials(); , maka pengaturan dapat diubah. Setelah mengubah pengaturan harus disimpan dengan api_set_credentials() . Ketika API Wisblock memeriksa jika ada perubahan yang perlu disimpan, nilai yang diubah hanya akan disimpan pada boot pertama setelah mem -flash aplikasi.
Contoh:
// 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 (); KATAAN 1
Pengaturan kode keras harus diatur dalam void setup_app(void) !
KATAAN 2
Perlu diingat bahwa parameter yang diubah dari metode ini dapat diubah pada perintah atau ble tetapi akan diatur ulang setelah reboot !
api_ble_printf() dapat digunakan untuk mengirim data melalui UART. print , println dan printf didukung.
KOMENTAR
Perintah ini tidak tersedia di RAK11310!
Secara default iklan BLE hanya aktif selama 30 detik setelah power-up/reset untuk menurunkan konsumsi daya. Dengan memanggil void restart_advertising(uint16_t timeout); Iklan dapat dimulai ulang selama detik timeout .
KOMENTAR
Perintah ini tidak tersedia di RAK11310!
lmh_error_status send_lora_packet(uint8_t *data, uint8_t size, uint8_t fport = 0); digunakan untuk mengirim paket data ke server Lorawan. *data adalah penunjuk ke buffer yang berisi data, size adalah ukuran paket. Jika fport adalah 0, fortdefined dalam struktur g_lorawan_settings digunakan.
bool send_p2p_packet(uint8_t *data, uint8_t size); digunakan untuk mengirim paket data melalui Lora P2P. *data adalah penunjuk ke buffer yang berisi data, size adalah ukuran paket.
Setelah siklus TX (termasuk Windows RX1 dan RX2) selesai, hasilnya ditahan di flag global g_rx_fin_result , acara LORA_TX_FIN dipicu dan panggilan balik lora_data_handler() dipanggil. Dalam panggilan balik ini hasilnya dapat diperiksa dan jika perlu langkah -langkah dapat diambil.
Cayennelpp adalah format yang dirancang oleh MyDevices untuk mengintegrasikan node Lorawan ke dalam platform IoT mereka.
Perpustakaan CayenNelpp memperluas tipe data yang tersedia dengan beberapa tipe data IPSO yang tidak termasuk dalam karya asli oleh Johan Stokking atau sebagian besar garpu dan karya sampingan oleh orang lain, tipe data tambahan ini tidak didukung oleh MyDevices Cayenne.
WisBlock API menggunakan beberapa tipe data lagi yang memperluas tipe data asli dan electroniccats untuk lebih mendukung berbagai macam modul sensor WisBlock.
Untuk menggunakan tipe data yang diperluas, WisBlock API sudah mencakup file header yang diperlukan.
Untuk dapat menggunakan fungsi Cayenne LPP, diperlukan contoh kelas.
/* * LoRaWAN packet */
WisCayenne g_solution_data ( 255 );Sebelum menambahkan data, buffer paket perlu diatur ulang
// Reset the packet
g_solution_data.reset();Perpustakaan Cayennelpp memiliki panggilan API untuk berbagai tipe data yang didukung. Lihat API Cayennelpp untuk detailnya. Selain panggilan API ini Wisblock API menambahkan 5 panggilan lagi untuk mereka. Panggilan API ini untuk format GNSS yang berbeda dan untuk data sensor 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) Paket data cayennelpp selalu dalam format <Channel #><Channel ID><data bytes> .
Untuk membuatnya lebih mudah dalam encoder data yang digunakan di server Lorawan dan data integrasi yang dikumpulkan oleh sensor WisBlock selalu memiliki nomor saluran yang sama (jika API ini digunakan). Berikut adalah daftar nomor saluran yang saat ini ditetapkan, ID saluran dan modul mana yang menggunakan kombinasi.
| Data | Saluran # | ID saluran | Panjang | Komentar | Modul yang diperlukan | Nama Lapangan Decoded |
|---|---|---|---|---|---|---|
| Nilai baterai | 1 | 116 | 2 byte | 0,01 V MSB yang tidak ditandatangani | RAK4631 | voltage_1 |
| Kelembaban | 2 | 104 | 1 byte | Dalam %RH | RAK1901 | kelembaban_2 |
| Suhu | 3 | 103 | 2 byte | dalam ° C. | RAK1901 | suhu_3 |
| Tekanan barometrik | 4 | 115 | 2 byte | di HPA (mbar) | RAK1902 | Barometer_4 |
| Illuminance | 5 | 101 | 2 byte | 1 lux tidak ditandatangani | RAK1903 | Illuminance_5 |
| Kelembaban 2 | 6 | 104 | 1 byte | Dalam %RH | RAK1906 | kelembaban_6 |
| Suhu 2 | 7 | 103 | 2 byte | dalam ° C. | RAK1906 | suhu_7 |
| Tekanan barometrik 2 | 8 | 115 | 2 byte | di HPA (mbar) | RAK1906 | Barometer_8 |
| Resistensi gas 2 | 9 | 2 | 2 byte | 0,01 ditandatangani (kohm) | RAK1906 | analog_9 |
| Stand GNSS. resolusi | 10 | 136 | 9 byte | 3 byte lon/lat 0,0001 °, 3 byte alt 0,01 meter | RAK1910, RAK12500 | GPS_10 |
| GNSS meningkatkan resolusi | 10 | 137 | 11 byte | 4 byte lon/lat 0,000001 °, 3 byte alt 0,01 meter | RAK1910, RAK12500 | GPS_10 |
| Suhu tanah | 11 | 103 | 2 byte | dalam ° C. | RAK12023/RAK12035 | suhu_11 |
| Kelembaban tanah | 12 | 104 | 1 byte | Dalam %RH | RAK12023/RAK12035 | kelembaban_12 |
| Kelembaban tanah mentah | 13 | 2 | 2 byte | 0,01 ditandatangani | RAK12023/RAK12035 | analog_in_13 |
| Data tanah valid | 14 | 102 | 1 byte | bool | RAK12023/RAK12035 | kehadiran_14 |
| Illuminance 2 | 15 | 101 | 2 byte | 1 lux tidak ditandatangani | RAK12010 | Illuminance_15 |
| VOC | 16 | 138 | 2 byte | Indeks VOC | RAK12047 | voc_16 |
| Gas MQ2 | 17 | 2 | 2 byte | 0,01 ditandatangani | RAK12004 | analog_in_17 |
| Persentase gas MQ2 | 18 | 120 | 1 byte | 1-100% tidak ditandatangani | RAK12004 | Persentase_18 |
| Gas MG812 | 19 | 2 | 2 byte | 0,01 ditandatangani | RAK12008 | analog_in_19 |
| Persentase gas MG812 | 20 | 120 | 1 byte | 1-100% tidak ditandatangani | RAK12008 | persentase_20 |
| Gas alkohol MQ3 | 21 | 2 | 2 byte | 0,01 ditandatangani | RAK12009 | analog_in_21 |
| Perc Gas Alkohol MQ3. | 22 | 120 | 1 byte | 1-100% tidak ditandatangani | RAK12009 | persentase_22 |
| Jarak tof | 23 | 2 | 2 byte | 0,01 ditandatangani | RAK12014 | analog_in_23 |
| Data TOF valid | 24 | 102 | 1 byte | bool | RAK12014 | kehadiran_24 |
| Gyro dipicu | 25 | 134 | 6 byte | 2 byte per sumbu, 0,01 °/s | RAK12025 | gyrometer_25 |
| Gerakan terdeteksi | 26 | 0 | 1 byte | 1 byte dengan ID gerakan | RAK14008 | digital_in_26 |
| LTR390 Nilai UVI | 27 | 2 | 2 byte | 0,01 ditandatangani | RAK12019 | analog_in_27 |
| Nilai LTR390 UVS | 28 | 101 | 2 byte | 1 lux tidak ditandatangani | RAK12019 | Illuminance_28 |
| INA219 saat ini | 29 | 2 | 2 byte | 0,01 ditandatangani | RAK16000 | analog_29 |
| Tegangan ina219 | 30 | 2 | 2 byte | 0,01 ditandatangani | RAK16000 | analog_30 |
| Kekuatan ina219 | 31 | 2 | 2 byte | 0,01 ditandatangani | RAK16000 | analog_31 |
| Touchpad pergi | 32 | 102 | 1 byte | bool | RAK14002 | kehadiran_32 |
| Touchpad Middle | 33 | 102 | 1 byte | bool | RAK14002 | kehadiran_33 |
| Touchpad benar | 34 | 102 | 1 byte | bool | RAK14002 | kehadiran_34 |
| Konsentrasi CO2 SCD30 | 35 | 125 | 2 byte | 1 ppm tidak ditandatangani | RAK12037 | konsentrasi_35 |
| Suhu SCD30 | 36 | 103 | 2 byte | dalam ° C. | RAK12037 | suhu_36 |
| Kelembaban SCD30 | 37 | 104 | 1 byte | Dalam %RH | RAK12037 | kelembaban_37 |
| MLX90632 Sensor Temp | 38 | 103 | 2 byte | dalam ° C. | RAK12003 | suhu_38 |
| MLX90632 Temp objek | 39 | 103 | 2 byte | dalam ° C. | RAK12003 | suhu_39 |
| Nilai PM 1.0 | 40 | 103 | 2 byte | dalam UG/M3 | RAK12003 | voc_40 |
| Nilai PM 2.5 | 41 | 103 | 2 byte | dalam UG/M3 | RAK12003 | voc_41 |
| Nilai PM 10 | 42 | 103 | 2 byte | dalam UG/M3 | RAK12003 | voc_42 |
| Peristiwa gempa bumi | 43 | 102 | 1 byte | bool | RAK12027 | kehadiran_43 |
| Nilai SI Gempa Bumi | 44 | 2 | 2 byte | analog 10 * m/s | RAK12027 | analog_44 |
| Nilai PGA gempa bumi | 45 | 2 | 2 byte | Analog 10 * m/s2 | RAK12027 | analog_45 |
| Peringatan shutoff gempa bumi | 46 | 102 | 1 byte | bool | RAK12027 | kehadiran_46 |
| Lpp_channel_eq_collapse | 47 | 102 | 1 byte | bool | RAK12027 | kehadiran_47 |
| Status beralih | 48 | 102 | 1 byte | bool | RAK13011 | kehadiran_48 |
ID saluran dalam Kursive adalah format yang diperluas dan tidak didukung oleh decoder data LPP Cayenne standar.
Daftar lengkap dan diperbarui dari format data bekas dapat ditemukan di RakWireless_Standized_Payload kami
Repo Rakwireless_Standized_Payload mencakup juga decoder yang cocok.
Kode yang digunakan di sini adalah contoh API-test.ino.
Ini adalah yang diperlukan termasuk dan definisi untuk aplikasi pengguna dan antarmuka API
Dalam contoh ini kami membuat kode kredensial Lorawan yang keras. Sangat disarankan untuk tidak melakukan itu untuk menghindari kredensial simpul yang digandakan
Opsi alternatif untuk mengatur kredensial
# 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 };Deklarasi ke depan dari beberapa fungsi (diperlukan saat menggunakan 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 );Di sini nama aplikasi diatur ke RAK-test . Nama akan diperpanjang dengan ID chip unik NRF52. Nama ini digunakan dalam iklan BLE.
/* * Application stuff */
/* * Set the device name, max length is 10 characters */
char g_ble_dev_name[ 10 ] = " RAK-TEST " ;Beberapa bendera dan sinyal diperlukan
/* * Flag showing if TX cycle is ongoing */
bool lora_busy = false ;
/* * Send Fail counter * */
uint8_t send_fail = 0 ; Fungsi ini dipanggil pada awal awal aplikasi. Dalam fungsi ini semuanya harus diatur yang diperlukan sebelum setup() dieksekusi. Ini bisa menjadi contoh kredensial Lorawan. Dalam contoh ini kami membuat kode kredensial Lorawan yang keras. Sangat disarankan untuk tidak melakukan itu untuk menghindari kredensial simpul yang digandakan
Opsi alternatif untuk mengatur kredensial
g_enable_ble diatur. Jika benar, antarmuka BLE diinisialisasi. Jika salah, antarmuka BLE tidak diaktifkan, yang dapat menurunkan konsumsi daya. 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 ();Fungsi ini dipanggil setelah BLE dan LORA sudah diinisialisasi. Idealnya ini adalah tempat untuk menginisialisasi hal -hal spesifik aplikasi seperti sensor atau aktuator. Dalam contoh ini tidak digunakan
/* *
* @brief Application specific initializations
*
* @return true Initialization success
* @return false Initialization failure
*/
bool init_app ( void )
{
MYLOG ( " APP " , " init_app " );
return true ;
} Panggilan balik ini dipanggil pada acara status . Acara status sering dipicu, waktu ditetapkan oleh send_repeat_time . Itu dipicu juga oleh acara yang ditentukan pengguna. Lihat Contoh RAK1904_Example _ Bagaimana acara yang ditentukan pengguna didefinisikan. _ Penting bahwa bendera acara diatur ulang. Sebagai contoh acara status diatur ulang dengan urutan kode ini:
if ((g_task_event_type & STATUS) == STATUS)
{
g_task_event_type &= N_STATUS;
...
} Acara status digunakan untuk mengirim paket uplink yang sering ke server Lorawan.
Dalam contoh ini kode kami restart juga iklan BLE selama 15 detik. Kalau tidak, advertising hanya aktif selama 30 detik setelah power-up/reset.
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 ;
}
}
}
} Panggilan balik ini digunakan untuk menangani data yang diterima di atas UART. Jika Anda tidak memerlukan fungsionalitas BLE UART, Anda dapat menghapus fungsi ini sepenuhnya. Dalam contoh ini kami meneruskan data BLE UART yang diterima ke penerjemah perintah AT. Dengan cara ini, kita dapat mengirimkan perintah di port USB atau di atas port Ble UART.
Komunikasi BLE hanya didukung pada RAK4631. RAK11310 tidak memiliki 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 Panggilan balik ini dipanggil pada tiga acara yang berbeda:
Acara Lora_data dipicu jika paket downlink dari server Lorawan atau paket Lora P2P telah tiba. Dalam contoh ini kami tidak mem -parsing data, mereka hanya dicetak ke log dan lebih banyak (jika perangkat terhubung)
Acara LORA_TX_FIN dipicu setelah mengirim paket uplink selesai, termasuk jendela RX1 dan RX2. Jika paket yang dikonfirmasi dikirim, bendera global g_rx_fin_result berisi hasil transmisi yang dikonfirmasi. Jika g_rx_fin_result adalah benar, server Lorawan mengakui paket uplink dengan mengirim ACK . Kalau tidak, g_rx_fin_result diatur ke false, menunjukkan bahwa paket tidak diterima oleh server Lorawan (tidak ada gateway dalam jangkauan, paket rusak di udara. Jika paket yang belum dikonfirmasi dikirim atau jika mode Lora P2P digunakan, bendera g_rx_fin_result selalu benar.
Acara lora_join_fin dipanggil setelah siklus request/recequ/tolak gabungan selesai. Bendera Global g_task_event_type berisi hasil dari permintaan bergabung. Jika benar, node telah bergabung dengan jaringan. Jika false gabungan tidak berhasil. Dalam hal ini siklus gabungan dapat dimulai ulang atau simpul dapat melaporkan kesalahan.
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();
}
}
} Di Arduino tidak mungkin untuk mendefinisikan pengaturan dalam file .ino yang dapat mengontrol perilaku perpustakaan yang disertakan. Untuk mengubah log debug dan penggunaan LED biru Anda harus membuka file WisBlock-API-V2.h di folder sumber perpustakaan.
Untuk mengaktifkan/menonaktifkan API Debug ( API_LOG() ) Buka file WisBlock-API-V2.h di folder sumber perpustakaan.
Mencari
# define API_DEBUG 1di file.
0 -> No debug output
1 -> API debug output
Untuk mengaktifkan/menonaktifkan debug aplikasi ( MY_LOG() ) yang dapat Anda temukan dalam contoh (baik di file .ino atau app.h)
# define MY_DEBUG 1di file.
0 -> No debug output
1 -> Application debug output
Mencari
# define NO_BLE_LED 1 dalam file WisBlock-API-V2
0 -> the blue LED will be used to indicate BLE status
1 -> the blue LED will not used
KOMENTAR
RAK11310 tidak memiliki BLE dan LED biru dapat digunakan untuk tujuan lain.
Output debug dapat dikontrol dengan mendefinisikan dalam output debug API_DEBUG
0 -> No debug outpuy
1 -> WisBlock API debug output
MY_DEBUG mengontrol output debug aplikasi itu sendiri
0 -> No debug outpuy
1 -> Application debug output
NO_BLE_LED mengontrol penggunaan LED BLE BLA.
0 -> the blue LED will be used to indicate BLE status
1 -> the blue LED will not used
Contoh untuk tidak ada output debug dan tidak ada LED biru
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 notificatorPerpustakaan yang diterbitkan di bawah Lisensi MIT
Kredit:
Di Fungsi Perintah: Taylor Lee ([email protected])
Rilis Kode
api_read_credentials()api_set_credentials() Simpan untuk flashWisBlock API LoRaWAN generik bukan GNSS