本文是基于嵌入式物聯(lián)網(wǎng)研發(fā)工程師的視覺對(duì)網(wǎng)絡(luò)編程和web編程進(jìn)行闡述。對(duì)于專注J2EE后端服務(wù)開發(fā)的童鞋們來說,這篇文章可能稍顯簡(jiǎn)單。但是網(wǎng)絡(luò)編程和web編程對(duì)于絕大部分嵌入式物聯(lián)網(wǎng)工程師來說是一塊真空領(lǐng)域。
的確,物聯(lián)網(wǎng)研發(fā)應(yīng)該以團(tuán)隊(duì)協(xié)作分工的方式進(jìn)行,所以有嵌入式設(shè)備端、網(wǎng)關(guān)、web前端、APP、后端開發(fā)等專屬崗位。作為系統(tǒng)架構(gòu)師,自然需要掌握各種崗位的關(guān)鍵技術(shù)。作為嵌入式工程師,掌握網(wǎng)絡(luò)編程、web編程,能夠極大地拓展自己的視野和架構(gòu)思維,能夠主動(dòng)地對(duì)系統(tǒng)的各種協(xié)議和應(yīng)用場(chǎng)景提出優(yōu)化的見解,而不僅僅是接受任務(wù)攤派。至少,能夠在不需要依賴后端工程師的情況,能夠快速搭建一個(gè)物聯(lián)網(wǎng)demo系統(tǒng)。因此,掌握一些基本的網(wǎng)絡(luò)編程、web編程技能,對(duì)于提升物聯(lián)網(wǎng)研發(fā)工程師的開發(fā)能力是非常重要的。
本文可以視為嵌入式企鵝圈發(fā)布微信Wifi 接入解決方案的首篇原創(chuàng)技術(shù)分享。微信Wifi接入方案系列技術(shù)分享將于2016年春節(jié)后陸續(xù)公開,敬請(qǐng)關(guān)注。本篇文章對(duì)物聯(lián)網(wǎng)涉及的知識(shí)進(jìn)行概述,之后的文章再進(jìn)行詳細(xì)的指導(dǎo)開發(fā)。
一、 OSI七層模型和TCP/IP四層模型
OSI七層模型是網(wǎng)絡(luò)協(xié)議的理論研究模型,或者可以稱為理想的模型,而TCP/IP四層模型才是事實(shí)標(biāo)準(zhǔn),是已經(jīng)被廣泛使用的模型。兩者之間的關(guān)聯(lián)圖示如下:

對(duì)于兩種模型的解讀,我想說的是作為開發(fā)人員不必強(qiáng)行去理解各層的含義,例如會(huì)話層負(fù)責(zé)什么,表示層負(fù)責(zé)什么。當(dāng)你在開發(fā)過程中沒有涉及到這些層次所解決的問題的時(shí)候,你想理解并記住是比較困難的。但是,當(dāng)你遇到問題并需要去解決的時(shí)候,這時(shí)你一定會(huì)對(duì)這些層次的職責(zé)非常清晰。
衡量一個(gè)物聯(lián)網(wǎng)平臺(tái)或者協(xié)議是否實(shí)用的非常關(guān)鍵的因素是它提供的消息觸達(dá)能力,其直接影響物聯(lián)網(wǎng)應(yīng)用開發(fā)。所以,我們從消息觸達(dá)能力去分析TCP/IP這個(gè)事實(shí)標(biāo)準(zhǔn)模型。我們?cè)O(shè)想以下場(chǎng)景,并進(jìn)行分析。

1.網(wǎng)絡(luò)接口層。路由器1和wifi音箱、空調(diào)、熱水器組成一個(gè)家庭局域網(wǎng),其使用wifi(802.11)協(xié)議進(jìn)行通信。該協(xié)議定義了物理信號(hào)、數(shù)據(jù)幀格式、丟包重發(fā)機(jī)制、流量控制等等。這些都是網(wǎng)絡(luò)接口層的任務(wù)。還有,多個(gè)設(shè)備共享信道,同時(shí)發(fā)數(shù)據(jù)會(huì)產(chǎn)生沖突,它是怎么解決的,這也是網(wǎng)絡(luò)接口層的內(nèi)容。其實(shí),物聯(lián)網(wǎng)工程師不必在意這些內(nèi)容。因?yàn)閣ifi物理信號(hào)方面的內(nèi)容是由wifi芯片廠商負(fù)責(zé),而wifi單芯片(wifi+SOC)則會(huì)提供SDK包并提供SOCKET編程接口了。所以,我們職責(zé)的重點(diǎn)是關(guān)注網(wǎng)絡(luò)層以上的編程開發(fā)知識(shí)。
2.網(wǎng)絡(luò)層,即IP協(xié)議,最基礎(chǔ)的認(rèn)識(shí)是每個(gè)IP對(duì)應(yīng)一個(gè)物聯(lián)設(shè)備、手機(jī)或者一個(gè)后方服務(wù)器。原則上一個(gè)網(wǎng)卡對(duì)應(yīng)一個(gè)IP,如圖中wifi音箱、wifi熱水器均有一個(gè)獨(dú)立的IP。網(wǎng)絡(luò)之間的通信都是基于IP進(jìn)行的,網(wǎng)絡(luò)包會(huì)通過路由器最終送到目標(biāo)IP所對(duì)應(yīng)的設(shè)備上。
Wifi音箱等家庭設(shè)備加入家庭局域網(wǎng),其實(shí)是各獲得一個(gè)局域網(wǎng)IP,192.168.*.*,包括路由器1也有一個(gè)局域網(wǎng)地址,但是路由器1還有一個(gè)互聯(lián)網(wǎng)IP。只有路由器的互聯(lián)網(wǎng)IP才能被外界所獲知,外界是不能主動(dòng)獲知局域網(wǎng)IP具體對(duì)應(yīng)哪個(gè)設(shè)備的,只有路由器1才知道,因此所有對(duì)外發(fā)送的數(shù)據(jù)包的源IP都是路由器1的互聯(lián)網(wǎng)IP,外界發(fā)送給設(shè)備的數(shù)據(jù)包的目標(biāo)IP也是路由器的互聯(lián)網(wǎng)IP。
我們都知道,設(shè)備上線時(shí)需要向物聯(lián)平臺(tái)服務(wù)器告知自己的狀態(tài),以便于用戶控制。因此物聯(lián)平臺(tái)服務(wù)器的IP必須是一個(gè)互聯(lián)網(wǎng)IP,或者是一個(gè)域名(DNS協(xié)議可以將域名解析為IP)。如果它是一個(gè)局域網(wǎng)IP,那設(shè)備是不可能訪問到的。
這里,我們還必須要記住一點(diǎn),設(shè)備和物聯(lián)平臺(tái)的第一次通信永遠(yuǎn)都應(yīng)該設(shè)備主動(dòng)發(fā)出,因?yàn)榫退阄锫?lián)平臺(tái)知道路由器1的公網(wǎng)IP,它也無法將消息傳送到內(nèi)部的設(shè)備的。另外,服務(wù)器必須要持續(xù)設(shè)備到達(dá)物聯(lián)平臺(tái)最后一跳的路由信息,因?yàn)槁酚尚畔⒃贩祷氐倪^程中具有路由器1記錄是哪個(gè)設(shè)備發(fā)出的信息。如果不記錄這個(gè)信息,物聯(lián)平臺(tái)單靠路由器1的互聯(lián)網(wǎng)IP是無法觸達(dá)到具體設(shè)備的。