网关应用示例说明

本文介绍生活物联网平台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.cgateway_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))删除一个子设备和网关的拓扑关系,同时会释放网关中子设备的资源。

    说明

    删除子设备时,优先根据子设备的ProductKeyDeviceName查找子设备,找到就直接删除;如果找不到子设备,则根据第一个参数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))复位一个子设备,复位子设备除了会删除和网关的拓扑关系之外,还会删除子设备和手机用户账号的绑定关系,同时会释放网关中子设备的资源。

    说明

    复位子设备时,优先根据子设备的ProductKeyDeviceName查找子设备,找到就直接复位;如果找不到子设备,则根据第一个参数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;
    }