前言
为何写作本书
几年前我作为一名嵌入式工程师参与了一个关于低功耗车载终端的研发项目,该低功耗车载终端中包含一个GPS模块和一个GPRS(2G)模块,工程师们希望通过最少的能量消耗把终端的GPS坐标上传至Web服务器中。虽然需求直截了当,但是在开发的过程中却出现了各种各样的分歧。例如传输协议采用UDP还是TCP,有的工程师认为UDP没有连接过程,传输时间更短,有的工程师认为TCP更加可靠而UDP也许会出现“丢包”现象。经过多次争论最终选择了UDP传输加自定义重传的方式。所谓自定义重传,就是车载终端把相同的数据包按照一定的时间间隔连续传输三次,每个数据包都包含一个递增的子序号,服务器通过子序号来剔除重复内容。通过增加这种容错机制似乎解决了UDP的“缺陷”,但是由于终端设备采用单向传输方式,并不要求服务器返回响应,所以终端根本不知道它上传的数据是否被正确处理。
在项目开发的过程中,工程师们在终端设备与Web平台的衔接方式的选择上也出现了不少分歧。在定制应用层协议时嵌入式工程师更喜欢二进制协议,但对于Web开发工程师来说JSON和XML才是他们所擅长的内容。因此,Web开发工程师单独做了一个UDP套接字服务,使终端设备可以把二进制内容转化为JSON格式的数据包,再把这个JSON数据包“POST”到一个HTTP服务器。此时对于Web开发工程师来说,设备其实是在提交表单。
经过工程师们的不断努力,这个低功耗车载终端如期完成。但是项目完成之后我不禁思考:这个项目是不是可以做得更好一点,是不是可以打破嵌入式工程师和Web开发工程师的技术鸿沟,是不是有更好的应用协议可以满足项目需求,是不是低功耗终端也可以提交表单?查阅了众多资料之后,我找到了CoAP。
回想硕士毕业之后我“执着”地成为一名专注于物联网的软件工程师,而我本科和硕士的专业都与机械工程相关。与其他计算机或电子专业不同,机械工程特别强调规范和标准,所以设计过程必须严格遵守规范。虽然表面上这显得异常死板,但是这种规范却大大提高了系统的互换性,节约了开发成本。在这种理念的指导下,我总是先寻找标准解决方案而不是随时随地准备“造轮子”。CoAP是一个由IETF(Internet Engineering Task Force,互联网工程任务组)组织编写的面向低功耗设备的物联网应用层协议,协议编号为RFC 7252。我非常高兴找到了应用“标准”,而不是又找到了一组“轮子”。
CoAP有很多优点,而这些优点正好可以解决上文提到的低功耗车载终端所遇到的问题:
1)CoAP传输层协议采用UDP,对于终端来说UDP的确可以减少一部分能耗。
2)CoAP采用请求/响应工作模式,当终端设备发送CoAP请求之后,服务器将返回响应码,终端通过响应码可以判断服务器的处理结果。
3)CoAP包含重传机制,不用再重新设计重传方法。
4)CoAP参考了HTTP的大量成功经验,如CoAP请求方法、CoAP选项定义和CoAP响应码等,所以Web开发工程师也可以非常容易地掌握CoAP。
CoAP可以帮助低功耗智能终端接入网络,通过这种标准协议也可以降低物联网系统的开发难度,尤其可降低物联网Web平台的开发难度。对于应用CoAP的终端设备来说,同样会遵守REST标准,使用类似的资源描述方法,使用相同的请求方法,应用相同的JSON数据包。对于物联网Web平台来说,处理一次终端设备的数据上传和处理一次Ajax表单提交同样容易。
我个人喜欢阅读技术图书,通过阅读图书可以系统地掌握一门新技术,我也希望本书可以帮助读者熟练掌握CoAP,并把它应用于物联网系统中。
目标读者
本书适合物联网爱好者、嵌入式工程师和Web开发工程师。
❑ 对于物联网爱好者而言,本书的示例可以让你更快地熟悉物联网系统。本书包括很多与物联网系统相关的基础知识,通过这些基础知识的学习可以加深你对物联网系统的理解。通过本书中的多个动手示例,你可以掌握物联网系统的调试方法。
❑ 对于嵌入式工程师而言,本书可以帮助你从不同角度了解低功耗设备如何连接网络。通过CoAP的学习可以从另一个角度熟悉HTTP。CoAP和HTTP都是设备连接网络的常见手段。
❑ 对于Web开发工程师而言,可以从另一个角度了解设备如何提交“表单”,通过学习CoAP你会发现低功耗终端设备也可以很流畅地接入系统,而不需要做多余的协议转换。
如何阅读本书
本书的主要内容大致分为三部分:
第一部分:第1~3章。第1章介绍与物联网应用直接相关的各种协议,这些协议包括IP、6LoWPAN协议、IEEE 802.15.4协议、HTTP、MQTT协议和CoAP等;第2章介绍与物联网应用相关的开源硬件Arduino和树莓派,无论是Arduino还是树莓派都是开源硬件领域的“明星产品”,在这些硬件平台上可以快速实现CoAP;第3章与前面两章不同,该章通过多个示例详细介绍与CoAP息息相关的网络协议—IP、UDP、TCP和HTTP,掌握这些协议是学习CoAP的基础。
第二部分:第4~8章。在第4章中先通过一个简洁示例让读者对CoAP有一个大致的了解,该示例包含CoAP客户端和CoAP服务器两个部分,CoAP服务器使用Arduino UNO实现,通过一个安装了Copper插件的Firefox浏览器便可访问该CoAP服务器;第5章与第6章详细分析与CoAP相关的RFC文档,这两章是掌握CoAP的理论基础;第7章介绍多种CoAP客户端和服务器的实现方法,这些实现方法包括C语言、Python、Node.js和Java;在实际项目中使用CoAP难免出现问题,第8章介绍CoAP的多种调试方法,通过Copper插件和Wireshark网络抓包工具可以快速地发现CoAP的细节错误。
第三部分:9.10章。最后两章设计一个微型的物联网系统,试图通过该系统向读者展现物联网系统从设计到实现的整个过程。微型物联网系统包括服务器和设备两部分。服务器部分(第9章)包括Web前端、后端和数据库部分的实现内容,与其他Web系统不同,该系统还包括CoAP服务器实现;设备部分(第10章)使用一个低功耗受限制设备作为CoAP客户端,该设备使用Contiki作为嵌入式操作系统,使用IEEE 802.15.4这样的无线方式连接网络。
相关资料
本书提供多个基础示例,这些示例代码可以帮助读者深入了解CoAP。
示例代码仓库:https://github.com/xukai871105/the_beginning_of_coap。
本书还提供一个CoAP测试服务器,该测试服务器部署于阿里云,国内用户可以非常方便地访问该服务器。
CoAP测试服务器:coap://wsncoap.org。
勘误和支持
由于时间和水平方面的限制,书中难免出现错误或者描述不准确的地方,恳请读者批评指正。如果读者在阅读过程中发现问题,可通过个人博客或邮箱与我取得联系。
我的邮箱:xukai19871105@126.com。
我的博客:http://blog.csdn.net/xukai871105。
致谢
感谢机械工业出版社华章公司的编辑,没有你们的鼓励就不会有这本书。感谢我的同事崔红鹏、王耀庭、许静和伊明,感谢你们与我一同讨论CoAP的各种细节问题,并把CoAP真正应用到实际产品中。最后感谢我的妻子左文娟,在这一年多的时间里始终支持我的写作,是你的鼓励让我最终完成本书。