基于CoAP的M2M课程教学及实验设计

2017-11-09 08:46张笑非
计算机教育 2017年11期
关键词:服务端字段字节

张笑非,刘 镇 ,滕 玮

(1.江苏科技大学 计算机学院,江苏 镇江 212003;2. 北京工业大学 信息学部,北京 100124 )

基于CoAP的M2M课程教学及实验设计

张笑非1,2,刘 镇1,滕 玮1

(1.江苏科技大学 计算机学院,江苏 镇江 212003;2. 北京工业大学 信息学部,北京 100124 )

阐述以IETF CoAP协议扩展标准RFC 7959 “CoAP块级传输”中的案例作为M2M课程教学内容,提出通过Eclipse开源项目Californium中提供的API对实验内容进行设计并利用JUnit框架设计CoAP块级传输案例的测试用例,测试结果验证了相应的块级传输流程。

CoAP; 块级传输;请求/应答对;Californium项目

0 引 言

当前,全国众多高校的物联网专业都开设了M2M通信技术课程,由于涉及的理论和技术框架还在发展中,教学及实验内容也在不断建设和完善中。CoAP是一种应用于受限节点和受限网络的Web传输协议,类似HTTP但又不是盲目地在HTTP的技术上进行缩减,而是针对M2M应用进行优化,实现REST架构风格的一个子集[1]。在物联网应用中,CoAP成为HTTP的替代者而实现智能硬件到Web的接入[2]。CoAP的标准已在IETF RFC 7252中给出,文献[3]提出将RFC标准文档应用于计算机网络教学中。MIT、Apache等机构也都给出了多种编程语言版本的CoAP实现,且文献[4-6]也提出网络编程在提高教学和实验效果方面的作用,文献[7]分别就案例分解和重构在网络编程教学中的应用与改革进行了说明。这些都为在物联网专业的M2M通信技术课程中准备了充足的教学和实验素材。

1 CoAP教学设计

本教学设计使用IETF RFC 7959[8]作为M2M通信技术课程中CoAP的教学内容。RFC 7959是对RFC 7252的更新,是对CoAP块级传输方式的定义。CoAP消息的基本传输方式是在客户端和服务端之间,通过一次请求/应答对完成,可以满足从传感器读取数据,或向执行器发送指令等小型载荷需求,但面对固件更新这种需要承载大型载荷的M2M应用时,就需要对这些载荷进行分割。由于CoAP使用的传输层协议是UDP或DTLS,因此不能像TCP对HTTP消息一样进行分割和重新排列。RFC 7959在不考虑使用IP碎片机制的情况下,通过对CoAP协议增加一对Block选项的方式,对单个大型载荷进行分块、并通过多次请求/应答对完成传输。

教学设计中之所以选择RFC 7959定义的CoAP块级传输作为教学内容,是因为对于协议三要素(语法、语义、时序)而言,RFC 7252中介绍的单次请求/应答对作为时序部分较为简单。而基于块级传输的多次请求/应答过程,能够帮助学生更好地理解CoAP消息在客户端/服务端之间的交换过程;同时也可以对比受限网络环境和常规互联网环境下,由于需求差异导致协议栈的每一层功能和策略存在的差别。

1.1 教学内容

CoAP块级传输中需要利用块选项(Block Option),块选项分为Block1和Block2。CoAP中的请求/应答对,其中请求消息由客户端发送给服务端,应答消息由服务端返还给客户端。若需进行分块的载荷来自客户端,如PUT和POST操作,则块选项为Block1。若需进行分块的载荷来自服务端,如接收到GET操作,则块选项为Block2。块选项是变长的,可以是1个或2个或3个字节。块选项包含3个字段,即NUM、M和SZX,其中NUM的长度可以是4bit或12bit或20bit,是当前块在所属载荷分割出的多个块中的序列号;M占1bit,1表示还有后续块,0表示本块是最后一个;SZX占3bit,是当前块尺寸的指数,2^(SZX+4)就是当前块的字节数。为了便于讲解,后面的例子中会将块选项写成4个部分,即“块选项类型:NUM/M/2**(SZX+4)”,例如:2:2/0/32表示一个Block2块选项,块序号为2、没有后续块、当前块的长度是32字节;1:3/1/128表示一个Block1块选项,块序号为3,还有后续块,当前块的长度是128字节。

1.2 教学案例

RFC 7959的第3节给出4类案例,每类案例中包含若干具体案例,见表1。这些案例涵盖了块级GET、块级PUT/POST的消息交换过程,其中块级PUT与块级POST的消息交换过程是一样的,它们的区别在于对原子性和幂等性上的要求不一样。这些案例演示了基本的块级转发流程、存在重传的块级转发流程,存在块尺寸协商的块级转发流程。

表1 CoAP块级传输案例

1.2.1 简单块级GET案例

如图1,该案例给出一个GET请求被分解为三次请求/应答对,客户端在第一次向服务端发起CoAP GET消息时,并不知道服务端将要返回的载荷大小。服务端在第一次应答中建议的块尺寸是128字节,并且M标志位为1,说明还有后续的块。于是客户端继续向服务端发送GET请求,直到接收到的来自服务端的第3个应答时,由于M标志位为0,说明整个载荷接收完毕。本案例中由于来自服务端的载荷被分割成3个块,所以块选项类型是Block2,3个块的NUM依次为0、1、2,每个块的尺寸都是128字节,而实际情况中,第3个块的长度只需满足不小于1个字节、且不大于128字节。

图1 简单块级GET的消息交换过程

1.2.2 存在CON消息丢失的后期协商块级GET案例

如图2,教学设计中利用该案例阐述了CoAP块级传输中的两个要素,一个是块尺寸的后期协商,另一个是重传机制。案例中CoAP消息过程包含5个请求/应答对,这可以通过MID的值或块选项字段NUM看出。MID是CoAP首部中的消息标示符,该例中MID从1234到1238共5个;同样,NUM字段在5次请求/应答对中分别是0、2、3、4、5共5个,而没有1,这正是后期协商造成的。

图2 存在CON消息丢失的后期协商块级GET的消息交换过程

客户端和服务端可以在消息交换中的多次修改块尺寸,提供类似TCP的拥塞控制功能[9]。在教学设计中,首先要讲解什么是早期协商,即在第一次请求/应答对的请求消息中,如果块选项的SZX被设置了值,那这个值就是客户端期望服务端在后续应答时设置的块尺寸指数,反之则说明客户端没有进行早期协商。第一次请求/应答对中的应答消息到达客户端后,客户端对服务端设置的块尺寸128字节并不满意,因此在第二次的请求/应答对的请求消息将块尺寸设置为64字节。由于第一次应答,服务端已经返回了128字节,而这时客户端设置的块尺寸为64字节,因此相当于之前已经发送了两个64字节的块,第二次应答消息中的块相当于是第3个64字节了,这就是为什么转发过程中没有出现NUM为1的情况。

其次,在这个案例中,还需要对CoAP的重传机制作讲解。CoAP请求/应答对的可靠性是通过设置请求消息中的Type字段为“需确认”、即CON,客户端会通过计时器判断在规定时间内是否收到与请求消息MID相同的应答消息,否则会重新发送同样的请求消息。该案例中模拟了第二次请求/应答对的请求消息丢失的情况,若是应答消息丢失则仍由客户端重新发送请求,服务端并不设置超时机制。

1.2.3 原子性块级POST/块级应答组合案例

如图3,教学设计中利用该案例阐述了CoAP块级传输中的两个要素,一个是原子性块级传输,另一个是Block1和Block2块选项的组合。整个CoAP消息过程包含6个请求/应答对,即该例中MID从1234到1239;过程的前半部分是客户端通过Block1块选项把发送给服务端的数据分成了3个块依次传输,过程的后半部分是服务端通过Block2块选项把返回给客户端的结果分成了4个块依次传输。由于在第3次请求/应答对中通过双工的方式同时完成了最后一个Block1块和第一个Block2块,所以双方交换7个块通过6次请求/应答对便完成了。

图3 原子性块级POST/块级应答组合的消息交换过程

在教学设计中,首先要讲解原子性块级传输的机制,与之相对的是无状态块级传输。它们的区别在于在服务端通过应答消息的M字段,以表示块级传输过程中的所有请求/应答对构成一个原子性操作,还是说每个请求/应答对构成独立的操作。从本案例块级传输的每一次应答消息可以看到,除了最后一次应答消息,之前应答消息的M字段均为1,说明服务端预期来自客户端更多的请求消息,直到最后一次应答消息M字段为0,表示服务端认为之前接收到的所有请求/应答对成了一次原子性的块级传输过程。而在无状态块级传输中,即使客户端发送的请求消息中通过M字段置1、以告知服务端本次请求/应答对后还有更多的请求/应答对,但服务端每次向客户端发送的应答消息的M字段都为0,以表示服务端可以独立处理这些被分割的块,每一个请求/应答对是独立的。

其次,在这个案例中,还需要对CoAP的Block1和Block2块选项组合机制作讲解。整个块级传输过程共包含6次请求/应答对,其中第3次请求/应答对的应答消息中同时包含了Block1和Block2块选项。这是因为客户端通过前三次请求将输入数据提交给了服务端,而服务端则在第三次应答中通过Block1块选项M字段为0表示数据接收完成、同时还通过Block2块选项开始向客户端返回结果,直到第6次应答通过Block2块选项M字段置0告知客户端结果返回完毕。

2 CoAP实验设计

本实验设计使用Eclipse开源项目Californium[10]作为CoAP的实验环境。Californium是一个面向后台服务和强劲IoT设备的CoAP框架,其为RESTful Web服务提供的API支持CoAP的所有特性。实验设计在Californium中将每个案例编写成JUnit测试单元来验证,文献[11]就如何将JUnit应用到课程教学中做了探讨。

2.1 案例的测试框架设计

由于每一个CoAP案例的测试设计都包含通用模块和独立模块,因此在设计上利用JUnit4的标注机制。如图4所示,用@BeforeClass定义CoAP网络参数初始化函数init( ),用@Before定义CoAP客户端实例和服务端实例的创建函数setupEndpoints( ),用@After定义CoAP客户端实例和服务端实例的销毁函数shutdownEndpoints( ),用@Test分别定义三个块级传输过程函数testGET()、testGETLateNegotionalLostACK()、testAtomicBlo ckwisePOSTWithBlockwiseResponse()。

图4 实验测试流程

2.2 测试的通用模块设计

锁步(Lockstep)也称为时钟同步,是一种容错技术[12]。为了能够重现教学案例中的场景,我们将服务端运行在正常模式,而将客户端运行在锁步模式,即客户端每次发送和等待接收,都是通过明确的命令来控制。因此,首先定义测试用例的静态初始化函数init( ),在其中为CoAP服务端定义运行时的网络参数:

接着就需要定义每次Test实例的初始化函数setupEndpoints( ),其中需要创建并启动运行在正常模式的CoAP服务端实例,以及运行在锁步模式的CoAP客户端实例:

最后定义每次Test实例运行完毕时执行的销毁函数shutdownEndpoints( ):

2.3 测试的独立模块设计

教学设计中的3个案例,可以通过CoAP客户端的锁步模式完成相应的块级传输流程。其中,客户端client通过函数sendRequest完成请求消息的发送、通过函数expectResponse确认应答消息的接收。以案例3为例,为了完成图3中的块级传输流程,先通过函数generateRandomPayload为CoAP两端生成指定长度的随机载荷;另外,CoAP客户端需要指定token作为区分并发请求消息的标识符,以及path作为POST请求创建资源的路径。

案例3中的6次请求/应答对,每一次请求/应答对在CoAP客户端锁步模式下、通过执行一对sendRequest和expectResponse函数来完成测试。

2.4 测试结果

将通用模块和案例3独立模块的组合作为JUnit单元测试,图5中的运行结果正确验证了案例3在教学设计上的块级传输流程。

图5 案例3的JUnit单元测试结果

3 结 语

该设计方法可以被用到M2M课程其他知识点,或者其他课程的教学和实验设计当中去,特别是目前一些涉及新技术的物联网专业课程,在实际的教学过程中让学生掌握先进技术的原理和开发方法,以提高他们的专业素质和能力。

[1] Shelby K S, Hartke C B.The Constrained Application Protocol (CoAP), IETF RFC 7252, June 2014[EB/OL]. [2017-06-16].https://tools.ietf.org/pdf/rfc7252.pdf.

[2] Levä T, Mazhelis O, Suomi H. Comparing the cost-efficiency of CoAP and HTTP in Web of Things applications[J]. Decision Support Systems, 2014, 63(3): 23-38.

[3] 王盛邦, 田海博. RFC在网络协议教学中的应用[J]. 现代计算机(专业版), 2013(23): 35-39.

[4] 张晓明, 杜天苍, 秦彩云. 计算机网络编程课程的教学改革与实践[J]. 实验技术与管理, 2010(2): 4-7.

[5] 胡静, 赵雷, 罗宜元, 等. 网络工程专业的网络编程课程教学与改革[J]. 计算机教育, 2014(18): 35-38.

[6] 戚平, 石乐义. 原始套接字编程在网络实验教学中的应用[J]. 实验室研究与探索, 2012(7): 325-327.

[7] 吴杰, 梁妍. 基于实验案例分解和重构的Android网络编程教学改革探索[J]. 信息技术与信息化, 2016(5): 103-110.

[8] Borman C. Shelby Z.Block-Wise Transfers in the Constrained Application Protocol (CoAP), IETF RFC 7959, August 2016[EB/OL].[2017-06-16]. https://tools.ietf.org/pdf/rfc7959.pdf.

[9] Castellani A P, Rossi M, Zorzi M. Back pressure congestion control for CoAP/6LoWPAN networks[J]. Ad Hoc Networks, 2014,18(1):71-84.

[10] Kovatsch M, Lanter M, Shelby Z. Californium: Scalable cloud services for the Internet of Things with CoAP[C]// Internet of Things. IEEE, 2014: 1-6.

[11] 朱冬玲. JUnit在软件测试课程教学中的应用[J]. 福建电脑, 2013(10): 56-57.

[12] 付爱英,周晶晶. 基于Lockstep的容错技术的研究[J]. 科技广场, 2012(7): 70-73.

1672-5913(2017)11-0150-05

G642

江苏科技大学2016高教研究立项课题(GJKTY201625);江苏省教育科学“十二五”规划2015年度立项课题(D/2015/01/78);江苏科技大学2015年学校重点教改课题“计算机类专业通用课程优质教学资源建设的研究与实践”。

张笑非,男,讲师,研究方向为通信技术研究与教学工作,julychang@just.edu.cn。

(编辑:郭田珍)

猜你喜欢
服务端字段字节
图书馆中文图书编目外包数据质量控制分析
No.8 字节跳动将推出独立出口电商APP
No.10 “字节跳动手机”要来了?
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
简谈MC7字节码
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究
摸清黑客套路防范木马侵入