您的位置 首页 新品

根据STM32渠道的CoAP Server计划

0.前言CoAP是受限制的应用协议(ConstrainedApplicationProtocol)的代名词。在当前由PC机组成的世界,信息交换是通过TCP和应用层协议H…

0.前语

CoAP是受限制的运用协议(Constrained Application Protocol)的代名词。在当时由PC机组成的国际,信息交流是经过TCP和运用层协议HTTP完成的。可是关于小型设备而言,完成TCP和HTTP协议显然是一个过火的要求。为了让小设备能够接入互联网,CoAP协议被规划出来。CoAP是一种运用层协议,它运转于UDP协议之上而不是像HTTP那样运转于TCP之上。CoAP协议十分细巧,最小的数据包仅为4字节。
本文将运用STM32渠道完成一个CoAP Server Demo。本文将具体阐明怎么运用STM32这样的低成本MCU完成CoAP Server的过程,本文企图阐明CoAP协议尽管很“年青”,可是有用、好用且易用。
【代码库房】
假如想取得本文的示例代码请点击——【bitbucket】,示例代码中的doc目录有本文所运用开发板的原理图和相关阐明。
【相关博文】
物联网学习笔记——索引博文】
【CoAP学习笔记——nodeJS node-coap装置和运用(windows渠道)】

1.运用LwIP处理CoAP数据包
新建一个套接字,绑定UDP 5683端口,侦听该端口数据运用microcoap呼应函数解析,最终取得回来成果即可。示例中运用了RT Thread中移植好的LwIP协议栈,网卡驱动为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(“SocketError\r\n”);
  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(“Binderror\r\n”);
  18. return;
  19. }
  20. endpoint_setup();
  21. rt_kprintf(“CoapServerStart!\r\n”);
  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(“\r\n——————–\r\n”);
  30. printf(“ReceivedBuffer:\r\n”);
  31. coap_dump(buf,n,true);
  32. printf(“\r\n”);
  33. #endif
  34. if(0!=(rc=coap_parse(&pkt,buf,n)))
  35. {
  36. printf(“Badpacketrc=%d\r\n”,rc);
  37. }
  38. else
  39. {
  40. size_trsplen=sizeof(buf);
  41. coap_packet_trsppkt;
  42. #ifdefMICROCOAP_DEBUG
  43. printf(“DumpPacket:\r\n”);
  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=%d\n”,rc);
  50. }
  51. else
  52. {
  53. #ifdefMICROCOAP_DEBUG
  54. printf(“——————–\r\n”);
  55. printf(“SendingBuffer:\r\n”);
  56. coap_dump(buf,rsplen,true);
  57. printf(“\r\n”);
  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. }

代码中运用了多个LwIP Socket部分的函数,例如socket, bind, recvfrom, sendto等。
其间coap_parse函数把从UDP取得的payload转化为契合CoAP标准的结构体,coap_handle_req函数依据CoAP恳求中的URI,调用呼应的处理函数。最终由coap_build函数把处理的成果系列化为UDP负载。

2.终端描绘
一切的终端信息均保存在endpoints大局数组中,该大局数组坐落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】每个endpoint需求CoAP拜访办法,相应的处理函数,URI途径描绘,资源描绘办法等。
【2】CoAP协议中界说了多种拜访办法,GET、PUT、POST和DELETE等办法。
【3】handle_get_light等函数首要用于处理CoAP恳求,依据不同的恳求调用不同的处理办法。
【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. }

除了指定回来内容之外,可经过COAP_RSPCODE_CONTENT指定回来是否成功,也能够经过COAP_CONTENTTYPE_TEXT_PLAIN指定回来内容的格局。更多的界说请检查microcoap的源代码。

3.简略测验
可运用CoAP命令行东西测验CoAP Server作业是否正常,或许运用火狐浏览器的coap插件。
运用CoAP命令行测验东西——coap-cli,具体的装置过程请参阅【CoAP学习笔记——nodeJS node-coap装置和运用(windows渠道)】第2部分
3.1 light Demo
输入指令,测验修正light状况
coap put -p 1 coap://10.13.11.116/light
回来
(2.05) 1
阐明
-p参数可用于指定coap的负载,此处1表明翻开light,0表明封闭light。


图3.1 light PUT办法输出
输入指令,测验取得light状况
coap get coap://10.13.11.116/light
回来
(2.05) 1
控制台输出


图3.2 light GET办法输出

3.2 JSON格局Demo
指令
coap get coap://10.13.11.116/test_json
回来
(2.05)
{
“value”: 12
}
控制台输出


图3.3 JSON格局测验输出

4.CoAP格局剖析
经过示例代码并凭借wireshark可剖析CoAP数据包的各个部分,可加上CoAP协议的了解。wireshark中现已支撑CoAP协议,在过滤窗口中输入coap便可抓取一切coap数据包。
CoAP协议的剖析请参阅——【CoAP学习笔记——CoAP格局详解】

图4.1 wireshark剖析CoAP

5. 总结
microcoap正如它的称号相同,简略好用,函数不多可是能够完成最基本的功用。(by xukai871105)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/272181.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部