日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

子設備管理

本節內容將結合src/dev_model/examples/linkkit_example_gateway.c為例講解網關產品的編程方法。

背景信息

名詞

說明

網關

能夠直接連接物聯網平臺的設備,且具有子設備管理功能,能夠代理子設備連接云端。

子設備

本質上也是設備。子設備不能直接連接物聯網平臺,只能通過網關連接。

設備ID

Device ID,也就是設備句柄,在網關場景中用于標識一個具體的設備,調用IOT_Linkkit_Open時返回。

拓撲關系

子設備和網關的關聯關系為拓撲關系,子設備與網關建立拓撲關系后,便可以復用網關的物理通道進行數據通信。

子設備動態注冊

子設備在注冊時只需將productKey和deviceName上報給網關,網關代替子設備向云端發起身份認證并獲取云端返回的deviceSecret用之后的上線操作。

管理子設備

  1. 網關與云端建連。

    網關的建連過程與單品直連設備的建連過程完全一致。

    1. 調用IOT_RegisterCallback注冊必要的回調處理函數,如連接事件處理,設備連云初始化完成處理,屬性設置事件處理等回調函數。子設備和網關共用一組回調處理函數,以參數DeviceID來區分不同的設備。

          IOT_RegisterCallback(ITE_CONNECT_SUCC, user_connected_event_handler);
          IOT_RegisterCallback(ITE_DISCONNECTED, user_disconnected_event_handler);
          IOT_RegisterCallback(ITE_PROPERTY_SET, user_property_set_event_handler);
          IOT_RegisterCallback(ITE_REPORT_REPLY, user_report_reply_event_handler);
          IOT_RegisterCallback(ITE_TIMESTAMP_REPLY, user_timestamp_reply_event_handler);
          IOT_RegisterCallback(ITE_INITIALIZE_COMPLETED, user_initialized);
          IOT_RegisterCallback(ITE_PERMIT_JOIN, user_permit_join_event_handler);
                                      
    2. 調用IOT_Ioctl進行必要的配置,如選擇服務器站點,選擇是否使用一型一密等等。

          /* Choose Login Server */
          int domain_type = IOTX_CLOUD_REGION_SHANGHAI;
          IOT_Ioctl(IOTX_IOCTL_SET_DOMAIN, (void *)&domain_type);
      
          /* Choose Login Method */
          int dynamic_register = 0;
          IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);
                                      
    3. 使用IOTX_LINKKIT_DEV_TYPE_MASTER參數調用IOT_Linkkit_Open初始化主設備資源。

          iotx_linkkit_dev_meta_info_t master_meta_info;
      
          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));
      
          /* Create Master Device Resources */
          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;
          }
                                      
    4. 同樣使用IOTX_LINKKIT_DEV_TYPE_MASTER參數調用IOT_Linkkit_Connect與云端建立連接。

          /* Start Connect Aliyun Server */
          res = IOT_Linkkit_Connect(user_example_ctx->master_devid);
          if (res < 0) {
              EXAMPLE_TRACE("IOT_Linkkit_Connect Failed\n");
              return -1;
          }
                                      
    5. ITE_INITIALIZE_COMPLETED事件處理函數中確認網關連云初始化完成后,便可以進行下一步添加子設備的操作。

    說明

    不要在步驟1中注冊的回調函數中進行會阻塞線程操作,如調用IOT_Linkkit_Connect進行子設備建連,調用IOT_Linkkit_Report進行子設備上下線等。

  2. 添加子設備。

    添加子設備主要由4個步驟完成。

    1. 使用IOTX_LINKKIT_DEV_TYPE_SLAVE參數調用IOT_Linkkit_Open初始化子設備資源。

      說明

      如果需要使用動態注冊,只需要將設備信息參數的device_secret配置為空字符串即可。啟用動態注冊功能需要把子設備的DeviceName事先在物聯網控制臺預注冊。

    2. 調用IOT_Linkkit_Connect將子設備連上云端,這個接口為同步接口,會自動完成子設備注冊和拓撲關系的添加。

    3. 使用ITM_MSG_LOGIN參數調用IOT_Linkkit_Report完成子設備上線操作。

    4. ITE_INITIALIZE_COMPLETED事件處理函數中確認對應的子設備連云初始化完成后,便可以進行子設備與云端的數據交互了。

      int example_add_subdev(iotx_linkkit_dev_meta_info_t *meta_info)
      {
          int res = 0, devid = -1;
          devid = IOT_Linkkit_Open(IOTX_LINKKIT_DEV_TYPE_SLAVE, meta_info);
          if (devid == FAIL_RETURN) {
              EXAMPLE_TRACE("subdev open Failed\n");
              return FAIL_RETURN;
          }
          EXAMPLE_TRACE("subdev open susseed, devid = %d\n", devid);
      
          res = IOT_Linkkit_Connect(devid);
          if (res == FAIL_RETURN) {
              EXAMPLE_TRACE("subdev connect Failed\n");
              return res;
          }
          EXAMPLE_TRACE("subdev connect success: devid = %d\n", devid);
      
          res = IOT_Linkkit_Report(devid, ITM_MSG_LOGIN, NULL, 0);
          if (res == FAIL_RETURN) {
              EXAMPLE_TRACE("subdev login Failed\n");
              return res;
          }
          EXAMPLE_TRACE("subdev login success: devid = %d\n", devid);
          return res;
      }
                                      
    重要

    使用相同ProductKey, DeviceName重復調用IOT_Linkkit_Open初始化子設備資源,將返回相同的devid,SDK不會重復創建子設備資源。因此,在子設備創建成功后,用戶可通過重復調用IOT_Linkkit_Open來查詢ProductKey, DeviceName對應的子設備devid。

  3. 子設備管理相關操作。

    1. 子設備登出。

      使用ITM_MSG_LOGOUT選項調用IOT_Linkkit_Report即可完成子設備登出。子設備登出功能主要用于通知云端控制臺設備處于離線狀態。

          res = IOT_Linkkit_Report(devid, ITM_MSG_LOGOUT, NULL, 0);
          if (res == FAIL_RETURN) {
              EXAMPLE_TRACE("subdev logout Failed\n");
              return res;
          }
          EXAMPLE_TRACE("subdev logout success: devid = %d\n", devid);
                                      
    2. 獲取子設備列表。

      網關可以用ITM_MSG_QUERY_TOPOLIST選項來調用IOT_Linkkit_Query以獲取與其存在拓撲關系的所有子設備信息。列表信息將在ITE_TOPOLIST_REPLY事件回調中返回。

    3. 刪除子設備拓撲關系。

      用戶可以用ITM_MSG_DELETE_TOPO選項調用IOT_Linkkit_Report以刪除參數devid指定的子設備拓撲關系,執行該命令后云端不會再將該子設備與本網關進行關聯。

    4. 子設備OTA。

      用戶使用IOT_Ioctl配置要升級的子設備,再用IOT_Linkkit_Query來觸發子設備升級。

      • 調用IOT_RegisterCallback注冊固件升級所用的回調函數user_fota_event_handler。

        IOT_RegisterCallback(ITE_FOTA, user_fota_event_handler);
        IOT_RegisterCallback(ITE_INITIALIZE_COMPLETED, user_initialized);
                                                
      • 使用IOTX_LINKKIT_DEV_TYPE_MASTER參數調用IOT_Linkkit_Open初始化主設備資源。

        iotx_linkkit_dev_meta_info_t master_meta_info;
        
        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));
        
        /* Create Master Device Resources */
        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;
        }
                                                
      • 調用IOT_Linkkit_Connect與云端建立連接。

        /* Start Connect Aliyun Server */
        res = IOT_Linkkit_Connect(user_example_ctx->master_devid);
        if (res < 0) {
            EXAMPLE_TRACE("IOT_Linkkit_Connect Failed\n");
            return -1;
        }
                                                
      • 添加子設備,進行子設備OTA。

        /* Add subdev */
        while (user_example_ctx->subdev_index < EXAMPLE_SUBDEV_ADD_NUM) {
            if (user_example_ctx->master_initialized && user_example_ctx->subdev_index >= 0 &&
                (0 == current_ota_running) && (user_example_ctx->auto_add_subdev == 1 || user_example_ctx->permit_join != 0)) {
                /* Add next subdev */
                if (example_add_subdev((iotx_linkkit_dev_meta_info_t *)&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);
                }
                user_example_ctx->subdev_index++;
                user_example_ctx->permit_join = 0;
                /* check each sub dev has remote ota message */
                do_subdev_ota(user_example_ctx->subdev_index);
                /* wait remote ota message */
                HAL_SleepMs(10000);
            }
        }
                                                
      • do_subdev_ota函數詳解。

        用戶通過IOT_Ioctl這個接口來切換OTA通道為某個子設備(以devid區分_使用。切換后,只有這個子設備的升級消息能夠被接收到。同時通過IOT_Linkkit_Query接口向云端查詢是否有適合當前子設備的固件版本信息,如果有則走入OTA流程(觸發用戶自定義的OTA回調函數user_fota_event_handler)。

        void do_subdev_ota(int devid)
        {
            if (status_list[devid] == SUB_OTA_SUCCESS) {
                HAL_Printf("current devid is %d, its has checked remote ota message, skip\n", devid);
                return;
            }
        
            if (current_ota_running == 1) {
                return;
            }
        
            HAL_Printf("current devid running ota is %d\n", devid);
            int ota_result = 0;
            ota_result = IOT_Ioctl(IOTX_IOCTL_SET_OTA_DEV_ID, (void *)(&devid));
            if (0 != ota_result) {
                status_list[devid] = SUB_OTA_FAILED_SET_DEV_ID;
                HAL_Printf("IOTX_IOCTL_SET_OTA_DEV_ID failed, id is %d\n", devid);
                return;
            }
            ota_result = IOT_Linkkit_Query(devid, ITM_MSG_REQUEST_FOTA_IMAGE, (unsigned char *)current_subdev_version,
                                           strlen(current_subdev_version));
            HAL_Printf("current devid is %d, ITM_MSG_REQUEST_FOTA_IMAGE ret is %d\n", devid, ota_result);
            if (0 != ota_result) {
                status_list[devid] = SUB_OTA_FAILED_QUERY;
                return;
            }
            status_list[devid] = SUB_OTA_SUCCESS;
        } 
                                                    
  4. 子設備數據交互。

    子設備與云端的數據交互方法與單品產品完全一致,詳情可查看物模型編程章節。

    • 調用IOT_Linkkit_Report上報屬性,上報透傳數據,更新設備標簽信息,刪除設備標簽信息。

    • 調用IOT_Linkkit_TriggerEvent進行Event的主動上報。

    • ITE_RAWDATA_ARRIVED事件回調中接收云端下發的透傳數據。

    • ITE_SERVICE_REQEUST事件回調中接收服務請求(同步服務和異步服務)。

    • ITE_PROPERTY_SET事件回調中處理云端下發的屬性設置。

    • ITE_PROPERTY_GET事件回調中處理本地通信下發的屬性獲取

注意事項

  1. 網關設備必須支持多線程,并使用獨立線程用于執行IOT_Linkkit_Yield。

     void *user_dispatch_yield(void *args) 
     {
         while (1){
             IOT_Linkkit_Yield(USER_EXAMPLE_YIELD_TIMEOUT_MS);
         }
    
         return NULL;
     }
    
     res = HAL_ThreadCreate(&g_user_dispatch_thread, user_dispatch_yield, NULL, NULL, NULL);
     if (res < 0) {
         EXAMPLE_TRACE("HAL_ThreadCreate Failed\n");
         IOT_Linkkit_Close(user_example_ctx->master_devid);
         return -1;
     }
  2. 對接智能生活開放平臺時,只有在收到云端下發的ITE_PERMIT_JOIN事件后,才可以執行子設備添加流程。

    當用戶通過App掃碼發起子設備添加時,App將會向云端發送PermitJoin命令,之后云端會將該命令轉發給網關。ITE_PERMIT_JOIN事件會下發子設備的productKey和允許子設備接入的時間窗口timeoutSec(一般為60秒),廠商可在此窗口時間內去執行子設備的發現和綁定,并執行添加子設備流程上報云端,上報成功后便可以在App界面查看到添加的子設備。此功能讓子設備的添加被有效的管控起來,只有在窗口時間內才可以添加子設備int user_permit_join_event_handler(const char product_key, const int time){ user_example_ctx_t user_example_ctx = user_example_get_ctx();。

    EXAMPLE_TRACE(“Product Key: %s, Time: %d”, product_key, time);
    user_example_ctx->permit_join = 1;
    return 0;
    }
    ```
  3. 在SDK主目錄的make.setting文件中添加FEATURE_DEVICE_MODEL_GATEWAY=y,再運行make命令即可編譯出網關例程。