利用相关串口软件完成附网测试(Quectel BC95系列模组调试小记 II)以后,本文通过STM32串口发送相应AT命令依照附网流程进行附网及UDP通信,至此实现模组基本功能调试。至于南向终端设备将需要上报的数据通过NB-IoT网络发送到移动OneNet物联网平台,而后北向应用通过RESTful接口获取这些数据或者OneNet物联网平台推送已订阅的数据,这些涉及各方面因素,有机会再讨论。
1、附网注网及信号强度测试
原理图中STM32串口引脚分配如下图所示,其中串口1进行调试信息打印,串口2与BC95-B8模组主串口相连。主串口可用于AT命令通信和数据传输,波特率为9600bps。它还可用于固件升级,固件升级的波特率为115200bps。该主串口在Active模式,Idle模式和PSM模式下均可工作。
软件代码主程序如下所示:
串口调试软件连接Demo板,选好端口,设置好相关参数,重启Demo板电源,得到如下调试信息:
2、UDP通信测试
在附网注网并获取信号强度成功后,创建UDP链接,传入本地UDP端口号,发送数据到特定主机IP和端口。
2.1 UDP协议简介
UDP(User Datagram Protocol)传输与IP传输非常类似。你可以将UDP协议看作IP协议暴露在传输层的一个接口。UDP协议同样以数据包(Datagram)的方式传输,其传输方式亦为“Best Effort”的,所以UDP协议也是不可靠的(Unreliable)。那么为什么不直接使用IP协议而要额外增加一个UDP协议呢?一个重要的原因在于IP协议中并没有端口(Port)的概念。IP协议进行的是IP地址到IP地址的传输,这意味着两台计算机之间的对话。但每台计算机中需要有多个通信通道,并将多个通信通道分配给不同的进程使用。一个端口就代表了这样一个通信通道。UDP协议实现了端口,从而让数据包可以在送到IP地址的基础上,进一步可以送到某个端口。
尽管UDP协议简单,其实它的产生晚于更加复杂的TCP协议。早期的网络开发者开发出IP协议和TCP协议分别位于网络层和传输层,所有的通信都要先经过TCP封装,在经过IP封装(应用层—>TCP—>IP)。开发者将TCP/IP视为相互合作的套装。但很快,网络开发者发现,IP协议的功能和TCP协议的功能是相互独立的。对于一些简单的通信,我们只需要“Best Effort”式的IP传输就可以了,而不需要TCP协议复杂的建立连接的方式(特别是在早期网络环境中,如果过多的建立TCP连接,会造成很大的网络负担,而UDP协议可以相对快速的处理这些简单通信)。UDP协议随之被开发出来,作为IP协议在传输层的“傀儡”。这样,网络通信可以通过应用层—>UDP—>IP的封装方式,绕过TCP协议。由于UDP协议本身异常简单,实际上只为IP传输起到了桥梁的作用。
IP和他的傀儡UDP
2.2 本地端口调试
测试连接和之前一样,重启Demo板电源,通过串口调试工具得到调试信息如下:
如上图所示,成功创建本地端口,返回Socket ID并且一直循环在发送信息。
2.3 使用 nc (netcat)测试UDP协议与端口连通性
通常情况下,测试连通性时第一时间想到的是使用ping命令。但是ping命令使用的是icmp协议,属于TCP/IP协议中的一个子协议,故可以使用ping命令来测试TCP的连通性还可以测试延迟情况。
显然ping命令对测试UDP连通性时毫无用处,此时netcat隆重登场,这个命令被誉为是网络中的“瑞士军刀”,功能非常强大,测试UDP只是其中的一个功能变通。
在安全领域nc常用来端口监听转发,在运维中需要经常用到linux上的nc,一般linux都会默认集成这个命令,当然如果没有安装起来也很方便,如下所示:
安装成功后可以通过nc –help或者nc -h查看相关帮助,如下所示:
相关工具和配置都设置完成后,nc根据Demo板程序中指定的IP和端口进行监听,结果如下:
根据以上结果可知UDP通信已经创建,但是数据显示格式不对,需通过格式转换函数ByteToHexStr转换为十六进制字符串进行显示,代码如下:
为了方便,在Windows下得到的监听结果如下图所示,接收到的数据和发出的数据一致,准确无误!