111 lines
5.2 KiB
Python
111 lines
5.2 KiB
Python
|
import socket
|
||
|
import threading
|
||
|
import subprocess
|
||
|
import netifaces
|
||
|
|
||
|
|
||
|
# LAUNCH_FILES = {
|
||
|
# '0x00': ['roslaunch', 'pibot_navigation', 'nav.launch'],
|
||
|
# '0x01': ['roslaunch', 'upbot_location', 'upbot_location.launch'],
|
||
|
# 'launch_file_1': ['roslaunch', 'package_name', 'launch_file_1.launch'],
|
||
|
# 'launch_file_2': ['roslaunch', 'package_name', 'launch_file_2.launch']
|
||
|
# }
|
||
|
client_processes = {}
|
||
|
process_id_counter = 0
|
||
|
def get_local_ip():
|
||
|
interfaces = netifaces.interfaces()
|
||
|
for interface in interfaces:
|
||
|
addresses = netifaces.ifaddresses(interface)
|
||
|
if netifaces.AF_INET in addresses:
|
||
|
for address_info in addresses[netifaces.AF_INET]:
|
||
|
ip_address = address_info['addr']
|
||
|
if ip_address.startswith('192.168.') or ip_address.startswith('10.'):
|
||
|
return ip_address
|
||
|
|
||
|
def create_server_socket(host, port):
|
||
|
try:
|
||
|
socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
|
socket_server.bind((host, port))
|
||
|
socket_server.listen(5)
|
||
|
print(f"服务端已启动,地址{host},端口{port}")
|
||
|
print("正在等待客户端连接...")
|
||
|
|
||
|
client_num = 0
|
||
|
while True:
|
||
|
client_num += 1
|
||
|
conn, address = socket_server.accept()
|
||
|
print(f"服务端已接受到客户端 {client_num} 号的连接请求,客户端信息:{address}")
|
||
|
client_handler = threading.Thread(target=handle_client, args=(conn, address, client_num))
|
||
|
client_handler.start()
|
||
|
except Exception as e:
|
||
|
print(f"错误:{e}")
|
||
|
finally:
|
||
|
socket_server.close()
|
||
|
|
||
|
def handle_client(conn, address, client_num):
|
||
|
global process_id_counter
|
||
|
try:
|
||
|
while True:
|
||
|
data_from_client = conn.recv(1024).decode("UTF-8")
|
||
|
if not data_from_client:
|
||
|
break
|
||
|
print(f"客户端 {client_num} 号({address}) 发来的消息是:{data_from_client}")
|
||
|
data = data_from_client.strip()
|
||
|
if data == '1':
|
||
|
process_id_counter += 1
|
||
|
process_id = process_id_counter
|
||
|
process = subprocess.Popen(['roslaunch', 'pibot_navigation', 'nav.launch'])
|
||
|
client_processes.setdefault(client_num, []).append((process_id, process))
|
||
|
conn.send(f"定位导航已启动,进程标识符为 {process_id}".encode("UTF-8"))
|
||
|
elif data == '2':
|
||
|
process_id_counter += 1
|
||
|
process_id = process_id_counter
|
||
|
process = subprocess.Popen(['roslaunch', 'upbot_mapping', 'upbot_mapping.launch'])
|
||
|
client_processes.setdefault(client_num, []).append((process_id, process))
|
||
|
conn.send(f"手持标签划定范围已启动,进程标识符为 {process_id}".encode("UTF-8"))
|
||
|
elif data == '3':
|
||
|
process_id_counter += 1
|
||
|
process_id = process_id_counter
|
||
|
process = subprocess.Popen(['roslaunch', 'ipa_room_exploration', 'room_exploration_action_server.launch'])
|
||
|
client_processes.setdefault(client_num, []).append((process_id, process))
|
||
|
conn.send(f"全覆盖服务端已启动,进程标识符为 {process_id}".encode("UTF-8"))
|
||
|
elif data == '4':
|
||
|
process_id_counter += 1
|
||
|
process_id = process_id_counter
|
||
|
process = subprocess.Popen(['roslaunch', 'ipa_room_exploration', 'room_exploration_client.launch', 'robot_env:=4_'])
|
||
|
client_processes.setdefault(client_num, []).append((process_id, process))
|
||
|
conn.send(f"全覆盖客户端已启动,进程标识符为 {process_id}".encode("UTF-8"))
|
||
|
elif data.startswith('stop'):
|
||
|
stop_data = data.split()
|
||
|
if len(stop_data) == 2:
|
||
|
process_id_to_stop = int(stop_data[1])
|
||
|
if client_num in client_processes:
|
||
|
for process_tuple in client_processes[client_num]:
|
||
|
if process_tuple[0] == process_id_to_stop:
|
||
|
process_tuple[1].terminate()
|
||
|
client_processes[client_num].remove(process_tuple)
|
||
|
conn.send(f"已停止客户端 {client_num} 号的进程 {process_id_to_stop}".encode("UTF-8"))
|
||
|
break
|
||
|
else:
|
||
|
conn.send(f"客户端 {client_num} 号没有标识符为 {process_id_to_stop} 的进程".encode("UTF-8"))
|
||
|
else:
|
||
|
conn.send("没有启动的进程需要停止".encode("UTF-8"))
|
||
|
else:
|
||
|
conn.send("无效的停止命令格式".encode("UTF-8"))
|
||
|
else:
|
||
|
response = f"已收到消息: {data}"
|
||
|
conn.send(response.encode("UTF-8"))
|
||
|
|
||
|
except Exception as e:
|
||
|
print(f"客户端 {client_num} 号({address}) 处理时发生错误:{e}")
|
||
|
finally:
|
||
|
conn.close()
|
||
|
print(f"客户端 {client_num} 号({address}) 已断开连接。")
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
local_ip = get_local_ip()
|
||
|
print("本机在局域网内的IP地址:", local_ip)
|
||
|
|
||
|
server_port = int(input("请输入服务端端口号: "))
|
||
|
create_server_socket(local_ip, server_port)
|