![]() | ![]() | ![]() | ![]() | ![]() |
|---|
저전력 소비를 목표로, Rakwireless Wisblock Core 모듈 용 Arduino 라이브러리는 모든 Lora P2P, Lorawan, BLE, 명령 기능을 처리합니다. 응용 프로그램에 집중하고 나머지는 API에 맡길 수 있습니다. SX126X-Arduino Lorawan Library의 동반자로 만들어졌습니다.
setup() 또는 loop() 함수가 없기 때문에 Arduino 응용 프로그램에 대한 재고가 필요합니다. 대신 모든 것이 이벤트 중심입니다. MCU는 행동을 취해야 할 때까지 자고 있습니다. 이것은 Lorawan 이벤트 일 수 있으며 USB 포트 또는 응용 프로그램 이벤트에 대해 AT 명령이 수신 될 수 있습니다.
이 접근법을 사용하면 저전력 사용을 위해 설계된 응용 프로그램을 쉽게 만들 수 있습니다. 수면 중 WISBLOCK BASE + WISBLOCK CORE RAK4631은 40UA 만 소비합니다.
또한 API는 소스 코드로 하드 코딩 할 필요없이 LORA P2P / LORAWAN 설정을 설정하는 두 가지 옵션을 제공합니다.
라이브러리의 V2는 AT 명령 형식을 명령에서 Rui3과 호환되도록 변경했습니다. RUI3의 AT 명령 매뉴얼을 확인하십시오.
V2 릴리스는 Rakwireless Wisblock RAK4631 코어 모듈 만 지원합니다.
RAK11310 및 RAK1200에 대한 지원은 향후 추가 될 수 있습니다.
API는 setup() , loop() , Lorawan 초기화, Lorawan 이벤트 처리, BLE 초기화, AT 명령 인터페이스에 대한 BLE 이벤트 처리에서 모든 것을 처리합니다.
주목!
사용자 애플리케이션에는 setup() 및 loop() 함수가 없어야합니다 !
사용자 응용 프로그램에는 두 개의 초기화 함수가 있으며, 하나는 setup() 의 시작 부분에서 호출되고 다른 하나는 끝에 있습니다. 다른 기능은 loop() 에서 호출되는 이벤트 콜백입니다. 센서의 인터럽트와 같은 사용자 정의 이벤트를 정의 할 수 있습니다.
센서 읽기, 액추에이터 제어 또는 기타 응용 프로그램 작업은 app_event_handler() 에서 처리됩니다. app_event_handler() 자주 호출되며 호출 사이의 시간은 응용 프로그램에 의해 정의됩니다. 또한 app_event_handler() 는 사용자 정의 이벤트에서 호출됩니다.
ble_data_handler() loop() 에서 BLE 이벤트 (BLE UART RX 이벤트)에서 호출됩니다. BLE UART를 통해 맞춤형 커뮤니케이션을 구현하는 데 사용할 수 있습니다.
주목!
이 기능은 RAK11310에서 필요하지 않습니다!
lora_data_handler() 다른 Lorawan 이벤트에서 호출됩니다
그래프 TD
[부팅] -> | 시작 | B (설정)
b-> | 1 | d (setup_app)
D-> B (설정)
b-> | 2 | E [Lora 및 BLE 초기화]
e-> b (설정)
b-> | 3 | g (init_app)
g-> k (설정 완료)
K-> | 루프 시작 | 나 (루프)
Q [LORA 이벤트] -> | 깨우기 | J.
o [센서 이벤트] -> | 깨우기 | jp [ble event] -> | 깨우기 | jr [at command] -> | 깨우기 | JT [타이머] -> | 깨우기 | ji-> J (수면)
K-> | 시작 타이머 | 티
j-> l (App_event_handler)
j-> m (lora_data_handler)
j-> n (ble_data_handler)
j-> s (AT Command Handler)
l-> u (센서 읽기)
m-> V (조인, TX 및 RX 이벤트)
n-> w (명령에서 ble 핸들)
s-> aa (명령에서 사용자)
u-> l
v-> m
w-> n
aa-> s
l-> J
m-> j
n-> j
s-> j

AT 명령은 모든 명령 매뉴얼에서 찾을 수 있습니다 . 모든 RUI3의 명령이 지원되는 것은 아닙니다. AT에서 사용할 수있는 명령 목록은 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+상태 =? | - | <상태> | 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+포트 = <Input Parameter> | 1-223 | - | OK 또는 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에서 AT 명령은 AT가 아닌 ATC 로 호출됩니다!
AT 명령을 연장하려면 세 단계가 필요합니다.
사용자 정의 명령은 struct 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 반환해야합니다.
매개 변수가없는 함수 실행은 동작을 수행하고 동작의 성공을 AT_ERRNO_EXEC_FAIL 으로 0 으로 반환하는 데 사용됩니다.
이 예는 응용 프로그램에서 변수를 설정하는 데 사용됩니다.
/* ******************************************************************* */
// 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 );이 5 가지 예는 API의 사용법을 설명합니다. 모든 예에서 API 콜백 및 추가 기능 (센서 판독 값, IRQ 처리, GNSS 위치 서비스)은 자체 스케치로 분리됩니다.
Wisblock-API-V2는 다음 플랫폼 프로젝트에서도 사용되었습니다.
RAK4631과 함께 사용하면 BLE의 펌웨어 업데이트가 이미 라이브러리에 포함되어 있습니다. RAK4631의 펌웨어 업데이트는 Nordic NRF Toolbox (Android 및 iOS에서 사용할 수 있음) 또는 Wisblock Toolbox (My Android 응용 프로그램)를 사용하여 수행 할 수 있습니다.
업데이트의 경우 .pio/build/{device} 폴더에서 생성 된 업데이트 파일 (일반적으로 펌웨어.zip)을 복사하고 전화로 복사하고 응용 프로그램 중 하나를 사용하여 펌웨어를 업데이트하십시오.
BLE를 통한 펌웨어 업데이트가 실패하면 버전 v0.4.3을 사용하여 RAK4631의 최신 부트 로더로 장치를 업데이트하십시오. 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);
이 기능을 호출하여 응용 프로그램 버전을 설정할 수 있습니다. 응용 프로그램 버전은 AT 명령에 의해 요청할 수 있습니다. 버전 번호는 세 자리에서 빌드됩니다.
sw_1 ==> API 변경의 주요 버전 증가 / 거꾸로 호환되지 않음
sw_2 ==> API 변경 / 후진 호환의 마이너 버전 증가
sw_3 ==> 패치 버전이 버그 문제가 증가하고 API에 영향을 미치지 않습니다.
api_set_version 호출되지 않으면 응용 프로그램 버전은 기본값 1.0.0 으로 표시됩니다.
void api_reset(void);
Wisblock 코어 모듈의 재설정을 수행합니다
void api_wake_loop(uint16_t reason);
이것은 이벤트와 함께 루프를 깨우는 데 사용됩니다. 그 reason app.h 에 정의되어야합니다. 루프 깨어 난 앱 후에는 g_task_event_type 에서 reason 의 가치를 가진 app_event_handler() 호출합니다.
예를 들어, 이것은 가속도계 센서의 인터럽트에서 장치를 깨우는 데 사용될 수 있습니다. 여기서 예를 들어 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);
이 기능은 USB를 통해 Wisblock 장치의 전체 설정을 나열하도록 호출 할 수 있습니다. 출력은 다음과 같습니다.
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() 에서 수행 할 수 있습니다. 먼저 저장된 설정은 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
이 메소드에서 변경된 매개 변수는 명령 또는 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 패킷의 크기입니다. fport가 0 인 경우 g_lorawan_settings 구조에서 fportDefined가 사용됩니다.
bool send_p2p_packet(uint8_t *data, uint8_t size); LORA P2P를 통해 데이터 패킷을 보내는 데 사용됩니다. *data 데이터를 포함하는 버퍼에 대한 포인터이며 size 패킷의 크기입니다.
TX주기 g_rx_fin_result RX1 및 LORA_TX_FIN lora_data_handler() 이 콜백에서 결과를 확인할 수 있으며 필요한 경우 조치를 취할 수 있습니다.
Cayennelpp는 MyDevices가 Lorawan 노드를 IoT 플랫폼에 통합하기 위해 설계된 형식입니다.
CayennelPP 라이브러리는 Johan Stokking의 원래 작업에 포함되지 않은 여러 IPSO 데이터 유형 또는 다른 사람들의 대부분의 포크 및 측면 작품으로 사용 가능한 데이터 유형을 확장합니다. 이러한 추가 데이터 유형은 MyDevices Cayenne에서 지원하지 않습니다.
Wisblock API는 원래 및 ElectronicCats 데이터 유형을 모두 확장하여 광범위한 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가 사용되는 경우). 다음은 현재 할당 된 채널 번호, 채널 ID 및 조합을 사용하는 모듈 목록입니다.
| 데이터 | 채널 # | 채널 ID | 길이 | 논평 | 필요한 모듈 | 디코딩 된 필드 이름 |
|---|---|---|---|---|---|---|
| 배터리 값 | 1 | 116 | 2 바이트 | 0.01 v 부호없는 MSB | RAK4631 | 전압 _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 | illuminance_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 | Illuminance_15 |
| voc | 16 | 138 | 2 바이트 | VOC 지수 | 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 °/s | RAK12025 | 자이로 미터 _25 |
| 제스처가 감지되었습니다 | 26 | 0 | 1 바이트 | 제스처의 ID와 1 바이트 | RAK14008 | Digital_In_26 |
| LTR390 UVI 값 | 27 | 2 | 2 바이트 | 0.01 서명 | RAK12019 | ANALOG_IN_27 |
| LTR390 UVS 값 | 28 | 101 | 2 바이트 | 1 럭스 서명되지 않은 | RAK12019 | Illuminance_28 |
| INA219 전류 | 29 | 2 | 2 바이트 | 0.01 서명 | RAK16000 | 아날로그 _29 |
| INA219 전압 | 30 | 2 | 2 바이트 | 0.01 서명 | RAK16000 | 아날로그 _30 |
| INA219 전원 | 31 | 2 | 2 바이트 | 0.01 서명 | RAK16000 | 아날로그 _31 |
| 터치 패드가 남았습니다 | 32 | 102 | 1 바이트 | 부 | RAK14002 | 존재 _32 |
| 터치 패드 중간 | 33 | 102 | 1 바이트 | 부 | RAK14002 | 존재 _33 |
| 터치 패드 오른쪽 | 34 | 102 | 1 바이트 | 부 | RAK14002 | 존재 _34 |
| SCD30 CO2 농도 | 35 | 125 | 2 바이트 | 서명되지 않은 1 ppm | RAK12037 | 농축 _35 |
| SCD30 온도 | 36 | 103 | 2 바이트 | ° C에서 | RAK12037 | 온도 _36 |
| SCD30 습도 | 37 | 104 | 1 바이트 | %RH | RAK12037 | 습도 _37 |
| MLX90632 센서 온도 | 38 | 103 | 2 바이트 | ° C에서 | RAK12003 | 온도 _38 |
| MLX90632 객체 온도 | 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 |
| 오후 10 값 | 42 | 103 | 2 바이트 | ug/m3 | RAK12003 | VOC_42 |
| 지진 이벤트 | 43 | 102 | 1 바이트 | 부 | RAK12027 | 존재 _43 |
| 지진 SI 값 | 44 | 2 | 2 바이트 | 아날로그 10 * m/s | RAK12027 | 아날로그 _44 |
| 지진 PGA 값 | 45 | 2 | 2 바이트 | 아날로그 10 * m/s2 | RAK12027 | 아날로그 _45 |
| 지진 폐쇄 경보 | 46 | 102 | 1 바이트 | 부 | RAK12027 | 존재 _46 |
| lpp_channel_eq_collapse | 47 | 102 | 1 바이트 | 부 | RAK12027 | 존재 _47 |
| 스위치 상태 | 48 | 102 | 1 바이트 | 부 | RAK13011 | 존재 _48 |
Cursive의 채널 ID는 확장 형식이며 표준 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 고유 한 칩 ID로 확장됩니다. 이 이름은 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() 실행되기 전에 필요한 모든 것을 설정해야합니다. 이것은 예를 들어 Lorawan 자격 증명 일 수 있습니다. 이 예에서는 Lorawan 자격 증명을 하드 코딩했습니다. 복제 된 노드 자격 증명을 피하기 위해 그렇게하지 않는 것이 좋습니다.
설정 자격 증명에 대한 대체 옵션은 다음과 같습니다
g_enable_ble 설정됩니다. 사실이라면 BLE 인터페이스가 초기화됩니다. False 인 경우 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_EXALLE _ 예제 _ 사용자 정의 이벤트가 정의되는 방법을 참조하십시오. _ 이벤트 플래그가 재설정되는 것이 중요합니다. 예를 들어 상태 이벤트는이 코드 시퀀스에 의해 재설정됩니다.
if ((g_task_event_type & STATUS) == STATUS)
{
g_task_event_type &= N_STATUS;
...
} 상태 이벤트는 자주 업 링크 패킷을 Lorawan 서버로 보내는 데 사용됩니다.
이 예제 코드에서는 15 초 동안 BLE 광고를 다시 시작합니다. 그렇지 않으면 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 ;
}
}
}
} 이 콜백은 BLE UART를 통해 수신 된 데이터를 처리하는 데 사용됩니다. BLE UART 기능이 필요하지 않으면이 기능을 완전히 제거 할 수 있습니다. 이 예에서는 수신 된 BLE UART 데이터를 AT 명령 인터프리터로 전달합니다. 이런 식으로, 우리는 USB 포트 또는 Ble UART 포트에 명령으로 제출할 수 있습니다.
BLE 커뮤니케이션은 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 이 콜백은 세 가지 다른 이벤트에서 호출됩니다.
Lorawan 서버 또는 Lora P2P 패킷의 다운 링크 패킷이 도착하면 이벤트 LORA_DATA 가 트리거됩니다. 이 예에서 우리는 데이터를 구문 분석하지 않으며 로그에만 인쇄되고 Ble UART (장치가 연결된 경우).
이벤트 LORA_TX_FIN은 RX1 및 RX2 Windows를 포함하여 업 링크 패킷이 완료된 후 트리거됩니다. 확인 된 패킷이 전송되면 글로벌 플래그 g_rx_fin_result 확인 된 전송 결과가 포함됩니다. g_rx_fin_result 사실이라면 Lorawan 서버는 ACK 보내서 업 링크 패킷을 인정했습니다. 그렇지 않으면 g_rx_fin_result False로 설정되어 Lorawan 서버가 패킷을 수신하지 않았 음을 나타냅니다 (범위의 게이트웨이가없고 패킷이 공중에서 손상되지 않았습니다. 확인되지 않은 패킷이 전송되거나 LORA P2P 모드가 사용되는 경우 플래그 g_rx_fin_result 는 항상 사실입니다.
이벤트 LORA_JOIN_FIN은 조인 요청/조인 동기/거부 사이클이 완료된 후 호출됩니다. 글로벌 플래그 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 파일의 설정을 정의 할 수 없습니다. 디버그 로그와 Blue Ble LED의 사용을 변경하려면 라이브러리 소스 폴더에서 WisBlock-API-V2.h 파일을 열어야합니다.
API 디버그 ( API_LOG() )을 활성화하려면 라이브러리 소스 폴더에서 WisBlock-API-V2.h 파일을 엽니 다.
찾으십시오
# define API_DEBUG 1파일에서.
0 -> No debug output
1 -> API debug output
응용 프로그램 디버그 ( 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는 다른 목적으로 사용될 수 있습니다.
디버그 출력은 플랫폼에서 정의로 제어 할 수 있습니다 API_DEBUG
0 -> No debug outpuy
1 -> WisBlock API debug output
MY_DEBUG 응용 프로그램 자체의 디버그 출력을 제어합니다
0 -> No debug outpuy
1 -> Application debug output
NO_BLE_LED Blue Ble LED의 사용법을 제어합니다.
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 notificatorMIT 라이센스에 따라 도서관
크레딧 :
AT Command Functions : Taylor Lee ([email protected])
코드 릴리스
api_read_credentials()api_set_credentials() 플래시에 저장합니다WisBlock API LoRaWAN 으로 디버그 출력 변경