Totoro 3 563 Опубликовано: 21 ноября, 2018 Помните мост Рида? Ну так вот. Я тут изучаю Rust на досуге, и пишу мини проекты. Так и получился у меня... 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! 😃 13 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
cyber01 1 704 Опубликовано: 21 ноября, 2018 Круто Только вопрос т.е. теоретически можно просто перебрать все каналы (с учетом вариантов - теоретически) и читать чужой канал? Учитывая, что (из практики на предыдущих серверах) каналы и вообще имена обычно это или цифры или ник, то количество вариантов можно сократить. Может как вариант сделать что-то вроде публичных и приватных каналов? Публичные чисто без пароля (можно даже по какому-то из методов получать список публичных), а приватные - помимо ID надо знать еще и пароль. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 21 ноября, 2018 41 минуту назад, cyber01 сказал: теоретически можно просто перебрать все каналы (с учетом вариантов - теоретически) и читать чужой канал? 256 байт - это 256 раз по 256 значений. Это . Я думаю будет достаточно нелегко перебрать их все. Учитывая, подписаться можно на любой совершенно ID (сервер не скажет тебе сколько на этом канале клиентов), и сообщения могут идти не постоянно, а, скажем раз в две минуты, надо будет не только подписаться на канал, но и подождать немного. Если тратить на каждый канал по две минуты, это будет лет на полный перебор. " Чтобы придать всему проекту более традиционный вид, можно разбить 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 байт. Причем часть вообще "непечатные". 3 1 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
cyber01 1 704 Опубликовано: 21 ноября, 2018 Если так, то да, отлично Надо будет затестить как-то 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fronun 2 Опубликовано: 4 декабря, 2018 хм... Я как раз на другом сервере пытаюсь сделать типо как "OpenNET", думаю этот мост поможет, ну или воспользуюсь мостом рида. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 4 декабря, 2018 52 минуты назад, Fronun сказал: хм... Я как раз на другом сервере пытаюсь сделать типо как "OpenNET", думаю этот мост поможет, ну или воспользуюсь мостом рида. Отлично. Только в ближайшие два дня он может быть не доступен - технические работы на сервере. Не пугайтесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 4 декабря, 2018 3 часа назад, Totoro сказал: Не пугайтесь. Им никто не будет пользоваться. 😂 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Chebuya 415 Опубликовано: 4 декабря, 2018 Если будет клиент - цены не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 4 декабря, 2018 Только что, BrightYC сказал: Если будет клиент - цены не будет. Что за клиент? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 4 декабря, 2018 Нужны сервисные коды, как у рида. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Chebuya 415 Опубликовано: 4 декабря, 2018 32 минуты назад, NEO сказал: Что за клиент? 21.11.2018 в 04:02, Totoro сказал: Клиент для Java / Rust (чтобы можно было подключаться к компу с телефонов на Android и с десктопов / серверов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 4 декабря, 2018 Все, подняли. Должно работать. Клиент на Java я на днях набросаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fronun 2 Опубликовано: 5 декабря, 2018 (изменено) кстать, а как привязать к прогге <html>? Изменено 5 декабря, 2018 пользователем Fronun один один один!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 5 декабря, 2018 25 минут назад, Fronun сказал: кстать, а как привязать к прогге <html>? Что именно ты имеешь в виду? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
MineCR 7 Опубликовано: 6 декабря, 2018 Он хочет сделать внутриигровой интернет и браузер в ОК, но чтоб через мост было. Не спрашивайте почему так. )) Фроня, не вводи людей в заблуждение, это для передачи сообщений сделано, тем более многоканально. А у тебя совсем другое и пробегись по темам форума с браузерами в ОК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 6 декабря, 2018 Ну да, браузер и интранет это немного другое. Для того чтобы сделать внутриигровой интернет - надо наладить какую-то сетевую структуру на модемах. Основная цель такого интернета - это возможность передать данные с любого компьютера в сети на любой другой. Или хотябы между избранными "серверами" и их клиентами. Тут можно почитать про небезызвестный OpenNet и глянуть на децентрализованный лайтовый вариант - Zn. Браузер уже надо писать когда готова основная сеть. Когда компьютеры научатся передавать друг другу информацию, можно придумать специальный формат данных, который будет описывать интернет странички. Как HTML. Полная поддержка HTML в OpenComputers смысла не имеет, да и будет очень сложна в реализации. Имеет смысл свой, упрощенный формат, на подобии BB кодов. Пример можно посмотреть тут. Это информационная доска, которую мы делали для какого-то из серверов. Она умеет отрисовывать простейшее форматирование текста + гиперссылки. Почти то что нужно. Кроме того, для OpenNet (или CraftNet) был и более полноценный браузер. Мне его вроде показывал @Zer0Galaxy Не знаю, сохранились ли исходные коды. P.S. В принципе, для создания сети можно использовать и Stem. Например, организовывать сервера в сети в виде stem-каналов. Но в отличии от, например, OpenNet, который работал чисто на сетевых картах / модемах, каждый компьютер в такой сети должен будет обязательно иметь интернет-карту. Если это не проблема - то я только за. 😃 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fronun 2 Опубликовано: 9 декабря, 2018 06.12.2018 в 13:42, MineCR сказал: Он хочет сделать внутриигровой интернет и браузер в ОК, но чтоб через мост было. Не спрашивайте почему так. )) Фроня, не вводи людей в заблуждение, это для передачи сообщений сделано, тем более многоканально. А у тебя совсем другое и пробегись по темам форума с браузерами в ОК. Майн, как ты меня нашел? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fronun 2 Опубликовано: 9 декабря, 2018 (изменено) 06.12.2018 в 14:45, Totoro сказал: Ну да, браузер и интранет это немного другое. Для того чтобы сделать внутриигровой интернет - надо наладить какую-то сетевую структуру на модемах. Основная цель такого интернета - это возможность передать данные с любого компьютера в сети на любой другой. Или хотябы между избранными "серверами" и их клиентами. Тут можно почитать про небезызвестный OpenNet и глянуть на децентрализованный лайтовый вариант - Zn. Браузер уже надо писать когда готова основная сеть. Когда компьютеры научатся передавать друг другу информацию, можно придумать специальный формат данных, который будет описывать интернет странички. Как HTML. Полная поддержка HTML в OpenComputers смысла не имеет, да и будет очень сложна в реализации. Имеет смысл свой, упрощенный формат, на подобии BB кодов. Пример можно посмотреть тут. Это информационная доска, которую мы делали для какого-то из серверов. Она умеет отрисовывать простейшее форматирование текста + гиперссылки. Почти то что нужно. Кроме того, для OpenNet (или CraftNet) был и более полноценный браузер. Мне его вроде показывал @Zer0Galaxy Не знаю, сохранились ли исходные коды. P.S. В принципе, для создания сети можно использовать и Stem. Например, организовывать сервера в сети в виде stem-каналов. Но в отличии от, например, OpenNet, который работал чисто на сетевых картах / модемах, каждый компьютер в такой сети должен будет обязательно иметь интернет-карту. Если это не проблема - то я только за. 😃 ну вообще, мы хотели с другом (не с MineCR), сделать так компьютер(клиент) <-> роутер (микроконтроллер, может я делаю ошибки и может нельзя так делать, но можно сделать прошивку на EEPROM, правда ограничение 4096 кб(( ), <-> dns-сервер <-> веб-хост, я так хотел сделать, чтобы соединялись через мост. (Роутер и сервер я имею виду что через мост) Изменено 9 декабря, 2018 пользователем Fronun Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 563 Опубликовано: 10 декабря, 2018 16 часов назад, Fronun сказал: ну вообще, мы хотели с другом (не с MineCR), сделать так компьютер(клиент) <-> роутер (микроконтроллер, может я делаю ошибки и может нельзя так делать, но можно сделать прошивку на EEPROM, правда ограничение 4096 кб(( ), <-> dns-сервер <-> веб-хост, я так хотел сделать, чтобы соединялись через мост. (Роутер и сервер я имею виду что через мост) С технической точки зрения - в этой схеме много лишнего. Достаточно было бы интернет платы в компе пользователя и в компе сервера. Роутер можно выкинуть. Но с точки зрения фана - почему нет. Делай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fronun 2 Опубликовано: 10 декабря, 2018 (изменено) 3 часа назад, Totoro сказал: Роутер можно выкинуть Но... Я хачу по фану сделять((( Изменено 10 декабря, 2018 пользователем Fronun Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах