物联网IoT协议之NB-IoT/CoAP快速入门教程
转载请注明 作者:源码先生, 文章链接:https://www.debugself.com/2019/12/17/nb_iot_guide/, 请勿用于商业用途
关注我,获取更多物联网IoT+云原生的技术分享。
八大物联网IoT上云协议快速入门教程
物联网IoT协议之mqtt快速入门教程
物联网IoT协议之OPC UA快速入门教程
物联网IoT协议之 LoRaWAN快速入门教程
物联网IoT协议之NB-IoT/CoAP快速入门教程
物联网IoT上云协议之Modbus快速入门教程
IPv6快速入门教程
物联网IoT协议之6LoWPAN快速入门教程
物联网IoT协议之HTTP快速入门教程
车联网V2X快速入门教程
物联网IoT协议之NB-IoT/CoAP快速入门教程
什么是NB-IoT
如果说NB-IoT是窄带物联网,再来个NB-IoT的部署图,可能直接把入门者弄懵,其实NB-IoT是一个比较容易理解的技术,来,直接上图。
没错,这就是地球人都知道的SIM卡,简单的说,NB-IoT就是低配版的2G/3G/4G/5G,他们有很多相似之处:
- 使用运营商的基站通信,得给运营商交月租或者流量费
- 可以发短信
- 可以上网
但是NB-IoT卡不支持语音通话,毕竟是“窄带物联网”,速率比较慢,NB-IoT最高速率也就250kbps,和5G相比,只能说是丐版5G了。
使用NB-IoT替代2G
实际上,NB-IoT使用的通信频段就是2G的通信频段。
从上图可以看到,电信的NB-IoT频段全部集中在870-885MHz,这个频段就是之前电信的2G频段,电信2G用户很少,所以电信的2G直接全部退网了,把所有2G频段都转给NB-IoT使用了;电信的NB-IoT通信频段比移动和联通都有优势,因为通信频率越低,信号衰减越小,传输距离越远,基站部署成本越低;不过电信比较任性,使用电信的NB-IoT卡,必须绑定电信的IoT云平台,使用不太方便。移动由于2G用户较多,全部退网2G影响比较大,移动只能把部分2G频段转给NB-IoT,还有部分频段继续用在2G。随着将来2G全部退网,NB-IoT会全面替换2G。
NB-IoT的特点和使用场景
NB-IoT能全面替换2G,那一定有过人之处了。NB-IoT是为了适用物联网需求专门定制的,相比2G,NB-IoT具有以下特点:
- 低功耗:物联网很多设备只能电池供电,更喜欢低功耗,下文会进一步说明NB-IoT是如何实现低功耗的;
- 低速率:速率高了耗电高,为了低功耗,只能牺牲点速率了;
- 大连接:当前2G/3G/4G网络,单个基站能够接入的手机终端个数其实并不多,在人多的密集场合,还是会出现手机没有信号的情况(不要说自己没遇到过,那是因为人还不够多)。物联网的特点之一是设备数量巨多,而NB-IoT设计的目标就是海量连接,NB-IoT能够实现海量连接不是因为NB-IoT的技术有多NB,而是利用了物联网设备很多时候都在休眠的特性,休眠的设备根本就没占用连接嘛;
- 低成本:NB-IoT整个生态,包括NB-IoT模组,NB-IoT流量收费,NB-IoT基站都是奔着低成本设计的;
- 强覆盖:NB-IoT信号覆盖比2G强,别问为什么强,问就是源码先生也不太懂。
基于NB-IoT以上特点,NB-IoT比较适合节点数量多,但传送数据量不大,功耗低(电池供电)的场景,比如路灯、水表,烟感,共享单车等;当然供电不是问题的场景,使用NB-IoT也是可以的,还可以获得更好的实时性。
NB-IoT之Hello World
使用NB-IoT,主要就是使用它上网的功能,也就是TCP/UDP通信。这里的Hello World是实现NB-IoT的UDP通信,即NB-IoT作为UDP客户端,发送数据到UDP服务器,并接收服务器返回的消息,准备材料如下
- NB-IoT模组一个(BC28模组)
- NB-IoT卡一张(移动的卡)
- 本地PC电脑一台+串口调试软件
- USB转串口(TTL)线
- 具有公网IP的电脑一台(阿里云ECS)
把NB-IoT卡插入NB-IoT模组
然后通过AT操作/控制NB-IoT模组(AT指令是以回车结尾的字符串,大多数通信模组如NB-IoT模组、4G模组都支持以AT指令的方式操作模组);PC机通过USB转串口(TTL)连接NB-IoT模组的RX、TX、GND引脚,在PC运行“串口调试软件”打开COM口,可以发送AT指令给NB-IoT模组。
因为NB-IoT使用的是运营商的网络,运营商的网络是公网访问的,所以必须建立公网UDP服务器才行。这里用阿里云ECS服务器(Ubuntu系统),在服务器运行如下命令可以建立UDP服务器。
1 | nc -v -l -u 20000 #启动UDP服务器,端口20000 |
BC28模组建立UDP套接字,并上报数据到UDP服务器的AT指令如下
1 | AT+QREGSWT=2 //Disable registration function of Huawei’s IoT platform |
在服务器的nc命令中,可以看到收到来自NB-IoT的Hello字符串;
服务器下行数据给NB-IoT设备,在nc命令行手动输入”World”并回车
NB-IoT模组会实时收到服务器的回应
1 | +NSONMI:1,5 //串口调试工具会自动显示收到服务器的回应 |
输入AT指令读取服务器回应的内容
1 | AT+NSORF=1,5 //Read the message |
NB-IoT低功耗的实现原理
所谓的低功耗,本质都是靠通信模组的休眠实现的,因为休眠时基本是不耗电的,LoRaWAN、NB-IoT莫不如此。NB-IoT有三种模式支持不同的场景:
PSM(Power Saving Mode),即省电模式
PSM模式NB-IoT模组处于休眠状态,当设备没有数据要发送时,模组自动进入PSM状态;当设备有数据要发送时,模组自动退出PSM状态,然后执行发送任务,发送完毕后再自动进入PSM状态。PSM模式下,模组需要配置的关键参数有:
- Active-Time:当模组发送数据完毕,经过Active-Time时间后,模组自动进入PSM状态;Active-Time可取值范围0-1860秒;
- Periodic-TAU:Periodic tracking area updating是基站/运营商核心网要求的NB-IoT周期上报的数据包,类似心跳包,如果NB-IoT设备长久休眠且不上报数据,移动核心网就无法知道NB-IoT设备的状态了,所以基站/运营商核心网要求NB-IoT设备每隔TAU时间,必须上报依次自己的状态。3GPP协议规定Periodic-TAU默认为54min,最大可达310hr。
Active-Time和Periodic-TAU这两个参数,完全由NB-IoT设备自行配置吗?不是,这两个值是设备端和运营商核心网协商决定的,一般是NB-IoT设备先上报自己期望的Active-Time和Periodic-TAU值给核心网,核心网再根据当前网络整体状况权衡,并下发最终的Active-Time和Periodic-TAU给NB-IoT设备。
PSM模式下,有以下要点:
- 当设备进入PSM状态,无法接收服务器下行的数据,所以PSM模式只适用于设备主动上报数据的场景(如水表电表),不适用于服务端实时控制设备的场景(如共享单车)
- 设备上报数据后的Active-Time时间内,可以认为设备处于连接状态,此时服务器下发数据给设备,设备是可以接收到的
- 设备建立TCP连接后进入PSM状态,TCP连接依旧不会失效,下次发送TCP数据时,不需要手动再次建立TCP连接,可以直接发送TCP数据,这是因为虽然设备进入PSM状态,但是核心网依然保存着TCP连接所有的上下文数据
- 当设备处于PSM状态时,如果要上报数据,可以直接使用AT命令发送数据,模组会自动退出PSM,不需要手动发送“激活”指令
DRX(Discontinuous Reception)模式
DRX模式下,NB-IoT设备每隔DRX周期会主动监听一次寻呼信道,检查是否有下行业务到达,而且DRX周期比较短(取值范围为:1.28s,2.56s,5.12s 或者10.24s),所以DRX模式下的设备可以实时接收服务器下发的命令。由于NB-IoT模组需要不停监听寻呼,这种模式比较耗电。
DRX周期一般由运营商核心网决定,核心网会下发DRX周期给NB-IoT设备,设备按照DRX周期监听寻呼即可。
eDRX(extended DRX)模式
eDRX是DRX模式的扩展,它是PSM和DRX的组合,兼顾低功耗和实时性。
如上图,每个eDRX的周期的开始时候,有一个PTW(寻呼时间窗口),在PTW时间内,设备处于同DRX一样的模式,超过PTW时间内,设备处于同PSM一样的模式。
另外,运营商核心网在PTW窗口外接收到下行数据包,会缓存数据包(对每个设备只能缓存一条),进入PTW时间窗口内时再转发数据包给NB-IoT设备。
NB-IoT常用的应用层协议CoAP
前面的Hello World简单演示了NB-IoT使用UDP通信的流程,但是基于原生的UDP构建应用程序会很麻烦,一般还需要定义应用层协议,NB-IoT常用的应用层协议是CoAP(官网:https://coap.technology)。CoAP(Constrained Application Protocol)按照字面理解,这是专门为资源受限的IoT设备定制得应用层协议,它的传输层默认使用UDP,UDP比TCP更省资源,且IoT设备休眠后会影响TCP的长连接,UDP更适合IoT场景。
CoAP和HTTP有很多相似之处,比如访问资源的URI和大家熟知的网址格式一致:
1 | coap-URI = "coap:" "//" host [ ":" port ] path-abempty [ "?" query ] |
CoAP也使用请求/应答的通信模式:客户端发送一个请求,服务器返回一个响应。
1 | Client Server |
CoAP的消息格式如下
上图中0xFF之前为CoAP的头部(对应HTTP的头部),中0xFF之后的Payload是要上传的数据(对应的HTTP的Body)。CoAP也使用HTTP REST风格的接口,预定义了4种请求:
- GET方法——用于获得某资源
- POST方法——用于创建某资源
- PUT方法——用于更新某资源
- DELETE方法——用于删除某资源
CoAP的细节请阅读标准文档(https://tools.ietf.org/html/rfc7252),**按照HTTP的思路理解CoAP即可**。
不少NB-IoT模组内置了CoAP协议,这样通过AT指令就可以直接完成CoAP交互了。