“NB200软件设计手册”的版本间的差异
(→物联网云平台) |
(→本文参考) |
||
(未显示同一用户的20个中间版本) | |||
第33行: | 第33行: | ||
==物联网云平台== | ==物联网云平台== | ||
− | NB-IOT是运营商网络,没有局域网的概念,只能访问有固定IP的服务器。并且为了凸显NB- | + | NB-IOT是运营商网络,没有局域网的概念,只能访问有固定IP的服务器。并且为了凸显NB-IOT的低功耗、多链接等优点,需要一个将核心网与终端深度融合(利用终端的通信特点实现免心跳等机制)的物联网平台作为设备网关,用户只需要自建应用服务器,专注上层的应用开发,设备的连接和管理工作全部交给平台来完成。平台负责应用服务器和设备之间的数据转发工作。华为电信平台利用自身技术优势实现的免心跳等机制,这是自建服务器无法实现的。 |
− | 与NB- | + | 与NB-IOT终端深度融合的平台有: |
*华为OceanConnect | *华为OceanConnect | ||
第65行: | 第65行: | ||
===查询模块功能状态=== | ===查询模块功能状态=== | ||
发送指令:<syntaxhighlight lang="bash"> | 发送指令:<syntaxhighlight lang="bash"> | ||
+ | #发送指令 | ||
AT+CFUN? | AT+CFUN? | ||
− | + | #模块返回 | |
+CFUN:0 | +CFUN:0 | ||
− | + | </syntaxhighlight><code>+CFUN:0</code> 表示模块功能未打开,若返回:<code>+CFUN:1</code> 则表示射频已打开。 | |
− | |||
− | |||
− | </syntaxhighlight>+CFUN: | ||
类似查看手机是否处于处于飞行或关机状态。0表示模块处于最低功能状态,功耗很小,可用的指令和功能也很少。 | 类似查看手机是否处于处于飞行或关机状态。0表示模块处于最低功能状态,功耗很小,可用的指令和功能也很少。 | ||
===开启模块功能=== | ===开启模块功能=== | ||
− | + | <syntaxhighlight lang="bash"> | |
+ | #发送指令 | ||
AT+CFUN=1 | AT+CFUN=1 | ||
− | + | ||
+ | #大约两三秒后,模块返回 | ||
OK | OK | ||
− | + | </syntaxhighlight>此时表示模块功能已打开,可以继续后续指令。注意,CFUN指令未返回前请勿执行其他指令。{{Note|text=注意,若该指令返回错误ERROR,表示没有检测到SIM卡,多数是因为SIM卡未插入或者插反。NB200使用的是Micro类型的卡槽,SIM卡插入时,注意卡缺口朝外。|type=warning}} | |
− | </syntaxhighlight> | ||
− | {{Note|text=注意,若该指令返回错误ERROR,表示没有检测到SIM卡,多数是因为SIM卡未插入或者插反。NB200使用的是Micro类型的卡槽,SIM卡插入时,注意卡缺口朝外。|type=warning}} | ||
===查询SIM卡的ICCID码=== | ===查询SIM卡的ICCID码=== | ||
− | ICCID是集成电路卡识别码:Integrate Circuit Card Identity的首字母缩写,该号码可以在SIM卡的背面看到。 | + | ICCID是集成电路卡识别码:Integrate Circuit Card Identity的首字母缩写,该号码可以在SIM卡的背面看到。<syntaxhighlight lang="bash"> |
− | + | #发送指令 | |
− | |||
AT+NCCID | AT+NCCID | ||
− | + | #模块返回 | |
+NCCID:89860317492045357506 | +NCCID:89860317492045357506 | ||
+ | OK | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | ===查询模块IMEI码=== | ||
+ | IMEI码是模块的唯一标识码,模块与电信或华为通信时,会用到IMEI码。<syntaxhighlight lang="bash"> | ||
+ | #发送指令 | ||
+ | AT+CGSN=1 | ||
+ | |||
+ | #模块返回 | ||
+ | +CGSN:867725034773635 | ||
OK | OK | ||
第97行: | 第104行: | ||
===查询当前频段=== | ===查询当前频段=== | ||
− | + | BC28支持多频段,查询当前频段设置的命令如下。<syntaxhighlight lang="bash"> | |
+ | #发送指令 | ||
AT+NBAND? | AT+NBAND? | ||
− | + | ||
+ | #模块返回: | ||
+NBAND:5 | +NBAND:5 | ||
− | |||
OK | OK | ||
− | </syntaxhighlight>+NBAND格式如下:+NBAND:<band> | + | </syntaxhighlight>+NBAND格式如下:<code>+NBAND:<band></code> |
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第117行: | 第125行: | ||
有关完整的频段说明,请阅读NB200硬件手册 | 有关完整的频段说明,请阅读NB200硬件手册 | ||
|} | |} | ||
− | + | 模块入网时会自动搜索工作频段,无需手动设置。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===查询当前信号=== | ===查询当前信号=== | ||
信号的强弱直接影响网络通信的质量,可以使用AT+CSQ来查询当前信号值。一般要求CSQ值大于5方可正常工作。 | 信号的强弱直接影响网络通信的质量,可以使用AT+CSQ来查询当前信号值。一般要求CSQ值大于5方可正常工作。 | ||
发送指令:<syntaxhighlight lang="bash"> | 发送指令:<syntaxhighlight lang="bash"> | ||
+ | #发送指令 | ||
AT+CSQ | AT+CSQ | ||
− | + | ||
+ | #模块返回 | ||
+CSQ:25,99 | +CSQ:25,99 | ||
− | |||
OK | OK | ||
− | </syntaxhighlight>+CSQ格式如下:+CSQ:<rssi>,<ber> | + | </syntaxhighlight>+CSQ格式如下:<code>+CSQ:<rssi>,<ber></code> |
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第173行: | 第163行: | ||
发送指令<syntaxhighlight lang="bash"> | 发送指令<syntaxhighlight lang="bash"> | ||
+ | #发送指令 | ||
AT+CGATT? | AT+CGATT? | ||
− | + | ||
+ | #模块返回 | ||
+CGATT:1 | +CGATT:1 | ||
− | |||
OK | OK | ||
− | |||
</syntaxhighlight>参数: | </syntaxhighlight>参数: | ||
第189行: | 第179行: | ||
发送指令:<syntaxhighlight lang="bash"> | 发送指令:<syntaxhighlight lang="bash"> | ||
+ | #发送指令 | ||
AT+CGATT=1 | AT+CGATT=1 | ||
− | + | ||
+ | #模块返回 | ||
OK | OK | ||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
===查询网络是否已注册=== | ===查询网络是否已注册=== | ||
− | + | <syntaxhighlight lang="bash"> | |
+ | #发送指令 | ||
AT+CEREG? | AT+CEREG? | ||
− | + | ||
+ | #模块返回 | ||
+CEREG:0,1 | +CEREG:0,1 | ||
− | |||
OK | OK | ||
− | </syntaxhighlight>返回格式为:+CEREG:<n>,<stat> | + | </syntaxhighlight>返回格式为:<code>+CEREG:<n>,<stat></code> |
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第224行: | 第215行: | ||
|}以上指令,我们已完成网络的附着操作,接下来可以使用CoAP和UDP协议收发数据了。 | |}以上指令,我们已完成网络的附着操作,接下来可以使用CoAP和UDP协议收发数据了。 | ||
− | == | + | == 其他相关指令 == |
+ | 本节讲解NB使用时值得了解的其他相关指令。 | ||
+ | |||
+ | === 设置网络通知 === | ||
当模块网络发生变化时,我们需要模块主动上报当前的网络状态,发送以下指令实现该功能。 | 当模块网络发生变化时,我们需要模块主动上报当前的网络状态,发送以下指令实现该功能。 | ||
第252行: | 第246行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | ==自动入网设置== | + | ===自动入网设置=== |
自动入网是指模块上电后,自动完成网络附着动作,无需执行任何指令。可以按照下面的方法来开启或关闭自动入网。 | 自动入网是指模块上电后,自动完成网络附着动作,无需执行任何指令。可以按照下面的方法来开启或关闭自动入网。 | ||
− | ===开启自动入网=== | + | ====开启自动入网==== |
模块出厂时,已配置为自动入网 | 模块出厂时,已配置为自动入网 | ||
第264行: | 第258行: | ||
OK | OK | ||
− | </syntaxhighlight>设置完后发送AT+CFUN=1打开设备功能,最后发送重启命令AT+ | + | </syntaxhighlight>设置完后发送AT+CFUN=1打开设备功能,最后发送重启命令AT+NRB,重启模块即可生效。 |
− | + | ====关闭自动入网==== | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ===关闭自动入网=== | ||
自动附着网络功能会消耗更多的电量,如果考虑功耗问题,建议在使用的时候再连接网络。只要关闭自动连接和射频功能即可。 | 自动附着网络功能会消耗更多的电量,如果考虑功耗问题,建议在使用的时候再连接网络。只要关闭自动连接和射频功能即可。 | ||
第284行: | 第270行: | ||
</syntaxhighlight>然后再发送AT+CFUN=0,关闭射频功能,发送重启命令AT+NRB后生效。 | </syntaxhighlight>然后再发送AT+CFUN=0,关闭射频功能,发送重启命令AT+NRB后生效。 | ||
− | == | + | ===PING测通=== |
− | + | 使用AT+NPING指令来测通,检查是否能够与目标服务器IP通信。<syntaxhighlight lang="bash"> | |
− | + | #发送ping请求 | |
− | |||
− | |||
AT+NPING=115.29.240.46 | AT+NPING=115.29.240.46 | ||
− | + | #模块返回 | |
− | |||
OK | OK | ||
− | + | #若成功,模块返回 | |
+NPING:115.29.240.46,53,488 | +NPING:115.29.240.46,53,488 | ||
− | </syntaxhighlight> | + | #若失败,携带错误返回 |
+ | +NPINGERR:1 | ||
+ | |||
+ | </syntaxhighlight>命令返回格式为:<code>+NPING:<remote_address>,<ttl></code> | ||
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第320行: | 第306行: | ||
另外值得注意的是,电信的SIM卡虽然已绑定了该某个IP地址,会仍然无法PING成功,但不影响通信。 | 另外值得注意的是,电信的SIM卡虽然已绑定了该某个IP地址,会仍然无法PING成功,但不影响通信。 | ||
+ | === 错误码提示 === | ||
+ | 当指令执行遇到错误时,我们需要针对错误原因,来确定下一步的操作。发送指令<code>AT+CMEE=1</code> 来开启错误码提示。 | ||
+ | |||
+ | 未开启时,模块仅返回ERROR,开启后,会携带错误码,例如:<code>+CME ERROR:513</code> | ||
+ | |||
+ | == 使用UDP协议通信 == | ||
+ | NB模块作为UDP的客户端,连接UDP的服务端,NB模块的UDP客户端创建成功后,可以与服务器收发数据。 | ||
+ | |||
+ | 为了方便测试,我们在谷雨云平台上启用了一个UDP测试服务器,监听客户端,收到数据后会加上前缀字符串返回给客户端。 | ||
+ | |||
+ | 注意,使用电信卡的用户很可能无法与我们的服务器通信,因为电信NB网络有定向访问的限制。 | ||
+ | {| class="wikitable" | ||
+ | !接口 | ||
+ | !功能 | ||
+ | |- | ||
+ | |UDP测试服务器:115.29.240.46,端口号:6001 | ||
+ | |6001端口时刻监听客户端,收到数据后,加上“iotxx.udp”前缀字符串,延时3s后返回给客户端。 | ||
+ | |} | ||
===创建UDP通信Socket=== | ===创建UDP通信Socket=== | ||
− | + | 需要先创建一个socket,类型为UDP,并且指定一个本地端口。 | |
发送如下命令创建UDP Socket<syntaxhighlight lang="bash"> | 发送如下命令创建UDP Socket<syntaxhighlight lang="bash"> | ||
− | AT+NSOCR=DGRAM,17, | + | #创建UDP Socket |
− | + | AT+NSOCR=DGRAM,17,3000,1 | |
+ | |||
+ | #若成功返回 | ||
0 | 0 | ||
− | + | ok | |
− | + | #若失败,返回错误ERROR,当开启AT+CMEE=1时,会返回详细错误 | |
+ | ERROR 或 +CME ERROR: 4 | ||
+ | |||
− | AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>] | + | </syntaxhighlight>创建socket的指令格式为:<code>AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]</code> |
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第336行: | 第344行: | ||
|- | |- | ||
|<type> | |<type> | ||
− | | | + | |UDP固定取值为DGRAM |
|- | |- | ||
|<protocol> | |<protocol> | ||
第342行: | 第350行: | ||
|- | |- | ||
|<listen-port> | |<listen-port> | ||
− | |本地监听端口,不是远程UDP- | + | |本地监听端口,不是远程UDP-Server的端口。示例中取值3000。 |
+ | BC28模块支持创建7路UDP Socket,若再次创建socket,本地端口请+1,注意不要和已创建的重复即可。 | ||
|}返回格式为: | |}返回格式为: | ||
第348行: | 第357行: | ||
OK | OK | ||
− | + | {| class="wikitable" | |
− | + | !参数 | |
− | + | !说明 | |
+ | |- | ||
+ | |<socket-id> | ||
+ | |刚刚创建的Socket ID,后续通信需要携带此ID,需要记录。例如上述命令返回的socket Id为0 | ||
+ | |} | ||
===UDP发送和接收数据=== | ===UDP发送和接收数据=== | ||
− | + | 向UDP测试服务器发送数据。UDP测试服务器IP为<code>115.29.240.46</code>,端口为<code>6001</code> <syntaxhighlight lang="bash"> | |
− | + | #发送数据命令 | |
− | + | AT+NSOST=0,115.29.240.46,6001,3,313233 | |
− | + | #模块返回 | |
− | |||
− | |||
− | |||
− | AT+NSOST=0,115.29.240.46, | ||
− | |||
0,3 | 0,3 | ||
+ | OK | ||
− | + | </syntaxhighlight>发送数据指令格式为:<code>AT+NSOST=<socket-id>,<remote_addr>,<remote_port>, <length>,<nowiki><data></nowiki></code> | |
− | </syntaxhighlight> | ||
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第370行: | 第378行: | ||
|- | |- | ||
|<socket-id> | |<socket-id> | ||
− | | | + | |填写已创建的socket Id,请参考上节AT+NSOCR命令 |
|- | |- | ||
|<remote_addr>,<remote_port> | |<remote_addr>,<remote_port> | ||
− | | | + | |UDP服务器IP地址和端口,例如我们的UDP测试服务器:<code>115.29.240.46:6001</code> |
|- | |- | ||
|<length>,<nowiki><data></nowiki> | |<length>,<nowiki><data></nowiki> | ||
|待发送的数据长度和数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,length为:3 | |待发送的数据长度和数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,length为:3 | ||
− | |}模块返回格式:<socket-id>,<length> | + | |}模块返回格式:<code><socket-id>,<length></code> |
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第383行: | 第391行: | ||
|- | |- | ||
|<socket-id> | |<socket-id> | ||
− | | | + | |socket通信编号 |
|- | |- | ||
|<length> | |<length> | ||
− | | | + | |已发送的数据长度。 |
− | + | 例如返回:0,3,则表示,Socket 0通道发送了3个字节数据。此时表明,模块已经成功将数据发送了出去。 | |
+ | |} | ||
− | + | 数据发成成功后,大约3秒后收到测试服务发来的数据。<syntaxhighlight lang="bash"> | |
− | +NSONMI:0, | + | #模块返回 |
− | </syntaxhighlight> | + | +NSONMI:0,13 |
+ | </syntaxhighlight>命令格式为:<code>+NSONMI:<socket-id>,<length></code> | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |socket通信编号 | ||
+ | |- | ||
+ | |<length> | ||
+ | |已收到的数据长度 | ||
+ | 例如返回:0,13,则表示,Socket 0通道收到了13个字节数据。此刻可以调用读指令,将数据读出来。 | ||
+ | |}此时,我们需要把已模块已收到的数据读出来。 | ||
− | + | <syntaxhighlight lang="bash"> | |
− | + | #将已缓存的数据读出来 | |
− | + | AT+NSORF=0,13 | |
− | + | #模块返回 | |
− | + | 0,115.29.240.46,6001,13,696F7478782E7564703A313233,0 | |
− | AT+NSORF=0, | + | </syntaxhighlight>读指令格式为:<code>AT+NSORF=<socket-id>,<req_length></code> |
− | |||
− | 0,115.29.240.46, | ||
− | </syntaxhighlight> | ||
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第407行: | 第425行: | ||
|- | |- | ||
|<socket-id> | |<socket-id> | ||
− | | | + | |socket通信编号 |
|- | |- | ||
|<req_length> | |<req_length> | ||
第413行: | 第431行: | ||
|} | |} | ||
− | 模块返回的数据格式为:<socket-id>,<remote_addr>,<remote_port>,<length>,<nowiki><data>,<remaining_length></nowiki> | + | 模块返回的数据格式为:<code><socket-id>,<remote_addr>,<remote_port>,<length>,<nowiki><data>,<remaining_length></nowiki></code> |
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第419行: | 第437行: | ||
|- | |- | ||
|<socket-id> | |<socket-id> | ||
− | | | + | |socket通信编号 |
|- | |- | ||
|<ip_addr>,<port> | |<ip_addr>,<port> | ||
− | | | + | |发送方的服务器ip地址和端口号。例如我们的UDP测试服务器:<code>115.29.240.46:6001</code> |
|- | |- | ||
|<length>,<nowiki><data></nowiki> | |<length>,<nowiki><data></nowiki> | ||
− | | | + | |模块收到的数据长度和数据。例如:<code>696F7478782E7564703A313233</code>,对应字符串为:<code>iotxx.udp:123</code> |
|- | |- | ||
|<remaining_length> | |<remaining_length> | ||
− | | | + | |剩余待读数据长度。 |
|} | |} | ||
== 使用TCP协议通信 == | == 使用TCP协议通信 == | ||
− | + | TCP协议与UDP协议类似,NB模块作为TCP的客户端,连接TCP的服务端,连接成功后可以收发数据。 | |
+ | |||
+ | 为了方便测试,我们在云平台上启用了一个TCP测试服务器,无论发任何数据,在3秒后,会加上前缀字符串返回数据。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。 | ||
+ | |||
+ | BC28、BC35均支持TCP协议,BC95不支持。 | ||
+ | {| class="wikitable" | ||
+ | !接口 | ||
+ | !功能 | ||
+ | |- | ||
+ | |TCP测试服务器:115.29.240.46,端口号:9001 | ||
+ | |9001端口时刻监听客户端,收到数据后,加上“iotxx.tcp”前缀字符串,然后延时3s后返回给客户端。 | ||
+ | |} | ||
+ | |||
+ | === 创建TCP客户端 === | ||
+ | 需要先创建一个socket,指定socket类型为TCP,并且指定一个本地端口。<syntaxhighlight lang="bash"> | ||
+ | #创建 TCP Socket | ||
+ | AT+NSOCR=STREAM,6,4000,1 | ||
+ | |||
+ | #若成功返回 | ||
+ | 1 | ||
+ | OK | ||
+ | #若失败,返回错误ERROR,当开启AT+CMEE=1时,会返回详细错误 | ||
+ | ERROR 或 +CME ERROR: 4 | ||
+ | |||
+ | |||
+ | </syntaxhighlight>创建socket的指令格式为:<code>AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]</code> | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<type> | ||
+ | |TCP协议固定取值为STREAM | ||
+ | |- | ||
+ | |<protocol> | ||
+ | |Socket通信协议,TCP协议固定取值为6 | ||
+ | |- | ||
+ | |<listen-port> | ||
+ | |本地监听端口,不是远程TCPServer的端口。示例中取值4000。 | ||
+ | BC28模块支持创建7路Socket,若再次创建socket,本地端口请+1,注意不要和已创建的重复即可。 | ||
+ | |}返回格式为: | ||
+ | |||
+ | <socket-id> | ||
+ | |||
+ | OK | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |刚刚创建的Socket ID,后续通信需要携带此ID,需要记录。例如上述命令返回的socket Id为1 | ||
+ | |} | ||
+ | |||
+ | === 连接TCP服务器 === | ||
+ | TCP协议比UDP协议多一个连接步骤,调用一下命令连接TCP服务器。<syntaxhighlight lang="bash"> | ||
+ | #连接TCP服务器 | ||
+ | AT+NSOCO=1,115.29.240.46,9001 | ||
+ | |||
+ | #模块返回 | ||
+ | OK | ||
+ | |||
+ | |||
+ | </syntaxhighlight>指令格式:AT+NSOCO=<socket-id>,<remote_addr>,<remote_port> | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |刚刚创建的Socket ID,后续通信需要携带此ID,需要记录。例如上述命令返回的socket Id为1 | ||
+ | |- | ||
+ | |<remote_addr>,<remote_port> | ||
+ | |TCP服务器地址和端口,例如我们的测试服务器:<code>115.29.240.46:9001</code> | ||
+ | |} | ||
+ | |||
+ | === TCP数据收发 === | ||
+ | 向TCP服务器发送数据,例如字符串123<syntaxhighlight lang="bash"> | ||
+ | #连接TCP服务器 | ||
+ | AT+NSOSD=1,3,313233 | ||
+ | |||
+ | #模块返回 | ||
+ | 1,3 | ||
+ | OK | ||
+ | |||
+ | |||
+ | </syntaxhighlight>指令格式:AT+NSOSD=<socket-id>,<length>,<nowiki><data></nowiki> | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |socket通信id | ||
+ | |- | ||
+ | |<length>,<nowiki><data></nowiki> | ||
+ | |待发送数据和数据长度,data格式为16进制,例如发送字符串123,则length是3,data是313233 | ||
+ | |} | ||
+ | |||
+ | 数据发成成功后,大约3秒后收到测试服务下发的数据。<syntaxhighlight lang="bash"> | ||
+ | #模块返回 | ||
+ | +NSONMI:1,13 | ||
+ | </syntaxhighlight>命令格式为:<code>+NSONMI:<socket-id>,<length></code> | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |socket通信编号 | ||
+ | |- | ||
+ | |<length> | ||
+ | |已收到的数据长度 | ||
+ | 例如返回:0,13,则表示,Socket 0通道收到了13个字节数据。此刻可以调用读指令,将数据读出来。 | ||
+ | |}此时,我们需要把已模块已收到的数据读出来。 | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | #将已缓存的数据读出来 | ||
+ | AT+NSORF=1,13 | ||
+ | #模块返回 | ||
+ | 1,115.29.240.46,9001,13,696F7478782E7564703A313233,0 | ||
+ | </syntaxhighlight>读指令格式为:<code>AT+NSORF=<socket-id>,<req_length></code> | ||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |socket通信编号 | ||
+ | |- | ||
+ | |<req_length> | ||
+ | |要读取的数据长度,当req_length大于+NSONMI指令返回的长度时,返回+NSONMI的实际长度。若req_length小于+NSONMI指令返回的长度时,将只返回req_length长度的数据。 | ||
+ | |} | ||
− | + | 模块返回的数据格式为:<code><socket-id>,<remote_addr>,<remote_port>,<length>,<nowiki><data>,<remaining_length></nowiki></code> | |
− | + | {| class="wikitable" | |
− | </ | + | !参数 |
+ | !说明 | ||
+ | |- | ||
+ | |<socket-id> | ||
+ | |socket通信编号 | ||
+ | |- | ||
+ | |<ip_addr>,<port> | ||
+ | |发送方的服务器ip地址和端口号。例如我们的UDP测试服务器:<code>115.29.240.46:9001</code> | ||
+ | |- | ||
+ | |<length>,<nowiki><data></nowiki> | ||
+ | |模块收到的数据长度和数据。例如:696F7478782E7463703A313233,对应字符串为:<code>iotxx.tcp:123</code> | ||
+ | |- | ||
+ | |<remaining_length> | ||
+ | |剩余待读数据长度。 | ||
+ | |} | ||
==使用CoAP协议通信== | ==使用CoAP协议通信== | ||
− | + | 标准CoAP是一种类似HTTP的极其轻量级的应用层协议,HTTP基于TCP协议,而CoAP基于UDP协议,最小数据包仅有4个字节。非常适合低功耗物联网设备的使用。 | |
− | + | BC28模块内的CoAP协议并非指标准CoAP,而是按照LwM2M标准进行了一层封装。简单的说,BC28内部的CoAP协议是LwM2M标准协议的简化版本。为了简化描述,下文统称为CoAP。 | |
CoAP通信的使用流程: 模块附着网络>>设置CDP服务器地址和端口>>发送数据>>接收数据。 | CoAP通信的使用流程: 模块附着网络>>设置CDP服务器地址和端口>>发送数据>>接收数据。 | ||
− | + | 为了方便测试,我们在云平台上启用了一个CoAP测试服务器,无论模块发送什么数据,测试服务器在收到的数据前加上前缀字符串,然后延时3s后返回给客户端。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。 | |
− | {{Note|text=1、NB模块中使用的CoAP协议是在标准CoAP基础上又封装一层,过程较复杂,因此大家很难自己创建CoAP服务器来测试,如果要自建CoAP协议服务器,请参考电信的模块对接手册。 | + | {| class="wikitable" |
− | + | !接口 | |
+ | !功能 | ||
+ | |- | ||
+ | |CoAP测试服务器:115.29.240.46,端口号:5683 | ||
+ | |5683端口时刻监听客户端数据,并且在收到的数据前加上“iotxx.coap”前缀字符串,延时3s后返回给终端。 | ||
+ | |} | ||
+ | 也可以使用我们的云透传平台创建电信平台设备,支持线数据测试,数据透传。详情请参考《谷雨云透传平台接入指南<ref group="手册" name=":1">[[谷雨云透传平台接入指南]],谷雨云透传接入指南</ref>》。 | ||
+ | {| class="wikitable" | ||
+ | !接口 | ||
+ | !功能 | ||
+ | |- | ||
+ | |电信平台:117.60.157.137,端口号:5683 | ||
+ | |电信商用物联网平台,需要先在谷雨云透传上创建电信平台设备,方可在线调试或透传。 | ||
+ | |}{{Note|text=1、NB模块中使用的CoAP协议是在标准CoAP基础上又封装一层,过程较复杂,因此大家很难自己创建CoAP服务器来测试,如果要自建CoAP协议服务器,请参考电信的模块对接手册。|type=info}} | ||
===配置CDP服务器=== | ===配置CDP服务器=== | ||
− | 配置远程CoAP服务器的IP地址和端口,类似UDP的IP和端口。 | + | 配置远程CoAP服务器的IP地址和端口,类似UDP的IP和端口。<syntaxhighlight lang="bash"> |
− | + | #设置CoAP测试服务器地址 | |
− | |||
AT+NCDP=115.29.240.46,5683 | AT+NCDP=115.29.240.46,5683 | ||
− | + | #模块返回 | |
OK | OK | ||
− | |||
</syntaxhighlight>设置指令格式:AT+NCDP= <ip_addr>[,<port>] | </syntaxhighlight>设置指令格式:AT+NCDP= <ip_addr>[,<port>] | ||
{| class="wikitable" | {| class="wikitable" | ||
− | |||
!参数 | !参数 | ||
!说明 | !说明 | ||
第472行: | 第640行: | ||
===配置新消息通知=== | ===配置新消息通知=== | ||
− | + | 开启发送消息通知,配置后若消息已发送,串口会返回异步命令+NSMI:SENT的提示。<syntaxhighlight lang="bash"> | |
− | + | #发送指令 | |
− | |||
AT+NSMI=1 | AT+NSMI=1 | ||
− | + | #模块返回 | |
OK | OK | ||
− | + | </syntaxhighlight>开启接收消息通知,配置后,若接收到服务器的数据下发,模块会主动向串口发送异步命令。<syntaxhighlight lang="bash"> | |
− | </syntaxhighlight>开启接收消息通知,配置后,若接收到服务器的数据下发,模块会主动向串口发送异步命令。 | + | #发送指令 |
− | |||
− | |||
AT+NNMI=1 | AT+NNMI=1 | ||
− | + | #模块返回 | |
OK | OK | ||
− | + | </syntaxhighlight>指令格式:AT+NSMI/NNMI=<status> | |
− | </syntaxhighlight>指令格式:AT+NNMI=<status> | ||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第502行: | 第665行: | ||
===CoAP发送和接收数据=== | ===CoAP发送和接收数据=== | ||
− | + | 向CoAP测试服务器发送消息,消息内容为字符串123,对应长度为3,对应HEX格式字符串为313233<syntaxhighlight lang="bash"> | |
− | + | #向CoAP测试服务器发送消息 | |
− | |||
− | |||
− | |||
AT+NMGS=3,313233 | AT+NMGS=3,313233 | ||
− | + | #模块返回 | |
OK | OK | ||
− | + | #若数据发送成功,返回 | |
+NSMI:SENT | +NSMI:SENT | ||
− | + | #若数据发送失败,携带错误码返回 | |
− | |||
+ | </syntaxhighlight>指令格式:AT+NMGS=<length>,<nowiki><data></nowiki> | ||
{| class="wikitable" | {| class="wikitable" | ||
!参数 | !参数 | ||
第529行: | 第689行: | ||
|} | |} | ||
− | + | 接收数据:等待约3秒,测试服务器返回数据:<syntaxhighlight lang="bash"> | |
− | +NNMI: | + | #模块串口打印 |
− | </syntaxhighlight>指令格式为:+NNMI:<length>,<nowiki><data> | + | +NNMI:14,696F7478782E636F61703A313233 |
+ | </syntaxhighlight>指令格式为:+NNMI:<length>,<nowiki><data></nowiki> | ||
+ | |||
+ | {| class="wikitable" | ||
+ | !参数 | ||
+ | !说明 | ||
+ | |- | ||
+ | |<length> | ||
+ | |已接收数据的数据长度 | ||
+ | |- | ||
+ | |<nowiki><data></nowiki> | ||
+ | |已接收到的数据内容,data是以16进制形式。 | ||
+ | 例如刚才向CoAP测试服务器发送了123,3秒后返回字符串为:iotxx.coap:123,对应16进制数据为:696F7478782E636F61703A313233 | ||
+ | |} | ||
+ | |||
+ | == 谷雨云透传接入指导 == | ||
+ | 谷雨物联网提供简单实用的云透传平台,向广大开发者,免费提供NB设备的连接测试。 | ||
+ | |||
+ | 请阅读:谷雨云透传平台接入指南<ref name=":1" group="手册" />中的NB设备接入一节。 | ||
+ | |||
+ | == 电信/华为云平台接入指导 == | ||
+ | 待更新 | ||
==本文参考== | ==本文参考== | ||
<references group="手册" /> | <references group="手册" /> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[分类:NB-IOT]] | [[分类:NB-IOT]] | ||
[[分类:NB200]] | [[分类:NB200]] | ||
[[分类:软件手册]] | [[分类:软件手册]] |
2019年2月17日 (日) 23:41的最新版本
本文档描述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
+CFUN:0
表示模块功能未打开,若返回:+CFUN:1
则表示射频已打开。
类似查看手机是否处于处于飞行或关机状态。0表示模块处于最低功能状态,功耗很小,可用的指令和功能也很少。
5.2 开启模块功能
#发送指令
AT+CFUN=1
#大约两三秒后,模块返回
OK
此时表示模块功能已打开,可以继续后续指令。注意,CFUN指令未返回前请勿执行其他指令。
5.3 查询SIM卡的ICCID码
ICCID是集成电路卡识别码:Integrate Circuit Card Identity的首字母缩写,该号码可以在SIM卡的背面看到。
#发送指令
AT+NCCID
#模块返回
+NCCID:89860317492045357506
OK
5.4 查询模块IMEI码
IMEI码是模块的唯一标识码,模块与电信或华为通信时,会用到IMEI码。
#发送指令
AT+CGSN=1
#模块返回
+CGSN:867725034773635
OK
5.5 查询当前频段
BC28支持多频段,查询当前频段设置的命令如下。
#发送指令
AT+NBAND?
#模块返回:
+NBAND:5
OK
+NBAND格式如下:+NBAND:<band>
参数 | 说明 |
---|---|
<band> | 网络频段:
5:表示B5,中国电信使用该频段 8:表示B8,中国移动使用该频段 有关完整的频段说明,请阅读NB200硬件手册 |
模块入网时会自动搜索工作频段,无需手动设置。
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。 |
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 其他相关指令
本节讲解NB使用时值得了解的其他相关指令。
6.1 设置网络通知
当模块网络发生变化时,我们需要模块主动上报当前的网络状态,发送以下指令实现该功能。
发送指令
AT+CEREG=1
模块返回:
OK
此时,我们可以简单测试一下该功能。例如,关闭模块网络然后重新打开,如下:
#发送指令关闭网络
AT+CGATT=0
#模块返回
OK
#大概1s左右,模块主动通知
+CEREG=0
#再次打开网络
AT+CGATT=1
#模块立即返回
OK
#然后随即主动通知正在注册网络:
+CEREG:2
#最后再次通知注册成功(注册网络需要一定的时间,不同地区时间不同,从几秒到几分钟均有可能):
+CEREG:1
6.2 自动入网设置
自动入网是指模块上电后,自动完成网络附着动作,无需执行任何指令。可以按照下面的方法来开启或关闭自动入网。
6.2.1 开启自动入网
模块出厂时,已配置为自动入网
发送指令
AT+NCONFIG=AUTOCONNECT,TRUE
模块返回:
OK
设置完后发送AT+CFUN=1打开设备功能,最后发送重启命令AT+NRB,重启模块即可生效。
6.2.2 关闭自动入网
自动附着网络功能会消耗更多的电量,如果考虑功耗问题,建议在使用的时候再连接网络。只要关闭自动连接和射频功能即可。
发送指令
AT+NCONFIG=AUTOCONNECT,FALSE
模块返回:
OK
然后再发送AT+CFUN=0,关闭射频功能,发送重启命令AT+NRB后生效。
6.3 PING测通
使用AT+NPING指令来测通,检查是否能够与目标服务器IP通信。
#发送ping请求
AT+NPING=115.29.240.46
#模块返回
OK
#若成功,模块返回
+NPING:115.29.240.46,53,488
#若失败,携带错误返回
+NPINGERR:1
命令返回格式为:+NPING:<remote_address>,<ttl>
参数 | 说明 |
---|---|
<remote_address> | 目标ip地址 |
<ttl> | 数据包生存时间,请看百科介绍。 |
发生错误时,返回:+NPINGERR:<err>
参数 | 说明 |
---|---|
<err> | 错误码
1:远程主机有效时间内未响应。 2:发送PING请求失败。 |
所以当返回:+NPINGERR:1时,很可能是该IP地址未绑定到SIM卡(电信卡有这个限制)。无法进行后续通信测试。
另外值得注意的是,电信的SIM卡虽然已绑定了该某个IP地址,会仍然无法PING成功,但不影响通信。
6.4 错误码提示
当指令执行遇到错误时,我们需要针对错误原因,来确定下一步的操作。发送指令AT+CMEE=1
来开启错误码提示。
未开启时,模块仅返回ERROR,开启后,会携带错误码,例如:+CME ERROR:513
7 使用UDP协议通信
NB模块作为UDP的客户端,连接UDP的服务端,NB模块的UDP客户端创建成功后,可以与服务器收发数据。
为了方便测试,我们在谷雨云平台上启用了一个UDP测试服务器,监听客户端,收到数据后会加上前缀字符串返回给客户端。
注意,使用电信卡的用户很可能无法与我们的服务器通信,因为电信NB网络有定向访问的限制。
接口 | 功能 |
---|---|
UDP测试服务器:115.29.240.46,端口号:6001 | 6001端口时刻监听客户端,收到数据后,加上“iotxx.udp”前缀字符串,延时3s后返回给客户端。 |
7.1 创建UDP通信Socket
需要先创建一个socket,类型为UDP,并且指定一个本地端口。
发送如下命令创建UDP Socket
#创建UDP Socket
AT+NSOCR=DGRAM,17,3000,1
#若成功返回
0
ok
#若失败,返回错误ERROR,当开启AT+CMEE=1时,会返回详细错误
ERROR 或 +CME ERROR: 4
创建socket的指令格式为:AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]
参数 | 说明 |
---|---|
<type> | UDP固定取值为DGRAM |
<protocol> | Socket通信协议,UDP协议号是17,因此取值为17 |
<listen-port> | 本地监听端口,不是远程UDP-Server的端口。示例中取值3000。
BC28模块支持创建7路UDP Socket,若再次创建socket,本地端口请+1,注意不要和已创建的重复即可。 |
返回格式为:
<socket-id>
OK
参数 | 说明 |
---|---|
<socket-id> | 刚刚创建的Socket ID,后续通信需要携带此ID,需要记录。例如上述命令返回的socket Id为0 |
7.2 UDP发送和接收数据
向UDP测试服务器发送数据。UDP测试服务器IP为115.29.240.46
,端口为6001
#发送数据命令
AT+NSOST=0,115.29.240.46,6001,3,313233
#模块返回
0,3
OK
发送数据指令格式为:AT+NSOST=<socket-id>,<remote_addr>,<remote_port>, <length>,<data>
参数 | 说明 |
---|---|
<socket-id> | 填写已创建的socket Id,请参考上节AT+NSOCR命令 |
<remote_addr>,<remote_port> | UDP服务器IP地址和端口,例如我们的UDP测试服务器:115.29.240.46:6001
|
<length>,<data> | 待发送的数据长度和数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,length为:3 |
模块返回格式:<socket-id>,<length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<length> | 已发送的数据长度。
例如返回:0,3,则表示,Socket 0通道发送了3个字节数据。此时表明,模块已经成功将数据发送了出去。 |
数据发成成功后,大约3秒后收到测试服务发来的数据。
#模块返回
+NSONMI:0,13
命令格式为:+NSONMI:<socket-id>,<length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<length> | 已收到的数据长度
例如返回:0,13,则表示,Socket 0通道收到了13个字节数据。此刻可以调用读指令,将数据读出来。 |
此时,我们需要把已模块已收到的数据读出来。
#将已缓存的数据读出来
AT+NSORF=0,13
#模块返回
0,115.29.240.46,6001,13,696F7478782E7564703A313233,0
读指令格式为:AT+NSORF=<socket-id>,<req_length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<req_length> | 要读取的数据长度,当req_length大于+NSONMI指令返回的长度时,返回+NSONMI的实际长度。若req_length小于+NSONMI指令返回的长度时,将只返回req_length长度的数据。 |
模块返回的数据格式为:<socket-id>,<remote_addr>,<remote_port>,<length>,<data>,<remaining_length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<ip_addr>,<port> | 发送方的服务器ip地址和端口号。例如我们的UDP测试服务器:115.29.240.46:6001
|
<length>,<data> | 模块收到的数据长度和数据。例如:696F7478782E7564703A313233 ,对应字符串为:iotxx.udp:123
|
<remaining_length> | 剩余待读数据长度。 |
8 使用TCP协议通信
TCP协议与UDP协议类似,NB模块作为TCP的客户端,连接TCP的服务端,连接成功后可以收发数据。
为了方便测试,我们在云平台上启用了一个TCP测试服务器,无论发任何数据,在3秒后,会加上前缀字符串返回数据。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。
BC28、BC35均支持TCP协议,BC95不支持。
接口 | 功能 |
---|---|
TCP测试服务器:115.29.240.46,端口号:9001 | 9001端口时刻监听客户端,收到数据后,加上“iotxx.tcp”前缀字符串,然后延时3s后返回给客户端。 |
8.1 创建TCP客户端
需要先创建一个socket,指定socket类型为TCP,并且指定一个本地端口。
#创建 TCP Socket
AT+NSOCR=STREAM,6,4000,1
#若成功返回
1
OK
#若失败,返回错误ERROR,当开启AT+CMEE=1时,会返回详细错误
ERROR 或 +CME ERROR: 4
创建socket的指令格式为:AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]
参数 | 说明 |
---|---|
<type> | TCP协议固定取值为STREAM |
<protocol> | Socket通信协议,TCP协议固定取值为6 |
<listen-port> | 本地监听端口,不是远程TCPServer的端口。示例中取值4000。
BC28模块支持创建7路Socket,若再次创建socket,本地端口请+1,注意不要和已创建的重复即可。 |
返回格式为:
<socket-id>
OK
参数 | 说明 |
---|---|
<socket-id> | 刚刚创建的Socket ID,后续通信需要携带此ID,需要记录。例如上述命令返回的socket Id为1 |
8.2 连接TCP服务器
TCP协议比UDP协议多一个连接步骤,调用一下命令连接TCP服务器。
#连接TCP服务器
AT+NSOCO=1,115.29.240.46,9001
#模块返回
OK
指令格式:AT+NSOCO=<socket-id>,<remote_addr>,<remote_port>
参数 | 说明 |
---|---|
<socket-id> | 刚刚创建的Socket ID,后续通信需要携带此ID,需要记录。例如上述命令返回的socket Id为1 |
<remote_addr>,<remote_port> | TCP服务器地址和端口,例如我们的测试服务器:115.29.240.46:9001
|
8.3 TCP数据收发
向TCP服务器发送数据,例如字符串123
#连接TCP服务器
AT+NSOSD=1,3,313233
#模块返回
1,3
OK
指令格式:AT+NSOSD=<socket-id>,<length>,<data>
参数 | 说明 |
---|---|
<socket-id> | socket通信id |
<length>,<data> | 待发送数据和数据长度,data格式为16进制,例如发送字符串123,则length是3,data是313233 |
数据发成成功后,大约3秒后收到测试服务下发的数据。
#模块返回
+NSONMI:1,13
命令格式为:+NSONMI:<socket-id>,<length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<length> | 已收到的数据长度
例如返回:0,13,则表示,Socket 0通道收到了13个字节数据。此刻可以调用读指令,将数据读出来。 |
此时,我们需要把已模块已收到的数据读出来。
#将已缓存的数据读出来
AT+NSORF=1,13
#模块返回
1,115.29.240.46,9001,13,696F7478782E7564703A313233,0
读指令格式为:AT+NSORF=<socket-id>,<req_length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<req_length> | 要读取的数据长度,当req_length大于+NSONMI指令返回的长度时,返回+NSONMI的实际长度。若req_length小于+NSONMI指令返回的长度时,将只返回req_length长度的数据。 |
模块返回的数据格式为:<socket-id>,<remote_addr>,<remote_port>,<length>,<data>,<remaining_length>
参数 | 说明 |
---|---|
<socket-id> | socket通信编号 |
<ip_addr>,<port> | 发送方的服务器ip地址和端口号。例如我们的UDP测试服务器:115.29.240.46:9001
|
<length>,<data> | 模块收到的数据长度和数据。例如:696F7478782E7463703A313233,对应字符串为:iotxx.tcp:123
|
<remaining_length> | 剩余待读数据长度。 |
9 使用CoAP协议通信
标准CoAP是一种类似HTTP的极其轻量级的应用层协议,HTTP基于TCP协议,而CoAP基于UDP协议,最小数据包仅有4个字节。非常适合低功耗物联网设备的使用。
BC28模块内的CoAP协议并非指标准CoAP,而是按照LwM2M标准进行了一层封装。简单的说,BC28内部的CoAP协议是LwM2M标准协议的简化版本。为了简化描述,下文统称为CoAP。
CoAP通信的使用流程: 模块附着网络>>设置CDP服务器地址和端口>>发送数据>>接收数据。
为了方便测试,我们在云平台上启用了一个CoAP测试服务器,无论模块发送什么数据,测试服务器在收到的数据前加上前缀字符串,然后延时3s后返回给客户端。注意,使用电信卡的用户很可能无法与我们的服务器通信。因为电信NB网络有定向访问的限制。
接口 | 功能 |
---|---|
CoAP测试服务器:115.29.240.46,端口号:5683 | 5683端口时刻监听客户端数据,并且在收到的数据前加上“iotxx.coap”前缀字符串,延时3s后返回给终端。 |
也可以使用我们的云透传平台创建电信平台设备,支持线数据测试,数据透传。详情请参考《谷雨云透传平台接入指南[手册 3]》。
接口 | 功能 |
---|---|
电信平台:117.60.157.137,端口号:5683 | 电信商用物联网平台,需要先在谷雨云透传上创建电信平台设备,方可在线调试或透传。 |
9.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?
9.2 配置新消息通知
开启发送消息通知,配置后若消息已发送,串口会返回异步命令+NSMI:SENT的提示。
#发送指令
AT+NSMI=1
#模块返回
OK
开启接收消息通知,配置后,若接收到服务器的数据下发,模块会主动向串口发送异步命令。
#发送指令
AT+NNMI=1
#模块返回
OK
指令格式:AT+NSMI/NNMI=<status>
参数 | 说明 |
---|---|
<status> | 设置接收消息通知类型,取值如下:
0:不通知,默认设置 1:通知并携带数据, 2:仅通知 |
9.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 |
10 谷雨云透传接入指导
谷雨物联网提供简单实用的云透传平台,向广大开发者,免费提供NB设备的连接测试。
请阅读:谷雨云透传平台接入指南[手册 3]中的NB设备接入一节。
11 电信/华为云平台接入指导
待更新
12 本文参考
- ↑ 1.0 1.1 《NB200硬件设计手册》BC28模块指令使用介绍
- ↑ NB-IOT技术揭秘,一文读懂NB-IOT
- ↑ 3.0 3.1 谷雨云透传平台接入指南,谷雨云透传接入指南