阿里云IOT C-SDK 源码分析系列(2):IOT_Linkkit_Open 接口源码分析

该函数是使用 IOT的SDK的 需要调用的 第一个 接口函数,该函数原型如下:

原型

int IOT_Linkkit_Open(iotx_linkkit_dev_type_t dev_type, iotx_linkkit_dev_meta_info_t *meta_info);
接口说明

初始化设备资源, 在对设备进行操作之前, 必须先调用此接口. 该接口调用成功的情况下会返回设备ID, 当使用其他接口时需要以设备ID为入参, 对指定的设备进行操作
参数说明

参数	        数据类型	                        方向	说明
dev_type	iotx_linkkit_dev_type_t	        输入	需要创建资源的设备类型
meta_info	iotx_linkkit_dev_meta_info_t	输入	设备的四元组信息

返回值说明

值	    说明
>= 0	创建设备成功
< 0	    失败

参数附加说明

typedef enum {
    IOTX_LINKKIT_DEV_TYPE_MASTER,  // 创建的设备为主设备, 仅能创建一次
    IOTX_LINKKIT_DEV_TYPE_SLAVE,   // 创建的设备为子设备
    IOTX_LINKKIT_DEV_TYPE_MAX
} iotx_linkkit_dev_type_t;


typedef struct {
    char product_key[PRODUCT_KEY_MAXLEN];
    char product_secret[PRODUCT_SECRET_MAXLEN];
    char device_name[DEVICE_NAME_MAXLEN];
    char device_secret[DEVICE_SECRET_MAXLEN];
} iotx_linkkit_dev_meta_info_t;

product_key: 最大长度为20字节
product_secret: 最大长度为64字节
device_name: 最大长度为32字节
device_secret: 最大长度为64字节

  该接口函数的作用,正如说明里提到的,就是“创建并初始化设备资源”,因为我们后面的所有功能,都是基于该函数 申请创建的设备资源 来实现的,这些资源 其实就是各种功能模块 要使用的信号量、动态内存、功能初始化等等。

   下图是该函数的  网关主设备的 open调用 流程图:

  这里面 除了各种 功能模块的初始化外,还有一个 内部使用的全局变量 

_mqtt_conncection

  这个里面涉及到一个数据 结构  iotx_cm_connection_t ,如下图所示:

typedef struct iotx_connection_st {
    int                              fd;
    void                             *open_params;  
    void                             *context;     
    void                             *list_lock;
    iotx_cm_protocol_types_t         protocol_type;
    iotx_cm_connect_fp               connect_func;
    iotx_cm_sub_fp                   sub_func;
    iotx_cm_unsub_fp                 unsub_func;
    iotx_cm_pub_fp                   pub_func;
    iotx_cm_yield_fp                 yield_func;
    iotx_cm_close_fp                 close_func;
    iotx_cm_event_handle_cb          event_handler;
    void                             *cb_data;

} iotx_cm_connection_t;

  这个是 mqtt 协议层面的,功能接口,特别说明一下:

fd:对应 _cm_fd[i] 中的 索引值,而_cm_fd[ ] 存放着 _mqtt_connection 的指针。 

open_params : mqtt 协议的参数,比如各种超时时间、发送、接收缓冲等等。

context: 其实 是 mqtt的底层HAL 接口函数 接口,也就是最终 会指向 硬件 tcp 连接、 断开、读、写等硬件接口

protocol_type :协议类型

其他的就是 mqtt的各种 功能函数了。

   这个 _mqtt_conncection 会通过 _get_fd 存放在 _cm_fd[i] 中,并且将存储索引值 返回给 上面的_mqtt_conncection的 fd元素,后面就可以通过 fd 找  对应的 _cm_fd[fd] 指向的 指针变量,进而找到_mqtt_conncection的各种 参数及接口函数,       不太清楚作者 为什么要这么绕着 搞,可能是为兼容其他的 协议吧。

    至此就完成了 IOT_Linkkit_Open  主机使用的源码 原理分析。它并没有 进行任何硬件层面的初始化,知识 SDK的资源创建和初始化。

发布了256 篇原创文章 · 获赞 262 · 访问量 63万+

猜你喜欢

转载自blog.csdn.net/u012351051/article/details/104215994
今日推荐