1. 程式人生 > >AliOS-Things--EMW3060--閘道器

AliOS-Things--EMW3060--閘道器

好吧,目前下面這些還不支援。。。。。

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中把子裝置的三元組資訊事先儲存在記憶體中,新增子裝置時通過陣列順序依次新增子裝置(那這還是動態註冊嗎?)。