AliOS-Things--EMW3060--閘道器
阿新 • • 發佈:2018-10-31
好吧,目前下面這些還不支援。。。。。
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中把子裝置的三元組資訊事先儲存在記憶體中,新增子裝置時通過陣列順序依次新增子裝置(那這還是動態註冊嗎?)。