> For the complete documentation index, see [llms.txt](https://dh-organization.gitbook.io/droneshub-rover-kontakt/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dh-organization.gitbook.io/droneshub-rover-kontakt/opisanie-servernoi-chasti-programmy/fail-server_controller.py.md).

# ФАЙЛ «SERVER\_CONTROLLER.PY»

Файл «Server\_controller.py» представляет собой инструмент для взаимодействия с серверами реле и сервоприводов, а также для запуска и остановки серверных процессов. Этот файл включает два класса: Attachments и Site\_run. Каждый класс выполняет специфические функции, обеспечивающие управление и взаимодействие с различными компонентами системы.

## ИНИЦИАЛЗАЦИЯ БИБЛИОТЕК

```python
import logging
import socket
import os
import re
import subprocess
import sys
import 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

```python
class Attachments:
    # Конструктор класса, инициализирующий соединения с серверами
    def __init__(self, ip, port_rele, port_servo) -> None:
        host = ip
        # Попытка подключения к серверу реле
        try:
            self.client_socket_rele = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.client_socket_rele.connect((host, port_rele))
            print("подключенно rele")
        except:
            print("error connect server rele")
        # Попытка подключения к серверу сервопривода
        try:
            self.client_socket_servo = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.client_socket_servo.connect((host, port_servo))
            print("подключенно servo")
        except:
            print("error connect server servo")
```

Конструктор класса Attachments инициализирует соединения с серверами реле и сервоприводов. Он создает два сокета и пытается подключиться к серверам по указанным IP-адресу и портам. В случае успеха выводится сообщение о подключении, в случае ошибки - сообщение об ошибке.

## &#x20;АСИНХРОННАЯ ФУНКЦИЯ rele\_status (прописывается в классе Attachments)

```python
    async def rele_status(self, gradus):
        try:
            self.client_socket_rele.sendall(f"{gradus}".encode('utf-8'))
        except Exception as e:
            print("error rele: ", e)
```

Функция rele\_status отправляет статус реле (градус) на сервер реле. В случае ошибки выводится сообщение об ошибке.

## АСИНХРОННАЯ ФУНКЦИЯ servo\_grad (прописывается в классе Attachments)

```python
    async def servo_grad(self, status):
        try:
            self.client_socket_servo.sendall(f"{int(status)}".encode('utf-8'))
        except Exception as e:
            print("error servo: ", e)

```

Функция servo\_grad отправляет угол поворота сервопривода на сервер сервоприводов. В случае ошибки выводится сообщение об ошибке.

## АСИНХРОННАЯ ФУНКЦИЯ rele\_status\_never

```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
```

Функция rele\_status\_never запрашивает и получает статус реле с сервера реле.

## АСИНХРОННАЯ  ФУНКЦИЯ servo\_status

```python
    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
```

Функция  servo\_status запрашивает и получает статус сервопривода с сервера сервоприводов.

## ИНИЦИАЛИЗАЦИЯ КЛАССА Site\_run

```python
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)
```

Конструктор класса Site\_run запускает серверный процесс. Он формирует строку с данными о портах, добавляет её в аргументы командной строки и запускает серверный процесс с помощью subprocess.Popen. После запуска процесса происходит задержка для его установления.

## ФУНКЦИЯ stop

```python
    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)
```

Метод stop останавливает серверный процесс. Он формирует и выполняет команду для поиска PID процесса по порту, затем останавливает процесс с найденным PID с помощью команды taskkill.\
\
\
Процесс подготовки кода:

1. Создайте файл и назовите его Server\_Controller.py

<figure><img src="/files/S0bREwpopuVyNKsGO0hc" alt=""><figcaption><p>файл Server_Controller.py в иерархии</p></figcaption></figure>

2. Поэтапно добавьте код в файл

<figure><img src="/files/Hj2kSXbnU54VxAMeqhAz" alt=""><figcaption><p>Окно программирования файла "Server_controller.py". Часть 1</p></figcaption></figure>

<figure><img src="/files/LtaiqWrBS7WDhPV3lWUM" alt=""><figcaption><p>Окно программирования файла "Server_controller.py". Часть 2</p></figcaption></figure>

<figure><img src="/files/nfmM27EY5vsfSKxfDC7S" alt=""><figcaption><p>Окно программирования файла "Server_controller.py". Часть 3</p></figcaption></figure>

В данном случае все библиотеки предустановлены в Python.&#x20;

Запускать данный файл не нужно.
