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("接收到的数据:%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.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返回

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

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

其中“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. NB-IOT(4)---移远NB-IOT BC26模块模组简介和实际应用方向详解

    移远NB-IOT BC26模块模组简介和实际应用方向详解 继BC95和BC28之后,2017年底移远在杭州发布了基于MTK平台的新款NB-IOT BC26模组. BC26基于联发科MT2625芯片平台 ...

  2. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之01物联网模组简介

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软硬件工程师对物联网模组调试和使用的上手速度,让你们的项目进度尽可能快 ...

  3. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02EC20模组硬件供电和开关机复位操作

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.模组硬件知识 1 ...

  4. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04【EC20模组SIM卡和驻网模组指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04[EC20模组SIM卡和驻网模组指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 关于SIM ...

  5. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03EC20模组基础串口指令说明

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

  6. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05【EC20模组TCP/IP模块AT指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05[EC20模组TCP/IP模块AT指令说明] Socket长连接 一.准备工作 二.针对TCP/IP协议 关于TCP/ ...

  7. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02【EC20模组硬件供电和开关机复位操作】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02[EC20模组硬件供电和开关机复位操作] 一.模组硬件知识 1.背景知识:网络制式 2.模组的供电 3.模组的开机 4 ...

  8. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03【EC20模组基础串口指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03[EC20模组基础串口指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 STM32F103学 ...

  9. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之【05EC20模组TCP/IP模块AT指令说明】

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

  10. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04EC20模组SIM卡和驻网模组指令说明

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

最新文章

  1. android studio 导入库提示失败的处理方法以及androidstudio 清理缓存的方法
  2. 已知空间一点到另外两点直线的距离
  3. MVC中HtmlHelper用法大全
  4. callable object与新增的function相关 C++11中万能的可调用类型声明std::function...
  5. Ubuntu 安装调整工具移动 Launcher 启动器位置
  6. java的package需要大写吗,java 数字转大写的小程序
  7. C盘快要满啦-给Windows10优化瘦身
  8. android大作业计算器,2015大作业简易计算器实验报告.doc
  9. imp命令导入指定表_oracle 导入imp 命令
  10. Webots学习笔记—距离传感器的介绍和四轮小车的避障
  11. oracle 倒库详细步骤,超详细的倒车入库步骤
  12. python基础_026__标准库和第三方库
  13. Specular/Glossiness传统材质简单转换金属度流程材质metallic/roughness小记
  14. 1.整理华子面经--1
  15. Infrared and Visible Image Fusion using a Deep Learning Framework解析
  16. 分类统计字符—Python
  17. python_安卓——canv
  18. ES 按照每隔几分钟,几小时,几天统计折线图
  19. android如何设置图标,Android APP如何设置显示图标
  20. 【算法笔记】全域哈希表

热门文章

  1. 网站html导出excel插件,使用JQuery插件将HTML的table标签数据导出成excel
  2. 2019.03.10_2.3 -2.6
  3. VB中,连接ACCESS数据库
  4. 谭浩强 C程序设计(第五版)
  5. PID算法 旋转倒立摆与平衡车的区别。此贴后边会更新。
  6. Python微信打飞机游戏编程学习笔记04
  7. 在线电子词典程序框架
  8. 华为机试(6.17笔试题解析)
  9. Node——request使用代理
  10. HTML网页设计制作大作业(div+css)~ 环境保护(5个页面)