【NodeMCU-ESP8266】Arduino环境下建立UDP服务器及WiFiUDP库常用函数详解

这篇具有很好参考价值的文章主要介绍了【NodeMCU-ESP8266】Arduino环境下建立UDP服务器及WiFiUDP库常用函数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、UDP协议概述

        1、UDP基本概念

        2、UDP的主要特点

        3、UDP的基本报文格式

​二、ESP8266官方UDP库相关函数详解

三、建立UDP服务器的一般流程

四、ESP8266官方库 UDP 示例程序演示

五、ESP8266官方库 UDP 程序运行说明

        1、将程序编译并上传到开发板。

        2、运行串口网络数据调试器 对UDP服务器进行测试。


一、UDP协议概述

        1、UDP基本概念

        UDP(User Datagram Protocol)——  用户数据报协议,是互联网传输层的一个重要协议。
        UDP为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,允许应用程序在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。
        UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。
        由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

        2、UDP的主要特点

        (1)UDP是无连接的协议。即在发送数据前不需要建立连接,发送数据结束也没有连接释放,因此减少了开销和发送数据前的时延。
        (2)UDP使用尽最大努力交付。即不保证可靠交付,因此不需要维护复杂的连接状态表。
        (3)UDP是面向数据报的。对于应用层交付的报文,发送方的UDP在添加首部后直接交付给IP层。UDP对应用层交付的报文,既不合并,也不拆分,而是保留这些报文的边界。也就是说,应用层给UDP多长报文,UDP就发多长,一次发送一个报文。
        (4)在接收方的UDP,对于IP层交付的UDP用户数据报,在去除UDP首部后也直接交付应用层,不作任何处理,一次交付一个完整的报文。因此,控制报文长度的工作由应用层负责,应用层要选择合适大小的报文。若报文太长,UDP封装后交给IP层,IP层在传输时可能要进行分片处理,减低了IP层的效率。反之,应用层报文太短,效率也低。
        (5)UDP没有拥塞控制机制。因此,网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用很重要,如IP电话,实时视频会议等,要求源主机以恒定的速率发送数据,并且允许在网络拥塞时丢失一部分数据,但不允许数据有太大的时延。
        (6)UDP支持一对一,一对多,多对一和多对多的交互通信。
        (7)UDP的首部开销小,只有8字节,比TCP的20字节的首部短。

        3、UDP的基本报文格式

        UDP报头由4部分组成:
        源端口号:发送方的端口号。
        目的端口号:目的主机的端口号。
        UDP长度:UDP报文的长度,单位字节,包括报头和有效载荷。
        UDP校验和:保证报文完整性和正确性,出错就丢弃。

二、ESP8266官方UDP库相关函数详解

        1. begin(uint16_t port)
        功能:初始化 WiFiUDP库和网络设置,启动WiFiUDP套接字,侦听指定的本地端口
        参数:port,指定侦听的本地端口号
        返回值:1,成功;0,失败,表示没有可用的套接字

// initialize, start listening on specified port. 
// Returns 1 if successful, 0 if there are no sockets available to use
uint8_t begin(uint16_t port) override;

        2.  available()
        功能:返回当前数据包中,可从缓冲区读取的字节数。这是已经到达的数据。
        参数:无
        返回值:当前数据包中可用的字节数
        注意:仅在调用解析数据包函数WiFiUDP.parsePacket()之后,才能成功调用此函数。

// Number of bytes remaining in the current packet
int available() override;

        3. beginPacket(hostName, port)  或  beginPacket(hostIp, port)
        功能:开始构建数据包,准备写入数据,以发送到指定ip和端口的远程主机。
        参数:远程主机的IP地址(或域名)和端口号
        返回值:如果成功,则返回1;如果提供的IP地址或端口有问题,则返回0。       

// Start building up a packet to send to the remote host specific in ip and port
// Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
int beginPacket(IPAddress ip, uint16_t port) override;
// Start building up a packet to send to the remote host specific in host and port
// Returns 1 if successful, 0 if there was a problem resolving the hostname or port
int beginPacket(const char *host, uint16_t port) override;

        4. endPacket()
        功能:写入UDP数据后,完成数据找包并发送。
        参数:无
        返回值:报文发送成功,返回1;如有错误,返回0

// Finish off this packet and send it
// Returns 1 if the packet was sent successfully, 0 if there was an error
int endPacket() override;

        5. write(byte)  或  write(buffer, size)
        功能:前者,将单个字节内容,写入UDP数据包;后者,将缓冲区中指定数目的字节数,写入UDP数据包。
        参数:byte,发送的字节;buffer:数据缓冲区指针;size,缓冲区大小。
        返回值:写入UDP数据包的字节数。
        注意:此函数必须包装在beginPacket()和endPacket()之间。其中,beginPacket()初始化数据包,endPacket()完成数据包的发送。

// Write a single byte into the packet
size_t write(uint8_t) override;
// Write size bytes from buffer into the packet
size_t write(const uint8_t *buffer, size_t size) override;

        6. parsePacket ()
        功能:开始处理下一个可用的传入数据包
        参数:无
        返回值:返回数据包的大小(以字节为单位),如无可用的数据包,则返回0
        注意:在使用UDP.read()读取缓冲区之前,必须先行调用parsePacket ()。

// Start processing the next available incoming packet
// Returns the size of the packet in bytes, or 0 if no packets are available
int parsePacket() override;

        7. peek()
        功能:从当前数据包中读取并返回下一个字节,但并不向前移动到下一个字节。也就是说,对peek()的连续调用将返回相同的值,与对下一个read()的调用相同。
        返回值:下一个字节或字符;如果没有可供读取的字节则返回-1

// Return the next byte from the current packet without moving on to the next byte
int peek() override;

        8. read()  或  read(buffer, len)
        功能:前者,从当前数据包中读取一个字节;后者,从当前数据包中读取 len 个字节的数据,并将其存入buffer指定的缓冲区。
        参数:buffer,将要保存数据的缓冲区指针;len,要求要读取的字节数。
        返回值:前者,读取到的字节数据;后者,读取到的字节数。如无可供读取的字节则返回0
        注意:在函数 parsePacket() 执行成功之后,才能调用此函数

// Read a single byte from the current packet
int read() override;
// Read up to len bytes from the current packet and place them into buffer
// Returns the number of bytes read, or 0 if none are available
int read(unsigned char* buffer, size_t len) override;

        9. flush()
        功能:等待发送所有传出字符,此调用后输出缓冲区将被清空

// wait for all outgoing characters to be sent, output buffer is empty after this call
void flush() override;	

        10. stop()
        功能:断开 UDP 连接,释放 UDP 会话期间所使用的资源。

  // Finish with the UDP connection
  void stop() override;

        11. remotelP()
        功能:获取发送当前数据包的远程主机的IP地址
        返回值:发送当前数据包的远程主机IP地址(4个字节的IPAddress结构)
        注意:必须在WiFiUDP.parsePacket()之后,才能调用此函数

// Return the IP address of the host who sent the current incoming packet
IPAddress remoteIP() override;

        12. remotePort()
        功能:获取远程连接主机的端口号
        返回值:发送当前数据包的远程主机的端口号
        注意:必须在WiFiUDP.parsePacket()之后,才能调用此函数

// Return the port of the host who sent the current incoming packet
uint16_t remotePort() override;

三、建立UDP服务器的一般流程

        1、将ESP8266模组或开发板设置在station工作模式:WiFi.mode(WIFI_STA)。
        2、将ESP8266模组或开发板接入到WIFI 网络:WiFi.begin(SSID,PSSD)。
        3、实例化 WiFiUDP对象,开始在指定侦听端口号建立UDP连接,启动自动侦听。
        4、等待输入的UDP包,处理收到的数据,并回复客户端请求的信息。

四、ESP8266官方库 UDP 示例程序演示

        启动 ArduinoIDE,从菜单栏依次点选【文件】——【示例】——【ESP8266WiFi】——【UDP】,在IDE窗口主界面打开官方 UDP 示例程序。 
       将程序编译\上传到NodeMCU-ESP8266开发板。       
arduino esp8266 udp,单片机,网络协议,物联网,iot,udp

/*
  UDPSendReceive.pde:
  This sketch receives UDP message strings, prints them to the serial port
  and sends an "acknowledge" string back to the sender

  A Processing sketch is included at the end of file that can be used to send
  and received messages for testing with a computer.

  created 21 Aug 2010
  by Michael Margolis

  This code is in the public domain.

  adapted from Ethernet library examples
*/


#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#ifndef STASSID
#define STASSID "xcb940"        //将SSID更改成可用的名称
#define STAPSK "87589940abc"    //更改成可用的密码
#endif

unsigned int localPort = 8888;  // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];  // buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged\r\n";        // a string to send back

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort(), Udp.destinationIP().toString().c_str(), Udp.localPort(), ESP.getFreeHeap());

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
}

五、ESP8266官方库 UDP 程序运行说明

        1、将程序编译并上传到开发板。

        如在串口监视器可以看到如下信息,说明程序已成功运行。
        信息提示:(1)开发板成功连接到本地WiFi,获取到IP地址为:192.168.0.103。
                          (2)建立UDP服务器成功,并在8888端口启动侦听。

arduino esp8266 udp,单片机,网络协议,物联网,iot,udp

        2、运行串口网络数据调试器 对UDP服务器进行测试。

        (1)调试工具:SSCOM V5.13.1 百度网盘点击下载,  提取码:b89u。

arduino esp8266 udp,单片机,网络协议,物联网,iot,udp
        (2)运行调试工具,按照开发板串口输出信息中的UDP服务器IP地址和端口号,设置调试工具窗口左下角的远程主机IP地址和端口号,本地IP地址和端口号由软件自动填充。
        (3)点击调试工具窗口左下角【连接】按钮,在右下角空白窗口输入待发送的信息,再点击【发送】按钮,就可以向UDP服务器发送信息了。

arduino esp8266 udp,单片机,网络协议,物联网,iot,udp
        (4)如果信息发送成功,开发板串口监视器和调试工具上方的信息窗口,就可以看到有关信息了。

arduino esp8266 udp,单片机,网络协议,物联网,iot,udparduino esp8266 udp,单片机,网络协议,物联网,iot,udp文章来源地址https://www.toymoban.com/news/detail-856804.html

到了这里,关于【NodeMCU-ESP8266】Arduino环境下建立UDP服务器及WiFiUDP库常用函数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ESP8266 快速入门】示例5:Arduino环境实现OTA无线升级固件功能WebServer网页服务器方式

    使用【ESP8266】Arduino环境实现OTA无线升级固件功能,由LED闪烁程序通过OTA升级为PWM呼吸灯程序。 OTA听起来挺牛的一个功能,其全称为(Over-The-Air),直译为空中传送。就是通过无线方式实现固件升级。 对于实际封装好的项目,ESP8266已经包装好了,不方便使用数据线来下载程

    2024年02月03日
    浏览(46)
  • ESP8266 NodeMCU连接阿里云(从环境搭建到代码实现)

    ESP8266 NodeMCU是一款基于ESP8266芯片的开发板,因其体积小、功耗低、易于编程和扩展等特点,在物联网领域得到了广泛应用。阿里云IoT平台则为开发者提供了稳定可靠的物联网服务,包括设备接入、数据管理、远程控制等功能。本教程将指导你如何将ESP8266 NodeMCU连接到阿里云

    2024年04月16日
    浏览(52)
  • Arduino IDE 2.0安装,ESP8266/ESP32环境配置(Win11)

    一、Arduino IDE安装 下载地址: Software | Arduino https://www.arduino.cc/en/software 点进去选择自己电脑的配置下载就行(Win11的直接下载Win10的好) 下载之后直接打开安装包安装就好,记住配置为电脑的全部用户使用 二、Arduino IDE驱动安装 安装完之后启动Arduino IDE,等它文件自主配置完

    2024年02月04日
    浏览(56)
  • NodeMCU ESP8266 中断介绍以及使用详解

    今天,我们将学习中断和定时器的相关概念,并且基于NodeMCU ESP8266 12E开发板搭建硬件电路,通过使用中断和定时器实现我们想要实现的功能。 中断在嵌入式开发中是很常见的功能,特别是在单片机的开发中。通常 GPIO 引脚可以接收外部的信号,根据不同的信号类型,可以触

    2024年02月04日
    浏览(68)
  • 01-ESP8266 NodeMCU 物联网开发初识

    Author:teacherXue ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目,目前有非常高的市场普及率,还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32,可以在乐鑫官网查看完整的芯片列表。 ESP8266芯片的技术特性 处理器: L106 32 位 RISC 微

    2024年02月11日
    浏览(54)
  • NodeMCU ESP8266开发流程详解(图文并茂)

    NodeMCU ESP8266基于Arduino IDE的开发相对来说还是比较容易上手的,我们基本需要以下几个东西; 一台安装好Arduino IDE的PC,并且已经部署环境(安装好开发板的串口驱动); NodeMCU ESP8266 开发板; USB线(根据实际开发板的情况,本文需要Micro-USB的线); 具体如下图所示; 本文默

    2024年02月06日
    浏览(57)
  • ESP8266/ESP32 NodeMCU接入阿里云物联网平台

    阿里云物联网平台公共实例是免费的,且不像然也等服务器一样无法区分不同用户发布的话题。本文采用常规的pubsubclient库连接阿里云。ESP8266/ESP32用pubsubclient接入阿里云平台截至写稿的现在,网上有的资源较少,现在我就来介绍一下使用方法 1.登录阿里云官网https://www.aliyu

    2024年02月02日
    浏览(65)
  • 【雕爷学编程】Arduino智慧校园之使用ESP8266连接WiFi并上传温度数据到服务器

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月21日
    浏览(51)
  • NodeMCU ESP8266 GPIO使用详解(图文并茂)

    前面的文章中我们已经学习了如何点亮一个LED灯,在嵌入式的世界里,这个相当于我们初学一门编程语言,写下的Hello World程序。 为了让LED闪烁,我们需要操作芯片的GPIO,这是硬件最底层的概念,只不过 Arduino 的编程中,底层的库函数已经为我们做好了硬件的封装,只要调用

    2024年02月03日
    浏览(111)
  • NodeMCU ESP8266硬件开发板的熟悉

    什么是 ESP8266 NodeMCU? ESP8266 是乐鑫开发的一款低成本 Wi-Fi 芯片。 ESP8266可以作为一共独立的设备进行运行,也可以作为一款WiFi模块,通过AT指令进行控制。 例如,您可以将 ESP8266 连接到 单片机,通过串口AT指令实现增加 Wi-Fi 的功能。最实际的应用是将它其用作独立设备。

    2024年02月06日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包