Skip to content

Протокол mailbox'ов

iakov edited this page Nov 17, 2021 · 2 revisions

Это P2P сеть по TCP. Идентификация в сети идёт по бортномерам, но отправлять сообщение надо напрямую получателю.

Порт по умолчанию 8889, меняется в XML конфиге. Если 8889 занят, будет попытка открыть несколько следующих портов.

Каждое сообщение начинается с количества символов в нём использующихся 15:register:8889:4 23:data:Hello from Desktop

Чтобы подключиться к роботу нужно отправить ему сообщение о регистрации: 15:register:8889:4 Через двоеточие: кол-во байт + команда + порт сервера + свой бортномер

Когда к нам подключается робот, то он присылает нам свое сообщение о регистрации, на него мы должны ответить: 6:self:6 - размер + ключевое слово + наш борт номер отправляем все сообщения в тот же сокет, которым с нами соединился робот. Информация о серверном порте нужна нам для переподключения. Так же мы должны новому роботу, который с нами соединился отправить всех известных нам роботов: 32:connection:192.168.77.211:8889:4 32:connection:192.168.77.205:8889:2

После этого можно отсылать сообщения 23:data:Hello from Desktop

Так же нужно не реже чем в 3 секунды отправлять 9:keepalive, если мы молчим, иначе соединение закроется и будет переподключение при отправке сообщения.

Инициировать переподключение должен тот, кто пытается отправить сообщение. Если надо отправить сообщение роботу под номером 3, проверяем, есть ли с ним действующее соединение, если нет, то пытаемся подключиться на серверный порт. Если не заморачиваться над тем, что несколько роботов под одним ip, но на разных портах, то можно проверять наличие соединения просто по ip. Иначе нужно помнить с какого порта к нам подключились другие роботы (потому что они подключаются не с серверного порта).

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

API, доступное из скриптов Python и JavaScript (все Q_INVOKABLE и public slots): https://github.com/trikset/trikRuntime/blob/master/trikNetwork/src/mailbox.h