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