RobotKernal-UESTC/Code/MowingRobot/pibot_ros/ros_ws/service2.py

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)