版权声明:本文为博主原创文章,未经博主允许不得转载。 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中把子设备的三元组信息事先存储在内存中,添加子设备时通过数组顺序依次添加子设备(那这还是动态注册吗?)。