1. Alink 協議
Alink 協議是針對物聯網開發領域設計的一種數據交換規範,數據格式是 JSON,用於設備端和物聯網平臺的雙向通信,更便捷地實現和規範了設備端和物聯網平臺之間的業務數據交互。
2. alink_smart_device_demo
我們使用的 esp-iot-solution 版本 commit爲: 40cec13。
可通過以下命令確認:
git log --oneline -1
結果爲:
40cec13 Merge branch 'master' of https://github.com/espressif/esp-iot-solution
2.1 app_main()
我們先查看 main.c 下的 app_main 函數:
void app_main()
{
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK( nvs_flash_erase() );
ret = nvs_flash_init();
}
ESP_ERROR_CHECK( ret );
iot_demo_start();
}
首先進行 nvs_flash_init()
初始化 NVS 並檢查是否成功初始化,然後就直接運行 iot_demo_start()
。
2.2 iot_demo_start()
以下爲 iot_demo_start()
裏的代碼:
void iot_demo_start()
{
ESP_LOGI(TAG, "mode: json, free_heap: %u\n", esp_get_free_heap_size());
xTaskCreate(cloud_start_task, "alink_start_task", 1024 * 6, NULL, 9, NULL);
xTaskCreate(free_heap_task, "free_heap_task", 1024 * 2, NULL, 3, NULL);
}
在這裏通過 esp_get_free_heap_size()
進行了空閒堆大小的輸出以及創建了 cloud_start_task
和 free_heap_task
兩個 task。其中 free_heap_task
的作用是定時輸出空閒堆大小,在這裏就不做進一步分析。因此我們主要來看看 cloud_start_task
。
2.3 cloud_start_task
以下爲 cloud_start_task
裏的代碼:
void cloud_start_task(void *arg)
{
if (xSemWriteInfo == NULL) {
xSemWriteInfo = xSemaphoreCreateBinary();
}
cloud_init(xSemWriteInfo);
xTaskCreate(read_task_test, "read_task_test", 1024 * 4, NULL, 9, NULL);
xTaskCreate(write_task_test, "write_task_test", 1024 * 4, NULL, 4, NULL);
vTaskDelete(NULL);
}
在這裏主要是通過 cloud_init()
初始化雲,然後創建了 read_task_test
和 write_task_test
兩個 task。如果對 xSemaphoreCreateBinary()
有疑問,可以及時查看 Semaphore API。
2.4 read_task_test
以下爲 read_task_test
裏的代碼:
static void read_task_test(void *arg)
{
for (;;) {
cloud_read(portMAX_DELAY);
xSemaphoreGive(xSemWriteInfo);
}
vTaskDelete(NULL);
}
裏面只有兩個函數 cloud_read()
和 xSemaphoreGive()
。雲通過 cloud_read()
來閱讀設備上的數據。xSemaphoreGive()
用來發送(釋放)信號量。詳細解釋可以參考 Semaphore API。
2.5 write_task_test
以下爲 write_task_test
裏的代碼:
void write_task_test(void *arg)
{
esp_err_t ret;
for (;;) {
xSemaphoreTake(xSemWriteInfo, portMAX_DELAY);
ret = cloud_write(500 / portTICK_PERIOD_MS);
if (ret == ESP_FAIL) {
ESP_LOGW(TAG, "esp_write is err");
}
vTaskDelay(500 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
}
裏面也只有兩個函數 cloud_write()
和 xSemaphoreTake()
。雲通過 cloud_write()
來向設備寫入數據。xSemaphoreTake()
用來接收(獲取)信號量。詳細解釋可以參考 Semaphore API。
注意: 與 cloud 相關的 API 筆者暫時沒有詳細瞭解,這部分如果有有失偏頗的地方,望大家及時指正。感謝!