Перейти к публикации
Форум - ComputerCraft
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

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

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

 

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

 

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

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

Веб интерфейс еще не доделан, и пока просто показывает счетчик активных каналов и сессий в стиле Web 1.0.

Доделать его и дополнить фишками - задача на будущее.

 

Ну вот и все

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

 

Что я хочу добавить в будущем:

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

 

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

 

Enjoy! 😃

  • Like 8

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


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

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

  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
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 байт. Причем часть вообще "непечатные".

  • Like 2
  • Thanks 1

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


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

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

  • Like 1

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


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

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

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


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

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

 

Отлично.

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

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


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

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

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

😂

  • Sad 1

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, 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, который

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

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

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

  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
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

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


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

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

 

Я уже давно понял одну простую истину. Главное - вообще сделать.

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


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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×