9. ESP8266使用esp-open-rtos的實踐

一、esp-open-rtos概要

Esp-open-rtos是開源的、基於freertos的、用於ESP8266固件的開發支持環境。最早是從樂鑫官方的ESP8266_RTOS_SDK基礎上fork而來,但是目前的代碼、框架已經和原SDK相去甚遠,有了大幅的變化。從代碼結構、編譯方法、支撐庫等均有不同,而且內置了更多的常見傳感器驅動,以及MQTT、TLS、甚至OTA等常用的功能模塊。相比官方同樣的RTOS SDK、感覺更好用、更便利、開發應用速度更快。
目前,esp-open-rtos在github上獲得了550多個STAR,足以證明其被認可的程度。
Github地址:https://github.com/SuperHouse/esp-open-rtos

Esp8266的項目較多,容易混淆,總結如下:

  • 1) esp-open-sdk esp8266編譯工具鏈
  • 2) esp-open-rtos 基於FreeRTOS的esp8266固件
  • 3) ESP8266_NONOS_SDK 樂鑫官方非OS版本固件、帶AT固件
  • 4) ESP8266_RTOS_SDK 樂鑫官方RTOS固件(基於FreeRTOS)
  • 5) nodemcu-firmware NodeMCU的lua固件
  • 2~5均使用同樣的編譯工具鏈1。

二、esp-open-rtos安裝

1、編譯工具鏈的建立(toolchain)
交叉編譯工具鏈和樂鑫官方SDK相同,均使用esp-open-sdk。
安裝方法可參照前面文章:【ESP8266固件的編譯1(交叉編譯工具鏈的建立)】。
簡便起見,推薦使用【make STANDALONE=y】。

2. 代碼下載
如下命令從github上下載代碼。

git clone --recursive https://github.com/Superhouse/esp-open-rtos.git
使用recursive,可以將依賴的第三方代碼一起獲取。

三、代碼編譯

樂鑫官方的RTOS SDK是先編譯底層支撐代碼,以庫的形式提供。
應用層通過連接庫的的方式和底層代碼鏈接在一起,build爲bin,存在兩個階段。
具體可參照前文:
【ESP8266固件的編譯5(RTOS SDK固件)】

但eps-open-rtos採用了另外一種方式,它沒有底層代碼編譯庫的過程。
而是以應用爲中心,每個應用都會將所有底層代碼複製一份
(從FreeRTOS到lwip,再到各種依賴庫和應用層代碼)每個應用都會複製並編譯屬於自己的這份,
並和自身的應用層代碼一起編譯。(其實最終也會通過庫的形式,但是編譯過程是一體化的)

另外Esp-open-rtos的編譯採用make,擺脫了cmake,感覺清爽、瘦身很多。
編譯時可通過make help來看到編譯相關的幫助,尤其是make flash。

非常重要的是,
Esp-open-rtos在examples目錄下提供了很多例子(很贊),上手可以很快。

1、編譯準備
在編譯之前,需要在include目錄下,創建private_ssid_config.h文件,
來預定義系統默認wifi參數,內容如下:

#define WIFI_SSID "mywifissid"#
define WIFI_PASS "my secret password"

2. mqtt_client的編譯
上面已經說明過,esp-open-rtos以應用爲中心編譯,
下面以mqtt_client爲例進行說明

編譯方法1,在esp-open-rtos根目錄下,執行

make -C examples/mqtt_client/

編譯方法2,進入到examples/mqtt_client目錄下,直接執行

make

3. esp8266的相關參數設定
系統默認的esp8266相關的參數,如SPI類型、Flash大小等,定義在根目錄下的parameters.mk中,如下:

FLASH_SIZE ?= 16
FLASH_MODE ?= qio
FLASH_SPEED ?= 40

?= 是make的語法,意爲如果沒有定義,就使用=後的值做賦值,相當於默認參數。
如果目標硬件(ESP8266模組)固定,可以直接修改此文件。
若目標硬件經常變化,如經常切換ESP01和ESP12,也可以修改應用目錄下的Makefile文件進行配置:

PROGRAM=mqtt_client
FLASH_SIZE ?= 32
FLASH_MODE ?= qio

EXTRA_COMPONENTS = extras/paho_mqtt_c
include ../../common.mk

因使用安信可的ESP12F模塊,所以將FLASH_SIZE修改爲32,
如使用nodeMCU,除FLASH_SIZE外,還要將FLASH_MODE改爲dio。

注意EXTRA_COMPONENTS宏,是esp-open-rtos的Make體系中指明依賴組件的宏,
所有需要依賴的擴展都要定義在該宏中(空格分隔)
這裏可以看出,mqtt的協議是使用的Apache Paho(根據esp8266移植過)

MQTT本身的參數設定,可在在mqtt_client.c中修改。

編譯成功後,在examples/mqtt_client/ firmware目錄下,
會生成名爲mqtt_client.bin的固件文件。

4. mqtt_client代碼解析
mqtt_client的代碼簡單且結構清晰:
主函數啓動3個task,分別是:

  • wifi管理task
  • mqtt管理task
  • 以及mqtt連接成功後定時pub的測試task

wifi_alive是一個信號燈(semaphore),用於協調wifi task和 mqtt task,以保證網絡正常後再進行mqtt處理。
publish_queue是一個消息隊列,用於beat_task和mqtt task間的數據傳遞,用於定時向【/beat】主題發佈。
另外,mqtt task中在mqtt連接建立後,會訂閱【esptopic】主題,並顯示收到的消息。
下面是入口函數user_init的實現。

void user_init(void)
{
    uart_set_baud(0, 115200);
    printf("SDK version:%s¥n", sdk_system_get_sdk_version());

    vSemaphoreCreateBinary(wifi_alive);
    publish_queue = xQueueCreate(3, PUB_MSG_LEN);
    xTaskCreate(&wifi_task, "wifi_task",  256, NULL, 2, NULL);
    xTaskCreate(&beat_task, "beat_task", 256, NULL, 3, NULL);
    xTaskCreate(&mqtt_task, "mqtt_task", 1024, NULL, 4, NULL);
}

四、固件下載(刷寫)

因爲esp-open-rtos內置了esptool.py,可用make flash進行直接做固件刷新。
但在windows上,還是使用官方的下載工具更加方便。
關於固件下載工具的使用,可參照前文【ESP8266固件的編譯5(RTOS SDK固件)】。
和其他固件的刷新方法一樣,但寫入地址方面,和樂鑫官方、nodemcu差別較大。

觀察make flash的命令輸出:

esptool.py -p /dev/ttyUSB0 --baud 115200 write_flash -fs 32m -fm qio -ff 40m
0x0 ../../bootloader/firmware_prebuilt/rboot.bin 0x1000 ../../bootloader/firmware_prebuilt/blank_config.bin 0x2000 ./firmware/mqtt_client.bin

可以看到,出mqtt_client.bin外,還要刷入預置的,
存放於bootloader/firmware_prebuilt目錄下rboot.bin和blank_config.bin。

其寫入地址爲:

rboot.bin               0x0000
blank_config.bin        0x1000
mqtt_client.bin         0x2000

如下圖:
這裏寫圖片描述

刷入後,如網絡征程,即可以看到wifi連接成功後,mqtt的通信狀況。
ESP8266側如圖:
這裏寫圖片描述
框內內容分別是,wifi接入,mqtt接入,和收到mqtt消息。

服務端可用如下命令測試(mosquitto):

發佈:
mosquitto_pub -u test -P test -t /esptopic -m "hello world"

接收:
mosquitto_sub -u test -P test -t /beat

可以看到收到連續的beat消息。
這裏寫圖片描述

如上,mqtt在esp8266上非常容易的便可被實現,而且還有多task的支持。
增加傳感器,將讀取數據通過mqtt送出,即可實現簡單的IoT系統。
而且,esp-open-rtos對常見傳感器(溫度、光線 etc.)的驅動支持也相當不錯。
examples目錄下有例子,extras目錄下有協議實現。

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