Файл «Server_controller.py» представляет собой инструмент для взаимодействия с серверами реле и сервоприводов, а также для запуска и остановки серверных процессов. Этот файл включает два класса: Attachments и Site_run. Каждый класс выполняет специфические функции, обеспечивающие управление и взаимодействие с различными компонентами системы.
ИНИЦИАЛЗАЦИЯ БИБЛИОТЕК
import loggingimport socketimport osimport reimport subprocessimport sysimport time
logging: Эта библиотека предоставляет гибкую систему для вывода сообщений журнала (логирования) из программ на Python. Она позволяет настроить уровни логирования (например, DEBUG, INFO, WARNING, ERROR, CRITICAL) и выводить сообщения в различные места, такие как консоль, файлы, сетевые сервисы и т.д.
socket: Эта библиотека предоставляет низкоуровневые интерфейсы для работы с сетью. Она позволяет создавать сокеты для отправки и получения данных по сети, поддерживая различные протоколы, такие как TCP и UDP.
os: Эта библиотека предоставляет функции для взаимодействия с операционной системой. Она включает в себя функции для работы с файловой системой, управление процессами, переменными окружения и другими системными ресурсами.
re: Эта библиотека предоставляет операции для работы с регулярными выражениями. Она позволяет выполнять поиск, замену и другие манипуляции с текстом на основе шаблонов, заданных регулярными выражениями.
subprocess: Эта библиотека позволяет запускать новые процессы, подключаться к их каналам ввода-вывода-ошибок и получать их коды возврата. Она предоставляет более мощные средства для работы с подпроцессами по сравнению с os.system и другими подобными функциями.
sys: Эта библиотека предоставляет доступ к некоторым переменным и функциям, используемым интерпретатором Python, а также к функциям, которые взаимодействуют с интерпретатором. Например, sys.argv содержит список аргументов командной строки, sys.exit() позволяет выйти из программы, и т.д.
time: Эта библиотека предоставляет различные функции для работы со временем. Она позволяет измерять время выполнения кода, задерживать выполнение программы на заданное количество секунд (с помощью time.sleep), и выполнять другие операции, связанные с временем и датой.
ИНИЦИАЛИЗАЦИЯ КЛАССА Attachments
Конструктор класса Attachments инициализирует соединения с серверами реле и сервоприводов. Он создает два сокета и пытается подключиться к серверам по указанным IP-адресу и портам. В случае успеха выводится сообщение о подключении, в случае ошибки - сообщение об ошибке.
АСИНХРОННАЯ ФУНКЦИЯ rele_status (прописывается в классе Attachments)
Функция rele_status отправляет статус реле (градус) на сервер реле. В случае ошибки выводится сообщение об ошибке.
АСИНХРОННАЯ ФУНКЦИЯ servo_grad (прописывается в классе Attachments)
Функция servo_grad отправляет угол поворота сервопривода на сервер сервоприводов. В случае ошибки выводится сообщение об ошибке.
АСИНХРОННАЯ ФУНКЦИЯ rele_status_never
Функция rele_status_never запрашивает и получает статус реле с сервера реле.
АСИНХРОННАЯ ФУНКЦИЯ servo_status
Функция servo_status запрашивает и получает статус сервопривода с сервера сервоприводов.
ИНИЦИАЛИЗАЦИЯ КЛАССА Site_run
Конструктор класса Site_run запускает серверный процесс. Он формирует строку с данными о портах, добавляет её в аргументы командной строки и запускает серверный процесс с помощью subprocess.Popen. После запуска процесса происходит задержка для его установления.
ФУНКЦИЯ stop
Метод stop останавливает серверный процесс. Он формирует и выполняет команду для поиска PID процесса по порту, затем останавливает процесс с найденным PID с помощью команды taskkill.
Процесс подготовки кода:
Создайте файл и назовите его Server_Controller.py
файл Server_Controller.py в иерархии
Поэтапно добавьте код в файл
Окно программирования файла "Server_controller.py". Часть 1
Окно программирования файла "Server_controller.py". Часть 2
Окно программирования файла "Server_controller.py". Часть 3
В данном случае все библиотеки предустановлены в Python.
async def rele_status_never(self):
self.client_socket_rele.sendall(f"return".encode('utf-8'))
data = self.client_socket_rele.recv(self.buffer_size).decode('utf-8')
return data
async def servo_status(self):
self.client_socket_servo.sendall(f"return".encode('utf-8'))
data = self.client_socket_servo.recv(self.buffer_size).decode('utf-8')
return data
class Site_run:
# Конструктор класса, запускающий серверный процесс
def __init__(self, ip_site, port_site, ip_serv, port_serv, rtsp):
# Формирование строки с данными о портах
port_data = f'{ip_site}:{port_site},{ip_serv}:{port_serv},{rtsp}'
# Добавление данных о портах в аргументы командной строки
sys.argv.append(port_data)
self.port = port_site
# Формирование и выполнение команды для запуска сервера
command = f'python3.11 Server_site.py {" ".join(sys.argv[1:])}'
self.processes = subprocess.Popen(command, shell=True)
# Ожидание для установления процесса
time.sleep(3)
def stop(self):
# Формирование и выполнение команды для поиска PID процесса
command = f'netstat -a -n -o | find "{self.port}"'
output = subprocess.check_output(command, shell=True, text=True)
pattern = r'LISTENING\s+(\d+)'
pids = re.findall(pattern, output)
# Формирование и выполнение команды для остановки процесса
sys = 'taskkill /F /PID ' + str(pids[0])
os.system(sys)