概述
1 UDP简介
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
1.1 UDP流程
UDP的流程如下图:
服务器流程主要分为下述6个部分,即建立套接字、设置套接字地址参数、进行端口绑定、接收数据、发送数据、关闭套接字等。
(1)建立套接字文件描述符,使用函数socket(),生成套接字文件描述符。
(2)设置服务器地址和侦听端口,初始化要绑定的网络地址结构。
(3)绑定侦听端口,使用bind()函数,将套接字文件描述符和一个地址类型变量进行绑定。
(4)接收客户端的数据,使用recvfrom()函数接收客户端的网络数据。
(5)向客户端发送数据,使用sendto()函数向服务器主机发送数据。
(6)关闭套接字,使用close()函数释放资源。UDP协议的客户端流程
UDP协议的客户端流程 UDP协议的客户端流程分为套接字建立、设置目的地址和端口、向服务器发送数据、从服务器接收数据、关闭套接字等5个部分。
(1)建立套接字文件描述符,socket();
(2)设置服务器地址和端口,struct sockaddr;
(3)向服务器发送数据,sendto();
(4)接收服务器的数据,recvfrom();
(5)关闭套接字,close()。
1.2 NB-IOT 的UDP流程
LPWAN技术的优势主要体现在:低速率、超低功耗、长距离、低吞吐、强覆盖。这些特点恰好说明,此项技术正是针对物联网在长距离传输的场景下开发的。NB-IoT属于LPWAN技术的一种,是一种为物联网而设计的窄带无线技术。NB-IoT是由3GPP规范的,类似的技术还包括eMTC。
nb-iot的通信协议为LwM2M,属于应用层协议,位于CoAP协议之上,而CoAP可以进行DTLS加密处理,最后通过UDP或SMS方式传送。
NB-IOT收发的UDP流程为:
(1)测试服务器是否联通
(2)创建UDP Socket 连接
(3)发送UDP数据
(4) 接收服务器返回回复数据长度
(5)接收UDP数据
(6)关闭UDP Socket 连接
2 软硬件
2.1 硬件
开发板:NB dongle(物联网俱乐部 www.iotclub.net)
模块:Quectel移远 BC28
固件版本:BC28JAR01A01_ONT
通信方式:NB-IOT
通信运营商:中国移动
第三方云服务器平台: 阿里云 Linux CentOS
2.2 软件
开发版调试软件:QCOM_V1.6
调试平台:WIN7 X64
测试浏览器: Sougou
代码编辑器: HBulider
FTP 工具:WinSCP
SSH工具:putty
3 UDP 服务器建立
UDP服务器端C语言源码如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include <stdarg.h>
#include <time.h>
#define MYPORT 8888 //自定义的端口号,一般为避免重复,取值都比较大
#define ERR_EXIT(m)
do {
perror(m);
exit(EXIT_FAILURE);
} while (0)
void echo_ser(int sock){
char recvbuf[1024] = {0};
struct sockaddr_in peeraddr;
socklen_t peerlen;
int n;
while (1){
FILE* pFile = fopen("log.txt", "a"); //打开log.txt日志文件
peerlen = sizeof(peeraddr);
memset(recvbuf, 0, sizeof(recvbuf));
n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);
if (n <= 0){
if (errno == EINTR)
continue;
ERR_EXIT("recvfrom error");
}
else if(n > 0){
printf("接收到的数据:%sn",recvbuf);
sendto(sock, recvbuf, n, 0,
(struct sockaddr *)&peeraddr, peerlen);
printf("回送的数据:%sn",recvbuf);
time_t time_log = time(NULL);
struct tm* tm_log = localtime(&time_log);
fprintf(pFile, "%04d-%02d-%02d %02d:%02d:%02d ", tm_log->tm_year + 1900, tm_log->tm_mon + 1, tm_log->tm_mday, tm_log->tm_hour, tm_log->tm_min, tm_log->tm_sec);//写入日志时间
fprintf(pFile," Received data:%sn",recvbuf);//写入内容
}
fclose(pFile);
}
close(sock);
}
int main(void){
int sock;
if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
ERR_EXIT("socket error");
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("监听%d端口n",MYPORT);
if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
ERR_EXIT("bind error");
echo_ser(sock);
return 0;
}
备注:主要程序来源于网上,添加了log文件记录,方便查看。
上传脚本到服务器端,并新建log.txt日志文件。
SSH登录,编译和运行程序
[root@i ~]# cd /home/UDP
[root@i UDP]# gcc -o server server.c
[root@i UDP]# ./server
监听8888端口
4 模拟数据上传
4.1 连接NB-IOT模组
1)将NB dongle插入USB接口
2)启动QCOM_V1.6 软件,确认USB连接端口,进行连接
3)断开与其他平台连接
发送指令:AT+QREGSWT=2
模块的QCOM返回
OK
4)获取模组的IP地址
发送指令:AT+CGPADDR
模块的QCOM返回
+CGPADDR:0,100.73.252.183
OK
5)测试自建UDP服务器
发送指令:AT+NPING=119.23.173.66
模块的QCOM返回
OK
+NPING:119.23.173.66,49,1103
6)创建 UDP Socket
发送指令:AT+NSOCR=DGRAM,17,8888
DGRAM为UDP,STREAM为TCP; 17为UDP而 TCP是6;8888是我们自定义和开启服务器的UDP端口
模块的QCOM返回
2
OK
其中2代表的刚刚8888端口的Socket id号,发送和接收数据都得用到它。
7)发送UDP数据
发送指令:AT+NSOST=2,119.23.173.66,8888,6,4274354e4554
其中,2为8888端口的Socket id号,119.23.173.66为服务器的IPV4地址,8888为UDP端口号,6为所需要发送值得长度,4274354e4554为字符串“BT5NET”的16进制的数据。
模块的QCOM返回
OK
SHH上可以看到UDP程序反馈
接收到的数据:Bt5NET
回送的数据:Bt5NET
log.txt也刷新了日志
2019-03-22 13:31:52 Received data:Bt5NET
8)接收服务器返回回复数据长度
服务器会返回值,模块进行接收,QCOM返回值如下
+NSONMI:2,6
2为8888端口的Socket id号,6为返回字符串的长度。
注意有些时候,没有上面返回值,可能是服务器UDP停止。
9)接收UDP返回的数据
发送指令:AT+NSORF=2,6
其中,2为8888端口的Socket id号,6为服务器UDP返回字符串的长度。
模块QCOM返回值如下
2,119.23.173.66,8888,6,4274354E4554,0
OK
其中“4274354E4554”为16进制的字符串——“BT5NET”,最后的‘0’表示还有0个字节没有读出。
10)关闭UDP Socket
发送指令:AT+NSOCL=2
2为8888端口的Socket id号
模块QCOM返回值如下
OK
5 总结
DB-IOT 建立UDP连接比较简单,先在自己服务器开通UDP服务,然后利用AT+NSOCR、AT+NSOST、AT+NSORF和AT+NSOCL等命令进行通信。
利用自建的UDP通信方式,比较方便,现场数据经过NB-IOT可以直接传到自己的云服务器,不需要经过相应的IOT平台转发。
6 参考
1)CSDN LEII6 Linux C Socket UDP编程介绍及实例
2)CSDN later_niu UDP服务器开发与nb-iot模组通信(1)----协议篇
3)物联网俱乐部 EVB_USB的UDP收发测试
最后
以上就是灵巧饼干为你收集整理的移远NB-IOT BC28 模组 与自建的UDP服务器通信1 UDP简介1.1 UDP流程1.2 NB-IOT 的UDP流程2 软硬件3 UDP 服务器建立4 模拟数据上传5 总结6 参考的全部内容,希望文章能够帮你解决移远NB-IOT BC28 模组 与自建的UDP服务器通信1 UDP简介1.1 UDP流程1.2 NB-IOT 的UDP流程2 软硬件3 UDP 服务器建立4 模拟数据上传5 总结6 参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复