该函数是使用 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的资源创建和初始化。