Skip to content

iu7-2014/networks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Техническое задание (расшифрованное)

Разработать приложение для удалённого управления компьютером.

Функциональные возможности

  1. Передача изображения монитора удалённого компьютера.
  2. Управление курсором мыши удалённого компьютера:
  3. Перемещение.
  4. Нажатие 3 основных клавиш.

Требования к производительности

Не предъявляются. Можно слать PNG.

Реализация

ПО реализуется в виде клиент-серверного решения. Клиент представляет собой графическое приложение, предоставляющее возможности удалённого управления компьютером. Сервер представляет собой демона, слушающего на заранее заданном порте, который пересылает изображение на управляющий компьютер и эмулирует управление пользователем курсора мыши.

ПО в целом

Язык

Python 3

Сетевое взаимодействие

В связи с тем, что используется посылка разницы изображений (в противопоставление посылки изображения целиком), одновременно падает нагрузка на сеть, сокращается необходимая ширина канала, да и передача всех пакетов становится важной используется TCP соединение.

Библиотека

ZeroMQ PyZMQ.

Так как используется надёжное соединение (все соединения tcp), уведомлять о доставке состояния мыши/экрана не требуется. Поэтому паттерн REQ/REP не используется.

Оповещение о сервисе удалённого доступа в сети

rc.client: sub rc.server: pub rationale: Может быть много серверов, о присутсвии каждого из которых должнен знать любой компьютер в сети.

Посылка изображений рабочего стола удалённого компьютера

rc.client: pair rc.server: pair rationale: Гипотетически много клиентов может быть подключено к одному серверу. Когда картинка у сервера меняется все клиенты должны её получить. Проблема заключается в том, что получить изображение должны лишь авторизированные пользователи. Поэтому незашифрованные широковещательные сообщения не могут быть использованы. Для упрощения задачи шифрование не задействовано, поэтому остаётся только парное соединение.

Посылка комманд управления мышью с клиента

rc.client: pair rc.server: pair rationale: Даже в гипотетическом случае, когда много клиентов могут подключится к одному серверу получаем множество независимых пар: "клиент-сервер", т.к. всем клиентам, кроме управляющего не нужна позиция курсора мыши.

Протокол

Все сообщения инкапсулируются в JSON.

Пакет состояния мыши:

class MousePackage(Package):
	def __init__(self, x, y, left, middle, right):
		self.x = x
		self.y = y
		self.left = left
		self.right = right
Передача изображения

Изображение и его diff-ы передаются через base64.

Журналирование

Ведётся с помощью стандартного модуля logging. Конфигурация логгирования задаётся через файл (Q: INI/YAML?).

Клиент

Поддерживаемые платформы

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

Графический интерфейс

Qt 5 Widgets

Widget изображения удалённого рабочего стола

QGraphicsView (с QGraphicsScene, на который кинут Pixmap, который содержит изображение удалённого рабочего стола).

Widget, на котором происходит отрисовка удалённого рабочего стола, обрабатывает движения мышью, нажатия клавиш. После обработки формирует пакет текущего состояния мыши.

Сервер

Поддерживаемые платформы

Компьютер, работающий под управлением GNU/Linux с оконной системой X Window System и с системой инициализации SystemD.

Демонизация

Программа запускается SystemD.

Есть библиотека https://pypi.python.org/pypi/python-daemon/. Q: нужна ли она, когда SystemD делает это всё сам?

Журналирование

Вести логи просто в stdout. SystemD позаботится обо всём сам.

Получение изображения рабочего стола

Qt

Стандарты

Code style

PEP8 + для отступов табы вместо пробелов (для выравнивания пробелы). Никакого транслита — нормальный английский. Docstrings не обязательны, но в случае быдлокода желательны.

Техническая документация

Сообщения в коммитах, комменты в коде — на английском.

Git

Всё коммитим в одну ветку master. Push на github только когда интерпретируется без вылетов (хотя бы в стандартных ситуациях).

Releases

No releases published

Packages

No packages published

Languages