物聯網網絡編程和web編程

本文是基於嵌入式物聯網研發project師的視覺對網絡編程和web編程進行闡述。javascript

對於專一J2EE後端服務開發的同窗來講,這篇文章可能略微簡單。但是網絡編程和web編程對於絕大部分嵌入式物聯網project師來講是一塊真空鄰域。前端

的確。物聯網研發應該以團隊協做分工的方式進行,因此有嵌入式設備端、網關、web前端、APP、後端開發等專屬崗位。做爲系統架構師。天然需要掌握各類崗位的關鍵技術。java

做爲嵌入式project師。掌握網絡編程、web編程。能極大地擴展本身的視野和構架思惟,能夠主動地對系統的各類協議和應用場景提出優化的看法,而不不過接受任務攤派,至少,能夠在不需要依賴後端project師的狀況。能夠高速搭建一個物聯網demo系統。mysql

所以。掌握一些主要的網絡編程、web編程技能,對於提高物聯網研發project師的開發能力是很重要的。web


1、OSI七層模型和TCP/IP四層模型ajax

OSI七層模型是網絡協議的理論研究模型,或者可以稱之爲理想的模型,而TCP/IP四層模型纔是事實標準,是已經被普遍使用的模型。二者之間的關聯圖例如如下:sql



衡量一個物聯網平臺或者協議是否有用的關鍵技術的因素是它提供的消息觸達能力,直接影響物聯網應用開發。數據庫

因此,咱們從消息觸達能力去分析TCP/IP這個事實標準模型。咱們設想下面場景,並分析。apache

         


1.網絡接口層。路由器1和wifi音箱、空調、熱水器組成一個家庭局域網,其使用wifi(802.11)協議進行通訊。該協議定義了物理信號、數據幀格式、丟包重發機制、流量控制等等。編程

這些都是網絡接口層的任務。還有。多個設備共享信道,同一時候發數據會產生衝突。它是怎麼解決的。這也是網絡接口層的內容。事實上,物聯網project師沒必要在乎這些內容。因爲wifi物理信號方面的內容是由wifi芯片廠商負責,而wifi單芯片(wifi+SOC)則會提供SDK包並提供SOCKET編程接口了。因此,咱們職責的重點是關注網絡層以上的編程開發知識。

2.網絡層。即IP協議。最基礎的認識是每個IP相應一個物聯設備、手機或者一個後方server。

原則上一個網卡相應一個IP,如圖中wifi音箱、wifi熱水器均有一個獨立的IP。網絡之間的通訊都是基於IP進行的,網絡包會經過路由器終於送到目標IP所相應的設備上。

Wifi音箱等家庭設備增長家庭局域網。事實上是各得到一個局域網IP。192.168.*.*,包含路由器1也有一個局域網地址。但是路由器1另外一個互聯網IP。僅僅有路由器的互聯網IP才幹被外界所獲知。外界是不能主動獲知局域網IP詳細相應哪一個設備的。僅僅有路由器1才知道,所以所有對外發送的數據包的源IP都是路由器1的互聯網IP,外界發送給設備的數據包的目標IP也是路由器的互聯網IP。

咱們都知道,設備上線時需要向物聯平臺server告知本身的狀態,以便於用戶控制。

所以物聯平臺server的IP必須是一個互聯網IP。或者是一個域名(DNS協議可以將域名解析爲IP)。假設它是一個局域網IP。那設備是不可能訪問到的。

這裏,咱們還必須要記住一點,設備和物聯平臺的第一次通訊永遠都應該設備主動發出。因爲就算物聯平臺知道路由器1的公網IP,它也沒法將消息傳送到內部的設備的。另外,server必須要持續設備到達物聯平臺最後一跳的路由信息,因爲路由信息原路返回的過程當中具備路由器1記錄是哪一個設備發出的信息。假設不記錄這個信息,物聯平臺單靠路由器1的互聯網IP是沒法觸達到詳細設備的。

假設你不能理解上面這一段話,就記住,物聯平臺經過路由器1的互聯網IP主動發一條消息到設備是不能成功的,但是。當設備發一條消息給物聯平臺後。物聯平臺直接響應該數據包(IP源地址和目標地址調換位置)是可以觸達設備的。假設是知足一問一答的方式,那麼server不需要記錄這個路由信息,假設需要知足server主動發消息給設備的場景。那麼server是需要記錄這個信息的。

另外。咱們知道。網絡設備在物理上表現爲一個真實的網卡。網卡的MAC地址是6個字節。48位。在一個局域網內通訊,網絡編程時都是基於IP地址的,路由器或者交換機怎樣經過IP地址找到相應的MAC地址。即爲ARP地址解析協議。這個也是網絡層的職責,但是做爲開發者來講。咱們瞭解就能夠。

3. 傳輸層。即TCP/UDP協議。

對於傳輸層,咱們需要理解的是。一臺PC或者手機上執行的網絡運用可能很是多,但是他們都相應相同一個IP。操做系統怎樣將一個數據包分發給相應的網絡運用呢?這就依靠傳輸層所定義的port來區分。常見的網絡應用層協議都會默認傳輸層port號,如FTP相應21,HTTP相應80。SMTP相應25等等。傳輸層除了定義port號以外,還有兩個很是重要的協議,即TCP面向鏈接的協議和UDP數據包協議。前者可以理解爲一個虛擬的電話鏈接協議,一旦兩方打電話創建起鏈接後兩方通話的過程當中,所有的數據包均是走相同的路由路徑。

因爲面向鏈接的協議會在帶寬中預留資源來保障。因此面向鏈接協議可以保證質量,所以適用於一些對數據質量要求嚴格的網絡運用中,如電子郵件應用,假設不保證質量,郵件內容都不保證正確,誰會使用這個郵件系統呢?但是,對於一些音頻視頻類運用,丟一兩幀全然不影響用戶體驗,則會使用UDP協議,其不是面向鏈接。發完後以前的路由信息可以不在保存,其是使用最大努力交付(即trymy best)。

4. 應用層。常見的網絡應用協議包含HTTP、FTP、SMTP、POP等等。

嵌入式物聯應用是創建在這些網絡應用協議的基礎之上的。

這些協議會規範主要的請求鏈接、響應和傳輸數據等方面的格式。做爲嵌入式物聯網應用來講,其應該自行定義應用協議的格式,這些數據格式可以簡單本身定義,也可以使用成熟的標準格式,如HTML、XML、JSON等等。由於防火牆通常僅僅放開port爲80的HTTP數據包,因此物聯網應用通常都會構建在HTTP的基礎上。

因此,咱們要區分網絡應用層協議HTTP和應用本身定義協議。後者使用前者進行傳輸通訊。不管應用本身定義協議使用哪種格式。都需要通訊兩方同一時候使用。

物聯設備和物聯平臺後臺通訊時,可以使用簡單的XML格式或者JSON格式。而物聯平臺還要被PC瀏覽器訪問,那麼。由於瀏覽器僅僅支持HTML格式。則要求物聯平臺後臺提供HTML格式的內容服務,同理,物聯網平臺和手機APP之間的通訊可以用XML或者JSON。

甚至,咱們可以本身定義簡單的命令來實現功能。但是使用XML或者JSON這些格式有助於數據有良好的可讀性,而且也有成熟的類庫來解釋。

這些都是創建在HTTP網絡應用協議的基礎上的。


2、socket編程

socket編程分爲TCP和UDP兩種方式。分別例如如下:


可見,TCP/UDP的socket套接字在通訊以前需要綁定(bind)IP和port地址。對於TCP來講,server需要先偵聽listen,而client發起connect請求後,server才幹accept,以後即創建面向鏈接的通訊環境。經過send/recv函數進行通訊。

而UDP編程則很是easy,綁定以後可以立刻開始傳輸數據。

除了掌握主要的socket編程以外,還需要清楚下面知識:

1)堵塞和非堵塞。網絡套接字有堵塞和非堵塞之分。如若是建立的socket是堵塞的,那麼其recv函數就必定要等到對方傳送數據過來,纔會返回,不然會一直處於堵塞狀態。而非堵塞狀態則是立刻看看緩衝有沒有數據,若是有就返回數據,沒有會返回錯誤,而不是一直死等。堵塞模式可以簡單地理解爲同步工做模式,而非堵塞模式可以理解爲異步工做模式。

2)多路複用。做爲server,可能會存在多個client鏈接。假設輪詢每個clientsocket有沒有數據,那效率多累啊。

Socket編程的select和poll接口用來解決這類多路IO複用的問題,它能夠同一時候偵測多個鏈接的數據通訊。


3、B/S和C/S

1.B/S是瀏覽器和client模式,使用HTML語法格式。其使用一問一答,即server是無狀態的,它不知道client以前是否已經訪問過。無狀態有助於server高效率而且穩定地服務。但是這樣的模式對於物聯網應用的影響是致命的。因爲server沒法主動地發送消息給物聯設備。

那麼,怎樣改進呢?

1)ajax技術。Ajax技術最新是爲了解決頁面局部刷新頻繁的效率問題的。

即一個HTML頁面的局部數據發送變化了。在ajax以前需要又一次發送一次請求,來刷新整個頁面。而ajax則是隻向server請求發送變化的數據。前者在請求時會看到頁面有閃爍,然後者則沒有。咱們正好可以利用ajax來定時向server發起請求,詢問server是否有更新的數據。假設詢問頻率高。那麼實時效果就好,但是會加劇server負擔。本質上,仍是一問一答的形式,而不是雙向通訊。Ajax需要瀏覽器技術支持。

2)websocket技術。Websocket是爲了解決HTML的雙向通訊問題而提出的,其在第一條HTTP請求以後會讓server將興許的協議更新到Websocket進行通訊。

Websocket需要tomcat7.0以上的執行容器技術支持。

物聯網應用開發在設備端可以經過socket編程來模擬HTTP協議,相同可以模擬HTTP之上的HTML、XML或者Websocket。

2. C/S

C/Sclient和server編程在智能機出現以前在PC桌面領域一度被以爲會在逐漸被B/S所代替。但是在智能機設備端它又煥發新生。雖然HTML5發展迅速。但是我的以爲瀏覽器在手機等智能設備端的體驗仍是比不上原生APP。而HTML5更大的優點是其移植性很是強。

C/S編程可以直接使用socket通訊進行通訊,那天然不存在兩方通訊的問題。假設C/S編程使用http類庫進行編程通訊。它相同也會存在雙向通訊的問題。

眼下看來,很是多人都但願沿用J2EE那套業務架構來支持物聯網,但是物聯設備畢竟是資源有限,有些終端多是簡單的單片機,其跑完整的TCP/UDP協議都比較困難,所以有人提出了精簡版的TCP/IP協議。如CoAP(受限制的應用協議(ConstrainedApplicationProtocol)的代名詞)、ucIP、LWIP等等。

從業務應用協議來看,IBM研發的MQTT可能會成爲物聯網應用協議的標準。


4、 Web編程

Web編程最早指的是瀏覽器展現內容的語法編程。Web靜態語言便是HTML。

1.HTML不支持數據的動態變化。所以產生了基於解釋引擎的動態語言,如ASP、PHP、JSP等等。這類語言會使用HTML/CSS來描寫敘述展示樣式,而使用動態語言來控制數據的展示,好比訪問數據庫獲取新數據等等。

需要知道,ASP,PHP。JSP這些語言是server編程語言,當用戶經過瀏覽器訪問server相應網頁時,該網頁的ASP/PHP/JSP等內容會通過server的解釋引擎轉化爲詳細的數據,終於和其它的HTML、CSS數據一塊兒返回給瀏覽器進行展示。所以。瀏覽器獲得的永遠都是肯定的HTML、CSS和數據,不存在ASP/PHP/JSP的語句。

2.javascript腳本。

腳本是瀏覽器技術支持的語法。而不是server技術支持的。好比一個登陸界面。要確保用戶輸入的正確性,如不規則字符,長度太長等等,一般會使用javascript腳本進行檢測,而不需要發送請求給server。上述講到的ajax技術也是瀏覽器支持的腳本技術。

3.jQuery。它是對javascript技術的封裝,能夠更好地進行前端編程控制。

4.HTML/CSS/JS腳本,稱爲web前端編程開發,而ASP/JSP/PHP等爲後端開發。

5.後端開發天然會涉及到數據庫訪問、業務邏輯。並且其需要和前端進行交互。所以,web應用編程架構廣泛使用MVC編程模型,即M爲數據模型,負責數據庫訪問;V爲視圖,負責展示;C爲控制。MVC模型能夠對展示和數據庫進行良好的分離。有助於應用開發。

6.做爲整體執行架構來理解,server需要包含數據庫(如mysql)、web應用和解釋引擎和web服務(如apache和tomcat)。Apache提供http服務。

7.JSP的基礎是JAVA語法,J2EE架構提供servlet技術,用於支持網絡運用。JSP事實上是對servlet的高級封裝並做爲獨立的技術出現的,JSP側重支持B/S方面的網絡運用。而servlet則經過映射類的方式支持C/S方式的網絡運用,如微信藍牙接入和wifi接入的後端技術即便用servlet進行支持, 頂層使用XML/JSON格式。

相關文章
相關標籤/搜索