入門 ESP-IOT-SOLUTION 專題五:alink_smart_device_demo 淺析

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_taskfree_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_testwrite_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 筆者暫時沒有詳細瞭解,這部分如果有有失偏頗的地方,望大家及時指正。感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章