基本知识
网络中的ip地址
人在现实生活中如果有居所那么就会有住址。例如:xxx住在xxx街xxx号。同样计算机设备在网络上也有地址。IP地址就如同地址一样。在现实生活我们有快递。网络中的数据就类似于现实世界的包裹一样。
查询电脑的IP地址(以win11为例)
1.打开设置
点击“属性”
即可看见IP地址
端口
在现实生活中想去一个城市可以有多处城门以便人员进出或信息沟通。同样,一台电脑就会有多个端口,如同多个窗户。每个要使用网络通讯的软件都要使用一个端口,类似于要接管一个城的城门。计算机的端口多达几千个,使用时可以自定义端口,同一个端口只能被一个软件接管。
公网(外网)与私网(内网)
现在的互联网大多是树状结构
最初的互联网设备很少,大家的IP地址都够用。所以每个设备都有公网IP地址。大家也能直接访问对方。但现在互联网设备已经太多了,我们真实的IP地址早就被运营商层层代理了。 互联网也逐渐形成树状的结构。
客户A与客户B如果同时连接了路由器A,那他们就被分配一个IP地址。比如A客户是“192.168.10.1”,B客户是“192.168.10.2”。A与B在同一网段中因此他们可以直接通讯。如果此时有客户C连接的是路由器C。由于他不在路由器A建立的局域网(内网)下,C是无法连接到A和B的。
那么聪明的你肯定想到了找一个同时连接A、B、C的人。如果我们想让几个不在同一内网的设备互相通讯,那么我们就需要一个在公网上的服务器。
发送图片
如果你设计聊天软件,最初你设计的肯定只是有发送文字这个功能。图片如何发送?
图片实际上是由无数个0和1组成。本质上是一组排列有序的文字。如果你想实现发送文字。你只需要将图片的二进制代码发送出去。但一般来说,单个数据包无法装下一整张图片。我们就必须将图片分割打包发送。
ESP8266教学推荐哔哩哔哩up“太极创客”
在B站上,太极创客为你介绍的是MQTT协议。这个协议是专门为物联网设备设计的协议。在此,我不说MQTT协议。其实ESP8266可以直接创建一个tcp/udp的客户端。
以下是客户A的ESP8266以UDP协议连接另一个ESP8266
A客户
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "YourNetworkName";//你家WiFi的名字
const char* password = "YourNetworkPassword";//你家WiFi密码
const char* udpAddress = "192.168.10.3";//对方ESP8266的IP地址
const int udpPort = 1234;//对方ESP8266的端口
WiFiUDP udp;//创建UDP对象
void setup()
{
Serial.begin(115200);//串口通讯波特率
WiFi.begin(ssid, password);//连接WiFi
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Connecting to WiFi...");//使用串口将连接消息发送到adruino窗口
}
Serial.println("Connected to WiFi network");
}
void loop()
{
if (WiFi.status() == WL_CONNECTED) //网络如果连接成功才进行if的内容
{
if (udp.beginPacket(udpAddress, udpPort)) //如果能顺利连接到设备才执行if的内容
{
udp.print("Hello from ESP8266!");//向另一个ESP8266发送消息
udp.endPacket();//结束对话
Serial.println("UDP message sent");
}
else
{
Serial.println("Error sending UDP message");
}
delay(1000);
}
}
对于B客户由于是接收方,所以需要使用一个循环来不断的监听1234端口。
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "YourNetworkName"; // 你的Wi-Fi网络名称
const char* password = "YourNetworkPassword"; // 你的Wi-Fi网络密码
const int udpPort = 1234; // UDP端口号
WiFiUDP udp; // 创建一个WiFiUDP对象
void setup() {
Serial.begin(115200); // 初始化串口通信
WiFi.begin(ssid, password); // 连接Wi-Fi网络
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi network"); // Wi-Fi连接成功提示信息
udp.begin(udpPort); // 开始监听UDP端口
Serial.print("UDP server started on port ");
Serial.println(udpPort); // 输出UDP服务器已启动信息
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
int packetSize = udp.parsePacket(); // 检查是否有UDP数据包到达
if (packetSize) {
char packetBuffer[255]; // 创建一个缓冲区来存储接收到的数据
int len = udp.read(packetBuffer, 255); // 读取接收到的数据
if (len > 0) {
packetBuffer[len] = 0; // 添加字符串结束符
Serial.print("Received packet: ");
Serial.println(packetBuffer); // 输出接收到的数据到串口
}
}
delay(1000); // 延迟1秒
}
}