如果你不能理解上面這一段話,就記住,物聯(lián)平臺通過路由器1的互聯(lián)網(wǎng)IP主動發(fā)一條消息到設(shè)備是不能成功的,但是,當設(shè)備發(fā)一條消息給物聯(lián)平臺后,物聯(lián)平臺直接響應(yīng)該數(shù)據(jù)包(IP源地址和目標地址調(diào)換位置)是可以觸達設(shè)備的。如果是滿足一問一答的方式,那么服務(wù)器不需要記錄這個路由信息,如果需要滿足服務(wù)器主動發(fā)消息給設(shè)備的場景,那么服務(wù)器是需要記錄這個信息的。
另外,我們知道,網(wǎng)絡(luò)設(shè)備在物理上表現(xiàn)為一個真實的網(wǎng)卡,網(wǎng)卡的MAC地址是6個字節(jié),48位。在一個局域網(wǎng)內(nèi)通信,網(wǎng)絡(luò)編程時都是基于IP地址的,路由器或者交換機如何通過IP地址找到對應(yīng)的MAC地址,即為ARP地址解析協(xié)議,這個也是網(wǎng)絡(luò)層的職責,但是作為開發(fā)人員來說,我們了解即可。
3. 傳輸層,即TCP/UDP協(xié)議。對于傳輸層,我們需要理解的是,一臺PC或者手機上運行的網(wǎng)絡(luò)運用可能很多,但是他們都對應(yīng)同樣一個IP。操作系統(tǒng)如何將一個數(shù)據(jù)包分發(fā)給對應(yīng)的網(wǎng)絡(luò)運用呢?這就依靠傳輸層所定義的端口來區(qū)分。常見的網(wǎng)絡(luò)應(yīng)用層協(xié)議都會默認傳輸層端口號,如FTP對應(yīng)21,HTTP對應(yīng)80,SMTP對應(yīng)25等等。傳輸層除了定義端口號之外,還有兩個非常重要的協(xié)議,即TCP面向連接的協(xié)議和UDP數(shù)據(jù)包協(xié)議。前者可以理解為一個虛擬的電話連接協(xié)議,一旦雙方打電話建立起連接后雙方通話的過程中,所有的數(shù)據(jù)包均是走同樣的路由路徑。因為面向連接的協(xié)議會在帶寬中預(yù)留資源來保障,所以面向連接協(xié)議能夠保證質(zhì)量,因此適用于一些對數(shù)據(jù)質(zhì)量要求嚴格的網(wǎng)絡(luò)運用中,如電子郵件應(yīng)用,如果不保證質(zhì)量,郵件內(nèi)容都不保證正確,誰會使用這個郵件系統(tǒng)呢?但是,對于一些音頻視頻類運用,丟一兩幀完全不影響用戶體驗,則會使用UDP協(xié)議,其不是面向連接,發(fā)完后之前的路由信息可以不在保存,其是使用最大努力交付(即trymy best)。
4. 應(yīng)用層。常見的網(wǎng)絡(luò)應(yīng)用協(xié)議包括HTTP、FTP、SMTP、POP等等。嵌入式物聯(lián)應(yīng)用是建立在這些網(wǎng)絡(luò)應(yīng)用協(xié)議的基礎(chǔ)之上的。這些協(xié)議會規(guī)范基本的請求連接、響應(yīng)和數(shù)據(jù)傳輸?shù)确矫娴母袷?。作為嵌入式物?lián)網(wǎng)應(yīng)用來說,其應(yīng)該自行定義應(yīng)用協(xié)議的格式,這些數(shù)據(jù)格式可以簡單自定義,也可以使用成熟的標準格式,如HTML、XML、JSON等等。由于防火墻一般只放開端口為80的HTTP數(shù)據(jù)包,所以物聯(lián)網(wǎng)應(yīng)用一般都會構(gòu)建在HTTP的基礎(chǔ)上。
所以,我們要區(qū)分網(wǎng)絡(luò)應(yīng)用層協(xié)議HTTP和應(yīng)用自定義協(xié)議。后者使用前者進行傳輸通信。不管應(yīng)用自定義協(xié)議使用哪一種格式,都需要通信雙方同時使用。物聯(lián)設(shè)備和物聯(lián)平臺后臺通信時,可以使用簡單的XML格式或者JSON格式,而物聯(lián)平臺還要被PC瀏覽器訪問,那么,由于瀏覽器只支持HTML格式,則要求物聯(lián)平臺后臺提供HTML格式的內(nèi)容服務(wù),同理,物聯(lián)網(wǎng)平臺和手機APP之間的通信可以用XML或者JSON。甚至,我們可以自定義簡單的命令來實現(xiàn)功能,但是使用XML或者JSON這些格式有助于數(shù)據(jù)有良好的可讀性,而且也有成熟的類庫來解釋。
這些都是建立在HTTP網(wǎng)絡(luò)應(yīng)用協(xié)議的基礎(chǔ)上的。
二、 socket編程
socket編程分為TCP和UDP兩種方式。分別如下:

可見,TCP/UDP的socket套接字在通信之前需要綁定(bind)IP和端口地址。對于TCP來說,服務(wù)器需要先偵聽listen,而客戶端發(fā)起connect請求后,服務(wù)器才能accept,之后即建立面向連接的通信環(huán)境,通過send/recv函數(shù)進行通信。
而UDP編程則很簡單,綁定之后可以立即開始數(shù)據(jù)傳輸。
除了掌握基本的socket編程之外,還需要清楚以下知識:
1)阻塞和非阻塞。網(wǎng)絡(luò)套接字有阻塞和非阻塞之分。如假設(shè)創(chuàng)建的socket是阻塞的,那么其recv函數(shù)就一定要等到對方傳送數(shù)據(jù)過來,才會返回,否則會一直處于阻塞狀態(tài)。而非阻塞狀態(tài)則是立即看看緩沖有沒有數(shù)據(jù),如果有就返回數(shù)據(jù),沒有會返回錯誤,而不是一直死等。阻塞模式可以簡單地理解為同步工作模式,而非阻塞模式可以理解為異步工作模式。
2)多路復(fù)用。作為服務(wù)器,可能會存在多個客戶端連接,如果輪詢每個客戶端socket有沒有數(shù)據(jù),那效率多累啊。Socket編程的select和poll接口用來解決這類多路IO復(fù)用的問題,它能夠同時偵測多個連接的數(shù)據(jù)通信。