开发者学堂课程【嵌入式之 RFID 开发与应用2020版:NB-loT 通信之 UDP 收发数据】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11193
NB-loT 通信之 UDP 收发数据
接下来介绍 NB-loT 的几种通信方式,首先介绍最简单的 UDP 的方式。UDP 的通信方式只需要三步就可以了。
一、创建 UDP
1.如果对这个指令不熟悉,可以通过 M5310-A 文件,文件中有所有关于此文件的内容。DUC 属于 M5310-A TCPIP,打开应用指导
其他初始化不再讨论
2.创建指令:AT+NSOCR=<type>,<protocol>,<listen port>,<receive control>
在传微调助手中输入“AT+NSOCR=DGRAM,17,8888,1”
NSOCR 是命令,第一个参数 DGRAM 是通讯起源译,指的是 UDP。如果是 TCP 的话参数会变成 STREAM。17 代表着 UDP 的协议号如果是 TCP 的话他的协议号为 6。8888 代表 UDP 的端口号,(需要注意的是这个参数不代表服务器的端口而是通信终端自身的端口。端口是动态的,设置为多少都行,除了这些知名端口外最好设置成 1024 之后的。)1 代表允许接收他的下线数据。返回值代表着创建成功的信道ID。
3.实现数据的发送
输入:“AT+NSOSD=0,120,55,98,180,5000,2,3132”
需要注意的是:不能在自己的电脑上搭一个局网的服务器,因为移动终端是公网的移动设备无法发送到局域网中。可以买一个代理或者注册一个花生壳。如果用的是电信网络,这种情况下一般有公网 IP。
比如:网址“192.168.1.1”,(用中国电信的话普通用户不行,需改为超级用户,密码需问运营商要。)
登陆过后:
①点击应用
②点击高级 NAT 配置
③点击虚拟主机配置
④映射服务器 IP
映射的服务器 IP 为 13,因为虚拟机在当前内网中是 13,映射到外网,端口是8088,通过 8088 端口可以找到内网主机。外网开了 100 个端口(8000-8100),设置完后保存。如要知道NB的终端如何找到内网的 13 号主机需找运营商开放公网IP 才行。开放公网 IP 不是固定的,如要固定需收费。主要链接家里 WiFi,就会查到公网 IP。
4、替换数据
得到 IP 后将 IP 信息和端口替换进“AT+NSOSD=0,120,55,98,180,5000,2,3132”
中
因为信道 ID 的返回值为 1,所以要把“0”替换为“1”,IP 改为公网 IP,端口为路由器里面映射的端口,假设发送内容为 3 个字节,发送内容为 313200。为:“AT+NSOSD=1,171,216,89,114,8088,3,313200”
,16 进制的 31 为 1,16 进制的 32 为 2,00 表示把字符 12 打印出来。
但是把字符串发给服务器,服务器 不一定能接收到,因此要启动一个服务端的程序,以下为解决方案:
①创建一个语句
接收到 IP,端口号以及内容后将其打印出来
接收到内容之后客户端的端口就不会为 0,如果不为 0 可以通过 sendto 把接收到的数据原样的发回到客户端,也就是说,当服务器发送 1,2 后也会收到一个 1,2。
服务器也可以主动发,线程中如果端口有获得可以从终端获取数据然后再发送,也可以发送原样的数据,类似 echo
②运行
UDP 是一种面向无连接的通信,TCP 是面向连接的,UDP 链接和发数据是一条指令完成的。运行后返回值为 1,3 分别表示信道 ID 和字节数,终端 IP:218.204.252.121,端口“64148”为动态数据并非固定,“12”为发送的内容,发完数据终端不是马上会收到,有信号延迟。当收到“+NSONMI”时“1”表示信道 ID“2”表示数据长度
③提取:
通过指令:“AT+NSORF=0,4”
,“0”是信道ID“4”表示长度(长度写多少都行,但不能比接收的数据短),向终端发送数据,发送 abcd 四个字节。
当出现没有接收到数据时可能是服务器一端已经断开,需要再发一次数据,提示后马上发送 abcd,仍没收到数据,说明服务器下行有问题。
重新启动,再发一次数据,发现之前回的数据收到了,但手动输入的没有收到。说明不是终端问题,是服务器的程序问题。
可以将收到的每个字节加个“1”再回到“sendto”中。
UDP 能发也可以收,服务器手动发数据不需要讨论,echo 的数据是可以收到的。
如果想要再次创建同样的端口需要通过“AT+NSOCL=0”指令关闭 UDP SOCKET再创建,值不一定是 0,信道 ID 就可以,关闭信道就可以继续创建,否则要重新启动一个新窗口。