# work-soc-streamer

## Описание содержания файлов

В этом разделе описано краткое содержание файлов проекта, которые были изменены разработчиком (Мария Сухоносова).
Описание может содержать неточности.

### Файл /streamer_ulils.py

Это самописная библиотека, содержит класс SocketBlocksWrapper - обертку над сокетом для чтения/записи объектов или сырых блоков данных в сокет.
Используется остальными компонентами проекта.

### Файл /server.py

Это имполняемый файл сервера, то есть машины, которая ожидает подключений плат и компьютеров.
Задача сервера - прослушивать порт. На любом входящем соединении требовать авторизацию и после успешной авторизации создавать некое подобие локальной сети между нужными соединениями. Принцп действия схож с принципом действия свича с поддержкой VLAN с разницей в том, что сервер сначала требует авторизацию.

Требует наличия файла /streamer_ulils.py рядом во время исполнения.ы

### Файл /client.py

Это исполняемый файл клиента, то есть программы, которая создает окно, показывает картинку и реагирует на действия пользователя.

Требует наличия файла /streamer_ulils.py рядом во время исполнения.

В программе отдельно создается поток, работающий с сокетом и потом, работающий с ГУИ.

Пользователь (например) нажимает кнопку в ГУИ, дальше формируется сообщение с типом 'command' и отправляется в сокет путем неблокирующей записи, если сокет существует и открыт.

Поток, работающий с сокетом пытается установить соединение с сервером.
После успешной попытки происходит авторизация (сообщения типа 'auth').
После успешной авторизации клиент ожидает сообщений с типом 'video'.
Сообщение с этим типом интерпретируются как сообщения с картинкой. После чего картинка восстанавливается из сообщения и обновляется в потоке ГУИ.

В случае неудачной попытки подключения будет предпринята еще одна попытка подключения, и так до закрытия программы.

### Файл /board.py

Это основной исполняемый файл для компьютера с камерой. За основу был взят Final-Ochka-v1.2-beta.py
В него был встроен один класс в начале скрипта, был модифицирован алгоритм отправки фреймов и обработки классов.

Скрипт так же как и скрипт для клиента запускает поток, работающий с соединением. В данном случае поток слушает все сообщения с типом 'command'. Сразу после принятия сообщения такого типа вызывается обработчик команд, который уже выполняет команду.

### Файл /board-config.json

Файл содержит json структуру и хранит в себе настройки подключения к серверу.

### Файл /client-config.json

Файл содержит json структуру и хранит в себе настройки подключения и авторизации клиента на сервере.

### Файл /classes.json

Файл имеет структуру json и содержит массив классов в формате

```json
{
	"class": "nameOfClass",
	"label": "Название класса",
	"color": [<R>, <G>, <B>]
}
```

Поле class содержит имя класса. Поле label содержит название класса, которое будет отображено на клиенте. Поле label пока не используется.

### Файл /boards.sqlite3

Файл базы данных, в которой хранятся все наименования плат и пароль для подключения к каждой плате.
Содержит одну единственную таблицу, созданную таким кодом:
```sqlite
CREATE TABLE IF NOT EXISTS users (
   board_name TEXT NOT NULL PRIMARY KEY,
   password TEXT NOT NULL DEFAULT ''
);
```

## КАК ЗАПУСКАТЬ

Всего в этом проекте 3 исполняемых файла: board.py, computer.py, server.py.
Не так важно в каком порядке их запускать, однако если есть желание увидеть картинку, то нужно запустить все 3.

При копировании проекта по разным машинам следует убедиться, что вы взяли все ресурсы для конкретного файла.

### Board (плата с камерой)

Команда запуска:
```bash
python board.py
```

Используемые файлы:
* board.py (исполняемый файл)
* board-config.json
* classes.json
* Nab.wav
* Pot.wav
* Zah.wav
* AI.cfg
* AI.weights
* streamer_utils.py

В конфигурационном файле прописываются: 

### Server (комп, к которому все подключатся)

Команда запуска
```bash
python server.py
```

Используемые файлы:
* server.py (исполняемый файл)
* streamer_utils.py
* boards.sqlite3

### Client (комп, который должен показывать картинку)

Команда запуска
```bash
python client.py
```

Используемые файлы:
* client.py (исполняемый файл)
* classes.json
* client-config.json
* streamer_utils.py
* logo.png

В конфигурационном файле прописываются: адрес сервера, порт, имя платы для подключения, пароль

## Как добавить плату

Нужно отредактировать базу данных, то есть файл boards.sqlite3.

Открыть базу можно любой утилитой, которая поддерживает SQLite3.
Самый простой метод - выполнить в терминале
```bash
sqlite3 boards.sqlite3
```

Посмотреть все платы и пароли к ним
```sqlite
SELECT board_name, password FROM users;
```

Добавление/удаление/обновление информации делается нативным образом для этой базы данных, то есть через запросы.

База данных позволяет на лету менять данные. Изменения применяются сразу и только для новых подключений.
Уже установленные подключения не будут разорваны.

