<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于STM32平臺(tái)的CoAP Server方案

          基于STM32平臺(tái)的CoAP Server方案

          作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
          0.前言

          CoAP是受限制的應(yīng)用協(xié)議(Constrained Application Protocol)的代名詞。在當(dāng)前由PC機(jī)組成的世界,信息交換是通過TCP和應(yīng)用層協(xié)議HTTP實(shí)現(xiàn)的。但是對(duì)于小型設(shè)備而言,實(shí)現(xiàn)TCP和HTTP協(xié)議顯然是一個(gè)過分的要求。為了讓小設(shè)備可以接入互聯(lián)網(wǎng),CoAP協(xié)議被設(shè)計(jì)出來。CoAP是一種應(yīng)用層協(xié)議,它運(yùn)行于UDP協(xié)議之上而不是像HTTP那樣運(yùn)行于TCP之上。CoAP協(xié)議非常小巧,最小的數(shù)據(jù)包僅為4字節(jié)。
          本文將使用STM32平臺(tái)實(shí)現(xiàn)一個(gè)CoAP Server Demo。本文將詳細(xì)說明如何使用STM32這樣的低成本MCU實(shí)現(xiàn)CoAP Server的步驟,本文試圖說明CoAP協(xié)議雖然很“年輕”,但是有用、好用且易用。
          【代碼倉(cāng)庫(kù)】
          如果想獲得本文的示例代碼請(qǐng)點(diǎn)擊——【bitbucket】,示例代碼中的doc目錄有本文所使用開發(fā)板的原理圖和相關(guān)說明。
          【相關(guān)博文】
          物聯(lián)網(wǎng)學(xué)習(xí)筆記——索引博文】
          【CoAP學(xué)習(xí)筆記——nodeJS node-coap安裝和使用(windows平臺(tái))】

          本文引用地址:http://www.ex-cimer.com/article/201611/316106.htm

          1.使用LwIP處理CoAP數(shù)據(jù)包
          新建一個(gè)套接字,綁定UDP 5683端口,偵聽該端口數(shù)據(jù)使用microcoap響應(yīng)函數(shù)解析,最后獲得返回結(jié)果即可。示例中使用了RT Thread中移植好的LwIP協(xié)議棧,網(wǎng)卡驅(qū)動(dòng)為ENC28J60。

          1. voidcoap_server(void*para)
          2. {
          3. intfd;
          4. structsockaddr_inservaddr,cliaddr;
          5. coap_rw_buffer_tscratch_buf={scratch_raw,sizeof(scratch_raw)};
          6. if((fd=socket(AF_INET,SOCK_DGRAM,0))==-1)
          7. {
          8. printf("SocketErrorrn");
          9. return;
          10. }
          11. servaddr.sin_family=AF_INET;
          12. servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
          13. servaddr.sin_port=htons(PORT);
          14. rt_memset(&(servaddr.sin_zero),0,sizeof(servaddr.sin_zero));
          15. if((bind(fd,(structsockaddr*)&servaddr,sizeof(servaddr)))==-1)
          16. {
          17. printf("Binderrorrn");
          18. return;
          19. }
          20. endpoint_setup();
          21. rt_kprintf("CoapServerStart!rn");
          22. while(1)
          23. {
          24. intn,rc;
          25. socklen_tlen=sizeof(cliaddr);
          26. coap_packet_tpkt;
          27. n=recvfrom(fd,buf,sizeof(buf),0,(structsockaddr*)&cliaddr,&len);
          28. #ifdefMICROCOAP_DEBUG
          29. printf("rn--------------------rn");
          30. printf("ReceivedBuffer:rn");
          31. coap_dump(buf,n,true);
          32. printf("rn");
          33. #endif
          34. if(0!=(rc=coap_parse(&pkt,buf,n)))
          35. {
          36. printf("Badpacketrc=%drn",rc);
          37. }
          38. else
          39. {
          40. size_trsplen=sizeof(buf);
          41. coap_packet_trsppkt;
          42. #ifdefMICROCOAP_DEBUG
          43. printf("DumpPacket:rn");
          44. coap_dumpPacket(&pkt);
          45. #endif
          46. coap_handle_req(&scratch_buf,&pkt,&rsppkt);
          47. if(0!=(rc=coap_build(buf,&rsplen,&rsppkt)))
          48. {
          49. printf("coap_buildfailedrc=%dn",rc);
          50. }
          51. else
          52. {
          53. #ifdefMICROCOAP_DEBUG
          54. printf("--------------------rn");
          55. printf("SendingBuffer:rn");
          56. coap_dump(buf,rsplen,true);
          57. printf("rn");
          58. #endif
          59. #ifdefMICROCOAP_DEBUG
          60. coap_dumpPacket(&rsppkt);
          61. #endif
          62. sendto(fd,buf,rsplen,0,(structsockaddr*)&cliaddr,sizeof(cliaddr));
          63. }
          64. }
          65. }
          66. }


          代碼中使用了多個(gè)LwIP Socket部分的函數(shù),例如socket, bind, recvfrom, sendto等。
          其中coap_parse函數(shù)把從UDP獲得的payload轉(zhuǎn)化為符合CoAP規(guī)范的結(jié)構(gòu)體,coap_handle_req函數(shù)根據(jù)CoAP請(qǐng)求中的URI,調(diào)用響應(yīng)的處理函數(shù)。最后由coap_build函數(shù)把處理的結(jié)果系列化為UDP負(fù)載。

          2.終端描述
          所有的終端信息均保存在endpoints全局?jǐn)?shù)組中,該全局?jǐn)?shù)組位于endpoints.c文件中。

          1. constcoap_endpoint_tendpoints[]=
          2. {
          3. {COAP_METHOD_GET,handle_get_well_known_core,&path_well_known_core,"ct=40"},
          4. {COAP_METHOD_GET,handle_get_light,&path_light,"ct=0"},
          5. {COAP_METHOD_PUT,handle_put_light,&path_light,NULL},
          6. {COAP_METHOD_GET,handle_get_test_json,&path_test_json,"ct=50"},
          7. {(coap_method_t)0,NULL,NULL,NULL}
          8. };


          【1】每個(gè)endpoint需要CoAP訪問方法,相應(yīng)的處理函數(shù),URI路徑描述,資源描述方法等。
          【2】CoAP協(xié)議中定義了多種訪問方法,GET、PUT、POST和DELETE等方法。
          【3】handle_get_light等函數(shù)主要用于處理CoAP請(qǐng)求,根據(jù)不同的請(qǐng)求調(diào)用不同的處理方法。
          【4】ct=xx指定資源描述方法,例如ct=0表示字符串形式描述,ct=50表示JSON形式描述。

          URI采用以下方式描述:

          1. staticinthandle_get_light(coap_rw_buffer_t*scratch,
          2. constcoap_packet_t*inpkt,
          3. coap_packet_t*outpkt,
          4. uint8_tid_hi,uint8_tid_lo)
          5. {
          6. returncoap_make_response(scratch,
          7. outpkt,
          8. (constuint8_t*)&light,1,
          9. id_hi,id_lo,
          10. &inpkt->tok,
          11. COAP_RSPCODE_CONTENT,
          12. COAP_CONTENTTYPE_TEXT_PLAIN);
          13. }

          除了指定返回內(nèi)容之外,可通過COAP_RSPCODE_CONTENT指定返回是否成功,也可以通過COAP_CONTENTTYPE_TEXT_PLAIN指定返回內(nèi)容的格式。更多的定義請(qǐng)查看microcoap的源代碼。

          3.簡(jiǎn)單測(cè)試
          可使用CoAP命令行工具測(cè)試CoAP Server工作是否正常,或者使用火狐瀏覽器的coap插件。
          使用CoAP命令行測(cè)試工具——coap-cli,詳細(xì)的安裝步驟請(qǐng)參考【CoAP學(xué)習(xí)筆記——nodeJS node-coap安裝和使用(windows平臺(tái))】第2部分
          3.1 light Demo
          輸入指令,嘗試修改light狀態(tài)
          coap put -p 1 coap://10.13.11.116/light
          返回
          (2.05) 1
          說明
          -p參數(shù)可用于指定coap的負(fù)載,此處1表示打開light,0表示關(guān)閉light。


          圖3.1 light PUT方法輸出
          輸入指令,嘗試獲得light狀態(tài)
          coap get coap://10.13.11.116/light
          返回
          (2.05) 1
          控制臺(tái)輸出


          圖3.2 light GET方法輸出

          3.2 JSON格式Demo
          指令
          coap get coap://10.13.11.116/test_json
          返回
          (2.05)
          {
          "value": 12
          }
          控制臺(tái)輸出


          圖3.3 JSON格式測(cè)試輸出

          4.CoAP格式分析
          通過示例代碼并借助wireshark可分析CoAP數(shù)據(jù)包的各個(gè)部分,可加上CoAP協(xié)議的理解。wireshark中已經(jīng)支持CoAP協(xié)議,在過濾窗口中輸入coap便可抓取所有coap數(shù)據(jù)包。
          CoAP協(xié)議的分析請(qǐng)參考——【CoAP學(xué)習(xí)筆記——CoAP格式詳解】

          圖4.1 wireshark分析CoAP

          5. 總結(jié)
          microcoap正如它的名稱一樣,簡(jiǎn)單好用,函數(shù)不多但是可以實(shí)現(xiàn)最基本的功能。(by xukai871105)



          關(guān)鍵詞: STM32平臺(tái)CoAPServe

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();