# ФАЙЛ «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;

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dh-organization.gitbook.io/droneshub-rover-kontakt/opisanie-servernoi-chasti-programmy/fail-server_controller.py.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
