本文介绍生活物联网平台SDK V1.6.0版本中的网关产品示例代码。
请您根据需求下载生活物联网平台SDK。详细下载地址请参见获取SDK。
包含AliOS Things的SDK,网关参考应用程序位于Products/example/linkkit_gateway/,代码文件如下。
gateway_cmds.c gateway_cmds.h gateway_entry.c gateway_entry.h gateway_main.c gateway_main.h gateway_ut.c gateway_ut.h gateway_api.c gateway_api.h
无AliOS Things的SDK,网关参考应用程序位于examples/linkkit/gateway/,代码文件如下。
gateway_entry.c gateway_entry.h gateway_main.c gateway_main.h gateway_ut.c gateway_ut.h gateway_api.c gateway_api.h
说明:此处相比于包含AliOS Things版本的SDK,源代码少了gateway_cmds.c与gateway_cmds.h文件,其他代码一样。
下面详细介绍网关参考应用的文件。
gateway_entry.c
gateway_entry.c为应用程序主入口文件。
本文中,四元组分别指的是ProductKey、ProductSecret、DeviceName和DeviceSecret。
int application_start(int argc, char **argv)
{
... ... ... ... ... ... ... ... ...
设置默认的日志级别
#ifdef DEFAULT_LOG_LEVEL_DEBUG
IOT_SetLogLevel(IOT_LOG_DEBUG);
#else
#ifdef CSP_LINUXHOST
IOT_SetLogLevel(IOT_LOG_DEBUG);
#else
IOT_SetLogLevel(IOT_LOG_INFO);
#endif
#endif
加载四元组信息,用户需要实现该函数
load_device_meta_info();
... ... ... ... ... ... ... ... ...
注册连云成功回调函数,执行ota初始化
IOT_RegisterCallback(ITE_MQTT_CONNECT_SUCC, mqtt_connected_event_handler);
注册串口命令,代码在gateway_cmds.c中
#ifdef CONFIG_AOS_CLI
gateway_register_cmds();
#endif
... ... ... ... ... ... ... ... ...
main函数的loop循环
aos_loop_run();
return 0;
}
gateway_main.c
由于子设备的某些入网操作是同步阻塞式的,该文件里已创建了如下两个线程。
user_dispatch_yield线程:执行Link Kit SDK代码及注册的用户回调函数。
gateway_main主线程:调用Link Kit SDK接口,以及处理与子设备间的通信。
gateway_cmds.c
此文件主要包括命令行相关的功能代码,方便测试和调试操作。
gateway_ut.c
此文件为用户测试代码,例如kv模拟子设备信息、get topo list之后上线子设备、permit join的时候模拟添加子设备等。
gateway_api.c
此文件是对子设备操作的SDK接口函数的封装,支持的功能有添加子设备、删除子设备、复位子设备、查询子设备ID等操作,您可以直接使用该接口函数。
添加一个子设备
添加一个子设备需要对SDK进行三次接口调用。
调用
IOT_Linkkit_Open
:将子设备添加到网关本地的数据结构。调用
IOT_Linkkit_Connect
:将子设备注册并添加拓扑关系到云端。调用
IOT_Linkkit_Report
:告诉云端子设备上线了。
GATEWAY_API int gateway_add_subdev(iotx_linkkit_dev_meta_info_t *subdev_mate) { ... ... ... ... ... ... ... ... ... devid = IOT_Linkkit_Open(IOTX_LINKKIT_DEV_TYPE_SLAVE, subdev_mate); ... ... ... ... ... ... ... ... ... res = IOT_Linkkit_Connect(devid); ... ... ... ... ... ... ... ... ... res = IOT_Linkkit_Report(devid, ITM_MSG_LOGIN, NULL, 0); ... ... ... ... ... ... ... ... ... }
批量添加子设备
通过
IOT_Linkkit_Report( ... ITM_MSG_CONNECT_SUBDEV ...)
支持最多一次批量添加五个子设备。如果批量添加成功就调用
IOT_Linkkit_Report(subdev_id, ITM_MSG_LOGIN, NULL, 0)
上线对应的子设备。
GATEWAY_API int gateway_add_multi_subdev(int master_devid, iotx_linkkit_dev_meta_info_t *subdev_list, int subdev_num) { ... ... ... ... ... ... ... ... ... connect_times = subdev_num / GATEWAY_SUBDEV_ONE_TIME_CONNECT_MAX_NUM + (((subdev_num % GATEWAY_SUBDEV_ONE_TIME_CONNECT_MAX_NUM) == 0) ? 0 : 1); for (index = 0; index < connect_times; index++) { ... ... ... ... ... ... ... ... ... res = IOT_Linkkit_Report(master_devid, ITM_MSG_CONNECT_SUBDEV, (unsigned char *)p_cur_subdev, sizeof(iotx_linkkit_dev_meta_info_t) * cur_subdev_num); if (res == SUCCESS_RETURN) { 批量上线子设备 res = IOT_Linkkit_Report(subdev_id, ITM_MSG_BATCH_LOGIN, (unsigned char *)p_cur_subdev, sizeof(iotx_linkkit_dev_meta_info_t) * cur_subdev_num); ... ... ... ... ... ... ... ... ... } } return res; }
删除一个子设备
调用函数
IOT_Linkkit_Report(subdev_id, ITM_MSG_DELETE_TOPO, (unsigned char *)subdev_mate, sizeof(iotx_linkkit_dev_meta_info_t))
删除一个子设备和网关的拓扑关系,同时会释放网关中子设备的资源。说明删除子设备时,优先根据子设备的ProductKey和DeviceName查找子设备,找到就直接删除;如果找不到子设备,则根据第一个参数subdev_id继续查找。
GATEWAY_API int gateway_del_subdev(iotx_linkkit_dev_meta_info_t *subdev_mate) { ... ... ... ... ... ... ... ... ... //Here pk and dn of subdev is priorior than subdev id ret = IOT_Linkkit_Report(subdev_id, ITM_MSG_DELETE_TOPO, (unsigned char *)subdev_mate, sizeof(iotx_linkkit_dev_meta_info_t)); ... ... ... ... ... ... ... ... ... }
复位一个子设备
调用函数
IOT_Linkkit_Report(subdev_id, ITM_MSG_SUBDEV_RESET, (unsigned char *)subdev_mate, sizeof(iotx_linkkit_dev_meta_info_t))
复位一个子设备,复位子设备除了会删除和网关的拓扑关系之外,还会删除子设备和手机用户账号的绑定关系,同时会释放网关中子设备的资源。说明复位子设备时,优先根据子设备的ProductKey和DeviceName查找子设备,找到就直接复位;如果找不到子设备,则根据第一个参数subdev_id继续查找。
GATEWAY_API int gateway_reset_subdev(iotx_linkkit_dev_meta_info_t *subdev_mate) { ... ... ... ... ... ... ... ... ... //Here pk and dn of subdev is priorior than subdev id ret = IOT_Linkkit_Report(subdev_id, ITM_MSG_SUBDEV_RESET, (unsigned char *)subdev_mate, sizeof(iotx_linkkit_dev_meta_info_t)); ... ... ... ... ... ... ... ... ... }
查询一个子设备的DeviceID
调用函数
IOT_Linkkit_Query(master_devid, ITM_MSG_QUERY_SUBDEV_ID, (unsigned char *)subdev_mate, sizeof(iotx_linkkit_dev_meta_info_t));
根据子设备的ProductKey和DeviceName信息查询一个子设备的DeviceID(数据结构索引,为大于0的整数)。GATEWAY_API int gateway_query_subdev_id(int master_devid, iotx_linkkit_dev_meta_info_t *subdev_mate) { ... ... ... ... ... ... ... ... ... subdev_id = IOT_Linkkit_Query(master_devid, ITM_MSG_QUERY_SUBDEV_ID, (unsigned char *)subdev_mate, sizeof(iotx_linkkit_dev_meta_info_t)); ... ... ... ... ... ... ... ... ... }
批量上线子设备接口
该接口函数会将输入的子设备数组拆分成五个一组进行批量上线。
GATEWAY_API int gateway_batch_login(int master_devid, iotx_linkkit_dev_meta_info_t *subdev_list, int subdev_num) { ... ... ... ... ... ... ... ... ... for (index = 0; index < connect_times; index++) { ... ... ... ... ... ... ... ... ... res = IOT_Linkkit_Report(subdev_id, ITM_MSG_BATCH_LOGIN, (unsigned char *)p_cur_subdev, sizeof(iotx_linkkit_dev_meta_info_t) * cur_subdev_num); ... ... ... ... ... ... ... ... ... return res; }
批量下线子设备接口
该接口函数会将输入的子设备数组拆分成五个一组进行批量下线。
GATEWAY_API int gateway_batch_logout(int master_devid, iotx_linkkit_dev_meta_info_t *subdev_list, int subdev_num) { ... ... ... ... ... ... ... ... ... for (index = 0; index < connect_times; index++) { ... ... ... ... ... ... ... ... ... res = IOT_Linkkit_Report(subdev_id, ITM_MSG_BATCH_LOGOUT, (unsigned char *)p_cur_subdev, sizeof(iotx_linkkit_dev_meta_info_t) * cur_subdev_num); ... ... ... ... ... ... ... ... ... } return res; }