![]() | ![]() | ![]() | ![]() | ![]() |
|---|
استهداف استهلاك الطاقة المنخفضة ، هذه مكتبة Arduino لوحدات Rakwireless Wisblock الأساسية تهتم بجميع Lora P2P ، Lorawan ، Ble ، في وظائف القيادة. يمكنك التركيز على طلبك وترك الباقي إلى واجهة برمجة التطبيقات. تم صنعه كصاحب لمكتبة SX126X-arduino Lorawan
يتطلب بعض التفكير حول تطبيقات Arduino ، لأنه ليس لديك أي setup() أو loop() . بدلا من ذلك كل شيء مدفوع الحدث. تنام MCU حتى تحتاج إلى اتخاذ إجراءات. يمكن أن يكون هذا حدثًا في لوراوان ، أو أمر AT تم استلامه عبر منفذ USB أو حدث طلب ، على سبيل المثال ، مقاطعة قادمة من مستشعر.
هذا النهج يجعل من السهل إنشاء تطبيقات مصممة للاستخدام المنخفض للطاقة. أثناء النوم ، تستهلك قاعدة Wisblock + Wisblock Core Rak4631 فقط 40UA.
بالإضافة إلى ذلك ، يقدم API خيارين لإعداد إعدادات Lora P2P / Lorawan دون الحاجة إلى ترميزها في رموز المصدر.
غيرت V2 من المكتبة تنسيق AT Command ليكون متوافقًا مع RUI3 في الأوامر. يرجى التحقق من دليل Command for Rui3 للاختلافات.
يدعم إصدار V2 فقط وحدة Rakwireless Wisblock Rak4631 Core
يمكن إضافة دعم RAK11310 و RAK1200 في المستقبل
تتعامل API مع كل شيء من setup() ، loop() ، تهيئة Lorawan ، معالجة أحداث Lorawan ، تهيئة BLE ، أحداث BLE التي تتعامل مع واجهة AT.
ملاحظة!
يجب ألا يحتوي تطبيق المستخدم على setup() و loop() !
يحتوي تطبيق المستخدم على وظيفتين للتهيئة ، يتم استدعاء إحداهما في بداية setup() ، والآخر في النهاية. الوظائف الأخرى هي عمليات عمليات الاسترداد للحدث التي تسمى من loop() . من الممكن تحديد الأحداث المخصصة (مثل المقاطعات من مستشعر) أيضًا.
يتم التعامل مع قراءة المستشعر أو التحكم في المحرك أو مهام التطبيق الأخرى في app_event_handler() . يتم استدعاء app_event_handler() بشكل متكرر ، يتم تعريف الوقت بين المكالمات بواسطة التطبيق. بالإضافة إلى ذلك ، يتم استدعاء app_event_handler() في الأحداث المخصصة.
يتم استدعاء ble_data_handler() على أحداث ble (أحداث ble uart rx في الوقت الحالي) من loop() . يمكن استخدامه لتنفيذ التواصل المخصص على Ble Uart.
ملاحظة!
هذه الوظيفة غير مطلوبة على RAK11310!
lora_data_handler() يسمى أحداث لوراوان المختلفة
الرسم البياني TD
A [boot] -> | بدء التشغيل | ب (الإعداد)
ب -> | 1 | D (SETUP_APP)
D -> B (الإعداد)
ب -> | 2 | ه [تهيئة لورا و بلي]
e -> b (الإعداد)
ب -> | 3 | G (init_app)
g -> k (الانتهاء من الإعداد)
K -> | ابدأ حلقة | أنا (حلقة)
س [حدث لورا] -> | استيقظ | ي
o [حدث المستشعر] -> | استيقظ | JP [حدث بلي] -> | استيقظ | JR [AT Command] -> | استيقظ | JT [Timer] -> | استيقظ | Ji -> J (النوم)
K -> | بدء توقيت | ر
J -> L (app_event_handler)
J -> M (lora_data_handler)
J -> n (ble_data_handler)
J -> S (في معالج الأوامر)
L -> u (قراءة أجهزة الاستشعار)
M -> V (انضم ، أحداث TX و RX)
n -> w (تعامل مع الأوامر)
S -> AA (المستخدم في الأوامر)
u -> l
V -> م
W -> n
aa -> s
L -> J.
م -> ي
n -> j
S -> J.

يمكن العثور على جميع الأوامر في دليل AT-Command ، وليس كل 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+=؟ | - | 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 في Command. بالإضافة إلى ذلك ، سيتم سرد الأوامر المخصصة في إذا AT? يستخدم.
ملاحظة! في RUI3 Custom at Orders تسمى ATC بدلاً من في !
لتمديد الأوامر AT ، هناك حاجة إلى ثلاث خطوات:
يتم سرد الأوامر المخصصة في صفيف مع تنسيق ATCMD_T الهيكل. يتكون كل إدخال من الأمر AT ، نص التفسير الذي يتم عرضه عندما يتم استدعاء الأمر بـ A؟ وتأثيرات على وظائف الاستعلام ، وتنفيذ مع المعلمات وتنفيذ دون معلمات. فيما يلي مثال لاثنين من الأوامر المخصصة:
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 ولا يمكن تغييره أو لم يتم اكتشاف الأوامر المخصصة.
لكل أمر مخصص ، يجب كتابة أوامر الاستعلام والتنفيذ. يجب أن تتطابق أسماء هذه الوظائف مع أسماء الوظائف المستخدمة في مجموعة الأوامر المخصصة. يستقبل الأمر Execute كمعلمة قيمة الأمر 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 والوظائف الإضافية (قراءات المستشعرات ، ومعالجة IRQ ، وخدمة موقع GNSS) إلى رسوماتها الخاصة.
تم استخدام Wisblock-API-V2 أيضًا في مشاريع المنصة التالية:
عند استخدامها مع RAK4631 ، تم تضمين تحديث البرامج الثابتة على BLE بالفعل في المكتبة. يمكن إجراء تحديثات البرامج الثابتة لـ RAK4631 باستخدام صندوق أدوات Nordic NRF (متوفر لنظام Android و IOS) أو مع صندوق أدوات WISBlock (تطبيق Android الخاص بي).
بالنسبة للتحديث ، انسخ ملف التحديث الذي تم إنشاؤه (يسمى عادةً البرامج الثابتة.
إذا فشل تحديث البرامج الثابتة عبر BLE ، فقم بتحديث الجهاز إلى أحدث تحميل Bootload لـ RAK4631 مع الإصدار V0.4.3. يمكنك العثور على أحدث محولات التمهيد في Wisblock Repo
يوفر واجهة برمجة التطبيقات بعض المكالمات للإدارة ، وإرسال حزمة Lorawan ، وإرسال بيانات Ble UART ولإطلاق الأحداث.
void api_set_version(uint16_t sw_1 = 1, uint16_t sw_2 = 0, uint16_t sw_3 = 0);
يمكن استدعاء هذه الوظيفة لتعيين إصدار التطبيق. يمكن طلب إصدار التطبيق من قبل الأوامر. يتم بناء رقم الإصدار من ثلاثة أرقام:
sw_1 ==> زيادة الإصدار الرئيسي في تغيير واجهة برمجة التطبيقات / غير متوافق مع الوراء
sw_2 ==> زيادة الإصدار البسيط في تغيير واجهة برمجة التطبيقات / متتالية متتالية
sw_3 ==> زيادة إصدار التصحيح على bugfix ، لا يؤثر على API
إذا لم يتم استدعاء api_set_version ، فإن إصدار التطبيق يفتقر إلى 1.0.0 .
void api_reset(void);
يقوم بإعادة ضبط وحدة Wisblock الأساسية
void api_wake_loop(uint16_t reason);
يستخدم هذا لإيقاظ الحلقة مع حدث. يجب تحديد reason في app.h بعد تطبيق Woke App ، سوف يتصل بـ 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() . نظرًا لأن WISBlock API يتحقق إذا كانت هناك حاجة إلى حفظ أي تغييرات ، سيتم حفظ القيم التي تم تغييرها فقط في التمهيد الأول بعد وميض التطبيق.
مثال:
// 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
ضع في اعتبارك أن المعلمات التي يتم تغييرها من خلال هذه الطريقة يمكن تغييرها في Command أو BLE ولكن سيتم إعادة تعيينها بعد إعادة التشغيل !
يمكن استخدام api_ble_printf() لإرسال البيانات عبر uart ble. يتم دعم 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 هو حجم الحزمة. إذا كان FPORT 0 ، فسيتم استخدام fportDENED في بنية G_LORAWAN_SETTINGS.
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 في منصة إنترنت الأشياء الخاصة بهم.
تمد مكتبة Cayennelpp أنواع البيانات المتاحة مع العديد من أنواع بيانات IPSO غير المدرجة في العمل الأصلي من قبل Johan Stokking أو معظم الشوكات والأعمال الجانبية من قبل أشخاص آخرين ، لا يتم دعم أنواع البيانات الإضافية هذه من قبل MyDevices Cayenne.
يستخدم WISBlock API بعض أنواع البيانات الأخرى التي تمتد على حد سواء أنواع البيانات الأصلية والإلكترونية لدعم النطاق الواسع من وحدات مستشعر WISBlock بشكل أفضل.
لاستخدام أنواع البيانات الموسعة Wisblock API تتضمن بالفعل ملف الرأس المطلوب.
لتكون قادرًا على استخدام وظائف Cayenne LPP ، مطلوب مثيل للفئة.
/* * 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 V MSB غير موقعة | RAK4631 | Voltage_1 |
| رطوبة | 2 | 104 | 1 بايت | في ٪ rh | RAK1901 | الرطوبة |
| درجة حرارة | 3 | 103 | 2 بايت | في درجة مئوية | RAK1901 | درجة حرارة_3 |
| الضغط البارومتري | 4 | 115 | 2 بايت | في HPA (MBAR) | RAK1902 | barometer_4 |
| الإضاءة | 5 | 101 | 2 بايت | 1 لوكس غير موقعة | RAK1903 | إضاءة_5 |
| الرطوبة 2 | 6 | 104 | 1 بايت | في ٪ rh | RAK1906 | الرطوبة |
| درجة الحرارة 2 | 7 | 103 | 2 بايت | في درجة مئوية | RAK1906 | درجة الحرارة |
| الضغط البارومتري 2 | 8 | 115 | 2 بايت | في HPA (MBAR) | RAK1906 | Barometer_8 |
| مقاومة الغاز 2 | 9 | 2 | 2 بايت | 0.01 موقعة (KOHM) | RAK1906 | analog_9 |
| GNSS يقف. دقة | 10 | 136 | 9 بايت | 3 بايت لون/لات 0.0001 درجة ، 3 بايت بديل 0.01 متر | Rak1910 ، Rak12500 | GPS_10 |
| GNSS الدقة المحسنة | 10 | 137 | 11 بايت | 4 بايت LON/LAT 0.000001 ° ، 3 بايت بديل 0.01 متر | Rak1910 ، Rak12500 | GPS_10 |
| درجة حرارة التربة | 11 | 103 | 2 بايت | في درجة مئوية | RAK12023/RAK12035 | درجة حرارة_11 |
| رطوبة التربة | 12 | 104 | 1 بايت | في ٪ rh | RAK12023/RAK12035 | الرطوبة |
| رطوبة التربة الخام | 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 | النسبة المئوية |
| MG812 الغاز | 19 | 2 | 2 بايت | 0.01 وقعت | RAK12008 | analog_in_19 |
| MG812 نسبة الغاز | 20 | 120 | 1 بايت | 1-100 ٪ غير موقعة | RAK12008 | النسبة المئوية |
| MQ3 غاز الكحول | 21 | 2 | 2 بايت | 0.01 وقعت | RAK12009 | analog_in_21 |
| MQ3 الكحول GAS PERC. | 22 | 120 | 1 بايت | 1-100 ٪ غير موقعة | RAK12009 | النسبة المئوية |
| المسافة | 23 | 2 | 2 بايت | 0.01 وقعت | RAK12014 | analog_in_23 |
| TOF البيانات صالحة | 24 | 102 | 1 بايت | بول | RAK12014 | التواجد_24 |
| أدى الدوران | 25 | 134 | 6 بايت | 2 بايت لكل محور ، 0.01 درجة/ثانية | RAK12025 | Gyrometer_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 | analog_29 |
| INA219 الجهد | 30 | 2 | 2 بايت | 0.01 وقعت | RAK16000 | analog_30 |
| INA219 السلطة | 31 | 2 | 2 بايت | 0.01 وقعت | RAK16000 | analog_31 |
| لوحة اللمس غادر | 32 | 102 | 1 بايت | بول | RAK14002 | التواجد _32 |
| لوحة اللمس الوسطى | 33 | 102 | 1 بايت | بول | RAK14002 | التواجد_33 |
| لوحة اللمس الحق | 34 | 102 | 1 بايت | بول | RAK14002 | التواجد _34 |
| SCD30 تركيز ثاني أكسيد الكربون | 35 | 125 | 2 بايت | 1 جزء في المليون غير موقعة | RAK12037 | تركيز_35 |
| درجة حرارة SCD30 | 36 | 103 | 2 بايت | في درجة مئوية | RAK12037 | درجة الحرارة_36 |
| SCD30 الرطوبة | 37 | 104 | 1 بايت | في ٪ rh | RAK12037 | الرطوبة _37 |
| MLX90632 استشعار درجة الحرارة | 38 | 103 | 2 بايت | في درجة مئوية | RAK12003 | درجة الحرارة_38 |
| MLX90632 كائن درجة الحرارة | 39 | 103 | 2 بايت | في درجة مئوية | 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 | analog_44 |
| زلزال PGA قيمة | 45 | 2 | 2 بايت | التناظرية 10 * م/S2 | RAK12027 | analog_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 Repo أيضًا وحدة فك ترميز مطابقة.
الرمز المستخدم هنا هو مثال API-test.ino.
هذه هي المطلوبة المطلوبة والتعاريف لتطبيق المستخدم وواجهة API
في هذا المثال ، قمنا بتدوين بيانات اعتماد Lorawan. يوصى بشدة بعدم القيام بذلك لتجنب بيانات اعتماد العقدة المكررة
خيارات بديلة لإعداد بيانات الاعتماد
# 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 };تصريحات إلى الأمام لبعض الوظائف (مطلوب عند استخدام منصة)
/* * 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 الفريد. يستخدم هذا الاسم في الإعلان بلي.
/* * 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() . هذا يمكن أن يكون على سبيل المثال أوراق اعتماد لوروان. في هذا المثال ، قمنا بتدوين بيانات اعتماد Lorawan. يوصى بشدة بعدم القيام بذلك لتجنب بيانات اعتماد العقدة المكررة
خيارات بديلة لإعداد بيانات الاعتماد
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 و Lora بالفعل. من الناحية المثالية ، هذا هو المكان المناسب لتهيئة الأشياء المحددة للتطبيق مثل المستشعرات أو المحركات. في هذا المثال غير مستخدم
/* *
* @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 Adverstising نشط فقط لمدة 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 ;
}
}
}
} يتم استخدام رد الاتصال هذا للتعامل مع البيانات المستلمة على uart ble. إذا كنت لا تحتاج إلى وظيفة BLE UART ، فيمكنك إزالة هذه الوظيفة تمامًا. في هذا المثال ، نقوم بإعادة توجيه بيانات BLE UART المستلمة إلى مترجم AT. وبهذه الطريقة ، يمكننا تقديم أوامر إما عبر منفذ USB أو عبر منفذ Ble Uart.
يتم دعم التواصل BLE فقط على RAK4631. RAK11310 ليس لديه بلي.
# 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. في هذا المثال ، لا نقوم بتحليل البيانات ، يتم طباعتها فقط إلى السجل وفوق UART (إذا كان الجهاز متصلاً)
يتم تشغيل الحدث LORA_TX_FIN بعد إرسال حزمة الوصلة الصاعدة ، بما في ذلك Windows RX1 و RX2. إذا تم إرسال الحزم المؤكدة ، فإن العلم العالمي g_rx_fin_result يحتوي على نتيجة للإرسال المؤكد. إذا كان g_rx_fin_result صحيحًا ، فقد أقر خادم Lorawan حزمة الوصلة الصاعدة عن طريق إرسال ACK . وإلا يتم تعيين g_rx_fin_result على خطأ ، مما يشير إلى أنه لم يتم استلام الحزمة بواسطة خادم Lorawan (لا توجد بوابة في المدى ، أصيبت الحزمة بتلفها على الهواء. إذا تم إرسال الحزم غير المؤكدة أو إذا تم استخدام وضع Lora P2P ، فإن العلامة g_rx_fin_result هي دائمًا.
تم استدعاء الحدث lora_join_fin بعد الانتهاء من دورة arme/Quality request/reject. يحتوي العلم العالمي 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 الذي يمكنه التحكم في سلوك المكتبات المضمنة. لتغيير سجل التصحيح واستخدام LED Blue Ble ، يجب عليك فتح ملف WisBlock-API-V2.h في مجلد مصدر المكتبات.
لتمكين/تعطيل API Debug ( 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 ويمكن استخدام LED الأزرق لأغراض أخرى.
يمكن التحكم في إخراج التصحيح بواسطة تعريفات في platformio.ini API_DEBUG CONTROLS DEBUG OUTPUG OF WISBLOCK API
0 -> No debug outpuy
1 -> WisBlock API debug output
MY_DEBUG يتحكم في إخراج التطبيق من التطبيق نفسه
0 -> No debug outpuy
1 -> Application debug output
NO_BLE_LED يتحكم في استخدام LED Blue Ble.
0 -> the blue LED will be used to indicate BLE status
1 -> the blue LED will not used
مثال على عدم وجود ناتج التصحيح ولا يوجد LED أزرق
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تم نشر المكتبة تحت رخصة معهد ماساتشوستس للتكنولوجيا
الاعتمادات:
في وظائف الأوامر: تايلور لي ([email protected])
إصدارات الكود
api_read_credentials()api_set_credentials() يحفظ ليومضWisBlock API LoRaWAN العامة بدلاً من GNSS