我是靠谱客的博主 灵巧饼干,最近开发中收集的这篇文章主要介绍移远NB-IOT BC28 模组 与自建的UDP服务器通信1 UDP简介1.1 UDP流程1.2 NB-IOT 的UDP流程2 软硬件3 UDP 服务器建立4 模拟数据上传5 总结6 参考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部