一、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目錄下有協議實現。