曹雪峰,傅冬穎,蔡永華,尚宇輝,朱會卿
(河北民族師范學院 數(shù)學與計算機科學學院,河北 承德 067000)
將萬維網(wǎng)技術與物聯(lián)網(wǎng)技術相結合的物品萬維網(wǎng)技術是物聯(lián)網(wǎng)的一種實現(xiàn)模式[1-5]。利用Web的設計理念和技術,搭建基于不同通信方式的異構網(wǎng)絡和分布式網(wǎng)關的泛在應用開發(fā)環(huán)境,把物聯(lián)網(wǎng)網(wǎng)絡環(huán)境中的設備抽象為資源和服務,并釆用RESTful框架發(fā)布這些資源和服務,讓用戶能夠通過瀏覽器直接訪問到對應的傳感器節(jié)點,獲取或訂閱該節(jié)點所感知的數(shù)據(jù),并對節(jié)點進行遠程控制。這將大幅度降低物聯(lián)網(wǎng)應用的開發(fā)難度,提升物聯(lián)網(wǎng)應用創(chuàng)新的可能性,而采用CoAP實現(xiàn)基于RESTful的Web服務機制是目前常用的一種方法[6-7]。受限制的應用協(xié)議(constrained application protocol,CoAP)是專門為資源受限設備和網(wǎng)絡優(yōu)化設計的網(wǎng)絡協(xié)議。它采用REST(representa-tional state transfer)風格架構,將網(wǎng)絡上的所有對象抽象為資源,每個資源對應一個唯一的統(tǒng)一資源標識符(universal resource identifier,URI),通過URI可以對資源進行無狀態(tài)操作,包括GET、PUT、POST和DELETE等。CoAP并不是HTTP的壓縮協(xié)議。CoAP一方面實現(xiàn)了HTTP的一部分功能子集,并為資源受限環(huán)境進行了重新設計;另一方面提供了內(nèi)置資源發(fā)現(xiàn)、多播支持、異步消息交換等功能。
Contiki是一個開源操作系統(tǒng)[8-11],可以在其官方網(wǎng)站上下載到全套的源代碼,目前最新版本為Contiki3.0。Contiki操作系統(tǒng)支持CoAP協(xié)議。Cooja是Contiki操作系統(tǒng)下的無線傳感器網(wǎng)絡仿真工具,在Cooja中可以采用目前流行的多種傳感器構成的不同傳感器網(wǎng)絡,分析無線傳感器網(wǎng)絡不同層的協(xié)議。
CoAP報文格式如圖1所示[12-16]。
圖1 CoAP報文格式
Ver:2 bit,說明CoAP的版本號,固定值為“1”;
T:2 bit,說明CoAP的報文類型,CoAP定義了四種類型報文:
Confirmable(CON):需要被確認的報文,值為“00”;
Non-Confirmable(NON):不需要被確認的報文,值為“01”;
Acknowledgement(ACK):應答報文,值為“10”;
Rest(RST):復位報文,值為“11”;
TKL:4 bit,說明標簽字段的長度,單位為字節(jié)。其值為0時表示省略標簽字段;
Code:1字節(jié),說明CoAP的請求方法或響應狀態(tài)。該字段分成高3位和低5位兩部分,用十進制數(shù)表示成x.xx的形式。CoAP定義了四種請求方法和四種響應報文:
Code=0.00,表示空報文;
Code=0.01,表示GET方法;
Code=0.02,表示POST方法;
Code=0.03,表示PUT方法;
Code=0.04,表示DELETE方法;
Code=2.xx,表示正確響應;
Code=4.xx,表示客戶端錯誤響應;
Code=2.xx,表示服務器端錯誤響應。
Message ID:2字節(jié),說明CoAP報文的序號,用于重復性檢查,實現(xiàn)可靠傳輸。一對CoAP請求和響應的Message ID值必須相同;
Token:長度可變,是另一種形式的CoAP報文序號,在獨立式響應中起著重要作用;
Options:長度可變,可以沒有或有多個選項,具體包括如下內(nèi)容:
Option Delta:4 bit,Option的增值,相當于順序編號,當前的Option的具體編號等于之前所有Option Delta的總和。它的值可以為0-12,或者13,14。當為13或者14時,需要增加一個Option Delta (extend)字段,此字段長度為0-2字節(jié);
Option Length:4 bit,Option的長度,表示Value的具體長度,它的值可以為0-12,或者13,14。當為13或者14時,需要增加一個Option Length (extend)字段,此字段長度為0-2字節(jié);
Option Value:0或多個字節(jié),表示Option具體內(nèi)容。
CoAP的所有選項都采用編號的方式定義,每個選項字段有4個屬性:C(Critical)、U(Unsafe)、N(NoCacheKey)和R(Repeatable),前三個屬性值是編號的組成部分。常見的選項包括Uri相關選項、Content-Format選項、Accept、Etag、Block1和Block2選項等內(nèi)容;
0xFF:CoAP首部與負載之間的分隔符;
Payload:是和具體應用相關的內(nèi)容,包括多種不同格式的媒體。
雖然CoAP協(xié)議是基于運輸層不可靠的UDP協(xié)議實現(xiàn)的,但是它利用可靠傳輸機制提供了可靠傳輸?shù)恼埱?響應工作模式。
(1)捎帶式響應(piggybacked response)。
是指發(fā)送方的請求報文采用CON類型的報文,如果接收方能立即做出響應,響應數(shù)據(jù)就包含在ACK類型的確認報文中。
(2)獨立式響應(separate response)。
是指發(fā)送方的請求報文采用CON類型的報文,但是接收方因某種原因不能立即做出響應,因此在接收方返回的ACK類型的確認報文中并不包含響應數(shù)據(jù)。當接收方準備好該請求的響應數(shù)據(jù)后,會向發(fā)送方發(fā)送一個包含響應數(shù)據(jù)的CON類型報文,該報文需要得到發(fā)送方的確認。
如果發(fā)送方的報文不需要確認,可以采用非可靠傳輸?shù)姆谴_認模式(non-confirmable response)來實現(xiàn)。在非確認模式中發(fā)送方采用NON類型報文發(fā)送請求,接收方收到此報文后,同樣放回NON類型的響應報文。
CoAP使用URI標識一個資源,然后通過GET、POST、PUT和DELETE方法來操作這些資源。URI的格式如下:
coap-URI="coap:" "http://" host [":" port] path-abempty ["?" query]
其中,host為資源所在主機,不能為空,可以使IP地址或域名;port為服務器監(jiān)聽端口,coap默認為5683,coaps為5684;path為指定資源在主機上的路徑;query用于參數(shù)化資源。
另外,CoAP協(xié)議規(guī)定通過訪問/.well-known/core,可以查看傳感器節(jié)點提供的所有資源,這些資源以層次結構組織起來,用戶可以對資源進行進一步的操作。
在Cooja中按圖2搭建無線傳感器網(wǎng)絡。
其中節(jié)點1為無線傳感器網(wǎng)絡的網(wǎng)關,其上運行程序border-router.c。其他節(jié)點上都運行CoAP服務器程序er-example-server.c。
為了能夠通過互聯(lián)網(wǎng)上的遠程用戶終端訪問傳感器節(jié)點,需要將鏈路本地地址映射為IPv6的全球單播地址,這一工作由網(wǎng)關完成。首先通過Cooja的菜單項“tools->serial socket->sky1”打開網(wǎng)關節(jié)點的偵聽端口60001。然后打開新的ubuntu終端窗口,改變目錄到contiki/examples/er-rest-example,執(zhí)行如下命令,完成地址映射。
make connect-router-cooja
為了生成用于wireshark進行協(xié)議分析的報文跟蹤記錄文件,選擇Cooja的菜單項“tools/radio messages”打開radio messages對話框,在radio messages對話框中選擇“analyzer/6LoWPAN Analyzer with PCAP”菜單項,在仿真過程中的報文跟蹤記錄文件保存在Contiki操作系統(tǒng)的tools/cooja/build文件夾中,文件擴展名是.pcap。
然后選擇cooja的“simulation->start simulation”菜單項啟動仿真過程。
在安裝了copper插件的火狐瀏覽器中連接無線傳感器網(wǎng)絡中地址為aaaa::212:7402:2:202的節(jié)點2,單擊“discover”按鈕后,就會在瀏覽器“discovering”區(qū)域列出在其上已激活的資源。
選中“test/hello”,然后單擊瀏覽器上“GET”按鈕,可以看到節(jié)點2返回的“Hello World!”消息。對此過程捕獲的COAP報文如圖3所示。
圖中370號報文是客戶端發(fā)送的GET請求報文,是需要被確認的報文,省略了標簽字段,報文序號為16637;它有3個選項字段,前兩個選項字段的編號為11,是Uri-Path選項,指示資源在服務器中的位置,值分別為“test”和“hello”;第三個選項字段的編號為23(12+11),是Block2塊傳輸選項,因為是Block2,所以使用的是塊傳輸?shù)目刂菩杂梅?,希望響應的塊序號是“0”,塊大小是64字節(jié)。
圖3 GET的請求報文
圖4中的373號報文是CoAP服務器返回的GET響應報文,是應答報文,省略標簽字段,響應代碼為“2.05 content”,報文序號為16637,與請求報文一致。它有3個選項字段,第一個選項字段的編號為4,是ETag選項,作為資源本地標識符,用來區(qū)分同一資源在不同時間的變化,值為“0C”;第二個選項字段的編號為12(8+4),是Content-Format選項,指明CoAP負載的媒體類型,值為“text/plain;charset=utf-8”,也就是說負載的媒體類型為文本或二進制類型,采用utf-8編碼;第三個選項字段的編號為23,是Block2塊傳輸選項,因為是Block2,所以使用的是塊傳輸?shù)拿枋鲂杂梅?,表示當前報文的負載在資源描述中的塊序號是“0”,塊大小是32字節(jié),負載內(nèi)容是“Hello World!”。
通過瀏覽器上的“POST”按鈕就可遠程控制傳感器節(jié)點上的紅色Led燈。選中“actuators/toggle”,然后單擊瀏覽器上“POST”按鈕就可控制節(jié)點2上的紅色Led燈亮。該過程捕獲的COAP報文如圖5所示。
圖5 POST的請求報文
圖中345號報文是客戶端發(fā)送的POST請求報文,是需要被確認的報文,省略了標簽字段,報文序號為34004,它有2個選項字段,編號都為11,是Uri-Path選項,指示資源在服務器中的位置,值分別為“actuators”和“toggle”;負載字段的值為“mode=“on””。
圖6中346號報文是CoAP服務器返回的POST響應報文,是應答報文,省略了標簽字段,響應代碼為“2.05 content”,報文序號為34004,與請求報文一致。
圖6 POST的響應報文
如果把POST請求報文中負載字段內(nèi)容改為“mode=“off””,重復前面的操作,會看到節(jié)點2上的紅色Led燈熄滅。
在Contiki無線傳感器網(wǎng)絡操作系統(tǒng)的支持下,利用Cooja構建了由路由網(wǎng)關節(jié)點和COAP Server節(jié)點組成的無線傳感器網(wǎng)絡,用火狐瀏覽器訪問傳感器節(jié)點,查看傳感器節(jié)點上的資源,并對傳感器節(jié)點進行實時控制,實現(xiàn)了全IP物聯(lián)網(wǎng)網(wǎng)絡融合目標。利用Wireshark對捕獲報文進行分析,說明了CoAP協(xié)議的工作過程,驗證了CoAP協(xié)議的工作原理。