當前位置:首頁 > 公眾號精選 > 程序員小哈
[導讀]上一篇網(wǎng)文,我們實現(xiàn)ESP8266固件的下載、一鍵配網(wǎng)和云智能APP綁定設備。 Windows下AliOS Things環(huán)境搭建及ESP8266 固件下載 隨著物聯(lián)網(wǎng)設備的普及,物聯(lián)網(wǎng)操作系統(tǒng)也成了廣大開發(fā)者熱烈討論的話題之一,很多的組織和廠商都推出了在物聯(lián)網(wǎng)節(jié)點上的基礎軟件—

上一篇網(wǎng)文,我們實現(xiàn)ESP8266固件的下載、一鍵配網(wǎng)和云智能APP綁定設備。
Windows下AliOS Things環(huán)境搭建及ESP8266 固件下載

隨著物聯(lián)網(wǎng)設備的普及,物聯(lián)網(wǎng)操作系統(tǒng)也成了廣大開發(fā)者熱烈討論的話題之一,很多的組織和廠商都推出了在物聯(lián)網(wǎng)節(jié)點上的基礎軟件——物聯(lián)網(wǎng)操作系統(tǒng),如國內云服務供應商Alibaba推出的AliOS Things ,Amazon公司的Amazon FreeRTOS,再如開源社區(qū)領袖Linux基金會推出的Zephyr,以及在國內知名度很高的RT-Thread等等。

今天我們來對AliOS Things中的示例linkkitapp例程進行一下解析,希望可以為你解惑一二。

系統(tǒng)架構

AliOS Things是什么?

AliOS Things是面向IoT領域的輕量級物聯(lián)網(wǎng)嵌入式操作系統(tǒng)。致力于搭建云端一體化IoT基礎設備。具備極致性能,極簡開發(fā)、云端一體、豐富組件、安全防護等關鍵能力,并支持終端設備連接到阿里云Link,可廣泛應用在智能家居、智慧城市、新出行等領域。

AliOS Things是阿里巴巴推出的物聯(lián)網(wǎng)設備端軟件框架,物聯(lián)網(wǎng)設備可以通過AliOS Things設備框架接入阿里云,使用云服務器提供的相關物聯(lián)網(wǎng)設備服務。

AliOS Things軟件框架是基于APACHE2.0協(xié)議的開源軟件,項目地址為:https://github.com/alibaba/AliOS-Things

AliOS Things軟件架構可以從下到上分為四層,硬件和硬件抽象層、AOS操作系統(tǒng)層、應用框架層和應用層,下層組件為上層業(yè)務邏輯的實現(xiàn)提供支撐機制。

從底部到頂部,AliOS Things包括:

  • 板級支持包(BSP):主要由SoC供應商開發(fā)和維護
  • 硬件抽象層(HAL):比如WiFi和UART
  • 內核:包括Rhino實時操作系統(tǒng)內核、Yloop, VFS, KV 存儲
  • 協(xié)議棧:包括TCP/IP協(xié)議棧(LwIP),uMesh網(wǎng)絡協(xié)議棧
  • 安全:安全傳輸層協(xié)議(TLS),可信服務框架(TFS)、可信運行環(huán)境(TEE)
  • AOS API:提供可供應用軟件和中間件使用的API
  • 中間件:包括常見的物聯(lián)網(wǎng)組件和阿里巴巴增值服務中間件
  • 示例應用:阿里自主開發(fā)的示例代碼,以及通過了完備測試的應用程序(比如Alinkapp) 所有的模組都已經(jīng)被組織成組件,且每個組件都有自己的.mk文件,用于描述它和其它組件間的依賴關系,方便應用開發(fā)者按需選用。

我們一般只需要關心示例應用部分,找一個跟自己的需求接近的示例,然后在其上進行更改即可,我們使用的示例就是linkkitapp。

結構框圖

目錄結構

文件夾名稱 內容描述
3rdparty 第三方庫相關功能代碼
app 示例程序相關代碼
board 評估板(如我們使用的ESP8266)
build 編譯框架
include 系統(tǒng)頭文件
kernel 包括Rhino和協(xié)議棧
Middleware 阿里巴巴增值和常用的物聯(lián)網(wǎng)組件,包括Linkkit,OTA(安全差分升級),ulog(日志服務),uData(傳感器框架),uLocation(定位框架),WiFi配網(wǎng) 等
Network 包括LwIP 輕量級TCP/IP協(xié)議棧,uMesh 自組網(wǎng)協(xié)議棧,BLE 低功耗藍牙協(xié)議棧,LoRaWAN 協(xié)議棧,AT Commands Module 等
osal AOS API,提供可供應用軟件和中間件使用的API
out 編譯輸出目錄
platform 芯片架構支持的相關文件;該目錄下包含了mcu與arch文件夾;mcu:該目錄主要存放廠商提供的芯片底層軟件庫代碼(如ESP8266庫),主要由SoC供應商開發(fā)和維護,以及二進制文件,如系統(tǒng)啟動、驅動、編譯/鏈接腳本等。mcu下的目錄結構按“廠商/芯片系列”進行區(qū)分。arch:主要存放硬件體系架構所需要的移植接口實現(xiàn)文件,如任務切換、啟動、開關中斷等,硬件體系架構如arm、xtensa…。
security 包括TLS,TFS, TEE在內的安全組件
utility IoT通用軟件庫,比如 cjson、libc等

為什么D5(GPIO14)是一鍵配網(wǎng)的引腳?

首先我們看一下,D5引腳在哪里?

官方介紹: WeMos D1 mini pins and diagram

https://escapequotes.net/esp8266-wemos-d1-mini-pins-and-diagram/


D5是WeMos D1 mini模塊的引腳,GPIO14是ESP8266的引腳,兩個標識對應的一個引腳。

那linkkitapp代碼中哪里對應著一鍵配網(wǎng)的代碼呢?

程序入口在app_entry.c中的int application_start(int argc, char ** argv) 函數(shù)。

在application_start函數(shù)中有這樣一行:

從函數(shù)名上看,這是一個注冊事件過濾器的,過濾的目標是按鍵點擊事件,并處理按鍵點擊事件的,“l(fā)inkkit按鍵處理”回調函數(shù)。

該函數(shù)的實現(xiàn)如下:

事件值為VALUE_KEY_CLICK將進入awss配網(wǎng)模式;

事件值為VALUE_KEY_LTCLICK將進行awss復位操作。

經(jīng)過定位排查,我們知道在 key_poll_func(void * arg) 函數(shù)中,實現(xiàn)了判斷按鍵(短按、長按、長長按),然后分別向系統(tǒng)發(fā)出不同的按鍵事件aos_post_event()。

由上我們知道了AliOS定義的配網(wǎng)按鍵就是GPIO14,也就是mini D1 ESP8266模塊的D5腳。。

詳細請參考:ESP8266配網(wǎng)--key.c之按鍵事件分析
https://www.jianshu.com/p/fab0ea9e9ad3

ESP8266與主單片機之間的關系

STM32-->ESP8266-->阿里云物聯(lián)網(wǎng)平臺-->手機等終端

我們使用ESP8266模塊,只是把ESP8266當做一個數(shù)據(jù)傳輸?shù)拿浇?,STM32與ESP8266模塊通過串口進行通信。

STM32獲得外部傳感器的狀態(tài),然后通過串口發(fā)送狀態(tài)至ESP8266模塊。

經(jīng)ESP8266模塊內部的AliOS Things對數(shù)據(jù)包進行打包,然后將數(shù)據(jù)包通過WiFi網(wǎng)絡發(fā)送至阿里云物聯(lián)網(wǎng)平臺。

由于手機端與阿里云物聯(lián)網(wǎng)平臺保持著長連接,所以阿里云物聯(lián)網(wǎng)平臺獲得到的傳感器數(shù)據(jù)能夠及時推送至手機端,進而保持設備端的傳感器數(shù)據(jù)和手機端的數(shù)據(jù)保持一致性。

手機等終端-->阿里云物聯(lián)網(wǎng)平臺-->ESP8266-->STM32

反過來,通過手機端的云智能APP對設備進行操作,首先會將操作設備的指令推送至阿里云物聯(lián)網(wǎng)平臺,阿里云物聯(lián)網(wǎng)平臺會及時將指令推送至ESP8266模塊,ESP8266模塊會對收到的指令進行數(shù)據(jù)轉發(fā),將指令通過串口傳輸給STM32。

由于阿里云物聯(lián)網(wǎng)平臺推薦數(shù)據(jù)格式為ICA標準數(shù)據(jù)格式(Alink JSON),STM32端需要對接收到的串口信息進行解析,即對接收到的JSON字符串進行解析,然后對解析后的結果進行判斷,根據(jù)指令不同進而做不同的動作。

有人可能會說,ESP8266這個單片機性能這么好,不利用它浪費了;

還有人會說對于智能風扇這樣的簡單應用,只需要ESP8266作為主芯片即可,加上外圍電路,多省事多節(jié)約成本呀。

的確ESP8266性能很好,只是使用ESP8266的確夠用。那我們?yōu)槭裁催€要使用上面這種方式,額外浪費一個STM32單片機呢?

這種方式最大的好處就是,降低物聯(lián)網(wǎng)模塊的使用門檻,為什么這么說呢?

上面的通信方式,只需要一個具有串口功能的單片機就可以與ESP8266配合使用,而一般的單片機都有1-2個以上的串口,所以條件很容易就滿足了。

這樣,我們只需要在你原有的設計方案的基礎上,額外占用一個串口,就可以在不改變整體電路設計的基礎上,添加物聯(lián)網(wǎng)功能。

而外圍單片機的選擇就很自由了,可以根據(jù)功能需要,選擇便宜的或者性能比ESP8266更優(yōu)的作為主單片機。

另外一點,如果拿ESP8266作為主單片機的話,那么就要對ESP8266有比較深入的了解,這樣無疑增大了難度,當某天需求改變或者ESP8266性能無法滿足的時候,我們更換了ESP8266的芯片,那么整體方案都要改,而且你還要重新熟悉一個新的物聯(lián)網(wǎng)芯片,學習成本太高了。

需要解決的問題

ESP8266 有兩個UART:UART0和UART1。

UART0有TX、RX,可以作為系統(tǒng)的打印信息輸出接口和數(shù)據(jù)收發(fā)口。

UART1的RX被Flash占用,只有發(fā)送引腳TX(GPIO2,即UART1_TXD)可供使用,所以一般作為打印信息輸出接口(調試用)。

通常情況下,我們使用UART0和外設通訊,而使用UART1作為日志打印端口。

D1 mini ESP8266模塊兩個串口的所在位置:

我們使用一個Micro USB線與D1 mini ESP8266模塊相連,使用串口會收到如下打印信息:

我們可以看到默認的linkkitapp示例,Log信息是通過UART0發(fā)送出來的,而且里面有很多咱們不關心的信息,應該將此部分信息進行屏蔽。

所以我們需要做如下幾個工作:

  1. 將串口的比特率由921600修改為115200(此部分工作可不做);
  2. 交換UART0和UART1,讓UART1輸出Log日志;UART0與STM32進行通信;
  3. 將STM32發(fā)上來的信息,通過UART0接收并發(fā)送到云端;將云端下發(fā)的有用的信息通過UART0轉發(fā)給STM32。

解決問題1. 串口的初始化api在platform\mcu\esp8266\bsp\driver\uart.c 中,目前的代碼是默認如果不設置,uart0波特率是921600。但是一旦初始化了uart1,uart0的波特率會被改為和uart1一樣。

void
uart_init_new(uart_dev_t *uart)
{
    UART_WaitTxFifoEmpty(UART0);
    UART_WaitTxFifoEmpty(UART1);

    if (uart == NULL)
    {
        return;
    }


    if (uart->port == 1)
    {
        //printf("port= 1\n ");

        //uart1 setting
        UART_ConfigTypeDef uart_config;
        uart_config.baud_rate = uart->config.baud_rate;
        uart_config.data_bits = UART_WordLength_8b;
        uart_config.parity = USART_Parity_None;
        uart_config.stop_bits = USART_StopBits_1;
        uart_config.flow_ctrl = USART_HardwareFlowControl_None;
        uart_config.UART_RxFlowThresh = 120;
        uart_config.UART_InverseMask = UART_None_Inverse;
        //UART_ParamConfig(UART0, &uart_config);


        //uart2 setting for log
        //uart_config.baud_rate = uart->config.baud_rate;
        UART_ParamConfig(UART1, &uart_config);

        UART_SetPrintPort(UART1);
        //UART_intr_handler_register(uart0_rx_isr, NULL);
        ETS_UART_INTR_ENABLE();
    }
    else
    {
        //printf("port= 0 \n ");
        UART_ConfigTypeDef uart_config;
        uart_config.baud_rate = uart->config.baud_rate;
        // uart_config.baud_rate = BIT_RATE_921600;
        uart_config.data_bits = UART_WordLength_8b;
        uart_config.parity = USART_Parity_None;
        uart_config.stop_bits = USART_StopBits_1;
        uart_config.flow_ctrl = USART_HardwareFlowControl_None;
        uart_config.UART_RxFlowThresh = 120;
        uart_config.UART_InverseMask = UART_None_Inverse;
        UART_ParamConfig(UART0, &uart_config);


        UART_IntrConfTypeDef uart_intr;
        uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA | UART_TXFIFO_EMPTY_INT_ENA;
        uart_intr.UART_RX_FifoFullIntrThresh = 100;//10
        uart_intr.UART_RX_TimeOutIntrThresh = 10;//2
        uart_intr.UART_TX_FifoEmptyIntrThresh = 20;
        UART_IntrConfig(UART0, &uart_intr);


        UART_SetPrintPort(UART0);
        UART_intr_handler_register(uart0_rx_isr, NULL);
        ETS_UART_INTR_ENABLE();
    }
}


解決問題2. 交換UART0和UART1:修改此文件:AliOS-Things\platform\mcu\esp8266\hal\uart.c

解決問題3.

  • 下發(fā)有用信息:
  • 上發(fā)有用信息:

模擬上傳屬性

經(jīng)過上面的改造之后,我們只需要向UART0發(fā)送JSON格式的數(shù)據(jù),即可修改服務器端的數(shù)值,比如串口助手中發(fā)送:

{"CurrentTemperature":26}

發(fā)送完畢,服務器端的當前溫度值將會修改為26℃,在運行狀態(tài)中可以實時看出來當前溫度值是實時變化的。

模擬設置屬性

手機端APP點擊某個按鈕之后,將會將數(shù)據(jù)包發(fā)送至ESP8266,ESP8266將有用信息通過UART0的TX引腳發(fā)送給STM32,STM32將收到服務器端指令,對此指令進行解析,進而做相應的動作,具體邏輯類似下圖所示。

調試真實設備中,對電源開關設置為1,即{"PowerSwitch":1},在串口助手中我們收到指令{"PowerSwitch":1};

我們對電源開關設置為0,即{"PowerSwitch":0},可以看到串口助手中,收到對應的指令{"PowerSwitch":0}。

STM32中我們使用cJSON對上面字符串進行解析即可,然后做相應的動作,即完成了云端對設備的遠程控制。

細心的人可能發(fā)現(xiàn)了,為什么我們用CurrentTemperature或者PowerSwitch來設置屬性呢?其實他們就是我們創(chuàng)建產(chǎn)品的時候,進行功能定義的時候,設置的標識符。

到此為止,本月的“智能風扇”涉及到的知識點基本都已經(jīng)講過了,下一篇網(wǎng)文,就對此項目進行最后的收尾,大家敬請期待哈。



三千多字的網(wǎng)文,一個字也舍不得刪了,喜歡的幫忙點個“在看”吧。

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉