基于CoAP的无线传感器网络与互联网的互联研究

■ 文/传智播客Java基础课程研究组   陈文

陈文(传智播客Java高级讲师)
个人简介:7年以上软件开发经验。精通Java、PHP、ASP、MySQL、Oracle、SqlServer、Sybase等编程语言和数据库系统。曾参与国家计算机安全中心的531和242课题的研究,信息产业部<<号码携带运维系统>>,中国联通的<<运维MIS系统>>,内蒙联通的<<资源管理系统>>,中国移动研究院的《TSM平台》,中国移动的<<上海世博国漫综合业务平台>>等多个电信领域的软件项目的需求分析、设计及研发,并对企业管理软件有着深刻的理解,曾参与CRM和ERP等产品设计以及研发。授课思路清晰,擅长结合现实中的例子讲解抽象的概念,便于学生理解和记忆。

无线传感器网络与其他网络的互联是无线传感器网络研究热点方向之一,基于IPv6的全IP化互联方式是当前最受关注的焦点。本文介绍了在IP化无线传感器网络上实现REST风格服务的受限应用层协议CoAP,比较了CoAP与HTTP的不同和性能差异,最后提出和总结了基于CoAP的无线传感器网络与互联网的两种互联方式。
关键词:CoAP  无线传感器网络  物联网  网关  互联方式

1.引言
近年来,无线传感器网络(WirelessSen-sorNetwork,WSN)已经成为国际上学术界和工业界共同的研究热点之一。在许多应用中,无线传感器网络不以孤立网络的形式存在,而是通过一定的方式与其他外部网络互联,使其他外部网络能够访问和控制无线传感器网络,这样才有实际价值。互联网Internet是目前世界上最大的一种网络,因此实现无线传感器网络与Internet的网络互联具有重大意义。
在Internet以及其他一些网络中,TCP/IP已经成为事实上的协议标准。由于无线传感器网络终端数量庞大,IPv4远远不能满足无线传感器网络的地址需求,因此许多研究把重点放在了IPv6上,旨在将无线传感器网络IPv6化。互联网工程任务组(InternetEngineeringTaskForce,IETF)正在进行针对基于IPv6的低功率无线个域网(IPv6overLowPowerWirelessPersonalAreaNetwork,6LoWPAN)的相关标准化活动,包括将IPv6协议适配到IEEE802.15.4标准的6LoWPAN、低功耗网络路由协议(RoutingProtocolforLow-powerandLossyNetwork,RPL)、资源受限环境应用层协议(ConstrainedApplicationProtoc-ol,CoAP)等。IP智能物体产业联盟(IPSm-artObjectAlliance,IPSO)也开始了嵌入式设备IPv6产品化的推广。
无线传感器网络IP化的优点之一是,可以采用REST(RepresentationalStateTransfer)风格架构构建物联网应用。REST是表述性状态转换架构,是一种轻量级的Web服务实现,是互联网资源访问协议的一般性设计风格。REST有3个基本概念:表示(Representation)、状态(State)和转换(Tr-ansfer)。表示是指数据和资源都以一定的形式表示;状态是指一次资源请求中需要使用的状态都随请求提供,服务端和客户端都是无状态的;转换是指资源的表示和状态可以在服务端和客户端之间转移。
REST提出了一些设计概念和准则:网络上的所有资源都被抽象为资源;每个资源对应唯一的资源标识;通过通用的连接器接口;对资源的各种操作不会改变资源标识;对资源的所有操作是无状态的。REST风格使应用程序可以依赖于一些可共享和重用的并松散耦合的服务。HTTP(HypertextTransferProtocol)协议就是一个典型的符合REST风格的协议。
但是,HTTP协议较为复杂,开销较大,不适用于资源受限的传感器网络。IETFCoRE(ConstrainedRESTfulEnvironment)工作组正在制定CoAP协议,将REST风格引入智能物体网络。
2.受限应用层协议CoAP
2010年3月,IETF CoRE工作组开始标准化受限应用层协议(Constrained Application Protocol,CoAP)。CoAP是一种网络传输协议,专门为资源受限设备(如传感器节点)和网络(如6LoWPAN网络)优化设计。CoAP采用REST(Representational State Transfer)风格架构,将网络上的所有对象抽象为资源,每个资源对应一个唯一的统一资源标识符(Universal Resource Identifier, URI),通过URI可以对资源进行无状态操作,包括GET、PUT、POST和DELETE等。
CoAP并不是HTTP的压缩协议。CoAP一方面实现了HTTP的一部分功能子集,并为资源受限环境进行了重新设计;另一方面提供了内置资源发现、多播支持、异步消息交换等功能。

如图1所示,与HTTP不同,CoAP使用的是面向数据包的传输层协议,如用户数据包协议(User Datagram Protocol,UDP),因此可以支持多播。CoAP分为两层:消息层(Message)负责使用UDP进行异步交互,请求/回复层(Request/Response)负责传输资源操作请求和回复数据。
CoAP消息有4种类型,分别是:
● Confirmable(CON):需要收到确认的消息。 
● Non-confirmable(NON):不需要收到确认。
● Acknowledgment(ACK):表示确认一个Confirmable类型的消息已收到。
● Reset(RST):表示一个Confirmable类型的消息已收到,但是不能处理。
通过这种双层结构,CoAP能够在UDP上实现可靠传输机制。进行可靠传输时,使用CON消息,如果在规定时间内未收到ACK消息,则重新传输该消息(超时重传),直到收到ACK/RST消息或者超过最大重试次数。接收方收到CON消息时,返回ACK消息,如果接收方不能处理该消息,则返回RST消息。此外,CoAP还支持异步通信。当CoAP服务端收到不能立即处理的请求时,首先返回ACK消息,处理请求之后再发送返回消息。
CoAP主要有以下特点:
● 满足资源受限的网络需求;
● 无状态HTTP映射,可以通过HTTP代理实现访问CoAP资源,或者在CoAP之上构建HTTP接口;
●使用UDP实现可靠单播和最大努力多播。
●异步消息交换。
●很小的消息头载荷及解析复杂度。
●支持URI和内容类型(Content-type)。
●支持代理和缓存。
●内建资源发现。
虽然CoAP还在制定中,已经出现了许多开源的CoAP实现,包括C语言实现的Libcoap、Python语言实现的CoAPy、C#语言实现的CoAP.NET等。Contiki和Tiny OS两大无线传感器网络操作系统也提供了CoAP支持。
3.性能评测
CoAP采用UDP作为传输层协议,并且减小了数据包头大小,因此理论上而言能够有效地提高数据传输速率。为了比较CoAP和HTTP协议的传输性能,笔者进行了试验,分别基于CoAP和HTTP协议构建了一套相同的图像采集应用程序,该应用程序是通过传感器节点控制摄像头采集图像,并将图像拆分为若干数据包传递给上层应用。
试验采用的硬件设备是北京美信凌科信息技术有限公司生产的MX231CC无线传感器节点,运行启用6LoWPAN的Contiki系统,其上分别运行CoAP服务器和HTTP服务器,分别使用CoAP和HTTP作为图像数据传输的应用层协议。客户端程序由.NET实现,运行在一台Windows主机上,以一块MX-USBStick接入网卡作为与无线传感器网络的接入网关。CoAP客户端基于CoAP.NET实现。在试验中,图像数据包大小设置为100字节,客户端分别向CoAP服务器和HTTP服务器请求图像数据包,直至整幅图像传送完毕。CoAP请求的地址格式为:GET coap://[<节点IPv6地址>]:<节点端口>/picture?no=<图像数据包号>,其中picture是请求的资源,no是当前请求的图像数据包编号。同样,HTTP请求的地址格式为:GET http:// [<节点IPv6地址>]:<节点端口>/picture?no=<图像数据包号>。服务器返回的是最大100字节的有效数据。
 
表1显示了使用CoAP和HTTP时,传输数据大小和吞吐量对比的情况。其中,传输数据大小是指传送一个图像数据包时,实际传输的数据大小;吞吐量指的是平均每秒传送的图像数据包的数量。
从表1中可以看出,传输相等负载时,CoAP协议比HTTP协议实际传输的数据量要小。考虑到HTTP服务器实现的完整性以及TCP握手过程,HTTP协议传输的数据量事实上会更大。同时可以看出,基于UDP的CoAP协议比基于TCP的HTTP协议传输速率更快。与直接使用TCP或UDP相比,CoAP传输数据大小相当,但是传输速率相差较大,主要原因是为CoAP在UDP之上实现了可靠传输,以致性能有所降低。但是,直接使用UDP需要上层应用程序来实现可靠传输,如果网络环境不稳定,性能同样也会下降。
 
4.基于CoAP的无线传感器网络与互联网的互联方式
在无线传感器网络中采用基于IP的REST风格网络架构能够促进无线传感器网络与互联网之间的网络互联。应用CoAP协议之后,互联网中的服务能够直接通过CoAP协议或者通过HTTP与CoAP协议之间的映射转换来访问无线传感器网络资源。因此,基于CoAP的无线传感器网络与互联网的互联方式有直接接入和网关代理两种。
4.1.直接接入
直接接入方式是指无线传感器网络通过网关接入互联网,网关只对IPv6和6LoWPAN网络层进行转换,而对上层协议不做处理(见图2)。
直接接入时,传感器节点直接与支持CoAP协议的互联网应用程序进行数据通信。这种方式可以实现无线传感器网络与互联网的完全互联,无线传感器网络中的节点都可以通过IPv6地址直接访问,同时网关只需要对IPv6与6LoWPAN进行转换,减少了不必要的开销。但是,由于目前IPv6在互联网中还没有完全普及,这种方式的应用范围受到了一定的限制。在小型自控网络中,可以采用这种方式,但是在公用网络中目前还无法实现。另一方面,已有的互联网应用程序如浏览器等大多使用HTTP协议,不能直接访问无线传感器网络资源,需要应用CoAP协议重新实现。
4.2网关代理
网关代理方式是指无线传感器网络通过网关接入互联网,网关对全部协议进行相应转换,将HTTP或其他协议请求转换为CoAP请求,并将CoAP返回数据转换为HTTP或其他协议形式传递给互联网应用程序。
网关代理时,互联网应用程序不是直接访问无线传感器网络资源,而是通过网关对CoAP和HTTP或其他协议进行了转换。这种方式的优势在于,由于使用网关作为代理,互联网端可以使用IPv4或IPv6,使得这种方式的应用范围更广。同时,因为可以使用HTTP或其他协议,上层应用程序可以不需要改动。但是,CoAP和HTTP或其他协议的转换增加了网关的复杂度,也会对通信效率产生一定影响。
网关代理的实现方式有3种:委托调用、HTTP代理、透明代理。Java教程委托调用是指在网关上实现一个HTTP接口,通过传入参数对CoAP资源进行调用。传入参数可以包括CoAP资源URI、访问方法、负载参数等。这种方式不对CoAP和HTTP进行直接转换。图4显示的是笔者基于Libcoap实现的委托调用网关。
Libcoap是一个用C语言实现的CoAP库,当前版本支持draft-ietf-core-coap-03。Libcoap封装了Message层,并提供了Request/Response层示例。基于该示例,笔者封装了Request/Response层,并在其之上实现了网关CGI程序,可以通过如下格式访问CoAP资源:http://网关IP地址/coap-proxy?uri=coap://[节点IPv6地址]: :<节点端口>/[资源名称]。
HTTP代理和透明代理都是指网关对HTTP和CoAP进行映射转换。HTTP代理是采用HTTP正向代理的方式访问CoAP资源,代理服务器进行协议代理,将请求转发至无线传感器网络,底层同样使用Libcoap实现。
透明代理是直接以HTTP访问CoAP资源,例如http://[节点IPv6地址]/[资源名称]。网关需要监听网卡,截获所有对无线传感器网络节点的访问请求,将请求映射转换为CoAP格式:coap://[节点IPv6地址]:<节点端口>/[资源名称],发送至无线传感器网络;再将收到的CoAP回复翻译为HTTP格式返回。在整个过程中,网关对上层应用程序是透明的。IETF CoRE工作组正在讨论HTTP-CoAP映射的相关问题。
总而言之,委托调用和HTTP代理方式实现较为简单,但需要应用程序了解作为代理的网关;透明代理方式可以对应用程序隐藏网关信息,实现也更复杂。
5.结束语
无线传感器网络与IPv6的结合是物联网研究的重要趋势,而CoAP协议的实现更能促进无线传感器网络与互联网的集成。基于UDP的CoAP协议支持类HTTP的资源操作方式,并为物联网提供了许多特殊功能。本文介绍了CoAP协议,对比分析了无线传感器网络中CoAP与HTTP协议的性能,并提出和总结了基于CoAP的无线传感器网络与互联网的两种互联方式。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot提供了Spring Integration CoAP支持,可以使用Spring Integration框架实现CoAP协议的集成。 1. 首先,需要在Maven或Gradle中添加对spring-integration-coap的依赖: Maven: ```xml <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-coap</artifactId> </dependency> ``` Gradle: ```groovy compile 'org.springframework.integration:spring-integration-coap' ``` 2. 创建一个CoAP服务器端点 ```java @Configuration @EnableIntegration public class CoapServerConfiguration { @Bean public CoapServer coapServer() { CoapServer server = new CoapServer(); server.add(new CoapResource("hello") { @Override public void handleGET(CoapExchange exchange) { exchange.respond("Hello, CoAP!"); } }); return server; } @Bean public IntegrationFlow coapInboundFlow(CoapServer coapServer) { return IntegrationFlows.from(coapInboundChannelAdapter(coapServer)) .transform(Transformers.objectToString()) .handle(System.out::println) .get(); } @Bean public MessageChannel coapInboundChannel() { return new DirectChannel(); } @Bean public CoapInboundChannelAdapter coapInboundChannelAdapter(CoapServer coapServer) { CoapInboundChannelAdapter adapter = new CoapInboundChannelAdapter("/hello"); adapter.setCoapServer(coapServer); adapter.setOutputChannel(coapInboundChannel()); return adapter; } } ``` 在上面的代码中,我们创建了一个CoAP服务器端点,并添加了一个名为“hello”的CoAP资源。当客户端发送GET请求到CoAP服务器的/hello路径时,服务器将响应“Hello, CoAP!”消息。 我们还创建了一个名为“coapInboundFlow”的Spring Integration流,用于处理从CoAP服务器接收到的消息。在此流中,我们将CoAP消息转换为字符串并将其打印到控制台中。 3. 创建一个CoAP客户端 ```java @Configuration @EnableIntegration public class CoapClientConfiguration { @Bean public CoapClient coapClient() { return new CoapClient("coap://localhost/hello"); } @Bean public IntegrationFlow coapOutboundFlow(CoapClient coapClient) { return f -> f.handle(new CoapMessageHandler(coapClient)); } } ``` 在上面的代码中,我们创建了一个名为“coapClient”的CoAP客户端,并指定要访问的CoAP服务器端点的URL。 我们还创建了一个名为“coapOutboundFlow”的Spring Integration流,用于将消息发送到CoAP服务器。在此流中,我们使用CoapMessageHandler将消息发送到CoAP服务器。 4. 测试 现在我们可以测试我们的CoAP服务器和客户端了。在启动应用程序后,我们可以使用任何支持CoAP协议的客户端(如Copper)向CoAP服务器发送GET请求,并从控制台中查看响应消息。 例如,在Copper中,我们可以打开一个新的请求,输入“coap://localhost/hello”作为URI,选择GET方法,并单击“发送”按钮。我们应该会在响应面板中看到“Hello, CoAP!”消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值