剛進入大學(xué)的黃毛小子心高氣傲,都不知道自己被親朋好友的吹捧飄到哪里去了,轉(zhuǎn)眼間從學(xué)校的大門溜出來了,發(fā)現(xiàn)天空藍藍的,白云一飄一飄,而對自己的工作卻迷迷茫茫,高不成低不就,無奈之下跑到了深圳富士康做一線員工,當(dāng)時正好趕上鄭州港區(qū)富士康的建廠,都說從這工作后直接回到鄭州富士康都是管理、技術(shù)、質(zhì)檢等不錯的職位,我卻不屑,猶如每天“機器人”的工作,三個月就又回到老地方了。
作為電子信息工程畢業(yè)的我,一沒人脈,二沒技術(shù),一個研發(fā)也找不到,只能從維修售后做起,慢慢到了小小電源研發(fā),中間磕磕碰碰,摸爬滾打,寫過多少筆記,去過多少縣城,走過多少鄉(xiāng)鎮(zhèn),下過多少煤礦,堪稱電源人生的“一帶一路”。
電源也慢慢做到了控制這塊,從STC89C52開始的入門和STC12C5A60S2的系統(tǒng)學(xué)習(xí),到今天STM32的嵌入式研發(fā),“一幕幕、一路路”,后續(xù)的ARM-linux更期待。
進入正題,隨著物聯(lián)網(wǎng)的興起,使傳感器網(wǎng)絡(luò)、感知中國、RFID無線射頻識別、無線短距離通訊、云計算等技術(shù)的應(yīng)用走向熱潮。
我們來看看云端wifi的具體原理:
其實就是一鍵配置功能,簡單的說就是:當(dāng)設(shè)備還沒有連上WiFi的時候,此時通過手機App可以將WiFi的SSID及密碼一鍵配置到智能插座上去。
看看具體怎么工作:
1. 設(shè)備進入初始化狀態(tài),開始收聽附近的 WiFi 數(shù)據(jù)包。
2. 手機/平板設(shè)置 WiFi 名字和密碼后,發(fā)送 UDP 廣播包。
3. 設(shè)備通過 UDP 包(長度)獲取配置信息,切換網(wǎng)絡(luò)模式,連接上家里 WiFi,配置完成。
看實物咋樣。
我們現(xiàn)在開始看看8266是怎么實現(xiàn)遠(yuǎn)程控制的?
以智能插座為例,看看云端wifi是怎么控制的。
首先,我們先要設(shè)置與創(chuàng)建自己的產(chǎn)品。
選擇第一個云端wifi。
點擊保存后 點擊添加數(shù)據(jù)點。
點擊新建數(shù)據(jù)點。
選擇MCU開發(fā),SOC 8266-32M 剛才生成的序列號。
點擊生成代碼后。
這個時候可以搭建開發(fā)環(huán)境來更改代碼。
我們先用windows的開發(fā)環(huán)境,用安信可 ESP 系列一體化開發(fā)環(huán)境,是安信可科技為方便廣大用戶而推出的基于 Windows + Cygwin + Eclipse + GCC 的綜合 IDE 環(huán)境。
下載地址http://pan.baidu.com/s/1skRvR1j
軟件的安裝。
打開軟件簡單配置一下。
這是打開的軟件界面。
我們主要改的是APP文件。
我們現(xiàn)在根據(jù)模塊的硬件電路來改程序。
我們上面的圖片中工作模式選擇就是紅圈中的定義,接地和高電平 都是針對GPIO0,正常工作就是從FLASH啟動,寫固件時就是串口下載程序。
我們開始搭建硬件電路按鍵S1長按就是進入airlink配網(wǎng)模式了,按鍵S1是配置按鍵,按鍵S2按下接通時候就是串口下載了, LED是接在GPIO12和VCC之間的。
我們需要改的程序的地方不多,第一處修改。
我們把按鍵改一下,我們用了一個按鍵接的是GPIO4來配置。
第二處修改,把與第二個按鍵有關(guān)的程序刪除。
第三處修改,我們用GPIO12來做開關(guān)用,在主函數(shù)添加初始化程序。
第四處修改我們的8266收到指令后做出的動作,看看怎么修改程序。
修改后。
這個就是一個開燈和關(guān)燈的0x01和0x00。
再看看整體的SOC方案通訊原理圖。
這是MCU通過燒錄好GAgent固件的WIFI模組與服務(wù)器交互的邏輯。
“機智云”是一個面向開發(fā)者的免費開放的互聯(lián)網(wǎng)服務(wù)平臺,通過這個服務(wù)器將以單片機為主的智能硬件與智能手機聯(lián)系起來,實現(xiàn)三者之間的通信,這就是所謂的“物聯(lián)網(wǎng)”技術(shù)(IOT)。
而單片機+互聯(lián)網(wǎng)+手機APP開發(fā),這三種都需要學(xué)習(xí)。
說說互聯(lián)網(wǎng)TCP/IP協(xié)議(面向網(wǎng)絡(luò)傳輸層的通信協(xié)議,解決數(shù)據(jù)如何傳輸?shù)膯栴}),UDP協(xié)議,DHCP(動態(tài)主機配置協(xié)議,IP地址動態(tài)分配),HTTP協(xié)議(面向應(yīng)用層的文本傳輸協(xié)議,解決數(shù)據(jù)怎么用的問題) ;TCP服務(wù)端(sever)和客戶端(client),就如同打電話一樣需要一個主叫和被叫一樣,端口號就如同電話的分機。TCP或者UDP通信必須有TCP服務(wù)端(sever)和客戶端(client)這二者,作為TCP服務(wù)端(sever)時無需配置IP地址和端口號,但是作為客戶端(client)時就必須知道通信對方的IP地址和端口號。ARP地址解析協(xié)議,URL(統(tǒng)一資源地址,針對服務(wù)器而言)等等這些概念必須學(xué)習(xí)了解。
對于互聯(lián)網(wǎng)的鏈接有三種方式
1.硬件網(wǎng)口
2.WIFI
3.GPRS
通過互聯(lián)網(wǎng)這塊最終還是TCP/UDP協(xié)議,在59樓一個簡單的介紹,硬件網(wǎng)口就不多說了,wifi的通信前面已經(jīng)說過了,過幾天用APP控制看看效果咋樣。
而gprs聯(lián)網(wǎng)的話,這是簡單的原理。
對于目前的4G模塊都是利用手機SIM卡和運營商GPRS網(wǎng)絡(luò)提供無線網(wǎng)絡(luò)數(shù)據(jù)通信,目前的共享單車就是這種方案。
具體的通信原理
1、TCP連接
TCP(Transmission Control Protocol) 傳輸控制協(xié)議。TCP是主機對主機層的傳輸控制協(xié)議,提供可靠的連接服務(wù),采用三次握確認(rèn)建立一個連接。位碼即tcp標(biāo)志位,有6種 標(biāo)示:SYN(synchronous建立聯(lián)機) ACK(acknowledgement 確認(rèn)) PSH(push傳送) FIN(finish結(jié)束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認(rèn)號碼)。手機能夠使用聯(lián)網(wǎng)功能是因為手機底層實現(xiàn)了TCP/IP協(xié)議,可以使手機終端通過無線網(wǎng)絡(luò)建立TCP連接。TCP協(xié)議可以對上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡(luò)之上。
建立起一個TCP連接需要經(jīng)過“三次握手”:
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手。握手完成后,兩臺主機開始傳輸數(shù)據(jù)了。
2、HTTP連接
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol ),是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng),在請求結(jié)束后,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。
2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結(jié)束后再發(fā)送下一個請求。
由于HTTP在每次請求結(jié)束后都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態(tài),需要不斷地向服務(wù)器發(fā)起連接請求。通常的做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務(wù)器發(fā)送一次“保持連接”的請求,服務(wù)器在收到該請求后對客戶端進行回復(fù),表明知道 客戶端“在線”。若服務(wù)器長時間無法收到客戶端的請求,則認(rèn)為客戶端“下線”,若客戶端長時間無法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開。
而目前的4G通信采用SOCKET鏈接。
1.套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠(yuǎn)地主機的IP地址,遠(yuǎn)地進程的協(xié)議口。
應(yīng)用層通過傳輸層進行數(shù)據(jù)通信時,TCP會遇到同時為多個應(yīng)用程序進程提供并發(fā)服務(wù)的問題。多個TCP連接或多個應(yīng)用程序進程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進程和連接,許多計算機操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng)用層可以和傳輸層通過Socket接口,區(qū)分來自不同應(yīng)用程序進程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。
這是SOCKET的連接過程。
2. 建立socket連接建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務(wù)器端,稱為ServerSocket 。套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)。服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請求??蛻舳苏埱螅褐缚蛻舳说奶捉幼痔岢鲞B接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā) 給客戶端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
在TCP中我們常用長連接實現(xiàn)通信。
當(dāng)網(wǎng)絡(luò)通信時采用TCP協(xié)議時,在真正的讀寫操作之前,server與client之間必須建立一個連接,當(dāng)讀寫操作完成后,雙方不再需要這個連接 時它們可以釋放這個連接,連接的建立是需要3次握手的,而釋放則需要4次握手,所以說每個連接的建立都是需要資源消耗和時間消耗的。
這是短鏈接和長連接的區(qū)別。
目前物聯(lián)網(wǎng)系統(tǒng)共由四部分組成:
- 物聯(lián)網(wǎng)設(shè)備端
- 物聯(lián)網(wǎng)設(shè)備云平臺端
- 物聯(lián)網(wǎng)WEB后臺服務(wù)器
- 用戶端
這是一個接入系統(tǒng)框架。
具體的微信掃描原理。
服務(wù)器通過GPRS/3G流量來完成數(shù)據(jù)交互,過程如下:
一、手機掃描自行車,獲得自行車唯一的ID標(biāo)志,手機接著會向服務(wù)器提交一個請求(提交信息里包含:用戶信息,請求動作,車輛ID);
二、服務(wù)器收到用戶開鎖請求,此時會根據(jù)請求信息,接著向指定ID的自行車發(fā)出開鎖指令;
三、自行車收到服務(wù)器指令,會執(zhí)行相應(yīng)的開鎖動作。
前面我們主要講的是ESP8266wifi模塊是怎么控制設(shè)備。
下面結(jié)合實例講一下esp8266wifi模塊通過MCU來控制設(shè)備。
創(chuàng)建數(shù)據(jù)點就不介紹了,和SOC方案一樣。
主要區(qū)別是這里。
我們選擇獨立MCU方案的103。
在這里可以生成工程源碼。
我們再看看MCU方案的的整體原理。
這個體系包含設(shè)備、APP、M2M服務(wù)、業(yè)務(wù)服務(wù)、以及云對接等各種環(huán)節(jié)。
這是下載的源碼。
板子回來了。
其實生成的MCU代碼只是一個框架,沒有加任何外設(shè)功能,需要我們根據(jù)協(xié)議來執(zhí)行不同的功能。
這是相關(guān)協(xié)議文件的介紹。
程序?qū)崿F(xiàn)原理
協(xié)議實現(xiàn)機制:
協(xié)議解析后,將P0數(shù)據(jù)區(qū)的有效數(shù)據(jù)點生成對應(yīng)的數(shù)據(jù)點事件,再按事件處理數(shù)據(jù)點。
數(shù)據(jù)點轉(zhuǎn)換事件的說明:
根據(jù)協(xié)議P0數(shù)據(jù)區(qū)的attr_flags位判斷出有效數(shù)據(jù)點,并將其轉(zhuǎn)化成對應(yīng)的數(shù)據(jù)點事件,然后在事件處理函數(shù)中(gizwitsEventProcess)完成事件的處理。
其實上面介紹的云平臺的API接口就是設(shè)備MCU和wifi模塊之間的一個橋梁,我們就是通過這個橋梁并根據(jù)代碼框架來實現(xiàn)開發(fā),在這基礎(chǔ)之上去實現(xiàn)不同的功能,需要我們在串口接受函數(shù)里實現(xiàn)不同的功能。
上面是程序的簡單介紹,后續(xù)詳細(xì)分析,下面我們來看一下GAgent固件。
GAgent是運行在各種通訊模組上的一款應(yīng)用程序(固件),可以提供上層應(yīng)用(手機APP等控制端、云端)到產(chǎn)品設(shè)備的雙向數(shù)據(jù)通訊,此外,還提供對設(shè)備的配置入網(wǎng)、發(fā)現(xiàn)綁定、程序升級等功能。
產(chǎn)品開發(fā)者使用GAgent后,只需要關(guān)心產(chǎn)品的業(yè)務(wù)邏輯開發(fā),不用關(guān)心數(shù)據(jù)的通訊功能開發(fā),大大降低了開發(fā)的難度。該固件遵循以下協(xié)議《機智云平臺標(biāo)準(zhǔn)接入?yún)f(xié)議之MCU與WiFi模組通訊》、《機智云平臺標(biāo)準(zhǔn)接入?yún)f(xié)議之設(shè)備與云端通訊》、《機智云平臺標(biāo)準(zhǔn)接入?yún)f(xié)議之App與設(shè)備通訊》。
目前機智云提供由機智云移植的WiFi模組對應(yīng)固件有:漢楓 LPB100/ LPB120/ LPT120/ LPT220、樂鑫8266、高通4004 、RealTek 8711AM 、聯(lián)盛德 TLN13SP01、銳凌微 TinyCon3350-M26、慶科3162等;GPRS模組對應(yīng)固件有:廣和通G510等。
看看整個配置流程。
這是怎們綁定設(shè)備的,最關(guān)鍵的。
我們了解了上面的功能后進行平臺移植。
開發(fā)者在移植前要確保被移植平臺的硬件參數(shù)滿足以下的要求:
A. 平臺支持兩個串口接口(至少一個),一個負(fù)責(zé)與wifi模組間的數(shù)據(jù)收發(fā)(必須),一個用于調(diào)試信息打印(可復(fù)用數(shù)據(jù)收發(fā)串口)。
B.平臺支持定時器功能(1ms精確定時)。
C.平臺支持至少2K的RAM空間(可調(diào)整環(huán)形緩沖區(qū)大小來解決此問題,但易導(dǎo)致數(shù)據(jù)協(xié)議的處理異常)。
注:環(huán)形緩沖區(qū)修改位置: Gizwits\gizwits_protocol.h
原代碼中MAX_PACKAGE_LEN = 950,即環(huán)形緩沖區(qū)所占RAM空間大小為950*2 = 1900 字節(jié),開發(fā)者可以此來調(diào)整程序所占RAM空間的大小。
上面的基本原理了解后,我們來建立微信智能寵物屋,就是RGB控制,紅外對射,電機控制 ,溫濕度上傳。
第一步
下載gagent固件到wifi模塊。
下載好的燒錄到ESP8266即可,這里不做詳細(xì)介紹。
第二步
建立數(shù)據(jù)點生成STM32工程。
如何生成工程在91樓,需要添加相關(guān)驅(qū)動文件。
第三步
添加驅(qū)動文件并下載程序帶MCU。
并添加好文件和編譯路徑。
編譯沒有問題。
第四步
下載機智云的APP。
登陸賬號并綁定設(shè)備就可以開啟智能控制了。
看看是怎么控制的。
RGB顏色控制,電機,紅外對射,溫濕度上傳都可以實現(xiàn)。
這是視頻鏈接鏈接: https://pan.baidu.com/s/1o8VGFQ6 密碼: 4b4c
現(xiàn)在我們講一下具體怎么移植工程。
把下載的驅(qū)動文件復(fù)制到工程中去。
添加文件。
在MCU_STM32F103C8x_source\User\main.c 文件中添加各驅(qū)動庫的頭文件
然后我們在添加傳感器驅(qū)動的初始化文件和頭文件。
具體不再講解了。
下面我們簡單說一下數(shù)據(jù)結(jié)構(gòu):
在這里用到了環(huán)形隊列。
隊列:一種特殊的線性表,包含隊列頭、隊列尾,只允許在隊列頭進行刪除操作,在隊列尾進行刪除操作可以分為順序隊列和環(huán)形隊列。
順序隊列: 在內(nèi)存中是一段連續(xù)的存儲空間,并有隊列頭指針和隊列尾指針,打個比喻吧: 順序隊列就像在排隊買車票,排在最前面(第一個人)的就是隊頭,排在最后的就是隊尾,第一個買完票,離開(FIFO,先進先出,先排隊的先走),第二個人變成了隊頭,整體隊列前進,每走一個人,整個隊列都要前進,可見整體性能不會多么的好。
環(huán)形隊列: 可以將隊列空間想象成一個環(huán)形空間,這能使隊列空間重復(fù)使用:無論插入還是刪除,front(隊頭)指針增1或front(隊尾)指針加1時超出所分配的空間,就讓它指向這片連續(xù)空間的起始地址FIFO(先進先出)取元素時先從隊列頭開始,取完后,下一個元素就成了隊列頭,依次循環(huán)只有一個元素時,既是隊列頭,也是隊列尾。
這個就是對串口接受數(shù)據(jù)的處理。