LiteOS之CoAP对接华为云流程简介
前文介绍过Lite OS函数的调用关系,如何启动到main函数的执行以及具体使能的demo执行,以CoAP协议对接华为云为例,下图可见main函数执行到link_test回调link_main,在link_main中包含了一些组件以及协议的初始化,最后调用了stardard_app_demo_main函数来执行我们的对接云的demo,在coap对接过程中一定需要初始化的两个重要函数,oc_coap_init以及coap_al_init函数,下面我们来介绍这两个函数的初始化如何将OC层与network层的协议栈连接到一起。
同时在该demo中主要调用了三个函数实现对接华为云的全流程,包括采集数据的collect函数,以及命令处理的cmd函数,以及最重要的任务上报函数app_report_task_entry()函数,在函数中包括oc_coap_config()实现对包括ip地址、端口对接模式等一系列参数的配置,该函数的具体细节会在后文中讲解,最后调用oc_coap_report函数进行上报数据。
要了解其中的细节我们首先要知道该SDK的架构中两个重要的文件夹,network网络层、OC对接层,二者都包括了al层,分别是对协议栈的封装抽象层以及对OC的封装抽象。
首先来看结构体oc_coap_t,该结构体中包含两个参数,一个为名字name,另一个为结构体oc_coap_opt_t类型的指针 *opt。
typedef struct
{
const char *name;
const oc_coap_opt_t *opt;
}oc_coap_t;
static oc_coap_t s_oc_coap_ops;
结构体oc_coap_opt_t中有三个指针函数config、report、deconfig,分别负责连接参数配置、上报数据、以及断开连接。
typedef struct
{
fn_oc_coap_config config;
fn_oc_coap_report report;
fn_oc_coap_deconfig deconfig;
}oc_coap_opt_t;
接下来看OC层对coap协议的初始化,从oc_coap_init()函数调用oc_coap_imp_init()函数,在该函数调用了register函数,其中register函数的参数为结构体oc_coap_opt_t类型,该结构体中包括三个指针函数config、report、deconfig,该参数s_oc_coap_agent_opt中实现了对三个指针函数的赋值,分别将其赋值为__agent_config,__anget_report,__agent_deconfig函数。
再看图中最下面的coap协议栈端的初始化,从coap_al_init()函数调用到coap_imp_init()实现函数,其中调用了install函数,其参数为coa_al_op_t(结构体)类型的litecoap_op,与前文类似,这其中包含了对于init等一系列指针函数的初始化,实现了与coap协议栈的对接。
看图中红色箭头部分,前文我们调用了oc_coap_config(&oc_param)进行参数配置,在该函数中调用了config函数,可见s_oc_coap_ops.opt即为oc_coap_opt_t类型,其中定义了指针函数,config、deconfig、report,而这3个指针函数在OC层初始化过程中已经进行了初始化赋值,__agent_config、__agent_report、__agent_config等,在这三个函数的内部实现细节中调用了coap_al.c中的函数,而被调用的这些函数是协议栈的封装而成,实现了OC层和协议栈的对接。
如果采用WIFI模组对接华为云,还需要对TCPIP的抽象层进行初始化,该初始层指的是network/tcpip/sal中的文件,sal层与osal层的作用类似,如下图从link_tcpip_init到link_tcpip_imp_init函数,在该函数中调用了tcpip_init函数以及link_sal_install(&s_tcpip_socket),该参数中初始化了关于socket的一系列函数的赋值,实现对接。当然该协议在coap中的TCP也会用到,如果是NB模组其内部是具有一些协议栈的,因此不需要使用该处。
- 点赞
- 收藏
- 关注作者
评论(0)