目录
一、简介
esp32可以接上一些传感器(温度、气压等)采集数据,若只是用串口打印出来就有些单薄了,所以有时需要将数据上传到云服务器,之后可以与数据库、算法、app等连接。
本文讲述如何在esp32与云服务器之间搭建简单socket通信。
esp32使用WifiClient,云服务器端运行python监听相应端口。
参考文章:ESP32 WiFiClient发送数据至腾讯云服务器并接收处理
二、准备
1.esp32
2.PIO或Arduino IDE
3.云服务器
三、Socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
四、服务器端
购买云服务器和配置python环境可以百度一下
远程登录后创建listen_test.py
这个程序用于监听8081端口的socket请求
替换上你服务器的内网ip(不是公网ip)
import socket
import datetime
# 建立一个服务端
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 以下设置解决ctrl+c退出后端口号占用问题
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(('xxx.xxx.xxx.xxx',8081)) #绑定要监听的地址(内网ip)和端口
server.listen(5) #开始监听 表示可以使用五个链接排队
print('listen')
while True:# conn就是客户端链接过来而在服务端为期生成的一个链接实例
conn,addr = server.accept() #等待链接,多个链接的时候就会出现问题,其实返回了两个值
print(conn, addr)
try:
data = conn.recv(1024) #接收数据
if data:
print('recive:',data.decode()) #打印接收到的数据
except ConnectionResetError as e:
print('关闭了正在占线的链接!')
break
# conn.close()
我使用的是8081号端口,也可以换成(除80等外)未被占用的端口。
此时云服务器默认该端口是没有入权限的,所以需要设置安全组入方向策略。
添加如下策略
五、esp32端
替换上你的wifi名称、密码及服务器公网ip
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClient.h>
/* change ssid and password according to yours WiFi*/
const char* ssid = "xxx";
const char* password = "xxx";
/*
* This is the IP address of your PC
* [Wins: use ipconfig command, Linux: use ifconfig command]
*/
const char* host = "xxx.xxx.xxx.xxx";
const int port = 8081;
int num=0;
void setup()
{
Serial.begin(9600);
Serial.print("Connecting to ");
Serial.println(ssid);
/* connect to your WiFi */
WiFi.begin(ssid, password);
/* wait until ESP32 connect to WiFi*/
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected with IP address: ");
Serial.println(WiFi.localIP());
}
void loop()
{
delay(1000);
Serial.print("connecting to ");
Serial.println(host);
/* Use WiFiClient class to create TCP connections */
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
return;
}
String msg ="test:"+String(num++);
Serial.println(msg);
client.println(msg);
//client.stop();
}
此代码仅发送递增的数字num,项目中可能需要发送传感器数据到服务器,只需处理好数据后都放入msg发送。另外,如果你是Arduino IDE建议把串口波特率改为115200
六、运行
根据前面的步骤,服务器端先开始监听
python listen_test.py运行代码
运行esp32,可以在两端看到信息
非常棒的教程
大佬牛蛙