基于STM32平台的CoAP Server方案

发布者:ZenMaster123最新更新时间:2016-09-02 来源: eefocus关键字:STM32平台  CoAP  Server 手机看文章 扫描二维码
随时随地手机看文章
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. void coap_server(void* para)  
  2. {  
  3.     int fd;  
  4.     struct sockaddr_in servaddr, cliaddr;  
  5.     coap_rw_buffer_t scratch_buf = {scratch_raw, sizeof(scratch_raw)};  
  6.     if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)  
  7.     {  
  8.         printf("Socket Error\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.      
  16.     if ((bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr))) == -1)  
  17.     {  
  18.        printf("Bind error\r\n");  
  19.        return;          
  20.     }  
  21.     endpoint_setup();  
  22.     rt_kprintf("Coap Server Start!\r\n");  
  23.     while(1)  
  24.     {  
  25.         int n, rc;  
  26.         socklen_t len = sizeof(cliaddr);  
  27.         coap_packet_t pkt;  
  28.         n = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &len);  
  29. #ifdef MICROCOAP_DEBUG  
  30.         printf("\r\n--------------------\r\n");  
  31.         printf("Received Buffer: \r\n");  
  32.         coap_dump(buf, n, true);  
  33.         printf("\r\n");  
  34. #endif  
  35.         if (0 != (rc = coap_parse(&pkt, buf, n)))  
  36.         {  
  37.             printf("Bad packet rc=%d\r\n", rc);  
  38.         }  
  39.         else  
  40.         {  
  41.             size_t rsplen = sizeof(buf);  
  42.             coap_packet_t rsppkt;  
  43. #ifdef MICROCOAP_DEBUG  
  44.             printf("Dump Packet: \r\n");  
  45.             coap_dumpPacket(&pkt);  
  46. #endif  
  47.             coap_handle_req(&scratch_buf, &pkt, &rsppkt);  
  48.             if (0 != (rc = coap_build(buf, &rsplen, &rsppkt)))  
  49.             {  
  50.                  printf("coap_build failed rc=%d\n", rc);  
  51.             }  
  52.             else  
  53.             {  
  54. #ifdef MICROCOAP_DEBUG  
  55.                 printf("--------------------\r\n");  
  56.                 printf("Sending Buffer: \r\n");  
  57.                 coap_dump(buf, rsplen, true);  
  58.                 printf("\r\n");  
  59. #endif  
  60. #ifdef MICROCOAP_DEBUG  
  61.                 coap_dumpPacket(&rsppkt);  
  62. #endif  
  63.                 sendto(fd, buf, rsplen, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));  
  64.             }  
  65.         }  
  66.     }  
  67. }  


    代码中使用了多个LwIP Socket部分的函数,例如socket, bind, recvfrom, sendto等。
    其中coap_parse函数把从UDP获得的payload转化为符合CoAP规范的结构体,coap_handle_req函数根据CoAP请求中的URI,调用响应的处理函数。最后由coap_build函数把处理的结果系列化为UDP负载。

2.终端描述
    所有的终端信息均保存在endpoints全局数组中,该全局数组位于endpoints.c文件中。

  1. const coap_endpoint_t endpoints[] =  
  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. static int handle_get_light(coap_rw_buffer_t *scratch,  
  2.                             const coap_packet_t *inpkt,  
  3.                             coap_packet_t *outpkt,  
  4.                             uint8_t id_hi, uint8_t id_lo)  
  5. {  
  6.     return coap_make_response(scratch,  
  7.                               outpkt,  
  8.                               (const uint8_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。

41
图3.1 light PUT方法输出
输入指令,尝试获得light状态
coap get coap://10.13.11.116/light
返回
(2.05)  1
控制台输出

42
图3.2 light GET方法输出

3.2 JSON格式Demo
指令
coap get coap://10.13.11.116/test_json
返回
(2.05)
{
    "value": 12
}
控制台输出

43
图3.3 JSON格式测试输出

4.CoAP格式分析
    通过示例代码并借助wireshark可分析CoAP数据包的各个部分,可加上CoAP协议的理解。wireshark中已经支持CoAP协议,在过滤窗口中输入coap便可抓取所有coap数据包。
    CoAP协议的分析请参考——【CoAP学习笔记——CoAP格式详解】

44

图4.1 wireshark分析CoAP

5. 总结
    microcoap正如它的名称一样,简单好用,函数不多但是可以实现最基本的功能。(by xukai871105)

关键字:STM32平台  CoAP  Server 引用地址:基于STM32平台的CoAP Server方案

上一篇:关于STM32中断向量表的位置 、重定向问题
下一篇:基于STM32的红外遥控和解码遥控程序解析

推荐阅读最新更新时间:2024-03-16 15:07

分析TCP/IP协议栈代码之ARP(STM32平台
1. ARP的简介 Address Resolution Protocol-地址解析协议 ARP为IP地址到对应的硬件地址之间提供动态映射。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的功能。ARP的功能是在32 bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。 2. ARP的应答流程 任何时候我们敲入下面这个形式的命令: view plain copy % ftp bsdi //示例而已 都会进行以下这些步骤。这些步骤的序号如图 4 - 2所示。 1) 应用程序FTP客户端调用函数gethostbyname(3)把主机名(bsdi)转换成32 bit的IP地址。
[单片机]
分析TCP/IP协议栈代码之ARP(<font color='red'>STM32</font><font color='red'>平台</font>)
英特尔3D XPoint SSD掀起Server市场波澜 意图巩固龙头地位
英特尔 3 月发表搭载 3D XPoint 芯片的 Server SSD 系列产品 DC P4800X,预计下半年开始出货。Trendforce 记忆体储存研究(DRAMeXchange)资深研究经理陈玠玮指出, 3D XPoint 产品性能大胜传统 NAND Flash 产品,有利于英特尔在竞争厂商的强力进逼下巩固高阶 SSD 市场,也可导入 Client SSD 与 SCM(Storage Class Memory)市场为另一出海口,为订价策略、产能去化上增加更多弹性。 DRAMeXchange 统计,2016 年英特尔在 Server SSD 市场的市占率超过 30%,而三星市占率已相当接近英特尔。 一直以来,英特尔虽然借由
[手机便携]
三星、SK海力士、美光第二季Server DRAM营收季增30.1%
  集邦咨询半导体研究中心(DRAMeXchange)调查显示,回顾第二季度,整体ServerDRAM供给吃紧,即使原厂透过产品线调整仍无法有效缓解市场需求的力道,在平均零售价(AverageSellingPrice)垫高的带动下, 三星 、 SK海力士 、美光三大DRAM原厂第二季整体营收较第一季成长约30.1%。下面就随网络通信小编一起来了解一下相关内容吧。   DRAMeXchange分析师刘家豪指出,由于ServerDRAM平均搭载容量的提升,整体高容量服务器模组如32GBRDIMM与64GBLRDIMM的使用需求在上半年陆续浮现,使得ServerDRAM的获利水平均大幅拉升;2017下半年随着英特尔Purley平台产品
[网络通信]
STM32双路信号源及配置平台电路设计
随着在雷达探测、仪表测量、化学分析等领域研究的不断深入,不仅要求定性的完成目标检测,更加需要往高精度、高分辨率成像的方向发展。一方面,产生频率、幅度灵活可控,尤其是低相位噪声、低杂散的频率源对许多仪器设备起着关键作用。另一方面,电子元器件实际性能参数并非理想以及来存在自外部内部的干扰,大量的误差因素会严重影响系统的准确性。双路参数可调的信号源可有效地对系统误差、信号通道间不平衡进行较调,并且可以产生严格正交或相关的信号,这在弱信号检测中发挥重要作用。为此本文采用双通道DDS方法,以STM32($18.3200)为控制器,完成了一种高分辨率灵活可调的双路信号源电路设计。 最终设计出的滤波器结构参数及仿真结果如图1所示。 图1
[单片机]
<font color='red'>STM32</font>双路信号源及配置<font color='red'>平台</font>电路设计
机智云云平台+STM32的智能家居空气检测及净化设计
本文介绍的智能家居空气检测及净化系统是由桂林电子科技大学国际学院陈龙杰等人设计开发完成。通过使用机智云平台、STM32等,实现室内空气监测和排气系统,实时监控室内空气,采集室内温湿度、CO、CO2、PM2.5等各项指标,并将数据上报至APP客户端,用户可根据反馈的数据信息动态控制净化系统。 01 系统设计原理 气体传感器通过与stm32f767的模拟转数字接口 进行数据交互,MCU将获取的数据通过WIFI模组进行智能家居气体与机智云IOT平台物联,并实时上报至云端,用户可根据APP客户端来读取传感器的数据,用户根据反馈开启净化系统(见图1)。 图1 系统设计流程图 02 温湿度及气体浓度获取方法 根据各个传感器的特性曲线
[单片机]
机智云云<font color='red'>平台</font>+<font color='red'>STM32</font>的智能家居空气检测及净化设计
一种用VHDL设计嵌入式Web Server的方案
摘要:近几年嵌入式Internet开始迅猛发展,但绝大多数嵌入式Internet都使用微控制器和相应的软件来实现。本文介绍一种基于硬件来实现嵌入式Web Server的方案。该方案的核心思想是用VHDL语言来设计实现,并且用FPGA进行验证。 关键词:VHDL Internet协议 控制信息协议 数据报 最近几年随着Internet应用的迅猛发展,Internet的通信协议,特别是TCP/IP协议,已成为嵌入式Internet的主体构架;然而,仅仅使用嵌入TCP/IP协议对许我应用来说远远不够,它们要求更高层次的信息传输和交换方式。在原有嵌入TCP/IP协议基于上加入HTTP/1.1将构成一个功能较为简单的嵌入式Web Server
[嵌入式]
基于机智云物联网云平台+STM32的瓦斯监测控制管理系统
本项目由吉林建筑大学何冬雪、岳俊华开发设计完成,该基于单片机的瓦斯监测控制系统,其硬件主要由 STM32 单片机、甲烷气体传感器、温湿度传感器、Wi-Fi 模块、蜂鸣器报警电路模块、控制电路及显示电路模块等组成。 系统以单片机为核心,能够实时检测到煤矿中的有毒气体,当有害气体的浓度超标时,蜂鸣器会发生声音进行报警提醒工作人员撤离,并开启继电器控制风扇排气,增加空气流通;还结合温湿度传感器采集煤矿的环境,实现煤矿数据的采集与设定阈值对比后,并通过蜂鸣器报警。同时结合 Wi-Fi 模块实现机智云电脑端页面显示和控制,最后还能够通过有机发光二极管显示屏显示。 01 引 言 随着科技的日益进步,人们对能源的需求不断增加。在中国的基本能
[单片机]
基于机智云物联网云<font color='red'>平台</font>+<font color='red'>STM32</font>的瓦斯监测控制管理系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved