失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 移远NB-IOT BC28 模组 与自建的UDP服务器通信

移远NB-IOT BC28 模组 与自建的UDP服务器通信

时间:2023-03-24 01:34:18

相关推荐

移远NB-IOT BC28 模组 与自建的UDP服务器通信

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(物联网俱乐部 )

模块: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("接收到的数据:%s\n",recvbuf);sendto(sock, recvbuf, n, 0,(struct sockaddr *)&peeraddr, peerlen);printf("回送的数据:%s\n",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:%s\n",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.183OK

5)测试自建UDP服务器

发送指令:AT+NPING=119.23.173.66

模块的QCOM返回

OK+NPING:119.23.173.66,49,1103

6)创建 UDP Socket

发送指令:AT+NSOCR=DGRAM,17,8888DGRAM为UDP,STREAM为TCP; 17为UDP而 TCP是6;8888是我们自定义和开启服务器的UDP端口

模块的QCOM返回

2OK

其中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也刷新了日志

-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,0OK

其中“4274354E4554”为16进制的字符串——“BT5NET”,最后的‘0’表示还有0个字节没有读出。

10)关闭UDP Socket

发送指令:AT+NSOCL=22为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服务器通信》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。