Python Socket 线程编程中的多 Arduino 通信

问题描述 投票:0回答:1

我的设置中有四个程序:一个主服务器 Python 程序,以及三个客户端程序,即 Arduino1、Arduino2 和 GUI 程序。

操作顺序如下:我首先启动主服务器Python程序,然后启动GUI程序。随后,我启动了两个 Arduino 客户端。所有这些客户端最初都会向主服务器发送握手信号,然后主服务器根据该信号为它们分配唯一的 ID。

Arduino1 和 Arduino2 具有相似的用途。当我的 GUI 程序向主程序发送信号“2”或“3”时,主程序又将“请求数据”信号转发到与 ID 关联的特定 Arduino。 Arduino1 和 Arduino2 通过将简单的字符串数据发送回主服务器进行响应,然后主服务器将其打印出来。

Python服务器程序:

import threading
import socket
from datetime import datetime
import time
import threading
import logging
import config

connected_clients = []
data_lock = threading.Lock()

def send_data_to_specific_client(client_id, data):
    with data_lock:
        for client_info in connected_clients:
            if client_info["id"] == client_id:
                client_socket = client_info["socket"]
                client_socket.send(data.encode())
                return

    print(f"Client with ID {client_id} is not found in the connected clients.")

def server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('XXX.XXX.X.XXX', XXXXX) # change to your ip.
    server_socket.bind(server_address)
    server_socket.listen(10)

    print("Server is listening for incoming connections...")

    while True:
        client_socket, client_address = server_socket.accept()
        print("Connected to", client_address)
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address,))
        client_thread.start()

def handle_client(client_socket, client_address):
    try:
        while True:
            data = client_socket.recv(1024).decode('utf-8')
            
            if not data:
                continue

            print(data)

            if data == "(Laser_Sensor_Sent)":
                client_id = 0
                flag1 = True
                client_info = {
                    "socket": client_socket,
                    "address": client_address,
                    "id": client_id
                }

                connected_clients.append(client_info)
                print("(Laser Arduino added to client list)")

            elif data == "(station1)":
                client_id = 1
                flag1 = True
                client_info = {
                    "socket": client_socket,
                    "address": client_address,
                    "id": client_id
                }

                connected_clients.append(client_info)
                print("(Station1 Arduino added to client list)")

            elif data == "GUI_handshake":
                client_id = 10
                flag1 = True
                client_info = {
                    "socket": client_socket,
                    "address": client_address,
                    "id": client_id
                }

                connected_clients.append(client_info)
                
            if data in ["2", "3"]:
                received_data = int(data)
                    
                if received_data == 2:
                    send_data_to_specific_client(0, "laser_status\n")
                    continue

                elif received_data == 3:
                    send_data_to_specific_client(1, "station1_occupied\n")
                    continue

    except ConnectionResetError:
        print(f"Client {client_address} disconnected.")
        if client_address in connected_clients:
            del connected_clients[client_address]

    except Exception as e:
        print(f"An error occurred in the client handler: {e}")

    if client_address in connected_clients:
        del connected_clients[client_address]

    client_socket.close()

if __name__ == "__main__":
    server()

但是,我遇到了一个问题:当我将两个 Arduino 设备连接到服务器并使用 GUI 程序向主程序发送信号(例如“2”)时,偶尔会出现断开连接或响应时间延长的情况,有时持续几秒钟。这个问题似乎与我的 Python 服务器程序处理线程的方式有关。

当我仅连接一个 Arduino 时,它们中的任何一个都可以完美工作,并且响应时间即时。然而,当我同时连接两个 Arduino 设备时,它们似乎在某种程度上遇到了一些冲突或干扰。

python sockets server arduino arduino-uno
1个回答
0
投票

我已经指出了问题所在。两个 Arduino 共享相同的 MAC 地址。要解决此问题,请配置不同的 MAC 地址,它应该可以正常工作。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.