当前位置: 首页 > news >正文

STM32MP157A单片机移植Linux系统使用python链接云服务器

思维导图

需求分析

stm32mp157a单片机上移植Linux操作系统,包括LCD驱动、触摸驱动、Ethernet/WiFi支持,设备树信息包括ADC、GPIO、LCD,使用QT上位机在PC端显示,通过TCP与stm32交互,将ad数据传输到PC端和云服务器,使用阿里云服务器,装载MySQL数据库包括所有上传的数据。

云端服务器环境搭建

云端服务器中MySQL数据库,QTCreator,python环境搭建的各个Linux命令

python实现tcp服务端/客户端通信

tcp_server.py:需要注意的是,修改MySQL的密码为自己的MySQL密码,修改端口号,该代码主要实现python下tcp服务端的监听功能,并将接受到的参数保存到MySQL数据库内。

import socket
import struct
import mysql.connector

# MySQL 数据库配置
db_config = {
    'host': 'localhost',
    'user': 'root',
    'password': '<你的密码>',  # 替换为你的 MySQL root 密码
    'database': 'test_db'  # 替换为你的数据库名称
}

# 创建数据库连接
def create_db_connection():
    try:
        connection = mysql.connector.connect(**db_config)
        return connection
    except mysql.connector.Error as err:
        print(f"数据库连接失败: {err}")
        return None

# 插入数据
def insert_sensor_data(connection, hum, tem):
    try:
        cursor = connection.cursor()
        query = "INSERT INTO sensor_data (hum, tem) VALUES (%s, %s)"
        cursor.execute(query, (hum, tem))
        connection.commit()
        print(f"数据插入成功: hum={hum}, tem={tem:.2f}")
    except mysql.connector.Error as err:
        print(f"数据插入失败: {err}")

# TCP 服务器
def start_tcp_server(host='0.0.0.0', port=<你的端口>):
    # 创建数据库连接
    connection = create_db_connection()
    if connection is None:
        return

    # 创建 TCP socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(5)
    print(f"TCP 服务器启动,监听 {host}:{port}")

    while True:
        # 接受客户端连接
        client_socket, addr = server_socket.accept()
        print(f"Connected by {addr}")

        try:
            data = client_socket.recv(1024).decode('utf-8')  # 解码数据
            if data:
                print(f"接收到数据: {data}")

            # 解析数据(假设数据格式为 "hum,tem")
                hum, tem = data.split(',')  # 按逗号分隔
                hum = int(hum)  # 将 hum 转换为 int
                tem = float(tem)  # 将 tem 转换为 float

                # 将数据插入数据库
                insert_sensor_data(connection, hum, tem)

            # 接收数据(8字节:4字节int + 4字节float)
            #data = client_socket.recv(8)
            #if len(data) == 8:
                # 解析数据
                #hum = struct.unpack('!i', data[:4])[0]  # 解析int
                #tem = struct.unpack('<f', data[4:])[0]  # 解析float
                #print(f"Received int: {hum}, float: {tem}")
                #insert_sensor_data(connection, hum, tem) 

            else:
                print("Invalid data received")
        except Exception as e:
            print(f"Error: {e}")
        finally:
            client_socket.close()

    # 关闭数据库连接
    connection.close()

if __name__ == "__main__":
    start_tcp_server()

tcp_client.py:云服务器本地python下tcp客户端测试代码

import socket

def send_sensor_data(host='<云端服务器IP>', port=<端口号>, hum=50, tem=25.5):
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((host, port))
    message = f"{hum},{tem}"
    client_socket.send(message.encode('utf-8'))
    client_socket.close()
    print(f"数据已发送: {message}")

if __name__ == "__main__":
    send_sensor_data()

tcp_client.c:本地Linux-c程序tcp客户端上传数据到云服务器代码,需要注意字节序的问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define SERVER_IP "<云端服务器IP.address>"  // 替换为云端的IP地址
#define SERVER_PORT <端口号>

int main() {
    int sock;
    struct sockaddr_in server_addr;

    // 创建Socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {
        perror("Invalid address/ Address not supported");
        exit(EXIT_FAILURE);
    }

    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        exit(EXIT_FAILURE);
    }

    // 准备数据
    int int_value = 42;          // 示例int数据
    float float_value = 3.14f;   // 示例float数据

    // 序列化数据(将int和float转换为字节流)
    char buffer[8];
    *(int *)buffer = htonl(int_value);               // 将int转换为网络字节序
    *(float *)(buffer + 4) = float_value;           // 直接存储float(注意字节序问题)

    // 发送数据
    if (send(sock, buffer, sizeof(buffer), 0) < 0) {
        perror("Send failed");
        close(sock);
        exit(EXIT_FAILURE);
    }

    printf("Data sent: int=%d, float=%.2f\n", int_value, float_value);

    // 关闭Socket
    close(sock);
    return 0;
}

以上代码通过python语言进行tcp通信,以本地作为tcp客户端上传数据给云端tcp服务端,本地采集传感器数据,此处客户端代码仅做示例,直接传输数据,具体根据实际情况将采集数据传输即可,云端tcp服务端将接受到的数据保存到云端MySQL数据库,在云端数据库中可以查看

扩展

以上示例代码仅用于基础理解,使用比较简单的方式实现从本地获取数据,通过tcp直接传输到云端服务器并保存到MySQL数据库的功能,在实际开发中,可以增加mqtt数据传输json数据流,根据上端需求可以使用多进程、多线程对各模块进行分组处理,多进程间可以使用共享内存、消息队列、socket套接字进行交互等方式对整体架构进行增码。

相关文章:

  • Spring统一格式返回
  • Spring学习笔记03——Spring Boot的文件结构
  • XGMII(10 Gigabit Media Independent Interface)详解
  • Mac上安装Pycharm
  • 【音视频】音频基础
  • 前端项目打包生成 JS 文件的核心步骤
  • 飞牛NAS玩转DeepSeek-R1大模型并实现内外网自由互通
  • AI浏览器BrowserUse:本机运行环境准备(二)
  • Linux搭建个人大模型RAG-(ollama+deepseek+anythingLLM)
  • java jar包内的jar包如何打补丁
  • 51单片机编程学习笔记——74HC245八路三态输出双向收发器
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token
  • 矩阵压缩存储
  • 大白话TypeScript 第十章TypeScript 学习全阶段详细总结
  • Unity TMP_InputField 多行输入时的高度适应
  • Spring生命周期都有哪些阶段
  • k8s命名空间和资源配额
  • redis 与 DB 的一致性 7 种策略
  • 软考教材重点内容 信息安全工程师 第18章 网络安全测评技术与标准
  • 【C语言】高内聚低耦合:结构体、联合体、数组、字符串、枚举和指针的综合实践
  • 网站备案网站名称怎么填/seo教程自学网
  • 咨询手机网站建设平台/专业关键词排名软件
  • 公司注销网站备案/申请网址怎么申请的
  • 青岛网站建设 百度/搜索引擎seo外包
  • 平谷重庆网站建设/实时疫情最新消息数据
  • 网站流量站怎么做的/佛山营销型网站建设公司