我的设置中有四个程序:一个主服务器 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 设备时,它们似乎在某种程度上遇到了一些冲突或干扰。
我已经指出了问题所在。两个 Arduino 共享相同的 MAC 地址。要解决此问题,请配置不同的 MAC 地址,它应该可以正常工作。