物聯(lián)網(wǎng)(三)---WEB下發(fā)命令控制單片機[STM32+OneNET+ESP8266]

物聯(lián)網(wǎng)(一)---快速上手[STM32+OneNET+ESP8266]
物聯(lián)網(wǎng)(二)---原理分析[STM32+OneNET+ESP8266]
物聯(lián)網(wǎng)(三)---WEB下發(fā)命令控制單片機[STM32+OneNET+ESP8266]
物聯(lián)網(wǎng)(四)---搭建自己的TCP服務器[ESP8266]
物聯(lián)網(wǎng)(五)---搭建自己的云平臺[ESP8266+Django]

前面已經(jīng)介紹了怎么將單片機連入互聯(lián)網(wǎng),使單片機能夠?qū)⒉杉降臄?shù)據(jù)上傳到互聯(lián)網(wǎng)上杭抠,可以直接通過網(wǎng)頁來進行查看,以及對其中的原理進行了相應的介紹說明。本文將對如何從網(wǎng)頁上下發(fā)命令來控制單片機作相應的講解。

前面已經(jīng)介紹過桌粉,使用由于HTTP協(xié)議是無狀態(tài)宣脉,短連接,只能由客戶端向服務端發(fā)出請求跌宛,所以使用HTTP協(xié)議是無法從平臺上下發(fā)命令給單片機的。這里采用另外一種協(xié)議EDP來對進行通信积仗,當然疆拘,OneNET平臺上使用MQTTModbusTCP透傳也是可以的斥扛,這里只介紹其中一種入问,其他方法可以去OneNET平臺查找相關例程。

下面開始進入本節(jié)正文稀颁。

1.創(chuàng)建新的產(chǎn)品芬失,使用EDP協(xié)議

這里和前面沒什么不同,唯一不同的就是將HTTP協(xié)議換成了EDP協(xié)議匾灶,其他的與之前所介紹的物聯(lián)網(wǎng)(一)---快速上手[STM32+OneNET+ESP8266]是一樣的棱烂。

image.png

2.快速實現(xiàn)

硬件電路:

可以直接使用之前的硬件電路,需要稍微改動一下阶女,加入按鍵LED兩個部分颊糜,其他硬件電路無需進行改動,也就是只要接好STM32ESP8266相應的串口部分就好了秃踩。

ESP8266連接方法

按鍵與LED

軟件程序:

下載程序衬鱼,修改程序源碼中的DEVICEIDAPIKEY已經(jīng)相應的WIFI名稱密碼,編譯下載至單片機中程序就可正常運行了憔杨。但此時還是只能完成數(shù)據(jù)上傳的工作鸟赫,無法完成平臺給單片機下達命令的操作,要讓平臺能夠控制單片機,還需要一個WEB APP才能完成命令的下發(fā)工作抛蚤。

image.png

將程序下載進入單片機中后台谢,等待1min左右,就可以從網(wǎng)頁上看到有設備在線了岁经。


設備狀態(tài)

設備狀態(tài)

在數(shù)據(jù)流展示這里可以看到有數(shù)據(jù)上傳過來朋沮,時間也在不斷更新。

數(shù)據(jù)流展示 1

當按下開發(fā)板上的按鍵之后缀壤,面包中相對應的狀態(tài)也會隨之改變(需要開啟實時刷新)樊拓。

數(shù)據(jù)流展示 2

3.制作WEB APP

制作WEB APP來做相應的控制,這里我們只用到兩個控件诉位,分別是文本控件和按鈕控件骑脱,直接拖出來菜枷,然后修改相應的數(shù)據(jù)苍糠,如下圖。這里要注意的就是命令的格式不餓能出錯啤誊,否則STM32的程序中無法完成對命令的解析工作岳瞭。

控件參數(shù)修改

注:
1.這里不要將按鈕文本控件進行組合,組合后將不是一個按鈕蚊锹,會導致按鈕只能顯示狀態(tài)而無法點擊瞳筏,無法正常下發(fā)命令。
2.這里的{LED_RED{V}}中的{V}在命令下發(fā)時會被自動替換為01牡昆,最終下發(fā)的命令是{LED_RED0}{LED_RED1}姚炕。

修改命令,多加一個下劃線丢烘,使命令看起來更為直觀

制作好WEB APP后柱宦,稍微調(diào)整下布局,使之美觀點就好了播瞳。

完成后

需要注意的是掸刊,這里的數(shù)據(jù)流名字需要與STM32程序中解析出來待比對的命令相一致才行,否則STM32是無法對命令進行解析了赢乓,也就無法完成控制功能了忧侧。

下面的USART2_IRQHandler()中斷服務函數(shù)是對服務器端傳來的命令進行解析的。

/*串口中斷函數(shù)對服務器返回回來的命令進行解析*/
void USART2_IRQHandler(void)
{
    unsigned int data;

    if(USART2->SR & 0x0F)
    {
        // See if we have some kind of error
        // Clear interrupt (do nothing about it!)
        data = USART2->DR;
    }
    else if(USART2->SR & USART_FLAG_RXNE)   //Receive Data Reg Full Flag
    {       
        data = USART2->DR;
        usart2_rcv_buf[usart2_rcv_len++]=data;
        
        if(data=='{') //約定平臺下發(fā)的控制命令以'{'為開始符牌芋,‘}’為控制命令結(jié)束符蚓炬,讀者可以自定義自己的開始符合結(jié)束符
        {
            rcv_cmd_start=1;
        }
        if(rcv_cmd_start==1)
        {
            usart2_cmd_buf[usart2_cmd_len++]=data;
            if((data=='}')||(usart2_cmd_len>=MAX_CMD_LEN-1))
            {
                rcv_cmd_start=0;
                LED_CmdCtl();
                memset(usart2_cmd_buf,0,usart2_cmd_len);
                usart2_cmd_len=0;
            }
        }     
    }
    else
    {
        ;
    }
}

使用LED_CmdCtl()函數(shù)對接收到的命令做出判斷,以控制相應的LED的亮滅躺屁。

/**
  * @brief  分析平臺下發(fā)的LED控制命令
**/
void LED_CmdCtl(void)
{
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_RED_1")))  //約定平臺控制命令"LED_RED_1"為打開紅色LED燈
        {
                LED_RED_ON; 
                red_value=1;
        }
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_GREEN_1")))  //約定平臺控制命令"LED_GREEN_1"為打開綠色LED燈
        {
                LED_GREEN_ON;   
                green_value=1;
        }
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_YELLOW_1")))  //約定平臺控制命令"LED_YELLOW_1"為打開黃色LED燈
        {
                LED_YELLOW_ON;
                yellow_value=1;         
        }
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_BLUE_1")))  //約定平臺控制命令"LED_BLUE_1"為打開藍色LED燈
        {
                LED_BLUE_ON;    
                blue_value=1;
        }
        
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_RED_0")))  //約定平臺控制命令"LED_RED_0"為關閉紅色LED燈
        {
                LED_RED_OFF;    
                red_value=0;
        }
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_GREEN_0")))  //約定平臺控制命令"LED_GREEN_0"為關閉綠色LED燈
        {
                LED_GREEN_OFF;
                green_value=0;  
        }
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_YELLOW_0")))  //約定平臺控制命令"LED_YELLOW_0"為關閉黃色LED燈
        {
                LED_YELLOW_OFF; 
                yellow_value=0;
        }
        if((NULL != strstr((const char *)usart2_cmd_buf, "LED_BLUE_0")))  //約定平臺控制命令"LED_BLUE_0"為關閉藍色LED燈
        {
                LED_BLUE_OFF;   
                blue_value=0;
        }
}

到這里肯夏,如果按鍵程序編寫正確,LED也能正常驅(qū)動的話,程序基本上就沒有什么太大的問題了熄捍,這里注意理一下邏輯烛恤,就是WEB APP上開關的開值和關值要與程序里的LED的亮滅相一致,程序里的LED亮滅又要與硬件電路的LED的接法相一致才不致邏輯錯誤余耽。

完成后的效果圖如下:


GIF壓縮后的渣畫質(zhì)

最后再回顧以下本文重點:
1.不可使用前面的HTTP協(xié)議了缚柏,HTTP協(xié)議是無狀態(tài)朦促、短連接(一次會話完成后即結(jié)束)骄呼、只能由客戶端就發(fā)起請求,所以不可用于命令下發(fā)伤为;于是本文選用了EDP協(xié)議袱耽,當然還有其他類型的通信協(xié)議可供選擇杀餐,文中也有提及,但未展開敘述朱巨。
2.WEB端APP的命令格式十分重要史翘,WEB端APP的命令格式需與STM32中的命令格式相一致,否則STM32可能無法對數(shù)據(jù)進行解析冀续。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琼讽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子洪唐,更是在濱河造成了極大的恐慌钻蹬,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凭需,死亡現(xiàn)場離奇詭異问欠,居然都是意外死亡,警方通過查閱死者的電腦和手機粒蜈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門顺献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人薪伏,你說我怎么就攤上這事滚澜。” “怎么了嫁怀?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵设捐,是天一觀的道長。 經(jīng)常有香客問我塘淑,道長萝招,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任存捺,我火速辦了婚禮槐沼,結(jié)果婚禮上曙蒸,老公的妹妹穿的比我還像新娘。我一直安慰自己岗钩,他們只是感情好纽窟,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兼吓,像睡著了一般臂港。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上视搏,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天审孽,我揣著相機與錄音,去河邊找鬼浑娜。 笑死佑力,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的筋遭。 我是一名探鬼主播打颤,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宛畦!你這毒婦竟也來了瘸洛?” 一聲冷哼從身側(cè)響起揍移,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤次和,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后那伐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踏施,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年罕邀,在試婚紗的時候發(fā)現(xiàn)自己被綠了畅形。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡诉探,死狀恐怖日熬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肾胯,我是刑警寧澤竖席,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站敬肚,受9級特大地震影響毕荐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艳馒,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一憎亚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦第美、人聲如沸蝶锋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牲览。三九已至,卻和暖如春恶守,著一層夾襖步出監(jiān)牢的瞬間第献,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工兔港, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留庸毫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓衫樊,卻偏偏與公主長得像飒赃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子科侈,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容