本文以C Link SDK中的Demo檔案./demos/http_basic_demo
為例,介紹如何調用Link SDK的API,將HTTPS協議的裝置接入物聯網平台並進行訊息收發。
背景資訊
HTTPS接入的更多資訊,請參見概述。
步驟一:初始化
配置底層依賴和日誌輸出。aiot_http_init,用戶端執行個體,並初始化預設參數。
/* 配置SDK的底層依賴 */
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
/* 配置SDK的日誌輸出 */
aiot_state_set_logcb(demo_state_logcb);
...
...
/* 建立1個HTTPS用戶端執行個體並內部初始化預設參數 */
http_handle = aiot_http_init();
步驟二:配置功能
調用aiot_http_setopt,配置以下功能。
更多功能的配置項,請參見aiot_http_option_t。
配置串連參數。
範例程式碼:
char *http_host = "iot-as-http.cn-shanghai.aliyuncs.com"; … aiot_sysdep_network_cred_t cred; char *product_key = "a18wP******"; char *device_name = "LightSwitch"; char *device_secret = "uwMTmVAMnGGHaAkqmeDY6cHxxB******"; … … /* 配置HTTPS伺服器網域名稱。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_HOST, (void *)host); /* 設定管理員連接埠。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_PORT, (void *)&port); /* 配置裝置安全憑證。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_NETWORK_CRED, &cred); /* 配置裝置ProductKey。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_PRODUCT_KEY, product_key); /* 配置裝置DeviceName。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_DEVICE_NAME, device_name); /* 配置裝置DeviceSecret。 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_DEVICE_SECRET, device_secret);
相關參數:
參數
樣本
說明
http_host
iot-06z00ax1o******.http.iothub.aliyuncs.com
裝置的接入網域名稱。
product_key
a18wP******
裝置認證資訊。更多資訊,請參見擷取裝置認證資訊。
本常式的身份認證方式為一機一密。
device_name
LightSwitch
device_secret
uwMTmVAMnGGHaAkqmeDY6cHxxB******
配置狀態監控。
配置狀態監控的回呼函數。
範例程式碼:
int main(int argc, char *argv[]) { ... ... /* 配置資料到達時, SDK應調用的使用者回呼函數 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_RECV_HANDLER, demo_http_recv_handler); /* 配置內部狀態變化時, SDK應調用的使用者回呼函數 */ aiot_http_setopt(http_handle, AIOT_HTTPOPT_EVENT_HANDLER, demo_http_event_handler); }
相關參數:
配置項
樣本值
說明
AIOT_HTTPOPT_RECV_HANDLER
demo_http_recv_handler
當裝置接收到應答報文後,觸發該函數,執行對應處理。
AIOT_HTTPOPT_EVENT_HANDLER
demo_http_event_handler
當Token變化時,觸發該回呼函數,以確保Token的有效性。
定義狀態監控回呼函數。
在Token變化時,觸發回呼函數,設定執行操作。
void demo_http_event_handler(void *handle, const aiot_http_event_t *event, void *user_data) { int32_t res; /* Token失效事件處理 */ if (event->type == AIOT_HTTPEVT_TOKEN_INVALID) { printf("token invalid, invoke iot_http_auth to get new token\n"); res = aiot_http_auth(handle); printf("aiot_http_auth in callback, res = -0x%04x\r\n", -res); } }
在讀取到網路報文時,觸發回呼函數,執行設定的處理。樣本僅做列印處理,您在編寫處理邏輯時,需考慮以下幾點。
應答報文的參數說明,請參見HTTPS串連通訊。
正常接收報文含AIOT_HTTPRECV_STATUS_CODE、AIOT_HTTPRECV_HEADER和 AIOT_HTTPRECV_BODY三個事件,分別表示:通訊是否成功、報文的類型和報文的包體。
根據業務需要,處理狀態代碼。狀態代碼的更多資訊,請參見HTTP狀態代碼。
void demo_http_recv_handler(void *handle, const aiot_http_recv_t *packet, void *userdata) { switch (packet->type) { case AIOT_HTTPRECV_STATUS_CODE: { /* TODO: 以下代碼如果不被注釋, SDK收到HTTPS報文時, 會通過這個使用者回調列印HTTPS狀態代碼, 如404, 200, 302等。 */ /* printf("status code: %d\n", packet->data.status_code.code); */ } break; case AIOT_HTTPRECV_HEADER: { /* TODO: 以下代碼如果不被注釋, SDK收到HTTPS報文時, 會通過該回調列印HTTPS首部, 如Content-Length等。 */ /* printf("key: %s, value: %s\n", packet->data.header.key, packet->data.header.value); */ } break; /* TODO: 如果需要處理物聯網平台的HTTPS回應報文, 在此處修改。當前樣本僅列印回應。 */ case AIOT_HTTPRECV_BODY: { printf("%.*s\r\n", packet->data.body.len, packet->data.body.buffer); } break; default: { } break; } }
步驟三:請求串連
調用aiot_http_auth,根據配置串連的參數,向指定的物聯網平台HTTPS伺服器,發送身份認證請求,擷取Token。
/* 裝置認證, 擷取Token */
res = aiot_http_auth(http_handle);
if (res == 0) {
printf("aiot_http_auth succeed\r\n");
} else {
/* 如果認證失敗, 就銷毀執行個體, 回收資源, 退出程式 */
printf("aiot_http_auth failed, res = -0x%04x\r\n", -res);
aiot_http_deinit(&http_handle);
return -1;
}
步驟四:發送訊息
調用aiot_http_send,在demo_http_post_lightswitch
中,向指定Topic發送訊息。
常式僅列印發送的訊息。實際業務中,您需自訂函數
demo_http_post_lightswitch
。您需刪除常式中代碼兩邊的注釋符號,以示範裝置向物聯網平台上報訊息。
範例程式碼:
int32_t demo_http_post_lightswitch(void *handle) { char data[] = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}"; int32_t res; res = aiot_http_send(handle, "/a1wAf******/LightSwitch/user/update", (uint8_t *)data, strlen(data)); if (res < 0) { printf("aiot_http_send res = -0x%04X\r\n", -res); return res; } … … }
相關參數:
參數
樣本
說明
data[]
{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}
上報至物聯網平台的訊息內容。
由於樣本訊息的Topic類型為自訂,因此資料格式可自訂。
關於資料格式的更多資訊,請參見資料格式。
topic
/a1wAf******/LightSwitch/user/update
擁有發布許可權的Topic。其中:
a18wP******
為裝置的ProductKey。LightSwitch
為裝置的DeviceName。
裝置通過該Topic向物聯網平台發送訊息。
關於Topic的更多資訊,請參見什麼是Topic。
步驟五:接收應答
訊息發送後,物聯網平台返回應答報文。裝置端調用aiot_http_recv接收HTTPS應答資料,根據事件回呼函數,執行對應處理。
res = aiot_http_recv(handle);
if (res >= 0) {
/* 成功接收到伺服器應答, 且業務應答碼為0, 說明資料上報成功 */
return 0;
} else {
printf("aiot_http_recv res = -0x%04X\r\n", -res);
return -1;
}
步驟六:退出程式
調用aiot_http_deinit,銷毀HTTPS用戶端執行個體,釋放資源。
aiot_http_deinit(&http_handle);
printf("program exit as normal return\r\n");
printf("\r\n");
return 0;