Esp32如何使用Socket上传数据到云服务器

释放双眼,带上耳机,听听看~!

一、简介

esp32可以接上一些传感器(温度、气压等)采集数据,若只是用串口打印出来就有些单薄了,所以有时需要将数据上传到云服务器,之后可以与数据库、算法、app等连接。

本文讲述如何在esp32与云服务器之间搭建简单socket通信。

esp32使用WifiClient,云服务器端运行python监听相应端口。

参考文章:ESP32 WiFiClient发送数据至腾讯云服务器并接收处理

二、准备

1.esp32

2.PIO或Arduino IDE

3.云服务器

三、Socket

Esp32如何使用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如何使用Socket上传数据到云服务器

Esp32如何使用Socket上传数据到云服务器

添加如下策略

Esp32如何使用Socket上传数据到云服务器

五、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如何使用Socket上传数据到云服务器

运行esp32,可以在两端看到信息

Esp32如何使用Socket上传数据到云服务器

Esp32如何使用Socket上传数据到云服务器

 

给TA打赏
共{{data.count}}人
人已打赏
ESP32-CAM免费项目

ESP32-CAM将图像发布到云服务器-PHP(步骤及补充)

2022-3-14 14:03:30

ESP32-CAM免费项目

ESP32-CAM上传图片到服务器进行网页访问(宝塔面板)

2022-4-4 13:40:07

3 条回复 A文章作者 M管理员
  1. Luca

    非常棒的教程

  2. Luca

  3. 得体

    大佬牛蛙

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();