“NB260软件设计手册”的版本间的差异

来自谷雨文档中心
跳转至: 导航搜索
UDP发送和接收数据
本文参考
 
(未显示同一用户的12个中间版本)
第214行: 第214行:
 
</syntaxhighlight>此时表明可以进行网络通信等操作。
 
</syntaxhighlight>此时表明可以进行网络通信等操作。
  
== 设置网络变化通知 ==
+
== 其他相关指令 ==
 +
本节内容可以暂时跳过,不影响模块通信。
 +
 
 +
=== 设置网络变化通知 ===
 
当模块网络发生变化时,我们需要模块主动上报当前的网络注册状态,发送以下指令实现该功能。<syntaxhighlight lang="bash">
 
当模块网络发生变化时,我们需要模块主动上报当前的网络注册状态,发送以下指令实现该功能。<syntaxhighlight lang="bash">
 
#发送指令
 
#发送指令
第242行: 第245行:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
==禁止模块休眠==
+
===禁止模块休眠===
 
休眠的目的是降低模块功耗,延长电池的供电时间,休眠时模块处于最低功耗状态,无法接收串口指令,影响测试模块功能,因此,可以临时禁止休眠。<syntaxhighlight lang="bash">
 
休眠的目的是降低模块功耗,延长电池的供电时间,休眠时模块处于最低功耗状态,无法接收串口指令,影响测试模块功能,因此,可以临时禁止休眠。<syntaxhighlight lang="bash">
 
#发送指令
 
#发送指令
第258行: 第261行:
 
OK
 
OK
 
</syntaxhighlight>
 
</syntaxhighlight>
==使用UDP协议通信==
 
BC26支持UDP协议通信,UDP协议具有资源开销小,速度快等特点,并且不需要维持链接,非常适合低功耗设备的数据传输。{{Note|text=在数据通信之前,务必使模块附着到网络,请发送查询命令确认网络附着状态:AT+CEREG?  应当返回 +CEREG:0,1 或 +CEREG:1,1|type=warning}}
 
{{Note|text=由于电信公司政策(移动公司无此限制),使用电信NB卡若要访问私有服务器IP,必须将私有IP添加到SIM卡的白名单中(也就是绑定IP),例如从我们这购买的SIM卡已经绑定了我们的服务器IP:115.29.240.46|type=warning}}使用AT+NPING指令来测通,检查是否能够与目标服务器IP通信。
 
 
发送指令<syntaxhighlight lang="bash">
 
AT+NPING=115.29.240.46
 
</syntaxhighlight>模块立刻返回:<syntaxhighlight lang="bash">
 
  
 +
=== PING远程服务器 ===
 +
在与远程服务器通信之前,可以使用ping功能测通。只有ping成功之后,才能确保通信正常。<syntaxhighlight lang="bash">
 +
#发送指令
 +
AT+QPING=1,115.29.240.46
 +
#模块返回
 
OK
 
OK
  
</syntaxhighlight>然后随即返回:<syntaxhighlight lang="bash">
+
#若ping成功,模块返回:
+NPING:115.29.240.46,53,488
+
+QPING: 0,"115.29.240.46",32,930,51
</syntaxhighlight>返回格式为:+NPING:<remote_address>,<ttl>
 
{| class="wikitable"
 
!参数
 
!说明
 
|-
 
|<remote_address>
 
|目标ip地址
 
|-
 
|<ttl>
 
|数据包生存时间,请看百科介绍。
 
|}发生错误时,返回:+NPINGERR:<err>
 
{| class="wikitable"
 
!参数
 
!说明
 
|-
 
|<err>
 
|错误码
 
1:远程主机有效时间内未响应。
 
 
 
2:发送PING请求失败。
 
|}所以当返回:+NPINGERR:1时,很可能是该IP地址未绑定到SIM卡(电信卡有这个限制)。无法进行后续通信测试。
 
  
另外值得注意的是,电信的SIM卡虽然已绑定了该某个IP地址,会仍然无法PING成功,但不影响通信。
+
+QPING: 0,"115.29.240.46",32,730,51
  
===创建UDP通信Socket===
+
+QPING: 0,"115.29.240.46",32,260,51
在使用模块网络收发数据之前,需要先创建一个socket,并且知道对方ip和端口号后才能发送数据。
 
  
发送如下命令创建UDP Socket<syntaxhighlight lang="bash">
+
+QPING: 0,"115.29.240.46",32,270,51
AT+NSOCR=DGRAM,17,4587,1
 
</syntaxhighlight>模块返回:<syntaxhighlight lang="bash">
 
0
 
OK
 
</syntaxhighlight>创建socket的指令格式为:
 
  
AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]
+
+QPING: 0,4,4,0,260,930,547
 +
</syntaxhighlight>指令格式:<code>AT+QPING=<contextID>,<host></code>
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
 
!说明
 
!说明
 
|-
 
|-
|<type>
+
|<connectID>
|Socket类型,取值为DGRAM
+
|取值来自+QIOPEN中的第一个字段,TCP客户端创建完成后,串口返回的已创建连接ID。
 
|-
 
|-
|<protocol>
+
|<host>
|Socket通信协议,UDP协议号是17,因此取值为17
+
|待发送的数据长度,例如发送字符串:123,则长度是3
|-
+
|}
|<listen-port>
+
返回指令格式:
|本地监听端口,不是远程UDP-Server的端口。示例中取值4587。BC26模块支持创建7路UDP Socket,再次创建socket,注意本地端口取值不要重复,其他情况对本地端口的取值没有任何要求。
 
|}返回格式为:
 
 
 
<socket-id>
 
 
 
OK
 
 
 
刚刚创建了第一个UDP Socket,因此socket-id为0,模块数据收发均要使用此处返回的socket-id,请牢记。
 
 
 
===UDP发送和接收数据===
 
我们需要在服务器(固定IP)上先创建一个UDP Server,指定一个端口来监听模块发来的消息。
 
 
 
为了快速测试,我们在谷雨服务器上,创建了一个UDP Server ,固定IP:115.29.240.46,端口号:5000,该Server收到UDP Client发来的数据时,会在已收到的数据加上前缀:"iotxx:",然后延时5s后发回到UDP Client中。
 
  
例如客户端发送字符串"123", 等待5s后,会收到字符串 "iotxx:123"
+
<code>+QPING: <result>[,<IP_address>,<bytes>,<nowiki><time>,<ttl>]</nowiki></code>
  
发送数据的命令如下:<syntaxhighlight lang="bash">
+
<code>+QPING: <finresult>[,<sent>,<rcvd>,<lost>,<min>,<max>,<avg>]</code>  
AT+NSOST=0,115.29.240.46,5000,3,313233
 
</syntaxhighlight>模块立刻返回:<syntaxhighlight lang="bash">
 
0,3
 
 
 
OK
 
</syntaxhighlight>发送数据指令格式为:AT+NSOST=<socket-id>,<remote_addr>,<remote_port>, <length>,<nowiki><data></nowiki>
 
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
 
!说明
 
!说明
 
|-
 
|-
|<socket-id>
+
|<result>
|刚刚创建的UDP通信socket编号,从0开始,若创建了两个UDP的socket,则第一个为id编号0,第二个id编号为1
+
<finresult>
 +
|0:表示成功
 +
565:表示DNS解析错误。
 +
 
 +
569:表示请求超时。
 +
 
 +
其他值,请阅读《Quectel_BC26_TCP(IP)_AT_Commands_Manual.pdf》
 
|-
 
|-
|<remote_addr>,<remote_port>
+
|<IP_address>
|远程服务器IP地址和端口,例如我们的NB云平台IP地址为:115.29.240.46,端口为:5000
+
|ping成功到的IP地址
 
|-
 
|-
|<length>,<nowiki><data></nowiki>
+
|<bytes>
|待发送的数据长度和数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,length为:3
+
|发送Ping请求的数据包长度
|}模块返回格式:<socket-id>,<length>
+
|-
{| class="wikitable"
+
|<ttl>
!参数
+
|Ping请求的ttl值
!说明
 
 
|-
 
|-
|<socket-id>
+
|<sent>,<rcvd>,<lost>
|UDP通信socket编号
+
|总计发送、接收和丢失的数据包个数。
 
|-
 
|-
|<length>
+
|<min>,<max>,<avg>
|是已发送的数据长度。
+
|最短最长和平均响应时间。
|}例如返回:0,3,则表示,Socket 0通道发送了3个字节数据。此时表明,模块已经成功将数据发送了出去。
+
|}
  
接下来演示模块接收来自服务器的数据(我们服务器5000端口收到客户端发送的数据后,等待5秒,然后原样回传)。等待大约5秒后,模块会异步命令通知:<syntaxhighlight lang="bash">
+
==使用UDP或TCP协议通信==
+NSONMI:0,9
+
BC26的UDP和TCP使用相同的AT指令,因此,我们将UDP和TCP合并讲解
</syntaxhighlight>格式为:+NSONMI:<socket-id>,<length>
 
  
+NSONMI:0,9 表示在通道0,接收到长度为9个字节的数据。
+
NB模块作为UDP的客户端,连接UDP的服务端,UDP客户端创建成功后,可以收发数据。
  
此时,我们需要把已模块已收到的数据读出来。
+
TCP协议与UDP协议类似,NB模块作为TCP的客户端,连接TCP的服务端,连接成功后可以收发数据。
  
发送指令:<syntaxhighlight lang="bash">
+
为了方便测试,我们在云平台上启用了一个UDP和TCP测试服务器,无论发任何数据,在3秒后,会加上iotxx前缀字符串返回数据。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。
AT+NSORF=0,9
 
</syntaxhighlight>模块返回:<syntaxhighlight lang="bash">
 
0,115.29.240.46,5000,9,696F7478783A313233,0
 
</syntaxhighlight>指令格式为:AT+NSORF=<socket-id>,<req_length>
 
 
{| class="wikitable"
 
{| class="wikitable"
!参数
+
!接口
!说明
+
!功能
|-
 
|<socket-id>
 
|UDP通信socket编号
 
 
|-
 
|-
|<req_length>
+
|UDP测试服务器:115.29.240.46,端口号:6001
|要读取的数据长度,当req_length大于+NSONMI指令返回的长度时,返回+NSONMI的实际长度。若req_length小于+NSONMI指令返回的长度时,将只返回req_length长度的数据。       
+
|6001端口时刻监听客户端,收到数据后,加上“iotxx.udp”前缀字符串,然后延时3s后返回给客户端。
 
|}
 
|}
 
模块返回的数据格式为:<socket-id>,<remote_addr>,<remote_port>,<length>,<nowiki><data>,<remaining_length></nowiki>
 
{| class="wikitable"
 
!参数
 
!说明
 
|-
 
|<socket-id>
 
|UDP通信socket编号
 
|-
 
|<ip_addr>,<port>
 
|数据发送方的ip地址和端口号。对应模块返回的字段:115.29.240.46,5000
 
|-
 
|<length>,<nowiki><data></nowiki>
 
|AT+NSORF指令读取到的数据长度和数据内容。对应模块返回的字段:9,696F7478783A313233,由于返回的是HEX格式的数据,因此对应的字符串为:iotxx:123
 
|-
 
|<remaining_length>
 
|未读取的剩余数据长度。对应模块返回的最后一个字段:0
 
|}
 
 
== 使用TCP协议通信 ==
 
TCP协议与UDP协议类似,NB模块作为TCP的客户端,连接TCP的服务端,连接成功后可以收发数据。
 
 
为了方便测试,我们在云平台上启用了一个TCP测试服务器,无论发任何数据,在5s后,会加上iotxx前缀字符串返回数据。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。
 
 
{| class="wikitable"
 
{| class="wikitable"
 
!接口
 
!接口
 
!功能
 
!功能
 
|-
 
|-
|TCP服务器固定IP:115.29.240.46,端口号:9001
+
|TCP测试服务器:115.29.240.46,端口号:9001
|9001端口时刻监听客户端数据,并且在收到的数据前加上iotxx前缀字符串,然后延时3s后返回给客户端。
+
|9001端口时刻监听客户端,收到数据后,加上“iotxx.tcp”前缀字符串,然后延时3s后返回给客户端。
 
|}
 
|}
  
=== 创建TCP客户端 ===
+
=== 创建UDP/TCP客户端 ===
 
模块在收发数据前,先要创建TCP客户端,指定TCP服务器的IP地址,端口号,以及设置模块本地端口。<syntaxhighlight lang="bash">
 
模块在收发数据前,先要创建TCP客户端,指定TCP服务器的IP地址,端口号,以及设置模块本地端口。<syntaxhighlight lang="bash">
#发送指令
+
#创建TCP客户端
 
AT+QIOPEN=1,0,"TCP","115.29.240.46",9001,3000,1
 
AT+QIOPEN=1,0,"TCP","115.29.240.46",9001,3000,1
 +
#若创建UDP客户端,请发送
 +
AT+QIOPEN=1,0,"UDP","115.29.240.46",6001,3001,1
 
#模块返回
 
#模块返回
 
OK
 
OK
 +
  
 
#几秒后,若TCP客户端创建成功,会返回
 
#几秒后,若TCP客户端创建成功,会返回
 
+QIOPEN: 0,0
 
+QIOPEN: 0,0
  
</syntaxhighlight>设置命令格式如下:AT+QIOPEN=<contextID>,<connectID>,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_port>[,<access_mode>]  
+
</syntaxhighlight>设置命令格式如下:<code>AT+QIOPEN=<contextID>,<connectID>,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_port>[,<access_mode>]</code> 
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第440行: 第373行:
 
|-
 
|-
 
|<service_type>
 
|<service_type>
|Socket类型,取值:"UDP"或"TCP",注意必须带上双引号。
+
|Socket类型,取值:"UDP"或"TCP",注意必须带上双引号。请根据使用的协议设置UDP或TCP。
 
|-
 
|-
 
|<IP_address>
 
|<IP_address>
第447行: 第380行:
 
|-
 
|-
 
|<remote_port>
 
|<remote_port>
|远程服务器的端口号,根据实际情况填写,由于我们的测试端口为9001,因此此处取值为9001
+
|远程服务器的端口号,根据实际情况填写,我们的TCP测试端口为9001,UDP测试端口为6001
 
|-
 
|-
 
|<local_port>
 
|<local_port>
第458行: 第391行:
 
1:直接推送,模块收到数据后,会立刻串口打印出来。无需额外的指令。
 
1:直接推送,模块收到数据后,会立刻串口打印出来。无需额外的指令。
 
|}
 
|}
命令响应格式为:+QIOPEN: <connectID>,<err>
+
命令响应格式为:<code>+QIOPEN: <connectID>,<err></code>  
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第471行: 第404行:
  
 
566:socket连接失败。可能是ip地址或者端口号错误。
 
566:socket连接失败。可能是ip地址或者端口号错误。
 +
 +
详细错误码,请阅读《Quectel_BC26_TCP(IP)_AT_Commands_Manual_V1.0.pdf》
 +
|}
 +
 +
若查询已创建的Socket,请发送指令:<code>AT+QISTATE=1,0</code>  ,1:表示根据connectID的值0来查询,模块返回:<code>+QISTATE: 0,"TCP","115.29.240.46",9001,3000,2,1,1</code>
 +
 +
=== 数据收发 ===
 +
向测试服务器发送数据。<syntaxhighlight lang="bash">
 +
#发送字符串,字符串的双引号可带可不带。
 +
AT+QISEND=0,3,"123"
 +
#或发送16进制数据
 +
AT+QISENDEX=0,3,313233
 +
#模块返回
 +
OK
 +
 +
#若数据发送成功,模块返回
 +
SEND OK
 +
</syntaxhighlight>
 +
 +
接收数据:等待约3秒后,测试服务器返回。<syntaxhighlight lang="bash">
 +
+QIURC: "recv",0,9
 +
iotxx:123
 +
</syntaxhighlight>指令格式:<code>AT+QISEND=<connectID>,<send_length>,<nowiki><data></nowiki></code>
 +
{| class="wikitable"
 +
!参数
 +
!说明
 +
|-
 +
|<connectID>
 +
|取值来自+QIOPEN中的第一个字段,TCP客户端创建完成后,串口返回的已创建连接ID。
 +
|-
 +
|<send_length>
 +
|待发送的数据长度,例如发送字符串:123,则长度是3
 +
|-
 +
|<nowiki><data></nowiki>
 +
|待发送的数据,例如字符串:123。
 +
若调用的是AT+QISENDEX指令,则数据是字符串123对应的16进制数据:313233
 
|}
 
|}
  
 +
接收数据指令格式:<code>+QIURC: "recv",<connectID>,<current_recv_length><CR><LF><nowiki><data></nowiki></code>
 +
{| class="wikitable"
 +
!参数
 +
!说明
 +
|-
 +
|<connectID>
 +
|取值来自+QIOPEN中的第一个字段,TCP客户端创建完成后,串口返回的已创建连接ID。
 +
|-
 +
|<current_recv_length>
 +
|待发送的数据长度,例如发送字符串:123,则长度是3
 +
|-
 +
|<CR><LF>
 +
|回车换行符号。
 +
|-
 +
|<nowiki><data></nowiki>
 +
|已接收的数据。
 +
|}
 
==使用LwM2M协议通信==
 
==使用LwM2M协议通信==
 
CoAP是一种类似HTTP的极其轻量级的应用层协议,HTTP基于TCP协议,而CoAP基于UDP协议,最小数据包仅有4个字节。非常适合低功耗物联网设备的使用。
 
CoAP是一种类似HTTP的极其轻量级的应用层协议,HTTP基于TCP协议,而CoAP基于UDP协议,最小数据包仅有4个字节。非常适合低功耗物联网设备的使用。
第489行: 第475行:
 
#模块返回
 
#模块返回
 
OK
 
OK
</syntaxhighlight>设置指令格式:AT+QLWSERV= <ip_addr>[,<port>]
+
</syntaxhighlight>设置指令格式:<code>AT+QLWSERV= <ip_addr>[,<port>]</code>
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第500行: 第486行:
 
|平台设备接入端口,默认端口:5683
 
|平台设备接入端口,默认端口:5683
 
|}
 
|}
若查询参数,请发送指令:AT+QLWSERV?
+
若查询参数,请发送指令:<code>AT+QLWSERV?</code>
  
 
===配置endpoint===
 
===配置endpoint===
第524行: 第510行:
  
  
</syntaxhighlight>设置endpoint格式:AT+QLWCONF=<endpoint>
+
</syntaxhighlight>设置endpoint格式:<code>AT+QLWCONF=<endpoint></code>  
  
 
{| class="wikitable"
 
{| class="wikitable"
第548行: 第534行:
 
OK
 
OK
  
</syntaxhighlight>设置参数格式为:AT+QLWADDOBJ=<obj_id>,[<ins_id>[,<res_num>,<res_id>]]
+
</syntaxhighlight>设置参数格式为:<code>AT+QLWADDOBJ=<obj_id>,[<ins_id>[,<res_num>,<res_id>]]</code>
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第565行: 第551行:
 
|String type. Resources ID with double quotation marks.
 
|String type. Resources ID with double quotation marks.
 
|}
 
|}
若删除ObjectID,发送指令:AT+QLWDELOBJ=<obj_id>
+
若删除ObjectID,发送指令:<code>AT+QLWDELOBJ=<obj_id></code>
  
 
=== 向平台发送注册请求 ===
 
=== 向平台发送注册请求 ===
第583行: 第569行:
 
#若设备注册失败,模块返回:
 
#若设备注册失败,模块返回:
 
CONNECT FAIL
 
CONNECT FAIL
</syntaxhighlight>注册请求指令格式为:AT+QLWOPEN=<mode>
+
</syntaxhighlight>注册请求指令格式为:<code>AT+QLWOPEN=<mode></code>  
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第597行: 第583行:
 
若注册失败,原因可能有:
 
若注册失败,原因可能有:
 
* 云平台设备未注册,或未使用IMEI码来注册
 
* 云平台设备未注册,或未使用IMEI码来注册
* 设置的云平台IP不可达,电信NB卡有定向IP限制,只能访问电信云平台地址,测试平台地址:180.101.147.115,商用平台地址:117.60.157.137。
+
* 设置的云平台IP不可达,电信NB卡有定向IP限制,只能访问电信云平台地址,测试平台地址:<code>180.101.147.115</code>,商用平台地址:<code>117.60.157.137</code>
  
 
=== 向平台发送更新请求 ===
 
=== 向平台发送更新请求 ===
第619行: 第605行:
 
OK
 
OK
  
</syntaxhighlight>设置指令格式为:AT+QLWCFG="dataformat",<send_data_format>,<recv_data_format>
+
</syntaxhighlight>设置指令格式为:<code>AT+QLWCFG="dataformat",<send_data_format>,<recv_data_format></code>  
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第643行: 第629行:
 
OK
 
OK
  
</syntaxhighlight>发送数据指令格式为:AT+QLWDATASEND=<obj_id>,<ins_id>,<res_id>,<length>,<nowiki><data>,<mode></nowiki>
+
</syntaxhighlight>发送数据指令格式为:<code>AT+QLWDATASEND=<obj_id>,<ins_id>,<res_id>,<length>,<nowiki><data>,<mode></nowiki></code>  
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第677行: 第663行:
 
+QLWDATARECV: 19,1,0,3,333231
 
+QLWDATARECV: 19,1,0,3,333231
  
</syntaxhighlight>该命令格式为:+QLWDATARECV: <obj_id>,<ins_id>,<res_id>,<length>[,<nowiki><data>]</nowiki>
+
</syntaxhighlight>该命令格式为:<code>+QLWDATARECV: <obj_id>,<ins_id>,<res_id>,<length>[,<nowiki><data>]</nowiki></code>  
 
{| class="wikitable"
 
{| class="wikitable"
 
!参数
 
!参数
第697行: 第683行:
 
|已接收的数据,例如16进制数据333231,对应字符串为321,接收的数据格式在上一小节中设置。
 
|已接收的数据,例如16进制数据333231,对应字符串为321,接收的数据格式在上一小节中设置。
 
|}
 
|}
 +
 +
== 谷雨云透传接入指导 ==
 +
谷雨物联网提供简单实用的云透传平台,向广大开发者,免费提供NB设备的连接测试。
 +
 +
请阅读:谷雨云透传平台接入指南<ref group="手册">[[谷雨云透传平台接入指南]],谷雨云透传接入指南</ref>中的NB设备接入一节。
 +
 +
== 电信/华为云平台接入指导 ==
 +
待更新
  
 
==本文参考==
 
==本文参考==

2019年2月17日 (日) 23:41的最新版本

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

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

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

有关NB260作为OpenCPU二次开发的软件说明,请阅读《NB260-OpenCPU软件开发手册》[手册 2]

1 准备工作

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

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

2、准备以下硬件:

  • NB260小系统模块
  • NB网络SIM卡(电信或者移动)
  • 串口转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技术揭秘》[手册 3]和《NB-IOT低功耗详解》[手册 4]

3 物联网平台

首先,NB-IOT是运营商网络,所以只能和有固定IP的服务器通信。

另外,为了凸显NB-IOT的低功耗,多链接等优点,需要一个打通用户服务器与核心网的物联网平台(如华为电信的平台),作为中转网关,用户只需要自建应用服务器,专注上层的应用数据开发,设备的连接和管理工作全部交给平台来完成。平台负责应用服务器和设备之间的数据转发工作。除此之外,华为电信平台例如自身技术优势还可以免心跳下发数据,这是模块直连用户自建服务器所无法实现的。

当前NB-IOT主要平台有:

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

电信物联网平台是华为OceanConnect的NB-IOT业务的独立版本,对于设备端来说,这两大平台是完全相同的。另外,由于华为和电信物联网平台需要申请账号才能使用,而且接入流程较为复杂,这无形之中增加了NB-IOT的学习难度。所以,为了让大家快速的了解和测试NB-IOT,我们开发了谷雨云透传平台,开箱即用,支持多种接入方式。在后面的快速通信测试时,我们将使用谷雨的云透传平台来快速测试。

4 模块硬件准备

首先连接NB260与USB转串口模块,最小连接仅需:GND,VIN,TXD,RXD,PEN。PEN信号用来开机和唤醒模块休眠,建议通过一个按键来与VIN相连。有关更详细的硬件接口说明,请参考《NB260硬件设计手册》[手册 1]

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

随即接通NB260的电源,红色电源指示灯亮,但串口无任何输出,因此BC26还未开机。

然后将PEN拉高至少500ms使模块开机,可以看到串口调试助手中打印了一些内容。如果全部显示乱码,请检查波特率是否为115200,若没有任何内容输出请重新尝试开机,并且检查串口线TX和RX是否反接等。

F1: 0000 0000
V0: 0000 0000 [0001]
00: 0006 000C
01: 0000 0000
U0: 0000 0001 [0000]
T0: 0000 00B4
Leaving the BROM

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

Icon-info.png
注意,当模块等待一段时间后再发串口数据无响应,表明模块处于休眠状态,需要按照开机的办法,也就是拉高PEN来唤醒模块。

5 附着网络

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

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

5.1 查询模块功能状态

#发送指令
AT+CFUN?

#模块返回
+CFUN:0

OK

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

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

5.2 开启模块功能

#发送指令
AT+CFUN=1

#模块返回
OK

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

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

5.3 查询SIM卡的ICCID码

ICCID是集成电路卡识别码:Integrate Circuit Card Identity的首字母缩写,该号码可以在SIM卡的背面看到。可以通过该识别码来查询NB物联网卡的号码。

#发送指令
AT+QCCID

#模块返回
+NCCID:89860317492045357506

OK

5.4 查询当前频段

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

#发送指令
AT+QBAND?

#若模块返回OK,表示尚未附着到网络,无法查询当前工作频段。请先完成网络附着。
OK

#若模块返回+QBAND:X,表示已经附着到网络,且当前工作频段为X
+QBAND:5
OK

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

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

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

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

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

5.5 查询当前信号

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

#发送指令:
AT+CSQ

#模块返回:
+CSQ: 25,0

OK

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

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

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

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

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

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

<ber> RXQUAL取值:0~7,若等于99表示未未知或未附着到网络。
Icon-tips.png
Tips:CSQ中的rssi与dBm换算公式如下:dBm = rssi*2 – 113,例如,当rssi等于30时,对应dBm为-53dBm

5.6 查询网络是否激活

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

#发送指令
AT+CGATT?

#模块返回:
+CGATT:1

OK

参数:

0:表示网络未激活。

1:表示网络已激活,注意,等于1表示仅打开网络功能,但是否入网还要等待+CEREG指令的确认。

5.7 激活网络

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

#发送指令
AT+CGATT=1

#模块返回
OK

若该指令返回ERROR,表明模块刚开机,SIM卡尚未准备好,请等待片刻。若仍然ERROR,很可能是SIM卡有异常。

5.8 查询网络是否已注册

#发送指令
AT+CEREG?

#模块返回:
+CEREG:0,1

OK

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

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

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

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

<stat> 网络注册状态

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

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

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

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

5.9 IP地址通知

当模块已经附着到网络时,会主动上报分配到的IP地址,如下:

#模块URC指令上报
+IP: 10.47.53.56

此时表明可以进行网络通信等操作。

6 其他相关指令

本节内容可以暂时跳过,不影响模块通信。

6.1 设置网络变化通知

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

#发送指令
AT+CEREG=1

#模块返回:
OK

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

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

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

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

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

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

6.2 禁止模块休眠

休眠的目的是降低模块功耗,延长电池的供电时间,休眠时模块处于最低功耗状态,无法接收串口指令,影响测试模块功能,因此,可以临时禁止休眠。

#发送指令
AT+SM=LOCK

#模块返回:
OK

若恢复模块的休眠功能,执行以下操作:

#发送指令
AT+SM=UNLOCK

#模块返回:
OK

6.3 PING远程服务器

在与远程服务器通信之前,可以使用ping功能测通。只有ping成功之后,才能确保通信正常。

#发送指令
AT+QPING=1,115.29.240.46
#模块返回
OK

#若ping成功,模块返回:
+QPING: 0,"115.29.240.46",32,930,51

+QPING: 0,"115.29.240.46",32,730,51

+QPING: 0,"115.29.240.46",32,260,51

+QPING: 0,"115.29.240.46",32,270,51

+QPING: 0,4,4,0,260,930,547

指令格式:AT+QPING=<contextID>,<host>

参数 说明
<connectID> 取值来自+QIOPEN中的第一个字段,TCP客户端创建完成后,串口返回的已创建连接ID。
<host> 待发送的数据长度,例如发送字符串:123,则长度是3

返回指令格式:

+QPING: <result>[,<IP_address>,<bytes>,<time>,<ttl>]

+QPING: <finresult>[,<sent>,<rcvd>,<lost>,<min>,<max>,<avg>]

参数 说明
<result>

<finresult>

0:表示成功

565:表示DNS解析错误。

569:表示请求超时。

其他值,请阅读《Quectel_BC26_TCP(IP)_AT_Commands_Manual.pdf》

<IP_address> ping成功到的IP地址
<bytes> 发送Ping请求的数据包长度
<ttl> Ping请求的ttl值
<sent>,<rcvd>,<lost> 总计发送、接收和丢失的数据包个数。
<min>,<max>,<avg> 最短最长和平均响应时间。

7 使用UDP或TCP协议通信

BC26的UDP和TCP使用相同的AT指令,因此,我们将UDP和TCP合并讲解

NB模块作为UDP的客户端,连接UDP的服务端,UDP客户端创建成功后,可以收发数据。

TCP协议与UDP协议类似,NB模块作为TCP的客户端,连接TCP的服务端,连接成功后可以收发数据。

为了方便测试,我们在云平台上启用了一个UDP和TCP测试服务器,无论发任何数据,在3秒后,会加上iotxx前缀字符串返回数据。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。

接口 功能
UDP测试服务器:115.29.240.46,端口号:6001 6001端口时刻监听客户端,收到数据后,加上“iotxx.udp”前缀字符串,然后延时3s后返回给客户端。
接口 功能
TCP测试服务器:115.29.240.46,端口号:9001 9001端口时刻监听客户端,收到数据后,加上“iotxx.tcp”前缀字符串,然后延时3s后返回给客户端。

7.1 创建UDP/TCP客户端

模块在收发数据前,先要创建TCP客户端,指定TCP服务器的IP地址,端口号,以及设置模块本地端口。

#创建TCP客户端
AT+QIOPEN=1,0,"TCP","115.29.240.46",9001,3000,1
#若创建UDP客户端,请发送
AT+QIOPEN=1,0,"UDP","115.29.240.46",6001,3001,1
#模块返回
OK


#几秒后,若TCP客户端创建成功,会返回
+QIOPEN: 0,0

设置命令格式如下:AT+QIOPEN=<contextID>,<connectID>,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_port>[,<access_mode>]

参数 说明
<contextID> 取值为0,固定值。
<connectID> 连接ID,取值范围0~4,TCP客户端创建成功后,后续数据通信或关闭TCP客户端,需要携带此ID号。

习惯从0开始递增。

<service_type> Socket类型,取值:"UDP"或"TCP",注意必须带上双引号。请根据使用的协议设置UDP或TCP。
<IP_address>

<domain_name>

远程服务器的IP地址或者域名,例如:"115.29.240.46" 或:"http://cloud.iotxx.com" ,注意必须带上双引号。
<remote_port> 远程服务器的端口号,根据实际情况填写,我们的TCP测试端口为9001,UDP测试端口为6001
<local_port> 模块本地端口号,取值任意,但是不能和已创建Socket所使用的本地端口相同。
<access_mode> 数据推送模式,取值范围如下:

0:缓存模式,模块收到数据后不会串口打印出来,而是需要发送AT指令来读取。

1:直接推送,模块收到数据后,会立刻串口打印出来。无需额外的指令。

命令响应格式为:+QIOPEN: <connectID>,<err>

参数 说明
<connectID> 连接ID,取值范围0~4,TCP客户端创建完成后,串口返回的已创建连接ID。
<err> 错误码,常见取值如下:

0:操作成功。

566:socket连接失败。可能是ip地址或者端口号错误。

详细错误码,请阅读《Quectel_BC26_TCP(IP)_AT_Commands_Manual_V1.0.pdf》

若查询已创建的Socket,请发送指令:AT+QISTATE=1,0 ,1:表示根据connectID的值0来查询,模块返回:+QISTATE: 0,"TCP","115.29.240.46",9001,3000,2,1,1

7.2 数据收发

向测试服务器发送数据。

#发送字符串,字符串的双引号可带可不带。
AT+QISEND=0,3,"123"
#或发送16进制数据
AT+QISENDEX=0,3,313233
#模块返回
OK

#若数据发送成功,模块返回
SEND OK

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

+QIURC: "recv",0,9
iotxx:123

指令格式:AT+QISEND=<connectID>,<send_length>,<data>

参数 说明
<connectID> 取值来自+QIOPEN中的第一个字段,TCP客户端创建完成后,串口返回的已创建连接ID。
<send_length> 待发送的数据长度,例如发送字符串:123,则长度是3
<data> 待发送的数据,例如字符串:123。

若调用的是AT+QISENDEX指令,则数据是字符串123对应的16进制数据:313233

接收数据指令格式:+QIURC: "recv",<connectID>,<current_recv_length><CR><LF><data>

参数 说明
<connectID> 取值来自+QIOPEN中的第一个字段,TCP客户端创建完成后,串口返回的已创建连接ID。
<current_recv_length> 待发送的数据长度,例如发送字符串:123,则长度是3
<CR><LF> 回车换行符号。
<data> 已接收的数据。

8 使用LwM2M协议通信

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

而LwM2M是在标准CoAP协议基础上封装了一层协议,LwM2M协议兼容BC95的CoAP协议(BC95的CoAP协议也并非指标准CoAP,而是按照LwM2M协议进行了一层封装)。

由于BC26采用的是标准LwM2M协议,因此,和华为、电信平台通信的步骤要多一些。

LwM2M的使用流程: 模块附着网络>>设置平台地址和端口>>相关参数配置>>发送数据>>接收数据。

8.1 配置服务器地址和端口

配置平台设备接入的IP地址和端口。

#发送指令
AT+QLWSERV="117.60.157.137",5683

#模块返回
OK

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

参数 说明
<ip_addr> 平台设备接入IP地址,例如电信IOT商用平台地址为:117.60.157.137
<port> 平台设备接入端口,默认端口:5683

若查询参数,请发送指令:AT+QLWSERV?

8.2 配置endpoint

设置endpoint,endpoint是模块接入平台时的身份验证,BC26是以模块IMEI码作为endpoint。

#查询IMEI码
AT+CGSN=1

#模块返回
+CGSN: 866971030245736

OK

设置endpoint

#设置endpoint
AT+QLWCONF="866971030245736"

#模块返回
OK

设置endpoint格式:AT+QLWCONF=<endpoint>

参数 说明
<endpoint> 模块接入平台时的身份验证码,必须使用模块的IMEI码。请勿和IMSI码混淆。

8.3 配置LwM2M Object

该配置与LwM2M的协议有关,这里我们仅设置与平台通信相关的参数,关于LwM2M协议的深入介绍请自行阅读相关文档。

#添加一个LwM2M object 19/0/0.
AT+QLWADDOBJ=19,0,1,"0"

#模块返回
OK

#添加一个LwM2M object 19/1/0.
AT+QLWADDOBJ=19,1,1,"0"

#模块返回
OK

设置参数格式为:AT+QLWADDOBJ=<obj_id>,[<ins_id>[,<res_num>,<res_id>]]

参数 说明
<obj_id> Integer type. Object ID. The maximum object ID number is 65535.
<ins_id> Integer type. Instance ID.
<res_num> Integer type. Resources ID number.
<res_id> String type. Resources ID with double quotation marks.

若删除ObjectID,发送指令:AT+QLWDELOBJ=<obj_id>

8.4 向平台发送注册请求

此时,可以向平台发送设备注册请求,注册成功后即可收发数据。

注意:发送注册请求之前,务必先在云平台上创建设备,并且必须以该模块的IMEI码作为设备编号。

#向平台发送注册请求
AT+QLWOPEN=0

#模块返回
OK

#等待一小会,若设备注册成功,模块返回:
CONNECT OK
+QLWOBSERVE: 0,19,0,0

#若设备注册失败,模块返回:
CONNECT FAIL

注册请求指令格式为:AT+QLWOPEN=<mode>

参数 说明
<mode> 数据推送该模式。通常设置为:0,直接推送模式。
  • 0,直接推送模式
  • 1,缓存读取模式

若注册成功,平台上会提示,设备已绑定或在线。

若注册失败,原因可能有:

  • 云平台设备未注册,或未使用IMEI码来注册
  • 设置的云平台IP不可达,电信NB卡有定向IP限制,只能访问电信云平台地址,测试平台地址:180.101.147.115,商用平台地址:117.60.157.137

8.5 向平台发送更新请求

#向平台发送更新请求
AT+QLWUPDATE

#模块返回
OK

#等待一小会,若更新成功,模块返回:
UPDATE OK

8.6 设置收发数据格式

发送数据之前,先设置发送数据的格式。

#设置发送和接收hex格式的数据
AT+QLWCFG="dataformat",1,1

#模块返回
OK

设置指令格式为:AT+QLWCFG="dataformat",<send_data_format>,<recv_data_format>

参数 说明
<send_data_format> 发送数据的格式

0 :文本模式

1 :Hex模式

<recv_data_format> 0 :文本模式

1 :Hex模式

8.7 向平台发送和接收数据

向平台发送数据

#向平台发送NON类型的消息,消息内容为字符串123,对应长度为3,hex为313233
AT+QLWDATASEND=19,0,0,3,313233,0x0000

#模块返回
OK

发送数据指令格式为:AT+QLWDATASEND=<obj_id>,<ins_id>,<res_id>,<length>,<data>,<mode>

参数 说明
<obj_id> Objec ID,取值来自注册成功后返回的+QLWOBSERVE: 0,19,0,0 中的19
<ins_id> Instance ID,取值来自注册成功后返回的+QLWOBSERVE: 0,19,0,0 中的第二个0
<res_id> Resource ID,取值来自注册成功后返回的+QLWOBSERVE: 0,19,0,0 中的第三个0
<length> 待发送的数据长度,例如发送16进制数据313233,对应字符串为123,则长度是3
<data> 待发送的数据,例如发送16进制数据313233,对应字符串为123,发送的数据格式在上一小节中设置。
<mode> 发送数据的模式,取值为:

0x0000 ,发送NON Message,无需平台响应

0x0100 ,发送CON Message,需要平台响应

若发送CON Message,模块收到平台返回的ACK响应时,模块会返回字符串:SEND OK

接收平台下发的数据

向平台注册设备一节,设置了消息直接推送模式。因此当平台下发数据时,模块会直接返回收到的数据:

#模块收到平台发来的数据
+QLWDATARECV: 19,1,0,3,333231

该命令格式为:+QLWDATARECV: <obj_id>,<ins_id>,<res_id>,<length>[,<data>]

参数 说明
<obj_id> Objec ID,取值为19
<ins_id> Instance ID,取值为1
<res_id> Resource ID,取值为0
<length> 已接收数据长度,例如16进制数据333231,对应字符串为321,对应长度是3
<data> 已接收的数据,例如16进制数据333231,对应字符串为321,接收的数据格式在上一小节中设置。

9 谷雨云透传接入指导

谷雨物联网提供简单实用的云透传平台,向广大开发者,免费提供NB设备的连接测试。

请阅读:谷雨云透传平台接入指南[手册 5]中的NB设备接入一节。

10 电信/华为云平台接入指导

待更新

11 本文参考

  1. 1.0 1.1 NB260硬件设计手册 ,BC28模块指令使用介绍
  2. NB260-OpenCPU软件开发手册,基于BC26的OpenCPU软件开发指导。
  3. NB-IOT技术揭秘,一文读懂NB-IOT
  4. NB-IOT低功耗详解,详细阐述NB-IOT低功耗的实现
  5. 谷雨云透传平台接入指南,谷雨云透传接入指南

本PDF由谷雨文档中心自动生成,点击下方链接阅读最新内容。

取自“http://doc.iotxx.com/index.php?title=NB260软件设计手册&oldid=1582