IoT开发实战:CoAP卷【2.9】

9.6 综合测试

下面我们为微型物联网系统做一轮综合测试,通过综合测试验证功能是否符合设计需求。

9.6.1 启动微型物联网系统

在树莓派启动Web服务器和CoAP服务器,在控制台中输入以下指令:

# 启动Web服务器和CoAP服务器

node app.js

# 控制台输出

Http Server Listening on :0.0.0.0:8090 CoAP Server Listening on :0.0.0.0:5683

9.6.2 增加模拟数据

为了更好地测试微型物联网系统,可以通过test文件夹中的post_sensor_data.js脚本向CoAP服务器插入更多的模拟数据。

9.6.3 访问默认设备

在浏览器地址栏中输入树莓派的IP地址和服务端口号,此处树莓派的IP地址为192.168.0.6,服务端口号为8090,在浏览器中输入“192.168.0.6:8090”,具体结果如图9-11所示。

图9-11 访问默认设备

虽然在URL中并没有指定设备编号,但是HTTP服务器依然返回了默认设备12CD的部分历史记录。

9.6.4 使用分页功能

由于12CD设备的传感器记录较多,所以Bootstrap-table采用分页显示的方式展现历史记录,默认情况下每页显示10条记录,用户可选择网页右下角的页码查看其他历史记录,分页查询结果如图9-12所示。

图9-12 使用分页功能

9.6.5 访问其他设备

选择左侧的设备列表中的其他项可查看其他设备的历史记录,假如选择CD12设备,那么页面将会跳转至/devices/CD12/page。跳转之后的结果如图9-13所示。

图9-13 访问其他设备

9.7 本章小结

开发完整的物联网系统是一个复杂而艰巨的工作,本章试图展现物联网系统的开发流程,更多的实现细节和调试经验仍需要读者在具体实践过程中不断积累。总的来说,物联网系统的开发流程和互联网系统并没有本质的区别,物联网系统同样具备数据库、Web前端和Web后端,此处的微型物联网系统仅仅增加了CoAP接口。CoAP接口相比于HTTP接口显得较为轻量,更适合那些低功耗受限制设备实用。在Web开发领域,同时掌握Web前端和Web后端开发技能的工程师称为“全栈工程师”。但在物联网开发领域,物联网工程师除了要掌握必要的Web前端和后端开发技能之外,还需要掌握良好的嵌入式开发技能,第10章将详细说明如何使一个低功耗受限制设备“接入”微型物联网系统。

第10章 微型物联网系统——设备部分

10.1 本章主要内容

微型物联网系统不仅包括服务器部分的具体实现,也包括设备部分的具体实现。第9章我们已经完成了服务器部分的开发工作,本章我们将继续推进设备部分的开发工作。在物联网系统中,终端设备的开发方式多种多样,可采用Arduino这样的小型MCU设备,也可使用树莓派这样Linux设备。无论如何设备需要具备连接网络的能力才可以实现CoAP客户端功能。CoAP设计的宗旨便是让低功耗受限制设备能够连接网络,所以本章试图在Contiki操作系统的支持下实现一个完整的CoAP应用。本章的主要内容包括:

·SensorTag简介。

·Contiki操作系统的基本使用方法。

·纯IPv6终端节点如何访问IPv4应用。

·SensorTag实现CoAP客户端,并向CoAP服务器推送传感器数据。

经过本章的学习,我们将完成一个较为完整的物联网系统。相比于Web开发,嵌入式设备的开发要更加复杂一些,开发过程的步骤也更多一些,所以对本章的学习需要很大的耐心。

10.2 设备与网络结构说明

10.2.1 设备说明

除了在其他章节多次出现的树莓派之外,本例中还使用了另外两个设备:SensorTag/CC2650和CC2538。SensorTag是德州仪器推出的CC2650开发套件,该套件具有多种不同的传感器,其核心MCU为CC2650。而CC2650是新一代无线SoC,同时具有BLE和IEEE 802.15.4两种无线传输功能,SensorTag是本例的“主角”。

更多关于SensorTag和CC2650的内容请参考德州仪器官方网站:

·SensorTag:http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User's_Guide

·CC2650:http://www.ti.com.cn/product/cn/CC2650

除了“主角”SensorTag之外,本例还包括它的“好帮手”CC2538。CC2538是一款符合IEEE 802.15.4标准的无线SoC,虽然与CC2650型号不同,但在2.4G频段中两者可以进行正常的无线通信。CC2538DK是德州仪器推出的CC2538开发套件之一,但是随着CC2538的流行也可以在其他平台购买到与CC2538DK兼容的CC2538开发套件。

更多关于CC2538和CC2538DK的内容请参考德州仪器官方网站:

·CC2538:http://www.ti.com.cn/product/cn/CC2538

·CC2538DK:http://www.ti.com.cn/tool/cn/cc2538dk

SensorTag与CC2538开发板的实际外观如图10-1所示,CC2538开发板与德州仪器推出的CC2538DK保持兼容。

图10-1 SensorTag与CC2538外观

1.SensorTag/CC2650

本章示例中并没有使用SensorTag的所有功能,而仅使用了SensorTag中的温湿度传感器HDC1000、光照传感器OPT3001和UART、LED、按键等基本功能。其中SensorTag的UART功能主要用于调试,LED将指示SensorTag工作状态,按键功能将触发SensorTag执行具体工作,SensorTag的交互能力非常有限,但是对于一个物联网设备来说这些已经足够了。关于HDC1000和OPT3001这两个传感器的更多内容请参考德州仪器官方网站:

·HDC1000:http://www.ti.com.cn/product/cn/HDC1000

·OPT3001:http://www.ti.com.cn/product/cn/OPT3001

SensorTag/CC2650的结构示意图如图10-2所示。

图10-2 SensorTag/CC2650结构示意图

2.CC2538开发板

与SensorTag相似,CC2538开发板也具有多种功能,但是本章示例中CC2538仅作为Slip-Radio使用,也就是说本例仅使用了CC2538的无线功能和串口功能,CC2538将作为SensorTag连接传统网络的重要“桥梁”。CC2538开发板的结构示意图如图10-3所示。

图10-3 CC2538DK结构示意图

10.2 设备与网络结构说明

10.2.1 设备说明

除了在其他章节多次出现的树莓派之外,本例中还使用了另外两个设备:SensorTag/CC2650和CC2538。SensorTag是德州仪器推出的CC2650开发套件,该套件具有多种不同的传感器,其核心MCU为CC2650。而CC2650是新一代无线SoC,同时具有BLE和IEEE 802.15.4两种无线传输功能,SensorTag是本例的“主角”。

更多关于SensorTag和CC2650的内容请参考德州仪器官方网站:

·SensorTag:http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User's_Guide

·CC2650:http://www.ti.com.cn/product/cn/CC2650

除了“主角”SensorTag之外,本例还包括它的“好帮手”CC2538。CC2538是一款符合IEEE 802.15.4标准的无线SoC,虽然与CC2650型号不同,但在2.4G频段中两者可以进行正常的无线通信。CC2538DK是德州仪器推出的CC2538开发套件之一,但是随着CC2538的流行也可以在其他平台购买到与CC2538DK兼容的CC2538开发套件。

更多关于CC2538和CC2538DK的内容请参考德州仪器官方网站:

·CC2538:http://www.ti.com.cn/product/cn/CC2538

·CC2538DK:http://www.ti.com.cn/tool/cn/cc2538dk

SensorTag与CC2538开发板的实际外观如图10-1所示,CC2538开发板与德州仪器推出的CC2538DK保持兼容。

图10-1 SensorTag与CC2538外观

1.SensorTag/CC2650

本章示例中并没有使用SensorTag的所有功能,而仅使用了SensorTag中的温湿度传感器HDC1000、光照传感器OPT3001和UART、LED、按键等基本功能。其中SensorTag的UART功能主要用于调试,LED将指示SensorTag工作状态,按键功能将触发SensorTag执行具体工作,SensorTag的交互能力非常有限,但是对于一个物联网设备来说这些已经足够了。关于HDC1000和OPT3001这两个传感器的更多内容请参考德州仪器官方网站:

·HDC1000:http://www.ti.com.cn/product/cn/HDC1000

·OPT3001:http://www.ti.com.cn/product/cn/OPT3001

SensorTag/CC2650的结构示意图如图10-2所示。

图10-2 SensorTag/CC2650结构示意图

2.CC2538开发板

与SensorTag相似,CC2538开发板也具有多种功能,但是本章示例中CC2538仅作为Slip-Radio使用,也就是说本例仅使用了CC2538的无线功能和串口功能,CC2538将作为SensorTag连接传统网络的重要“桥梁”。CC2538开发板的结构示意图如图10-3所示。

图10-3 CC2538DK结构示意图

10.2.2 网络结构说明

本章的示例中至少包括三个主要设备:SensorTag、CC2538和树莓派。其中SensorTag作为CoAP客户端,SensorTag与专用下载器XDS110相连,XDS110不但可以下载固件至SensorTag中,还可以与SensorTag/CC2650的串口相连,以便在PC中虚拟一个串口设备,通过该串口设备可以方便地查看SensorTag/CC2650的运行情况;另外CC2538将作为Slip-Radio,把经过6LoWPAN压缩的IPv6数据包变为Slip串行数据并通过自身串口传输至树莓派中,由于并没有直接使用树莓派中的物理串口,所以CC2538通过一个USB转串口设备插入树莓派USB端口中,对树莓派来说CC2538是一个名为ttyUSB0的串行设备。

本例中树莓派作为边界路由。在6LoWPAN/IPv6低功耗网络中边界路由的职责与WiFi网络中的路由器非常相似,树莓派把从CC2538获取的无线数据包注入Linux操作系统的网络层,由于SensorTag是一个纯IPv6节点,不能直接访问IPv4应用,所以需要在树莓派中增加一个NAT64网关,通过该网关进行IPv6数据包和IPv4数据包的双向转换。

最后,IPv4地址为192.168.0.3的主机将作为Web和CoAP服务器,在该主机中运行微型物联网系统的Web服务和CoAP服务。本章示例的网络详细结构如图10-4所示。

图10-4 网络结构示意图

10.3 Contiki入门

与其他嵌入式开发不同,Contiki所支持平台的开发工作一般在Linux下进行,常用的Linux发行版如Ubuntu、Debian和Deepin等均可进行Contiki开发。为了简化Contiki的学习门槛,Contiki开发团队提供了一套集成开发环境——Instant Contiki。Instant Contiki是一套已经安装好各种依赖包和工具链的Ubuntu 14.04虚拟机,不需要任何配置便可进行Contiki开发。在Instant Contiki中已经预装了ARM-Cortex M3和MSP430的交叉工具链。Instant Contiki的更多信息请参考Contiki官方网站www.contiki-os.org。

除了Instant Contiki集成开发环境之外,其他Linux发行版也可以进行Contiki开发。在这种情况下用户需要手动安装各种依赖工具和交叉工具链,依赖工具包括curl、git、wget和gcc等,交叉工具链包括gcc-arm-none-eabi和gcc-msp430等。

10.3.1 Contiki初步

下面通过一个完整的“Hello Contiki”示例说明如何在Instant Contiki 3.0中进行Contiki开发工作。本小节的相关步骤也可以在其他Linux发行版中实现。

1.使用Instant Contiki虚拟机

本节使用Contiki团队提供的Instant Contiki 3.0。Instant Contiki是一套基于Ubuntu 14.04的32位虚拟机,为了运行Instant Contiki虚拟机需要在Windows中安装虚拟机软件,常见的虚拟机软件包括VMware Workstation Player、VisualBox和Visual PC等。

实验环境说明如下:

·宿主机:Windows 10

·虚拟机软件:VMware Workstation Player 12.0

·Linux发行版:Instant Contiki 3.0(Ubuntu 14.04 LTS)

打开VMware Workstation 12 Player之后,在开始界面的左侧选择Instant Contiki 3.0,在开始界面的右下角选择“播放虚拟机”。进入Instant Contiki之后需要输入user用户的登录密码,默认情况下Instant Contiki的默认用户为user,登录密码为user。进入Instant Contiki的具体操作过程如图10-5和图10-6所示。

图10-5 选择Instant Contiki虚拟机

2.获取Contiki源代码

在Instant Contiki 3.0中已经预装了Contiki的源代码,但该部分代码并不是最新代码,Contiki源代码位于user用户目录下的contiki文件夹中。若需要与Contiki代码仓库master分支同步,可进入Contiki目录后输入git pull origin以获取最新代码,具体操作如下:

图10-6 Instant Contiki登录界面

# 进入Contiki源代码目录cd ~/contiki

# 拉取最新源代码git pull origin

另外使用git clone指令也可以获取最新的Contiki源代码。

# 复制Contiki源代码到用户目录

cd ~

# 获取Contiki源代码

git clone https://github.com/contiki-os/contiki.git # 获取子模块

git submodule update –init

3.Contiki相关子模块

Contiki代码仓库除了包括Contiki本身之外,还包括多个子模块。这些子模块需要使用git submodule指令初始化并更新。Contiki的相关子模块包括:

·mspsim:MSP430软件仿真组件,该子模块是Contiki仿真环境Cooja的必要组件。

·cc2538-bsl:CC2538平台串口bootload工具,该工具使用Python开发。cc2538-bsl除了适用于CC2538平台之外,也适用CC2630和CC1310等SoC。

·cc26xxware/cc13xx ware:CC2650和CC1310外设驱动库。该子模块是CC2650和CC1310开发的必要组件。

4.Contiki源代码结构

Contiki源代码包含多个目录,这些目录包括apps(应用组件)、core(核心代码)、cpu(移植与驱动)、platform(平台实现)、examples(基础示例)和tools(实用工具)等。Contiki的源代码结构如图10-7所示。

图10-7 Contiki源代码结构

(1)apps

apps文件夹包含Contiki扩展组件,这些组件包括:

·antelope组件,适用于嵌入式设备的超精简型数据库系统,可在嵌入式Flash文件系统的支持下实现简单的增删改查功能。

·er-coap组件和rest-engine组件,该组件同时支持CoAP客户端和服务器功能,与CoAP有关的组件还包括ipso-object[1]组件和oma-lwm2m[2]组件。

·shell和serial-shell组件,该组件可实现简单的串口控制台功能,shell组件提供诸如设备重启、base64处理和CRC计算等基础功能,除了这些基础功能之外,用户还可以根据需要增加自定义功能。

·webserver组件,该组件提供一个非常简单的Web功能,该组件可以帮助设备实现一些简单的预定义网页。

(2)core

core文件夹包含Contiki的所有核心代码,这些核心功能代码包括:

·protothread任务调度功能,Contiki采用事件触发机制,其核心为protothread任务调度机制,该机制和多数抢占式的操作系统存在明显区别,在protothread机制下任务没有私有堆栈,任务进行切换时操作系统仅保留C文件中的行号作为上下文切换的依据,protothread的实现部分位于sys目录中。

·网络功能,Contiki网络功能包括精简的IPv4和IPv6协议栈,支持UDP、TCP和部分HTTP功能,与其他具备IP功能的嵌入式操作系统不同,Contiki网络部分还包括低功耗无线传感网相关的IEEE

802.15.4支持层、6LoWPAN头压缩层和RPL[3]路由功能等;

·cfs文件系统,cfs文件系统也是Contiki操作系统的一部分,该文件系统可在CPU内部的Flash中创建和使用,在cfs文件系统的帮助下嵌入式设备可以方便地保存数据或读取历史记录。

(3)cpu

Contiki支持的CPU种类较多并且依然在不断扩充,Contiki支持的CPU包括STM32F 152系列、CC2538系列、CC1310/CC2650系列、MSP430F1/F2/F5系列、nRF52系列。Contiki操作系统完全由C语言实现并不包括任何汇编代码,简单来说Contiki操作系统仅需实现一个系统时钟便可完成移植,对于绝大多数ARM-Cortex CPU而言,Systick时钟是一个非常合适的系统时间载体。总而言之,Contiki操作系统几乎可以移植到任何CPU中。cpu目录中有一个特殊的cpu——native,该cpu可以理解为把Contiki操作系统“移植”到Linux系统中,那么Contiki的部分功能也可以在Linux平台下实现并验证。

(4)platform

platform文件夹包含Contiki操作系统所支持的各类平台,这些平台包括CC2538DK平台、SRF06-CC26xx(CC1310/CC2650)平台,STM32 NUCLEO平台等。在CPU移植的基础上,这些平台还增加了各种外设、传感器和执行器。每个平台下都包含contiki-main.c和contiki-conf.h,contiki-main.c中包含main函数,实现了绝大多数初始化工作,如操作系统初始化、网络组件初始化、辅助功能初始化和低功耗实现等功能,在platform的帮助下用户仅需要关心具体功能实现便可;contiki-conf.h包含与平台相关的默认Contiki配置,熟悉Contiki的所有配置并不是一件容易的事情。用户也可以参考相似的平台创建符合自身要求的platform。

(5)examples

examples文件夹包括大量基础示例,这些示例包括不同平台下的UDP客户端服务器示例、传感器示例、任务调度示例、定时器组件(etimer、ctimer和rtimer)示例;除了具体平台的示例之外,examples平台还包括边界路由示例、Slip-Radio示例等实用功能。

(6)tools

tools文件夹中包含很多使用Contiki过程中的实用工具,这些实用工具包括:

·CC2538-bsl工具:使用该工具可以通过串口下载固件,CC2538-bsl支持CC2538、CC2650和CC1310等。

·cooja仿真工具:cooja仿真工具是Contiki的一个特色工具,借助该工具可以在纯软件环境下模拟无线传感网络,cooja仿真工具既可支持多个终端节点,也可以支持边界路由,但cooja仿真工具仅支持MSP430相关平台。并不能仿真ARM Cortex系列平台。

·tools目录中tunslip6是一个常用工具,在Contiki应用系统中低功耗无线传感网络一般存在一个边界路由,该边界路由实现RPL Root功能,该路由设备将把低功耗传感网中需要转发的IP数据包重新组装为slip格式并通过串口发送至Linux主机,tunslip6工具侦听指定的串口,并把需要转发的IPv6数据包注入到Linux网络层驱动中。

(7)makefile.include

makefile.include是Contiki的核心makefile文件,阅读或学习makefile.include的细节可不是一件容易的事情。

[1] https://www.ipso-alliance.org/。[2 ] http://openmobilealliance.org/iot/。

[3] https://datatracker.ietf.org/doc/rfc6550/。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容