WLR089 ASF LoRaWAN库初始化:回调参数是否必要?程序能否运行?
关于WLR089 Xplained PRO中LORAWAN_Init()回调参数的疑问
问题背景
正在为WLR089 Xplained PRO开发板实现最小化LoRaWAN配置,已通过Microchip Studio 7的ASF向导搭建项目并引入对应lorawan.h库,程序可正常编译。但对LORAWAN_Init()函数的参数存在疑问:ASF默认项目示例中该函数无参数,但官方文档显示需传入下行回调函数指针和入网响应回调函数指针两个参数。当前代码中调用LORAWAN_Init(NULL,NULL),想确认:是否必须传入这两个回调函数?不传的话程序能否正常工作?
当前代码
#include <asf.h> #include "lorawan.h" #define EU_BAND 1 static uint8_t DeviceEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t ApplicationEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t ApplicationKey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static void init_system(void) { system_init(); delay_init(); } static void init_lorawan(void) { LORAWAN_Init(NULL,NULL);//THIS HERE// LORAWAN_SetAttr(DEV_EUI, DeviceEUI); LORAWAN_SetAttr(JOIN_EUI,ApplicationEUI); LORAWAN_SetAttr(APP_KEY, ApplicationKey); LORAWAN_SetAttr(EDCLASS,0); LORAWAN_SetAttr(ADR,1); } static void join_network(void) { bool joined = false; while (!joined) { joined = LORAWAN_Join(LORAWAN_OTAA) == LORAWAN_SUCCESS; if (!joined) { delay_ms(5000); } } } static void send_message(void) { uint8_t payload[] = "TESTING"; struct _LorawanSendReq req = {LORAWAN_CNF, 1, (char*)payload, sizeof(payload)-1}; if(LORAWAN_Send(&req) == LORAWAN_SUCCESS){ delay_ms(100); } } int main(void) { init_system(); init_lorawan(); join_network(); while (1) { send_message(); delay_ms(300000); } }
解答
- 不是必须传入这两个回调函数,调用
LORAWAN_Init(NULL,NULL)是完全可行的,程序能正常完成你当前代码中的核心逻辑(入网+周期性上行发送)。 - 两个回调的作用及不传的影响:
- 入网响应回调:用于接收入网流程的详细结果(比如失败的具体原因、额外的入网参数)。不传的话,你依然可以通过
LORAWAN_Join()的返回值判断入网是否成功,但无法获取更精细的失败排查信息(比如是密钥错误、频段不匹配还是网关不可达)。 - 下行回调:用于接收网关下发的下行数据。如果你的场景只需要上行发送,不需要处理下行消息,传
NULL完全不影响功能;后续如果需要处理下行,再实现对应的回调函数传入即可。
- 入网响应回调:用于接收入网流程的详细结果(比如失败的具体原因、额外的入网参数)。不传的话,你依然可以通过
内容的提问来源于stack exchange,提问作者Boyfinn
相关产品推荐
相关产品推荐

