授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。但愿你们分享给你周边须要的朋友或者同窗,说不定大神成长之路有博哥的奠定石。。。git
QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷web
1、基础篇网络
2、网络篇socket
- ESP8266开发之旅 网络篇① 认识一下Arduino Core For ESP8266
- ESP8266开发之旅 网络篇② ESP8266 工做模式与ESP8266WiFi库
- ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
- ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
- ESP8266开发之旅 网络篇⑤ Scan WiFi——ESP8266WiFiScan库的使用
- ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
- ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
- ESP8266开发之旅 网络篇⑩ UDP服务
- ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
- ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库
- ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 Flash文件系统
- ESP8266开发之旅 网络篇⑭ web配网
- ESP8266开发之旅 网络篇⑮ 真正的域名服务——DNSServer
- ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
3、应用篇tcp
4、高级篇函数
前面的博文中,博主讲述的内容基本上都是Tcp以及Http通讯的内容,那么咱们固然得讲解一下Tcp的另一个兄弟——UDP。oop
UDP 是 User Datagram Protocol 的简称,是一种无链接、不可靠的协议,每个数据报都是一个独立的信息,它在网络上以任何可能的路径传到目的地,但不保证是否真的传到目的地、是否过程当中真的保证了数据的完整性!学习
UDP就好像无手机时代,你要去探望亲戚,可是你不知道亲戚有没有在家(也就是说可能会丢包);测试
TCP就好像有手机时代,你要去探望亲戚,你会打电话过去提早沟通好,你会确保亲戚在家里才会买东西过去探望(数据不会丢包);优化
使用UDP服务,请在代码前加入一下头文件:
#include <WiFiUdp.h>
老规矩,先上一个博主总结的百度脑图:
整体上,根据功能能够把方法分为4大类:
函数说明:
/** * 初始化TCP服务,开始监听特定端口 * @return 1 表示成功 * 0 表示没有有效的socket能够用 */ uint8_t begin(uint16_t port);
函数说明:
/** * 断开UDP链接 */ void stop();
函数说明:
/** * 开始处理进来的UDP请求 * @return int 返回当前UDP包的大小,若是没有就返回0 */ int parsePacket();
注意点:
函数说明:
/** * 返回当前udp包的可读剩余字节数据 */ int available();
函数说明:
/** * 读取当前udp数据包的一个字节,并从缓冲区清除该字节 * @return 单字节数据 */ int read(); /** * 读取当前udp数据包的len长度的数据,并从缓冲区清除该字节 * @param buffer 存储数据的内存空间 * @param len 须要读取的长度 * @return 读取成功字节数 */ int read(unsigned char* buffer, size_t len);
注意点:
函数说明:
/** * 读取当前udp数据包的一个字节 * @return 单字节数据 */ int peek();
注意点:
函数说明:
/** * 清除缓冲区 */ void flush();
函数说明:
/** * 获取发送当前UDP包的主机IP地址 * @return IPAddress ip地址 */ IPAddress remoteIP();
函数说明:
/** * 获取发送当前UDP包的主机端口 * @return uint16_t 端口 */ uint16_t remotePort();
函数说明:
/** * 开始建立须要发送给远端主机的udp包 * @param ip 远端主机ip地址 * @param port 远端主机端口号 * @return 1 建立成功 * 0 建立失败 */ int beginPacket(IPAddress ip, uint16_t port); int beginPacket(const char *host, uint16_t port);
函数说明:
/** * 写入一字节数据到建立好的udp包 * @param uint8_t 单字节数据 * @return 1 写入成功 * 0 写入失败 */ size_t write(uint8_t); /** * 写入字节数据到建立好的udp包 * @param buffer 字节数据缓冲区 * @return size_t 返回写入成功的字节数 */ size_t write(const uint8_t *buffer); /** * 写入size字节数据到建立好的udp包 * @param buffer 字节数据缓冲区 * @param size 字节数据长度 * @return size_t 返回写入成功的字节数 */ size_t write(const uint8_t *buffer, size_t size);
函数说明:
/** * 把udp数据包发送出去 * @param uint8_t 单字节数据 * @return 1 发送成功 * 0 发送失败 */ int endPacket();
实例说明
源码:
#include <ESP8266WiFi.h> #include <WiFiUdp.h> const char* ssid = "********";//wifi帐号 const char* password = "********";//wifi密码 WiFiUDP Udp; unsigned int localUdpPort = 4210; // 本地监听端口 char incomingPacket[255]; // 存储Udp客户端发过来的数据 char replyPacket[] = "Hi there! Got the message :-)"; // 应答信息 void setup() { Serial.begin(115200); Serial.println(); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); //启动Udp监听服务 Udp.begin(localUdpPort); //打印本地ip地址,udp client端会使用到 Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); } void loop() { //解析Udp数据包 int packetSize = Udp.parsePacket(); if (packetSize) { // 收到Udp数据包 Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); // 读取Udp数据包 int len = Udp.read(incomingPacket, 255); if (len > 0) { incomingPacket[len] = 0; } //向串口调试器打印信息 Serial.printf("UDP packet contents: %s\n", incomingPacket); //往udp 远端发送应答信息 Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(replyPacket); Udp.endPacket(); } }
注意点:
测试结果:
实例说明
源码:
#include <ESP8266WiFi.h> #include <WiFiUdp.h> const char *ssid = "********"; //wifi名称 const char *password = "********"; //wifi密码 WiFiUDP Udp; unsigned int localUdpPort = 4210; // 本地端口号 char incomingPacket[255]; // 接收缓冲区 void setup() { //如下为基本功能初始化,初始化串口和网络和LED pinMode(LED_BUILTIN, OUTPUT); Serial.begin(115200); Serial.println(); Serial.printf("Connecting to %s ", ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); //如下开启UDP监听并打印输出信息 Udp.begin(localUdpPort); Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); } void loop() { int packetSize = Udp.parsePacket(); //获取当前队首数据包长度 if (packetSize) // 有数据可用 { Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(incomingPacket, 255); // 读取数据到incomingPacket if (len > 0) // 若是正确读取 { incomingPacket[len] = 0; //末尾补0结束字符串 Serial.printf("UDP packet contents: %s\n", incomingPacket); if (strcmp(incomingPacket, "LED_OFF") == 0) // 命令LED_OFF { digitalWrite(LED_BUILTIN, HIGH); // 熄灭LED sendCallBack("LED has been turn off"); } else if (strcmp(incomingPacket, "LED_ON") == 0) // 若是收到LED_ON { digitalWrite(LED_BUILTIN, LOW); // 点亮LED sendCallBack("LED has been turn on"); } else // 若是非指定消息 { sendCallBack("Command Error!"); } } } } /** * 发送响应信息 */ void sendCallBack(const char *buffer){ Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(buffer); //回复内容 Udp.endPacket(); }
测试结果:
使用Arduino for esp8266能够很是简单实现UDP通信过程。最重要须要记住的一点,那就是UDP面向无链接,发送出去的数据不会理会是否被收到。