打开主菜单

谷雨文档中心 β

NB200软件设计手册

Ghostyu讨论 | 贡献2019年2月17日 (日) 02:36的版本 CoAP发送和接收数据

本文档描述NB200的软件操作,即BC28的常用指令操作:模块初始化到数据通信。

有关NB200的硬件描述,请阅读《NB200硬件设计手册》[手册 1]

关于BC28的详细指令手册,请阅读移远官方指令手册。

目录

1 准备工作

在实际生产环境中,一般使用MCU的UART发送AT指令与NB模块交互。这里为了方便演示和讲解,我们使用电脑来的虚拟串口来与NB模块通信。

1、对NB-IOT技术有一定的了解

2、准备以下硬件:

  • NB200小系统模块
  • NB网络SIM卡(电信或者移动)
  • NB天线(电信850MHz,移动900MHz)
  • 串口转USB模块(任意的UART转USB模块,并安装好相应的驱动程序)

3、准备以下软件:

  • 串口调试助手(例如SSCOM,XShell等)。用于手动向模块发送AT指令。
  • 谷雨NBTool调试软件。图形化快速测试,自动向模块发送相关AT指令。

2 NB-IOT基础知识

NB-IoT (Narrow Band Internet of Things)是可与蜂窝网融合演进的低成本电信级高可靠性、高安全性广域物联网技术。 NB-IoT 构建于蜂窝网络之上,只消耗约 180 KHz 的频段,可以直接部署于 GSM 网络,UMTS 网络和 LTE 网络。 NB-IoT 采用的是授权频带技术,以降低成本。

NB-IoT 具有四大优势:

  • 海量链接的能力,在同一基站的情况下, NB-IoT 可以比现有无线技术提供 50~100 倍的接入数。一个扇区能够支持10 万个连接,设备成本降低,设备功耗降低,网络架构得到优化。
  • 覆盖广,在同样的频段下, NB-IoT比现有的网络增益提升了 20 dB,相当于提升了 100 倍的覆盖面积。
  • 低功耗, NB-IoT借助 PSM (Power Saving Mode,节电模式)和 eDRX (Extended Discontinuous Reception,超长非连续接收)可实现更长待机,它的终端模块待机时间可长达 10 年之久。
  • 低成本,NB-IOT不需要重新建网,射频和天线都是可以复用的,模块价格最终不会超过 5 美元。

关于NB-IOT的更多介绍请阅读《NB-IOT技术揭秘》[手册 2]

3 物联网云平台

NB-IOT是运营商网络,没有局域网的概念,只能访问有固定IP的服务器。并且为了凸显NB-IOT的低功耗、多链接等优点,需要一个将核心网与终端深度融合(利用终端的通信特点实现免心跳等机制)的物联网平台作为设备网关,用户只需要自建应用服务器,专注上层的应用开发,设备的连接和管理工作全部交给平台来完成。平台负责应用服务器和设备之间的数据转发工作。华为电信平台利用自身技术优势实现的免心跳等机制,这是自建服务器无法实现的。

与NB-IOT终端深度融合的平台有:

  • 华为OceanConnect
  • 电信物联网平台

电信物联网平台是华为OceanConnect的NB-IOT网络独立版本,两大平台的对接工作完全相同。学习其中任何一个接口。

但是,华为和电信物联网平台需要申请账号才能使用,接入流程较为复杂,无形之中增加了NB-IOT入门门槛。

为了让大家快速的了解和测试NB-IOT,我们开发了谷雨云透传平台,开箱即用,NB设备可直连,也可经过电信华为平台转接。下文我们将使用谷雨的云透传平台来完成NB终端的快速测试。

4 模块硬件准备

首先连接NB200与USB转串口模块,最小连接仅需:GND,VDD(5V),TXD(BC28的UART串口发送,对应MCU或者PC的接收),RXD(BC28的UART串口接收,对应MCU或者PC的发送),其他引脚保持悬空。有关更详细的硬件接口说明,请参考《NB200硬件设计手册》[手册 1]

然后打开串口调试助手软件,选择对应的串口号,设置串口参数:9600,无校验,8位数据位,1位停止位,最后打开串口。

随即接通NB200的电源(VDD可断开重连),可以看到串口调试助手中打印下面两行。如果全部显示乱码,请检查波特率是否为9600,若没有任何内容输出请检查串口线TX和RX是否反接等。

Neul 
OK

在串口调试助手中发送字符串:AT,模块随即返回:OK,如下图所示,发送数据时务必勾选:加回车换行符。否则模块不会响应。

 

5 附着网络

附着网络是指模块连接到基站并注册网络。只有当网络附着成功后,才可以进行网络通信。

一般块默认设置是自动附着网络。也就是不需要任何指令操作,可以参考下面的指令来确认是否已成功附着到网络。

5.1 查询模块功能状态

发送指令:

AT+CFUN?

模块返回:

+CFUN:0

OK

+CFUN:0表示模块功能未打开,若返回:+CFUN:1则表示射频已打开。

类似查看手机是否处于处于飞行或关机状态。0表示模块处于最低功能状态,功耗很小,可用的指令和功能也很少。

5.2 开启模块功能

发送指令:

AT+CFUN=1

等待大约4秒左右,模块返回:

OK

此时表示模块功能已打开,可以继续后续指令。注意在AT+CFUN未返回前请勿执行其他指令。

注意,若该指令返回错误ERROR,表示没有检测到SIM卡,多数是因为SIM卡未插入或者插反。NB200使用的是Micro类型的卡槽,SIM卡插入时,注意卡缺口朝外。

5.3 查询SIM卡的ICCID码

ICCID是集成电路卡识别码:Integrate Circuit Card Identity的首字母缩写,该号码可以在SIM卡的背面看到。

发送指令:

AT+NCCID

模块返回:

+NCCID:89860317492045357506

OK

5.4 查询当前频段

BC28支持多频段,查询当前频段设置的命令如下

AT+NBAND?

模块返回:

+NBAND:5
 
OK

+NBAND格式如下:+NBAND:<band>字段的含义为:

参数 说明
<band> 网络频段:

5:表示B5,中国电信使用该频段

8:表示B8,中国移动使用该频段

有关完整的频段说明,请阅读NB200硬件手册

5.5 设置频段(可选)

BC28支持多频段,需要手动设置当前使用的网络频段,例如设置B8频段的命令如下

AT+NBAND=8

模块返回:

OK

设置格式为:AT+NBAND=<band>

参数 说明
<band> 网络频段:

5:表示B5,中国电信使用该频段

8:表示B8,中国移动使用该频段

有关完整的频段说明,请阅读NB200硬件手册

注意:1、BC28模块最新的固件会根据当前SIM卡自动搜索网络,无需手动设置频段,因此请忽略该步骤。2、若手动修改,则在修改频段后,先发送AT+CFUN=0关闭射频,然后在发送AT+CFUN=1重新打开射频。否则可能无法正常使用网络。

5.6 查询当前信号

信号的强弱直接影响网络通信的质量,可以使用AT+CSQ来查询当前信号值。一般要求CSQ值大于5方可正常工作。

发送指令:

AT+CSQ

模块返回:

+CSQ:25,99

OK

+CSQ格式如下:+CSQ:<rssi>,<ber>,字段的含义为:

参数 说明
<rssi> 99:表示网络未知,或者网络未附着。如果模块关闭了自动附着功能,需要激活模块网络。才能获取到正确的信号值。

0 :表示信号质量为-113dBm或者以下,信号非常差

1 :表示信号质量为-111dBm

2~30:对应信号值为-109dBm到-53dBm。

31:对应信号值为-51dBm或者更高。

<ber> 字段未使用,恒等于99。
Tips:CSQ中的rssi与dBm换算公式如下:dBm = rssi*2 – 113,例如,当rssi等于30时,对应dBm为-53dBm

5.7 查询网络是否激活

该功能类似手机上的打开或关闭4G网络功能,网络激活后后方可网络通信。

发送指令

AT+CGATT?

模块返回:

+CGATT:1

OK

参数:

0:表示网络未激活,

1:表示网络已激活。

5.8 激活网络

打开模块的网络功能,为后面的socket网络通信做准备

发送指令:

AT+CGATT=1

模块返回:

OK

5.9 查询网络是否已注册

发送指令

AT+CEREG?

模块返回:

+CEREG:0,1

OK

返回格式为:+CEREG:<n>,<stat>

参数 说明
<n> 该命令通知设置。

0:表示网络注册状态变化时,不会主动发送+CEREG通知,用户发送查询命令时才会返回。

1:表示网络注册状态变化时,模块会主动下发+CEREG通知。

<stat> 网络注册状态

0:表示模块未注册到网络

1:表示模块已注册到网络

2:表示正在注册网络,请等待注册完成。

以上指令,我们已完成网络的附着操作,接下来可以使用CoAP和UDP协议收发数据了。

6 设置网络变化通知

当模块网络发生变化时,我们需要模块主动上报当前的网络状态,发送以下指令实现该功能。

发送指令

AT+CEREG=1

模块返回:

OK

此时,我们可以简单测试一下该功能。例如,关闭模块网络然后重新打开,如下:

#发送指令关闭网络
AT+CGATT=0
#模块返回
OK

#大概1s左右,模块主动通知
+CEREG=0

#再次打开网络
AT+CGATT=1
#模块立即返回
OK

#然后随即主动通知正在注册网络:
+CEREG:2

#最后再次通知注册成功(注册网络需要一定的时间,不同地区时间不同,从几秒到几分钟均有可能):
+CEREG:1

7 自动入网设置

自动入网是指模块上电后,自动完成网络附着动作,无需执行任何指令。可以按照下面的方法来开启或关闭自动入网。

7.1 开启自动入网

模块出厂时,已配置为自动入网

发送指令

AT+NCONFIG=AUTOCONNECT,TRUE

模块返回:

OK

设置完后发送AT+CFUN=1打开设备功能,最后发送重启命令AT+NRB,重启模块即可生效。重启后,模块返回:

REBOOTING
REBOOT_CAUSE_APPLICATION_AT
Neul 
OK

7.2 关闭自动入网

自动附着网络功能会消耗更多的电量,如果考虑功耗问题,建议在使用的时候再连接网络。只要关闭自动连接和射频功能即可。

发送指令

AT+NCONFIG=AUTOCONNECT,FALSE

模块返回:

OK

然后再发送AT+CFUN=0,关闭射频功能,发送重启命令AT+NRB后生效。

8 使用UDP协议通信

BC28支持UDP协议通信,UDP协议具有资源开销小,速度快等特点,并且不需要维持链接,非常适合低功耗设备的数据传输。

在数据通信之前,务必使模块附着到网络,请发送查询命令确认网络附着状态:AT+CEREG? 应当返回 +CEREG:0,1 或 +CEREG:1,1
由于电信公司政策(移动公司无此限制),使用电信NB卡若要访问私有服务器IP,必须将私有IP添加到SIM卡的白名单中(也就是绑定IP),例如从我们这购买的SIM卡已经绑定了我们的服务器IP:115.29.240.46

使用AT+NPING指令来测通,检查是否能够与目标服务器IP通信。 发送指令

AT+NPING=115.29.240.46

模块立刻返回:

OK

然后随即返回:

+NPING:115.29.240.46,53,488

返回格式为:+NPING:<remote_address>,<ttl>

参数 说明
<remote_address> 目标ip地址
<ttl> 数据包生存时间,请看百科介绍。

发生错误时,返回:+NPINGERR:<err>

参数 说明
<err> 错误码

1:远程主机有效时间内未响应。

2:发送PING请求失败。

所以当返回:+NPINGERR:1时,很可能是该IP地址未绑定到SIM卡(电信卡有这个限制)。无法进行后续通信测试。

另外值得注意的是,电信的SIM卡虽然已绑定了该某个IP地址,会仍然无法PING成功,但不影响通信。

8.1 创建UDP通信Socket

在使用模块网络收发数据之前,需要先创建一个socket,并且知道对方ip和端口号后才能发送数据。

发送如下命令创建UDP Socket

AT+NSOCR=DGRAM,17,4587,1

模块返回:

0
OK

创建socket的指令格式为:

AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]

参数 说明
<type> Socket类型,取值为DGRAM
<protocol> Socket通信协议,UDP协议号是17,因此取值为17
<listen-port> 本地监听端口,不是远程UDP-Server的端口。示例中取值4587。BC28模块支持创建7路UDP Socket,再次创建socket,注意本地端口取值不要重复,其他情况对本地端口的取值没有任何要求。

返回格式为:

<socket-id>

OK

刚刚创建了第一个UDP Socket,因此socket-id为0,模块数据收发均要使用此处返回的socket-id,请牢记。

8.2 UDP发送和接收数据

我们需要在服务器(固定IP)上先创建一个UDP Server,指定一个端口来监听模块发来的消息。

为了快速测试,我们在谷雨服务器上,创建了一个UDP Server ,固定IP:115.29.240.46,端口号:5000,该Server收到UDP Client发来的数据时,会在已收到的数据加上前缀:"iotxx:",然后延时5s后发回到UDP Client中。

例如客户端发送字符串"123", 等待5s后,会收到字符串 "iotxx:123"

发送数据的命令如下:

AT+NSOST=0,115.29.240.46,5000,3,313233

模块立刻返回:

0,3

OK

发送数据指令格式为:AT+NSOST=<socket-id>,<remote_addr>,<remote_port>, <length>,<data>

参数 说明
<socket-id> 刚刚创建的UDP通信socket编号,从0开始,若创建了两个UDP的socket,则第一个为id编号0,第二个id编号为1
<remote_addr>,<remote_port> 远程服务器IP地址和端口,例如我们的NB云平台IP地址为:115.29.240.46,端口为:5000
<length>,<data> 待发送的数据长度和数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,length为:3

模块返回格式:<socket-id>,<length>

参数 说明
<socket-id> UDP通信socket编号
<length> 是已发送的数据长度。

例如返回:0,3,则表示,Socket 0通道发送了3个字节数据。此时表明,模块已经成功将数据发送了出去。 接下来演示模块接收来自服务器的数据(我们服务器5000端口收到客户端发送的数据后,等待5秒,然后原样回传)。等待大约5秒后,模块会异步命令通知:

+NSONMI:0,9

格式为:+NSONMI:<socket-id>,<length>

+NSONMI:0,9 表示在通道0,接收到长度为9个字节的数据。

此时,我们需要把已模块已收到的数据读出来。

发送指令:

AT+NSORF=0,9

模块返回:

0,115.29.240.46,5000,9,696F7478783A313233,0

指令格式为:AT+NSORF=<socket-id>,<req_length>

参数 说明
<socket-id> UDP通信socket编号
<req_length> 要读取的数据长度,当req_length大于+NSONMI指令返回的长度时,返回+NSONMI的实际长度。若req_length小于+NSONMI指令返回的长度时,将只返回req_length长度的数据。       

模块返回的数据格式为:<socket-id>,<remote_addr>,<remote_port>,<length>,<data>,<remaining_length>

参数 说明
<socket-id> UDP通信socket编号
<ip_addr>,<port> 数据发送方的ip地址和端口号。对应模块返回的字段:115.29.240.46,5000
<length>,<data> AT+NSORF指令读取到的数据长度和数据内容。对应模块返回的字段:9,696F7478783A313233,由于返回的是HEX格式的数据,因此对应的字符串为:iotxx:123
<remaining_length> 未读取的剩余数据长度。对应模块返回的最后一个字段:0

9 使用TCP协议通信

NB200(BC28)和NB101(BC95)相比,额外支持TCP协议,TCP协议和UDP很相似,但是TCP可靠性更高。

首先创建TCP协议Socket

AT+NSOCR=STREAM,6,56000,1

模块返回:

10 使用CoAP协议通信

标准CoAP是一种类似HTTP的极其轻量级的应用层协议,HTTP基于TCP协议,而CoAP基于UDP协议,最小数据包仅有4个字节。非常适合低功耗物联网设备的使用。

BC28模块内的CoAP协议并非指标准CoAP,而是按照LwM2M标准进行了一层封装。简单的说,BC28内部的CoAP协议是LwM2M标准协议的简化版本。为了简化描述,下文统称为CoAP。

CoAP通信的使用流程: 模块附着网络>>设置CDP服务器地址和端口>>发送数据>>接收数据。

为了方便测试,我们在云平台上启用了一个CoAP测试服务器,无论模块发送什么数据,测试服务器在收到的数据前加上iotxx前缀字符串,然后延时3s后返回给客户端。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。

接口 功能
CoAP测试服务器:115.29.240.46,端口号:5683 5683端口时刻监听客户端数据,并且在收到的数据前加上“iotxx.coap”前缀字符串,延时3s后返回给终端。

也可以使用我们的云透传平台创建电信平台设备,可在线测试。详情请参考《谷雨云透传平台接入指南[手册 3]》。

接口 功能
电信平台:117.60.157.137,端口号:5683 电信商用物联网平台,需要先在谷雨云透传上创建电信平台设备,方可在线调试或透传。
1、NB模块中使用的CoAP协议是在标准CoAP基础上又封装一层,过程较复杂,因此大家很难自己创建CoAP服务器来测试,如果要自建CoAP协议服务器,请参考电信的模块对接手册。

10.1 配置CDP服务器

配置远程CoAP服务器的IP地址和端口,类似UDP的IP和端口。

#设置CoAP测试服务器地址
AT+NCDP=115.29.240.46,5683
#模块返回
OK

设置指令格式:AT+NCDP= <ip_addr>[,<port>]

参数 说明
<ip_addr> 目标CDP服务器的IP地址,例如:115.29.240.46
<port> 目标CDP服务器的端口,默认端口:5683

若想查询CDP设置情况,请发送指令:AT+NCDP?

10.2 配置新消息通知

开启发送消息通知,配置后若消息已发送,串口会返回异步命令+NSMI:SENT的提示。

#发送指令
AT+NSMI=1
#模块返回
OK

开启接收消息通知,配置后,若接收到服务器的数据下发,模块会主动向串口发送异步命令。

#发送指令
AT+NNMI=1
#模块返回
OK

指令格式:AT+NSMI/NNMI=<status>

参数 说明
<status> 设置接收消息通知类型,取值如下:

0:不通知,默认设置

1:通知并携带数据,

2:仅通知

10.3 CoAP发送和接收数据

向CoAP测试服务器发送消息,消息内容为字符串123,对应长度为3,对应HEX格式字符串为313233

#向CoAP测试服务器发送消息
AT+NMGS=3,313233
#模块返回
OK

#若数据发送成功,返回
+NSMI:SENT

#若数据发送失败,携带错误码返回

指令格式:AT+NMGS=<length>,<data>

参数 说明
<length> 待发送数据的数据长度
<data> 待发送的数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,对应长度为:3

接收数据:等待约3秒,测试服务器返回数据:

#模块串口打印
+NNMI:14,696F7478782E636F61703A313233

指令格式为:+NNMI:<length>,<data>

参数 说明
<length> 已接收数据的数据长度
<data> 已接收到的数据内容,data是以16进制形式。

例如刚才向CoAP测试服务器发送了123,3秒后返回字符串为:iotxx.coap:123,对应16进制数据为:696F7478782E636F61703A313233

11 本文参考

  1. 1.0 1.1 NB200硬件设计手册》BC28模块指令使用介绍
  2. NB-IOT技术揭秘,一文读懂NB-IOT
  3. 谷雨云透传平台接入指南,谷雨云透传接入指南

12 相关文档