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

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

思维导图




需求分析

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数据库内。
  1. import socket
  2. import struct
  3. import mysql.connector
  4. # MySQL 数据库配置
  5. db_config = {
  6.     'host': 'localhost',
  7.     'user': 'root',
  8.     'password': '<你的密码>',  # 替换为你的 MySQL root 密码
  9.     'database': 'test_db'  # 替换为你的数据库名称
  10. }
  11. # 创建数据库连接
  12. def create_db_connection():
  13.     try:
  14.         connection = mysql.connector.connect(**db_config)
  15.         return connection
  16.     except mysql.connector.Error as err:
  17.         print(f"数据库连接失败: {err}")
  18.         return None
  19. # 插入数据
  20. def insert_sensor_data(connection, hum, tem):
  21.     try:
  22.         cursor = connection.cursor()
  23.         query = "INSERT INTO sensor_data (hum, tem) VALUES (%s, %s)"
  24.         cursor.execute(query, (hum, tem))
  25.         connection.commit()
  26.         print(f"数据插入成功: hum={hum}, tem={tem:.2f}")
  27.     except mysql.connector.Error as err:
  28.         print(f"数据插入失败: {err}")
  29. # TCP 服务器
  30. def start_tcp_server(host='0.0.0.0', port=<你的端口>):
  31.     # 创建数据库连接
  32.     connection = create_db_connection()
  33.     if connection is None:
  34.         return
  35.     # 创建 TCP socket
  36.     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  37.     server_socket.bind((host, port))
  38.     server_socket.listen(5)
  39.     print(f"TCP 服务器启动,监听 {host}:{port}")
  40.     while True:
  41.         # 接受客户端连接
  42.         client_socket, addr = server_socket.accept()
  43.         print(f"Connected by {addr}")
  44.         try:
  45.             data = client_socket.recv(1024).decode('utf-8')  # 解码数据
  46.             if data:
  47.                 print(f"接收到数据: {data}")
  48.             # 解析数据(假设数据格式为 "hum,tem")
  49.                 hum, tem = data.split(',')  # 按逗号分隔
  50.                 hum = int(hum)  # 将 hum 转换为 int
  51.                 tem = float(tem)  # 将 tem 转换为 float
  52.                 # 将数据插入数据库
  53.                 insert_sensor_data(connection, hum, tem)
  54.             # 接收数据(8字节:4字节int + 4字节float)
  55.             #data = client_socket.recv(8)
  56.             #if len(data) == 8:
  57.                 # 解析数据
  58.                 #hum = struct.unpack('!i', data[:4])[0]  # 解析int
  59.                 #tem = struct.unpack('<f', data[4:])[0]  # 解析float
  60.                 #print(f"Received int: {hum}, float: {tem}")
  61.                 #insert_sensor_data(connection, hum, tem)
  62.             else:
  63.                 print("Invalid data received")
  64.         except Exception as e:
  65.             print(f"Error: {e}")
  66.         finally:
  67.             client_socket.close()
  68.     # 关闭数据库连接
  69.     connection.close()
  70. if __name__ == "__main__":
  71.     start_tcp_server()
复制代码
tcp_client.py:云服务器本地python下tcp客户端测试代码
  1. import socket
  2. def send_sensor_data(host='<云端服务器IP>', port=<端口号>, hum=50, tem=25.5):
  3.     client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4.     client_socket.connect((host, port))
  5.     message = f"{hum},{tem}"
  6.     client_socket.send(message.encode('utf-8'))
  7.     client_socket.close()
  8.     print(f"数据已发送: {message}")
  9. if __name__ == "__main__":
  10.     send_sensor_data()
复制代码
tcp_client.c:本地Linux-c程序tcp客户端上传数据到云服务器代码,必要注意字节序的问题
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <arpa/inet.h>
  6. #define SERVER_IP "<云端服务器IP.address>"  // 替换为云端的IP地址
  7. #define SERVER_PORT <端口号>
  8. int main() {
  9.     int sock;
  10.     struct sockaddr_in server_addr;
  11.     // 创建Socket
  12.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  13.         perror("Socket creation failed");
  14.         exit(EXIT_FAILURE);
  15.     }
  16.     // 设置服务器地址
  17.     server_addr.sin_family = AF_INET;
  18.     server_addr.sin_port = htons(SERVER_PORT);
  19.     if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {
  20.         perror("Invalid address/ Address not supported");
  21.         exit(EXIT_FAILURE);
  22.     }
  23.     // 连接到服务器
  24.     if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
  25.         perror("Connection failed");
  26.         exit(EXIT_FAILURE);
  27.     }
  28.     // 准备数据
  29.     int int_value = 42;          // 示例int数据
  30.     float float_value = 3.14f;   // 示例float数据
  31.     // 序列化数据(将int和float转换为字节流)
  32.     char buffer[8];
  33.     *(int *)buffer = htonl(int_value);               // 将int转换为网络字节序
  34.     *(float *)(buffer + 4) = float_value;           // 直接存储float(注意字节序问题)
  35.     // 发送数据
  36.     if (send(sock, buffer, sizeof(buffer), 0) < 0) {
  37.         perror("Send failed");
  38.         close(sock);
  39.         exit(EXIT_FAILURE);
  40.     }
  41.     printf("Data sent: int=%d, float=%.2f\n", int_value, float_value);
  42.     // 关闭Socket
  43.     close(sock);
  44.     return 0;
  45. }
复制代码
以上代码通过python语言举行tcp通信,以本地作为tcp客户端上传数据给云端tcp服务端,本地采集传感器数据,此处客户端代码仅做示例,直接传输数据,具体根据实际环境将采集数据传输即可,云端tcp服务端将接受到的数据保存到云端MySQL数据库,在云端数据库中可以检察

扩展

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表