AliOS-Things--EMW3060--网关

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28877125/article/details/83347526

好吧,目前下面这些还不支持。。。。。

int linkkit_main(void *paras)
{
#ifndef WIFI_AWSS_ENABLED
    set_iotx_info();
#endif
    int res = 0;
    uint64_t time_prev_sec = 0, time_now_sec = 0;
    user_example_ctx_t *user_example_ctx = user_example_get_ctx();
    iotx_linkkit_dev_meta_info_t master_meta_info;
    int subdevCurrentIndx = -1;
	
    memset(user_example_ctx, 0, sizeof(user_example_ctx_t));
    user_example_ctx->subdev_index = -1;

    /* 初始化 cJSON 钩子函数 */
    cJSON_Hooks cjson_hooks = {HAL_Malloc, HAL_Free};
    cJSON_InitHooks(&cjson_hooks);

    IOT_OpenLog("iot_linkkit");
    IOT_SetLogLevel(IOT_LOG_ERROR);

    memset(&master_meta_info, 0, sizeof(iotx_linkkit_dev_meta_info_t));
    memcpy(master_meta_info.product_key, PRODUCT_KEY, strlen(PRODUCT_KEY));
    memcpy(master_meta_info.product_secret, PRODUCT_SECRET, strlen(PRODUCT_SECRET));
    memcpy(master_meta_info.device_name, DEVICE_NAME, strlen(DEVICE_NAME));
    memcpy(master_meta_info.device_secret, DEVICE_SECRET, strlen(DEVICE_SECRET));

    /* 创建主设备资源 */
    user_example_ctx->master_devid = IOT_Linkkit_Open(IOTX_LINKKIT_DEV_TYPE_MASTER, &master_meta_info);
    if (user_example_ctx->master_devid < 0) {
        EXAMPLE_TRACE("IOT_Linkkit_Open Failed\n");
        return -1;
    }

    /* 选择注册服务器 */
    int domain_type = IOTX_CLOUD_DOMAIN_SH;
    IOT_Ioctl(IOTX_IOCTL_SET_DOMAIN, (void *)&domain_type);

    /* 选择注册方法 */
    int dynamic_register = 0;
    IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);

    /* 选择是否需要提交属性回复 */
    int post_property_reply = 0;
    IOT_Linkkit_Ioctl(user_example_ctx->master_devid, IOTX_LINKKIT_CMD_OPTION_PROPERTY_POST_REPLY,
                      (void *)&post_property_reply);

    /* 选择是否需要提交事件回复 */
    int post_event_reply = 0;
    IOT_Linkkit_Ioctl(user_example_ctx->master_devid, IOTX_LINKKIT_CMD_OPTION_EVENT_POST_REPLY, (void *)&post_event_reply);

    /* 开始连接阿里云服务器 */
    res = IOT_Linkkit_Connect(user_example_ctx->master_devid, &user_event_handler);
    if (res < 0) {
        EXAMPLE_TRACE("IOT_Linkkit_Connect Failed\n");
        return -1;
    }

    while (1) {
        IOT_Linkkit_Yield(USER_EXAMPLE_YIELD_TIMEOUT_MS);

        time_now_sec = user_update_sec();
        if (time_prev_sec == time_now_sec) {
            continue;
        }

		/* 增加子设备 */
        if (user_example_ctx->master_initialized) {
            if ( (subdevCurrentIndx != user_example_ctx->subdev_index) && (user_example_ctx->subdev_index < EXAMPLE_SUBDEV_MAX_NUM) ) {
                /* 增加下一个子设备 */
                if (example_add_subdev(&subdevArr[user_example_ctx->subdev_index]) == SUCCESS_RETURN) {
                    EXAMPLE_TRACE("subdev %s add succeed", subdevArr[user_example_ctx->subdev_index].device_name);
                } 
                else {
                    EXAMPLE_TRACE("subdev %s add failed", subdevArr[user_example_ctx->subdev_index].device_name);
                }
                subdevCurrentIndx = user_example_ctx->subdev_index;
            }
        }

        /* 提交属性的例子 */
        if (time_now_sec % 11 == 0 && user_master_dev_available()) {
            user_post_property();
        }
        /* 提交事件的例子 */
        if (time_now_sec % 17 == 0 && user_master_dev_available()) {
            user_post_event();
        }

        /* 更新设备信息例子 */
        if (time_now_sec % 23 == 0 && user_master_dev_available()) {
            user_deviceinfo_update();
        }

        /* 删除设备信息例子 */
        if (time_now_sec % 29 == 0 && user_master_dev_available()) {
            user_deviceinfo_delete();
        }
        
        /* 提交透传数据例子 */
        if (time_now_sec % 37 == 0 && user_master_dev_available()) {
            user_post_raw_data();
        }

        time_prev_sec = time_now_sec;
    }

    IOT_Linkkit_Close(user_example_ctx->master_devid);
    return 0;
}
typedef struct {
    int master_devid;       // 网关设备ID
    int cloud_connected;    // 云平台连接状态
    int master_initialized; // 网关设备初始化
    int subdev_index;       // 子设备目录
} user_example_ctx_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;

user_example_ctx_t *user_example_ctx = user_example_get_ctx();
iotx_linkkit_dev_meta_info_t master_meta_info;

网关设备

1、创建主设备

    /* 创建主设备资源 */
    user_example_ctx->master_devid = IOT_Linkkit_Open(IOTX_LINKKIT_DEV_TYPE_MASTER, &master_meta_info);

创建主设备会调用函数IOT_Linkkit_Open()从而获得一个设备ID,传入的参数为
参数一的可选项:

  • 设备类型为主设备(网关设备):IOTX_LINKKIT_DEV_TYPE_MASTER
  • 设备类型为从设备(子设备):IOTX_LINKKIT_DEV_TYPE_SLAVE
  • 保留类型: IOTX_LINKKIT_DEV_TYPE_MAX

参数二的内容为:产品四元组的结构体

  • product_key
  • product_secret
  • device_name
  • device_secret

主设备创建成功并且连接云平台成功之后,会由一个结构体变量存储网关设备的各种状态:

typedef struct {
    int master_devid;       // 网关设备ID
    int cloud_connected;    // 云平台连接状态
    int master_initialized; // 网关设备初始化状态
    int subdev_index;       // 子设备目录
} user_example_ctx_t;

在这个结构体变量中的子设备目录,就是当前网关设备下子设备的数量。

子设备

1、添加子设备

在主进程中有个死循环,会一直判断条件是否符合添加子设备:

  • 主设备已经初始化成功
  • 外部变量子设备数目(自定义)不等于主设备中子设备的数目
  • 主设备中现有的子设备数目小于最大子设备数目
    这些条件满足,就会添加新的子设备。
/* 增加子设备 */
if (user_example_ctx->master_initialized) {
    if ( (subdevCurrentIndx != user_example_ctx->subdev_index) && (user_example_ctx->subdev_index < EXAMPLE_SUBDEV_MAX_NUM) ) {
        /* 增加下一个子设备 */
        if (example_add_subdev(&subdevArr[user_example_ctx->subdev_index]) == SUCCESS_RETURN) {
            EXAMPLE_TRACE("subdev %s add succeed", subdevArr[user_example_ctx->subdev_index].device_name);
        } 
        else {
            EXAMPLE_TRACE("subdev %s add failed", subdevArr[user_example_ctx->subdev_index].device_name);
        }
        subdevCurrentIndx = user_example_ctx->subdev_index;
    }
}

在例程中,会在数组subdevArr中把子设备的三元组信息事先存储在内存中,添加子设备时通过数组顺序依次添加子设备(那这还是动态注册吗?)。

猜你喜欢

转载自blog.csdn.net/qq_28877125/article/details/83347526