遠程登錄功能主要應用于設備發生故障導致設備不可用時,對設備進行遠程運維。本文以C Link SDK中的Demo文件./demos/remote_access_basic_demo.c為例,介紹如何調用Link SDK的API,幫助設備實現遠程登錄功能。

背景信息

  • 遠程登錄功能的更多信息,請參見概述

  • 遠程登錄功能基于MQTT接入,開發過程中涉及MQTT接入的代碼說明,請參見MQTT接入

步驟一:初始化

  1. 添加頭文件。
    ……
    ……
    
    #include "aiot_ra_api.h"
  2. 配置底層依賴和日志輸出。
        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. 調用aiot_ra_init,創建RA客戶端實例,并初始化默認參數。
        void *ra_handle = aiot_ra_init();
        if (ra_handle == NULL) {
            printf( "aiot_ra_init failed\n");
            return -1;
        }

步驟二:配置功能

調用aiot_ra_setopt,配置以下功能。

  1. 配置功能參數。
    注意 配置遠程登錄功能參數前,請確保已配置設備認證信息等相關參數。具體操作,請參見MQTT配置連接參數
    • 示例代碼:
          aiot_ra_setopt(ra_handle, AIOT_RAOPT_MQTT_HANDLE, mqtt_handle);
          aiot_ra_setopt(ra_handle, AIOT_RAOPT_NETWORK_CRED, (void *)&cred);
          aiot_ra_setopt(ra_handle, AIOT_RAOPT_EVENT_HANDLER, (void *)ra_event_cb);
          for(int i = 0; i < sizeof(services) / sizeof(aiot_ra_service_t); i++) {
              aiot_ra_setopt(ra_handle, AIOT_RAOPT_ADD_SERVICE, (void *)&services[i]);
          }
    • 相關參數:
      配置項 示例 說明
      AIOT_RAOPT_MQTT_HANDLE mqtt_handle 遠程登錄功能的請求基于MQTT連接,通過該配置項,關聯MQTT連接句柄。
      AIOT_RAOPT_NETWORK_CRED cred 遠程登錄建立連接時,網絡使用的安全憑據。
      AIOT_RAOPT_EVENT_HANDLER ra_event_cb Websocket狀態發生變更時,觸發該回調函數。
      AIOT_RAOPT_ADD_SERVICE services[i] 配置建立遠程登錄連接時,設備端本地可支持的服務。
  2. 定義狀態監控回調函數。
    注意 在編寫狀態監控回調函數的處理邏輯時,請勿調用耗時較長的阻塞函數。
    void ra_event_cb(void *handle, const aiot_ra_event_t *event, void *userdata)
    {
        switch(event->type)
        {
        case AIOT_RA_EVT_CONNECT:
            printf( "ra_event_cb AIOT_RA_EVT_CONNECT %s \r\n", event->tunnel_id);
            /* TODO: 告知Websocket建連成功, 不可在此處調用耗時較長的阻塞函數 */
            break;
        case AIOT_RA_EVT_DISCONNECT:
            printf( "ra_event_cb AIOT_RA_EVT_DISCONNECT %s \r\n", event->tunnel_id);
            /* TODO: 告知Websocket掉線, 不可在此處調用耗時較長的阻塞函數 */
            break;
        case AIOT_RA_EVT_OPEN_WEBSOCKET:
            printf( "ra_event_cb AIOT_RA_EVT_OPEN_WEBSOCKET %s \r\n", event->tunnel_id);
            /* TODO: 告知RA接收到打開Websocket鏈接命令, 不可在此處調用耗時較長的阻塞函數 */
            break;
        case AIOT_RA_EVT_CLOSE_WEBSOCKET:
            printf( "ra_event_cb AIOT_RA_EVT_CLOSE_WEBSOCKET %s \r\n", event->tunnel_id);
            /* TODO: 告知RA接收到關閉Websocket鏈接命令, 不可在此處調用耗時較長的阻塞函數 */
            break;
        }
    }
  3. 定義本地支持的遠程服務類型。
    說明 默認開啟_SSH服務,否則無法實現遠程登錄功能。
    aiot_ra_service_t services[] = {
        {
            .type = "_SSH",
            .ip = "127.0.0.1",
            .port = 22,
        },
    };

步驟三:開啟遠程登錄通道功能

調用aiot_ra_start,向物聯網平臺發起請求,以通知物聯網平臺,設備已具備遠程登錄功能。

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    if (0 != pthread_create(&g_ra_process_thread, &attr, aiot_ra_start, (void*) ra_handle))
    {
        printf( "create remote_proxy_thread error!");
        return -1;
    }

步驟四:打開物聯網平臺遠程登錄開關

物聯網平臺接收通知后,您需打開遠程登錄開關,通知設備打開連接通道。設備再連接物聯網平臺的遠程通道,建立會話連接、實現消息收發等功能。

打開遠程登錄開關支持以下兩種方式:

  • 在控制臺打開。具體操作,請參見遠程登錄
  • 設備主動打開。通過調用接口:aiot_ra_request:
    /**
     * @brief 主動請求建立通道
     *
     * @param[in] handle 指向ra會話句柄的指針
     *
     * @return int32_t*
     * @retval <STATE_SUCCESS 執行失敗, 更多信息請參考 STATE_REMOTE_* 定義
     * @retval >=STATE_SUCCESS 執行成功
     */
    int32_t  aiot_ra_request(void *handle);

步驟五:關閉遠程登錄通道

調用aiot_ra_stop,關閉遠程服務通道。

    int i = 60000;
    while(1)
    {
        sleep(1);
        /* TODO: 業務邏輯 */
        i--;
        /*根據業務邏輯需求,設置條件,需要退出線程可以調用aiot_ra_stop*/
        if(i == 0)
        {
            /*退出線程,關閉RA服務*/
            aiot_ra_stop(ra_handle);
            break;
        }
    }

步驟六:退出程序

調用aiot_ra_deinit,銷毀RA客戶端實例,釋放資源。

    aiot_ra_deinit(&ra_handle);

后續步驟

  • 例程文件配置完成后,需進行編譯,生成可執行文件./output/remote-access-basic-demo

    更多信息,請參見編譯與運行

  • 關于運行結果的詳細說明,請參見運行日志