Перейти к содержимому
Totoro

Stem - мультиканальный интернет мост

Рекомендуемые сообщения

Помните мост Рида?

Ну так вот. Я тут изучаю Rust на досуге, и пишу мини проекты. Так и получился у меня...

 

iHjWLMf.png

 

Stem

Это интернет мост для OpenComputers.

 

Что такое мост

Для тех кто не знает что такое мост, и для чего он нужен:

мост дает примерно такие же возможности как и linked карта. Он позволяет связать между собой компьютеры OpenComputers, где бы они не находились. Только мост реализует это через интернет карту.

 

Однако по сравнению с linked картой есть один очень крутой плюс. Вы можете подключиться к своему OpenComputers компу не только с другого OpenComputers компа из Майнкрафта, но и из реального мира. Например с телефона. Или с вашего домашнего компьютера.

 

Отличие от моста Рида

Я немного по другому подошел к архитектуре проекта.

Вместо попарного соединения, Stem реализует систему каналов.

 

Работает это очень просто. Вы можете:

1) послать сообщение в канал X

2) подписаться на сообщения из канала X

 

Количество подписчиков не ограничено. Количество клиентов которые могут посылать сообщения в канал тоже не ограничено.

ID канала (по которому происходит подписка и отправка сообщений) служит заодно и паролем к нему.

 

Поэтому если вы хотите создать публично доступный канал - просто опубликуйте его ID.

А если хотите создать свой, приватный, канал - просто возьмите ID подлиннее и никому его не открывайте.

 

ID - это последовательность любых байт длиной до 256. Число комбинаций (256 в степени 256) это огромное число, так что уникальных ключей хватит надолго.

 

Пример

local event = require('event')

-- подключаем STEM
local stem = require('stem')

-- присоединяемся к серверу STEM
local server = stem.connect('stem.fomalhaut.me')

-- просим сервер присылать нам сообщения с канала 'my-channel-id'
server:subscribe('my-channel-id')

-- слушаем эвент 'stem_message' в цикле
while true do
  local name, channel_id, message = event.pull('stem_message')
  if name ~= nil then
    print(channel_id, message)
  end
end

-- ...или регистрируем листенер
event.listen('stem_message', function(_, channel_id, message)
  print(channel_id, message)
end)

-- мы можем посылать сообщение в канал
-- (причем не обязательно быть подписанным на этот канал
--  достаточно просто его ID)
server:send('my-channel-id', 'hello there')

-- просим сервер перестать присылать сообщение с канала
server:unsubscribe('my-channel-id')

-- полностью отключаемся от сервера STEM
server:disconnect()

 

Одновременно можно работать с несколькими серверами Stem и с любым количеством каналов.

 

Библиотека stem.lua

Библиотечку можно скачать напрямую по этой ссылке: https://gitlab.com/UnicornFreedom/stem/raw/master/stem.lua

 

Либо установить через HPM:

hpm install stem

 

Подробная документация по командам библиотеки находится здесь.

 

Сервер STEM

Дефолтный сервер STEM запущен у меня на VPS по адресу: https://stem.fomalhaut.me/

Можете смело его использовать. Единственное, что это тестовый сервер пока. Может пропадать или менять протокол.

Новости постараюсь писать сюда.

 

Исходный код проекта находится тут: https://gitlab.com/UnicornFreedom/stem

Вы можете скомпилировать его под свою систему и запустить где угодно.

 

Настраивается сервер файлом stem.toml в корневой папке.

Дефолтный конфиг может выглядеть так:

[tcp]
host = '127.0.0.1'
port = 5733

[web]
host = '127.0.0.1'
port = 5780

[general]
ping_interval = 60

Чтобы получить полностью свой отдельный и независимый сервер STEM, достаточно будет просто запустить бинарник, получившийся после компиляции.

Не забудьте также положить в папку с бинарником папки static и templates. Они нужны для веб-интерфейса.

 

Сервер мультипоточный, и очень производительный. Должен тянуть довольно большие объемы трафика. Но точных бенчмарков я не проводил. Если есть желающие - пишите в IRC, скооперируемся и померяем. 😃

 

Для того чтобы видеть логи сервера, используйте переменную окружения RUST_LOG. Например чтобы включить полное отображение всех логов:

$ RUST_LOG=stem ./stem

 

Веб-интерфейс

Если перейти по ссылке на сервер STEM то вы увидите... веб-интерфейс.

Веб интерфейс показывает счетчик активных каналов и сессий (клиентских подключений).

Кроме того, он дает возможность подключиться к любому каналу STEM и поучаствовать в приеме-передаче сообщений прямо через сайт. Единственное ограничение - как ID канала, так и контент сообщений ограничивается тем, что можно закодировать в UTF-8.

 

Ну вот и все

Мост в принципе уже полностью работоспособен.

 

Все идеи, пожелания, отчеты о багах пишите сюда, либо на issue трекер в репозитории.

 

Если кто-нибудь хочет помочь с написанием клиента STEM на своём любимом языке программирования - обращайтесь ко мне в ЛС, IRC или пишите в этой теме. Написать клиент несложно - для примера можно глянуть на код библиотеки для OpenComputers. Она состоит всего из 150 строк кода.

 

Enjoy! 😃

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Круто :) Только вопрос т.е. теоретически можно просто перебрать все каналы (с учетом вариантов - теоретически) и читать чужой канал? Учитывая, что (из практики на предыдущих серверах) каналы и вообще имена обычно это или цифры или ник, то количество вариантов можно сократить. Может как вариант сделать что-то вроде публичных и приватных каналов?  Публичные чисто без пароля (можно даже по какому-то из методов получать список публичных), а приватные - помимо ID надо знать еще и пароль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
41 минуту назад, cyber01 сказал:

 теоретически можно просто перебрать все каналы (с учетом вариантов - теоретически) и читать чужой канал?

 

256 байт - это 256 раз по 256 значений.

Это   3.2317006071311007300714876688669951960444102669715484... × 10^616.

 

Я думаю будет достаточно нелегко перебрать их все. Учитывая, подписаться можно на любой совершенно ID (сервер не скажет тебе сколько на этом канале клиентов),

и сообщения могут идти не постоянно, а, скажем раз в две минуты, надо будет не только подписаться на канал, но и подождать немного.

 

Если тратить на каждый канал по две минуты, это будет 1.2467980737388505903053578969394271589677508746032208... × 10^611лет на полный перебор.

"

Чтобы придать всему проекту более традиционный вид, можно разбить ID на два поля - 56 байт логин и 200 байт пароль.

Но согласись что это будет по сути то же самое. Каждый канал будет определяться уникальной комбинацией "логин + пароль", то есть теми же 256 байтами.

Я решил не усложнять.

 

Для публичного канала можно взять например ID "Evil-Reactor".

Для приватного канала - ID "you will never guess this ID".

 

И будет работать вполне хорошо.

А еще надо учитывать, что ID не имеет ограничения по допустимым символам. Можно взять любые значения байтов, от 0 до 255.

Например так:

local id = string.char(1, 0, 0, 0, 0, 0, 200, 200, 200, 13, 14, 64, 89)

ID из 13 байт. Причем часть вообще "непечатные".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если так, то да, отлично :) Надо будет затестить как-то :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

хм... Я как раз на другом сервере пытаюсь сделать типо как "OpenNET", думаю этот мост поможет, ну или воспользуюсь мостом рида.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
52 минуты назад, Fronun сказал:

хм... Я как раз на другом сервере пытаюсь сделать типо как "OpenNET", думаю этот мост поможет, ну или воспользуюсь мостом рида.

 

Отлично.

Только в ближайшие два дня он может быть не доступен - технические работы на сервере. Не пугайтесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Totoro сказал:

Не пугайтесь.

Им никто не будет пользоваться.

😂

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, BrightYC сказал:

Если будет клиент - цены не будет.

Что за клиент?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нужны сервисные коды, как у рида.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
32 минуты назад, NEO сказал:

Что за клиент?

 

21.11.2018 в 04:02, Totoro сказал:

 

  • Клиент для Java / Rust (чтобы можно было подключаться к компу с телефонов на Android и с десктопов / серверов).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все, подняли. Должно работать.

Клиент на Java я на днях набросаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кстать, а как привязать к прогге <html>?

Изменено пользователем Fronun
один один один!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
25 минут назад, Fronun сказал:

кстать, а как привязать к прогге <html>?

 

Что именно ты имеешь в виду?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Он хочет сделать внутриигровой интернет и браузер в ОК, но чтоб через мост было. Не спрашивайте почему так. ))

Фроня, не вводи людей в заблуждение, это для передачи сообщений сделано, тем более многоканально. А у тебя совсем другое и пробегись по темам форума с браузерами в ОК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну да, браузер и интранет это немного другое.

 

Для того чтобы сделать внутриигровой интернет - надо наладить какую-то сетевую структуру на модемах.

Основная цель такого интернета - это возможность передать данные с любого компьютера в сети на любой другой.

Или хотябы между избранными "серверами" и их клиентами.

Тут можно почитать про небезызвестный OpenNet и глянуть на децентрализованный лайтовый вариант - Zn.

 

Браузер уже надо писать когда готова основная сеть.

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

который будет описывать интернет странички. Как HTML.

Полная поддержка HTML в OpenComputers смысла не имеет, да и будет очень сложна в реализации.

Имеет смысл свой, упрощенный формат, на подобии BB кодов.

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

Она умеет отрисовывать простейшее форматирование текста + гиперссылки. Почти то что нужно.

 

Кроме того, для OpenNet (или CraftNet) был и более полноценный браузер. Мне его вроде показывал @Zer0Galaxy

Не знаю, сохранились ли исходные коды.

 

P.S. В принципе, для создания сети можно использовать и Stem.

Например, организовывать сервера в сети в виде stem-каналов. Но в отличии от, например, OpenNet, который

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

интернет-карту.

Если это не проблема - то я только за. 😃

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
06.12.2018 в 13:42, MineCR сказал:

Он хочет сделать внутриигровой интернет и браузер в ОК, но чтоб через мост было. Не спрашивайте почему так. ))

Фроня, не вводи людей в заблуждение, это для передачи сообщений сделано, тем более многоканально. А у тебя совсем другое и пробегись по темам форума с браузерами в ОК.

Майн, как ты меня нашел?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
06.12.2018 в 14:45, Totoro сказал:

Ну да, браузер и интранет это немного другое.

 

Для того чтобы сделать внутриигровой интернет - надо наладить какую-то сетевую структуру на модемах.

Основная цель такого интернета - это возможность передать данные с любого компьютера в сети на любой другой.

Или хотябы между избранными "серверами" и их клиентами.

Тут можно почитать про небезызвестный OpenNet и глянуть на децентрализованный лайтовый вариант - Zn.

 

Браузер уже надо писать когда готова основная сеть.

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

который будет описывать интернет странички. Как HTML.

Полная поддержка HTML в OpenComputers смысла не имеет, да и будет очень сложна в реализации.

Имеет смысл свой, упрощенный формат, на подобии BB кодов.

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

Она умеет отрисовывать простейшее форматирование текста + гиперссылки. Почти то что нужно.

 

Кроме того, для OpenNet (или CraftNet) был и более полноценный браузер. Мне его вроде показывал @Zer0Galaxy

Не знаю, сохранились ли исходные коды.

 

P.S. В принципе, для создания сети можно использовать и Stem.

Например, организовывать сервера в сети в виде stem-каналов. Но в отличии от, например, OpenNet, который

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

интернет-карту.

Если это не проблема - то я только за. 😃

ну вообще, мы хотели с другом (не с MineCR), сделать так компьютер(клиент) <-> роутер (микроконтроллер, может я делаю ошибки и может нельзя так делать, но можно сделать прошивку на EEPROM, правда ограничение 4096 кб(( ), <-> dns-сервер <-> веб-хост, я так хотел сделать, чтобы соединялись через мост. (Роутер и сервер я имею виду что через мост)

Изменено пользователем Fronun

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, Fronun сказал:

ну вообще, мы хотели с другом (не с MineCR), сделать так компьютер(клиент) <-> роутер (микроконтроллер, может я делаю ошибки и может нельзя так делать, но можно сделать прошивку на EEPROM, правда ограничение 4096 кб(( ), <-> dns-сервер <-> веб-хост, я так хотел сделать, чтобы соединялись через мост. (Роутер и сервер я имею виду что через мост)

 

С технической точки зрения - в этой схеме много лишнего. Достаточно было бы интернет платы в компе пользователя и в компе сервера. Роутер можно выкинуть.

Но с точки зрения фана - почему нет. Делай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Totoro сказал:

Роутер можно выкинуть

Но... Я хачу по фану сделять(((

Изменено пользователем Fronun

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...