打开主菜单

谷雨文档中心 β

更改

NB260软件设计手册

删除5,866字节2019年2月15日 (五) 14:13
使用UDP协议通信
</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">
 
OK
 
</syntaxhighlight>然后随即返回:<syntaxhighlight lang="bash">
+NPING:115.29.240.46,53,488
</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成功,但不影响通信。
 
===创建UDP通信Socket===
在使用模块网络收发数据之前,需要先创建一个socket,并且知道对方ip和端口号后才能发送数据。
 
发送如下命令创建UDP Socket<syntaxhighlight lang="bash">
AT+NSOCR=DGRAM,17,4587,1
</syntaxhighlight>模块返回:<syntaxhighlight lang="bash">
0
OK
</syntaxhighlight>创建socket的指令格式为:
 
AT+NSOCR=<type>,<protocol>,<listen-port>[,<receive control>]
{| class="wikitable"
!参数
!说明
|-
|<type>
|Socket类型,取值为DGRAM
|-
|<protocol>
|Socket通信协议,UDP协议号是17,因此取值为17
|-
|<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"
 
发送数据的命令如下:<syntaxhighlight lang="bash">
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"
!参数
!说明
|-
|<socket-id>
|刚刚创建的UDP通信socket编号,从0开始,若创建了两个UDP的socket,则第一个为id编号0,第二个id编号为1
|-
|<remote_addr>,<remote_port>
|远程服务器IP地址和端口,例如我们的NB云平台IP地址为:115.29.240.46,端口为:5000
|-
|<length>,<nowiki><data></nowiki>
|待发送的数据长度和数据内容,注意,data是以16进制形式的填写,例如要发送:123,则data为:313233,length为:3
|}模块返回格式:<socket-id>,<length>
{| class="wikitable"
!参数
!说明
|-
|<socket-id>
|UDP通信socket编号
|-
|<length>
|是已发送的数据长度。
|}例如返回:0,3,则表示,Socket 0通道发送了3个字节数据。此时表明,模块已经成功将数据发送了出去。
 
接下来演示模块接收来自服务器的数据(我们服务器5000端口收到客户端发送的数据后,等待5秒,然后原样回传)。等待大约5秒后,模块会异步命令通知:<syntaxhighlight lang="bash">
+NSONMI:0,9
</syntaxhighlight>格式为:+NSONMI:<socket-id>,<length>
 
+NSONMI:0,9 表示在通道0,接收到长度为9个字节的数据。
 
此时,我们需要把已模块已收到的数据读出来。
 
发送指令:<syntaxhighlight lang="bash">
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"
!参数
!说明
|-
|<socket-id>
|UDP通信socket编号
|-
|<req_length>
|要读取的数据长度,当req_length大于+NSONMI指令返回的长度时,返回+NSONMI的实际长度。若req_length小于+NSONMI指令返回的长度时,将只返回req_length长度的数据。       
|}
 
模块返回的数据格式为:<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协议通信 ==
2,367
个编辑