Интернет снова доказал, что из скучного железа можно сделать мем.
Один энтузиаст выложил проект, который использует встроенный акселерометр Mac: при ударе или резком касании ноутбук воспроизводит звук. Причём сила звука зависит от интенсивности удара — чем сильнее толчок, тем эмоциональнее реакция.
Да, по сути Mac начинает «стонать» при контакте.
Как это вообще работает
Внутри ноутбуков есть датчики движения — они нужны для защиты жёсткого диска или отслеживания положения устройства.
Разработчик просто подключился к этим данным и связал силу удара с воспроизведением аудиофайла.
Технически это простой, но эффектный трюк — немного кода, немного звука, и обычный ноутбук превращается в интернет-аттракцион.
Это бессмысленно? Немного. Весело? Да.
С практической точки зрения пользы ноль. С точки зрения мем-культуры — сто из ста.
Такие проекты напоминают, что технологии — это не только про серьёзные задачи, но и про абсурдное творчество.
Ребят, если хотите краткие и необычные новости про технологии и интернет, публикую такие посты у себя в Telegram Там всё коротко и по делу.
Всем снова привет :) Думаю многие пикабушники знают, что одно из моих хобби - реверс инжиниринг ретро телефонов, их хакинг и попытки впихнуть невпихуемое. Полгода назад в рамках серии статей я с нуля взломал неизвестный кнопочный телефон, отреверсил прошивку и написал для него бинлоадер (загрузчик нативных программ) и первую программу для него - игру змейку!
Две недели хакинга... это было действительно круто!
Однако телефоны на спредтруме это круто, но современные кнопочники на этом процессоре, к сожалению, используют компрессию LZMA и что-то пропатчить в них иногда проблематично. Плюс у них крайне мало памяти для написания каких-то сложных патчей. Поэтому я время от времени качаю прошивки для телефонов из своей школьной юности и ковыряю их в IDA Pro, чтобы не только иметь доказательную базу для своих статей, но и просто попытаться на них что-то запилить. Одним из таких стал легендарный Samsung SGH-C100.
Модель 2003 года базировалась на чипсете Skyworks, который условно можно назвать братиком Neptune LTE в Motorola C350 и E398 (используется идентичное ядро ARM7TDMI, только работающее на более низкой частоте). C100 стал настоящей легендой благодаря поддержке загрузки контента (хотя настоящей ФС в нём особо и не было), Java-приложений, а также очень крутому UFB-дисплею с разрешением 128x128 и конечно синтезатору Yamaha, который давал ту самую полифонию.
В процессе изучения телефона я наткнулся на то, что Samsung почему-то выкладывала прошивки вместе с map-файлами линкера. Для тех кто не в курсе, процесс компиляции прошивки упрощенно происходит в два этапа:
Компиляция отдельных модулей в объектные файлы - т.е файлы с расширением .o. Объектные файлы содержат в себе как код с данными, так и информацию о символах (функциях и переменных) в них, а также зависимостях от других модулей.
Линковка набора объектных файлов в единую прошивку. Здесь специальная программа - линкер, анализирует все входные объектные файлы и собирает из них готовую программу, исправляя ссылки на зависимости на конкретные адреса в исполняемом файле.
Так вот, с помощью специальной опции можно попросить линкер выдавать текстовый .map файл для дальнейшего анализа секций, таблицы символов и помощи при отладке кода. Как вы уже поняли, в этом файле хранятся текстовые имена всех функций и глобальных переменных в прошивке, а также карта памяти процессора:
Это настоящая находка для реверсера, поскольку по именам и коду большинства функций можно легко понять их предназначение, список аргументов (тут же все таки Plain-C) и просто понять принцип работы MMI (оболочки) в прошивке. Я написал парсер, который импортировал map-файл в базу IDA Pro и теперь у нас есть полностью отреверсенная прошивка для C100, которую можно патчить и моддить вдоль и поперек :)
На скриншоте код той самой игры из первого видео в статье
Так что делюсь базой и с вами. Базу свободно можно использовать как референс при реверсе других телефонов на Skyworks'ах с помощью поиска по паттернам, а также для реверса более поздних Swift'овских телефонов, но с ними надо поковыряться подольше. Знаю что меня читают инженеры, так что может кто-то тоже вдохновится и пойдет моддить свой C100? :)
Поковырял бы сам и запили статью, но я чет купил пару кабелей для C100 и все оказались нерабочими :(
Для ЛЛ: простейший способ отправить в чат телеги мессадж. На полноту и новизну не претендует, просто запишу для памяти. Потом же потребуется повторить, а будет уже не вспомнить. Я убил на это почти 6 часов. И еще 3 часа чтобы всё вспомнить и создать сию портянку....
В общем и целом, раз уж мне в руки попался открытый код управляющего приложения, то отчего бы в нём как следует не порыться.
Питон, ссука, это конечно, нечто... Без поллитра и гугля тут хрен чего куда. В результате я за пару дней: 1. добавил новый параметр MOUSE TRAVEL COUNT. Таки считаю пробег мышки в сантиметрах. Очень условно. Считаю проехавшие пиксели. Далее с учетом разрешения монитора 96 dpi (так написано в винде) перевожу их в сантиметры и так далее. Так как мониторов 3 и размеры у всех разные... В общем, очень эмпирический параметр. Но я это сделал и даже добавил в редактор тем дополнительную вкладку.
2. ПИНГИ... В конфигах нашлось такое: # Address used for ping sensor. Can be internal/external IP (e.g. 8.8.8.8 or 192.168.0.1) or hostname (google.com) # PING: 8.8.8.8
Я прописал PING: 81.211.0.63. Какой-то там DPI узел... tracert и смотрим как через что мы там лезем на ту же пикабу. 16 узлов. Аллес. Ладно. Показывает 0.3 - 0.02.
Захотелось линейную диаграмму. Включаю в теме, но там только целые числа. То есть MAX VALUE не может быть меньше 1. 2% от 100 - это всегда пустая диаграмма. 30% уже заметнее, но всё равно херня. Надо увеличить "чувствительность". Кстати, поставил 0.5, но надо еще уменьшить.
Ну хер с ним, нас на кривой кобыле не объедешь. Лезу в редактор, открываю файл конфига и прописываю туда 0.5. Сохраняю, запускаю и хер там ночевал. Шкала пустая и не реагирует. Лезу в код глубже, нахожу отрисовку прогресс-бара и вижу, что значение там сугубо целое (int блять) Меняю на float, модифицирую остальной код и наконец-то он умеет отображать дробные значения.
Кстати, свежая мысль - надо еще цвет изменять с зеленого на красный. //TODO
3. У нас имеется раздел DOWNLOADED.
И он мне зачем-то показывал какие-то неисчислимые террабайты. Оказалось, что цифра тупо берется с сетевого адаптера и показывает кол-во скачанного вареза с момента последнего включения компа. Нужный параметр. Познавательный. Нах он нужен? Хер с ним. Нашел где это. Запоминаю значение при старте приложения и потом уже при отрисовке вычитаю из текущего значения.
Гораздо информативнее. До кучи сделал еще и счётчик залитого вовне. Работает. Красота.
Ну и в целом как бы и всё. Вуаля сильвупле. Классно. Работает, рисует, чего же более? Но тут вмешался человеческий фактор! Вот дисплей трудится, греется, потеет, рисует всю эту шнягу а потом я в час ночи кидаюсь тапком в кнопку СПАТЬБЛЯТЬ и ухожу. А что там за статы сегодня были - неизвестно. Все кануло.
Комп засыпает, приложение выгружается, все данные затираются. Как-то пошло. Возникла мысль писать всё это в лог на диске. Можно. А зачем? Кто и когда его потом будет читать?... И тут меня ОСЕНИЛО! А буду-ка я при выключении постить эти охуенно нужные цифирки в свой ТГ канал! Ха! И тут блять случилось минус шесть часов моей жизни. Сел в 21 час, кое-как заработало часам к 5.
Далее, простите, будет очень много мата. Ибо даже по свежей памяти я всё это воспроизвёл еще раз с трудом.
░░░░ Итак: простейший способ, отправить из приложения мессадж в телегу
Как оказалось, всё реально пиздецки просто. Всё что нам надо:
п.1. Зарегать бота и получить его токен п.2. Узнать ёбаный id бота (!!!!) п.3. Узнать chat_id группы, которую ты хочешь неибацца ощастливить, п.4. Выкурить thread_id - идентификатор топика, если в группе есть эти неприпизженные разделы п.5. Написать в приложении простейший код из пары строчек. п.6. Охуеть, добавить бота в группу непременно с правами блять АДМИНИСТРАТОРА, выключив нахер всё что там можно. Оставив лишь возможность постов. п.7. Выпить валерьянки и пойти спать нах.
Собственно это и всё! Это реально работает! Без СМС и регистраций! Тьфу блэт.
Теперь ссука ДЕТАЛИ в которых не то что дьявол блять кроется а просто весь пиздец. Никто никогда нигде не умеет писать внятную блять документацию! Никто нихуя! Всё надо выискивать и выгугливать. При слове "нам надо подключиться к API" меня уже реально трясет, колотит и хочется грызть мебель. Это пиздец.
Итаак... па пунктам, тк скть.........
п.1. Добавляем в телегу @botfather. Через сраный тг-поиск. Прилагаю картинок, так как ВНЕЗАПНО ссука с одним и тем же именем ботов может быть, вы ахуеете щас, НЕСКОЛЬКО.
В общем вот этот
Из всех дальнейших пиздоплясок нам по сути надо только это:
Детальнее - внятно на русском написано ТУТ. Хотя в целом - можно скипнуть. Прописать описания и аватарку прилепить можно интуитивно. Там еще что-то про команды, но ну его нахер. Туда я не полез и не планирую. Заняться мне нечем больше.
Итак, мы получили TG_BOT_TOKEN
п.2. Узнать ёбаный id бота... С какого хуя нам его не дают сразу - я не знаю. Добавляем к себе в повозку @Getmyid_bot
Практически сразу вы получаете этот сраный айдищшник. Везде вводим линк бота, который начинается с @
Таким вот незамысловатым способом из говна и байтов мы получили botId
п.3. Узнать chat_id группы. Ндааа.... Ну, к этому моменту вы уже практические перестали плеваться и материть Дурова и иже с ними. Так что добавляем в телегу ОЧЕРЕДНОГО ботаблять: @username_to_id_bot
Я тут нихуя не блоггер и не популярный телеведущий, поэтому млять я постоянно путаюсь в этих группах, чатах и блять каналах. Я тащу на себе ебень с кучей топиков, и вроде это канал. Или группа. Но не чат. Блять.
Короче мы получили наконец-то ссука chat_id
И всё? А вот хуй и нет!!! Я блять не знаю КАК я до этого ссука допёр, но видимо мою голову всё-таки иногда посещают умные мысли. Пусть это визиты вежливости, но тем не менее. Просто так пихать этот ид в запрос можно до посинения. Такого чата не найдется. ПАТАМУУУУШТА.... Перед всей этой цифирью надо добавить -100 !!!! Вот ссука "ну надо"... Я не ебу почему и зачем, но явно этого нигде не написано. #Тактутпринято
То есть, если у вас получен chat_id: 666666 то обращаться к нему надо как к "-100666666" !!!!
Не, ну все же ясно как "е" в степени "пи". Только полный утупок не прорюхает.
Ща вы, конечно же скажете "УФФ, заебца, афтар пеши исчо" и собираетесь открыть кодильник, дабы ну понятно. А вот еще раз ХУЙ мимо. Всё это прокатывает, если блэт у вас ПУБЛИЧНАЯ группа. Если она приватная, то, внезапно @myBestChannelFuckenLink у неё не будет! И бот ... идёт лесом.
Длииииааа этаво... Запускаем браузерную телегу! Кстати, это самый простой способ, действительно. Можете погуглить "как получить chatId приватной группы". Я охуел где-то секунд за 20.
Знакомо: удалил соцсети, чтобы «наконец жить», а через неделю обнаружил себя в историях реддита или в яме какого-то нишевого форума. Поздравляю, вы не очистили сознание. Вы сменили шило на мыло. Потому что старая школа детокса мертва.
К сути:
Проблема не в конкретном приложении. Проблема в режиме «бесцельного скроллинга». Мозг привык к дофаминовым микродозам, и он найдет их, даже если вы удалите всё. В тренде теперь не детокс, а «цифровая гигиена» — осознанное конструирование своих отношений с технологиями. Чтобы они служили вам, а не вы им.
Вот каркас, по которому я перестроил свой цифровой день:
1. Аудит с пристрастием. Не «сколько времени», а «зачем».
Включил детальную статистику экранного времени. Не просто «Инстаграм — 2 часа». Смотрю: «15 минут — посмотреть, как поживают друзья; 1 час 45 минут — бесцельное листание ленты, потому не мог начать работу». Это и есть корень зла — бесцельность.
2. Жесткая сегрегация. «Рабочий» телефон vs. «Личный» смартфон.
Если нет двух устройств — создаю два полностью отдельных профиля/рабочих стола.
Профиль «Фокус»: Только мессенджеры, карты, камера, Spotify (без клипов!) и служебные приложения. Ни одного агрегатора лент. Никаких уведомлений, кроме звонков от близких.
Профиль «Пожиратель времени»: Все соцсети, ютуб, игры. На главный экран не выношу. Доступ — по паролю, который намеренно сложный.
3. Технологии в наступление. Использую против них же их же оружие.
Настройка алгоритмов — это навык. Я жестко курю лайки и подписки. Алгоритм YouTube? Только образовательные каналы и обзоры гаджетов. Pinterest? Только дизайн интерьеров и рецепты. Я не потребляю, что дают. Я дрессирую ленту под свои интересы.
Автоматизация рутины. Все, что можно, — на триггеры. Утром телефон сам включает погоду и список задач. Вечером — режим «Не беспокоить» и подкаст для сна.
4. Ритуал замещения.
Самое главное. Бесцельный скроллинг возникает на стыках дел: сел в метро, встал в очередь, ждешь звонка. Заранее готовлю «здоровую замену» на эти 5-15 минут:
Аудиокнига на телефоне (всегда запущена в фоне).
Статья в Pocket, сохраненная заранее.
Или просто блокнот, чтобы записать мысль.
Вывод:
Цифровой детокс - это не про изгнание. Это про контроль и архитектуру. Вы не убегаете от технологий в лес. Вы становитесь главным архитектором своего цифрового пространства. Вы не удаляете дверь в мир, а ставите на нее хороший замок и впускаете только гостей с пользой. Да, не просто, тут уж либо дисциплина, либо постоянные завтраки)))
Будучи творческим человеком и техногиком, я обожаю при первой возможности апгрейдить своё оборудование. Время от времени я мониторю маркетплейсы в поисках чего-то новенького и в этот раз я наткнулся на настоящий мультитул для Embedded-разработчика — контроллер I2C/SPI/UART/JTAG в одной коробочке и всё это всего за 1.000 рублей... Конечно я не смог пройти мимо этой штучки и в рамках сегодняшней статьи хочу рассказать что оно из себя представляет и как с ним работать. Жду вас под катом!
❯ Что за устройство?
На самом деле такой формат статей для меня «в новинку», до этого я ни разу не делал обзоров на оборудование. Да и мой инструментарий слишком зауряден, чтобы делать ещё одну статью уровня «почему Quciko T12 лучше любой 900M станции» или «почему Вам не стоит покупать компрессорный люкей в 2025 году». Однако обзоров на сегодняшний гаджет я не нашёл, несмотря на его огромную пользу как для Embedded-разработчиков и инженеров, так и мастеров по ремонту смартфонов, планшетов и ноутбуков.
Во время подготовки статьи о том, как я написал BIOS для игровой консоли от Waveshare, в рекомендациях мне попадались другие товары от этого производителя — в том числе и сегодняшний гаджет. Меня сразу привлекла возможность переключения 3v3->5v логики и обширный набор поддерживаемых шин. В официальной вики были описаны следующие характеристики:
Шины: 1x SPI с двумя чип-селектами (можно подключить до двух устройств на одну шину), 1x I2C, 1x JTAG (полноценный, с ресетом!) и 2x UART с дополнительными линиями CTS/RTS для совместимости с классическими COM-портами.
Используемый контроллер: WCH CH347. Некоторым читателям чип может показаться знакомым по аналогии с классическим CH341A.
Питание: 5В, 3.3В, потребление ~65мА на VBus. Есть самовосстанавливающийся предохранитель на «входе».
Waveshare — достаточно известный бренд, под которым реализуются одноплатные компьютеры, «бутербродная» периферия для них и инструменты.
Я сразу смекнул, что смогу использовать гаджет как для восстановления программно-убитых устройств по типу КПК, так и для отладки своих собственных самоделок, благо набор шин к этому располагает. Устройство приехало ко мне примерно через месяц, в небольшом пакетике и брендовой коробочке, в которую входило само устройство, кабель USB Type-B (ну почему не Type-C?), Dupont-провода в IDC-коннекторе для всех шин, а также небольшой мануал. Нареканий к доставке кроме скорости не возникло.
Сам гаджет представляет из себя компактную металлическую коробочку с «ушками» для удобного крепления на столе или стене. Сверху расположена шпаргалка по распиновке и режимам работы CH347, а также светодиодные индикаторы для UART.
Разбирается гаджет очень просто: достаточно лишь открутить несколько винтов с обеих боковых пластин устройства и перед нами открывается вид на плату. Схемотехника здесь простейшая: самовосстанавливающийся предохранитель, линейный регулятор AMS1117, который питает контроллер и нагрузку на VCC (до ~600мА), сам CH347, а также набор ключей для согласования режимов работы. CH347 — это не просто ASIC, а вполне себе полноценный микроконтроллер, прошивку которого можно обновить, правда SDK для использования CH347 как МК производитель не предоставляет.
После подключения гаджет радостно зажег индикатор PWR, подтвердив свою работоспособность, а значит пришло время протестировать возможные варианты использования!
❯ UART
С UART всё просто и понятно: нам достаточно лишь выбрать желаемый режим работы (M0 — двухканальный UART, остальные режимы — UART + I2C/SPI или UART + JTAG) с помощью тумблера и подключить/припаять Dupont'ы к соответствующим пинам на плате. UART здесь достаточно быстрый: при двухканальном режиме работы, на UART0 можно добиться до 9Мб/с (мегабод), а на UART1 — до 7.5Мб/с.
Провода в разъёмы установлены не бездумно — у них есть цветовая маркировка и логика помимо «красный — VCC, чёрный — GND».
В качестве теста я решил снять лог загрузки со своего проекта самодельной игровой консоли. Для работы с UART я привык использовать Putty: сначала я припаял RX/TX и массу, затем запустил Putty и выбрал COM-порт, соответствующий первому каналу, установил бодрейт в 115200 и включил консоль:
Всё работает! В целом, гаджет можно использовать и для прошивки более сложных устройств: например многие смартфоны и кнопочные телефоны всё ещё имеют альтернативный режим прошивки через UART, а ретро-телефоны Samsung и LG так вообще не имеют альтернатив — если нет специального JIG, то остаётся лишь вызванивать RX/TX с разъёма и подпаиваться напрямую к UART процессора!
❯ SPI/I2C
С SPI и I2C уже всё чуточку интереснее. Дело в том, что как вы уже могли понять — чип использует свой собственный проприетарный протокол для организации моста между программой на ПК и шиной данных. Для работы с этим протоколом производитель предоставляет уже готовую библиотеку для Windows начиная с 2000, так что возможно у чипа есть перспективы для оживления легаси пром. оборудования. Для Linux же есть альтернативные драйвера, которые пробрасывают CH347 как обычные spidev и i2c-dev устройства.
Драйвер можно скачать здесь
Для проверки коммуникации можно использовать специальную тестовую программу из SDK, которая позволяет отправлять произвольные данные и даже прошивать флэшки 25 'ой и EEPROM'ки 24'ой серии.
Давайте же попробуем написать что-нибудь полезное! Например, подключим к гаджету 1.8-дюймовый дисплей и что-нибудь на него выведем.
С разводкой дисплея проблем не возникает: SDO к MOSI, SCK к CLK, VCC к VCC и BL (питание подсветки), однако для управления DBI-дисплеями необходимы ещё две дополнительные линии: D/C (линия, определяющая как интерпретировать байт на входе), а также RESET для аппаратного сброса контроллера. И с этим проблем тоже не возникает: у контроллера есть как минимум четыре свободных GPIO, два из которых мы с вами и будем использовать для управления линиями дисплея — GPIO6 (CTS на UART1) и GPIO7 (RTS на UART).
Далее я начал изучать PDF-ку с документацией сомнительного качества и писать код инициализации. Начинается всё с получения контекста устройства с помощью функции CH347OpenDevice, которая принимает в себя индекс нужного контроллера в системе и возвращает непонятный идентификатор (вероятно WinUSB?). Интересно то, что в остальном API используется не идентификатор, а как раз тот самый индекс, который в большинстве случаев будет 0. Далее мы получаем информацию об устройстве и сверяем режим работы, если он отличается от нужного — выбрасываем исключение:
/* Initialize CH347 */ deviceHandle = CH347OpenDevice(deviceIndex); if (!deviceHandle) thrownew std::runtime_error("Failed to open CH347 device");
Далее настраиваем SPI-контроллер. На выбор есть все три существующих режима, настройки полярности и возможность вручную дергать один из двух доступных ChipSelect'ов, а также тайминги. Частота работы определяется предустановленным набором делителей — 60МГц, 30МГц, 15МГц и т.п. Не забываем настроить таймаут каждой USB-транзакции:
if (!CH347SPI_Init(deviceIndex, &cfg)) thrownew std::runtime_error("Failed to initialize SPI");
И инициализируем дисплей. Здесь есть важный момент: функция CH347GPIO_Set устанавливает состояние всего GPIO-контроллера в чипе и поэтому принимает в себя три битовые маски с конфигурацией каждого пина. Функции GPIO стандартные — вход/выход, плюс обработка прерываний с помощью специального callback'а:
Теперь можно запустить программу и посмотреть на результат. Если вы увидели шум (или мусор) на экране — значит вы всё делаете правильно и контроллер успешно проинициализирован.
На фото можно заметить перемычку между CS и массой, однако не все контроллеры дисплеев толерантны к постоянному низкому уровню на CS. На моей практике контроллеры ILI отказывались проходить инициализацию, если не разграничивать каждую транзакцию с помощью CS.
Теперь можно что-нибудь вывести. Подготавливаем изображение, преобразовав в 16-битный массив пикселей, переводим контроллер в режим записи в VRAM, отправляем изображение:
Потенциальных применений у такого гаджета много: можно сделать красивые анимированные часы, мониторинг датчиков, показ уведомлений или дублировать окно с основного ПК. А ведь когда-то ради такого покупали LPT-провода, дисплеи от Сименсов и вручную превращали параллельную шину в последовательную...
❯ Заключение
Вот такой интересный гаджет выпустила компания Waveshare — и, что радует, по очень приятной цене! Ссылку по понятным причинам прилагать не буду, но при желании вы сможете его найти на всех трёх крупных маркетплейсах. Кроме того, можно купить Breakout-плату с тем же самым чипом за ~500 рублей, но там не будет таких удобных переключателей и Dupont'ов.
К сожалению, теста JTAG в статье не будет. У меня пока нет готовых к работе необычных гаджетов, где можно было бы протестировать OpenOCD... однако мой HTC Dream всё ещё ждёт свою прошивку модема!
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.
Если вам понравилась статья...
И у вас появилось желание что-то мне задонатить (например прикольный гаджет) - пишите мне в телегу или в комментариях :) Без вашей помощи статьи бы не выходили! А ещё у меня есть Boosty.
Что думаете о таком преобразователе?
Что думаете об обзорах на оборудование? Есть смысл рассказывать о всяких ништяках, что я иногда покупаю для работы?
BUSY Bar — это продвинутый фокус-таймер с функцией блокировки отвлекающих приложений и интеграцией в умный дом. В этом посте мы покажем как, используя HTTP API, можно создавать виджеты для BUSY Bar. Это смогут сделать не только разработчики, но и обычные пользователи.
Далее вы узнаете как:
Вывести изображения и текст на экран BUSY Bar.
Взаимодействовать с устройством прямо из браузера.
Создать виджеты без программирования.
Виджеты, которые мы сделаем в этой статье
Прежде чем начать создавать виджеты, давайте познакомимся с HTTP API и с тем, как его использовать.
Один API для всех типов подключения
HTTP API — это протокол для взаимодействия с BUSY Bar, доступный через все 3 поддерживаемые типа подключения:
USB Ethernet — при подключении BUSY Bar к ПК, он определяется как сетевой адаптер с виртуальной сетью.
Wi-Fi сеть— быстрое, беспроводное подключение. BUSY Bar можно разместить где угодно в зоне действия Wi-Fi.
Cloud-сервер— удаленное управление через интернет с шифрованием и авторизацией по ключу, используя API-токен, выпускаемый в личном кабинете BUSY.
Благодаря использованию одинакового HTTP API во всех трех типах подключения, можно переключаться между ними без переписывания кода.
Как работает HTTP API в BUSY Bar
Как следует из названия, HTTP API основан на протоколе HTTP, который используется для передачи данных в интернете, между браузером и web-сервером. Когда вы вводите URL сайта, ваш браузер отправляет HTTP запрос и сервер возвращает web-страницу в ответе.
Взаимодействие web-браузера и web-сервера по протоколу HTTP
Взаимодействие с BUSY Bar устроено похожим образом. BUSY Bar выполняет роль HTTP сервера и ожидает запросы, а ПО на ПК выполняет роль HTTP клиента. Этим ПО может быть любая программа, поддерживающая отправку HTTP-запросов, например, система умного дома, приложение или скрипт.
Скрипт или приложение отправляет запрос и BUSY Bar возвращает данные в формате JSON
Благодаря широкой поддержке HTTP в языках программирования, обращаться к BUSY Bar можно с помощью всего нескольких строк кода. А некоторые простые запросы, такие как запрос общей информации о BUSY Bar, могут быть отправлены прямо из браузера - просто открытием http://10.0.4.20/api/status/system.
Запрос /api/status/system возвращает общую информацию о BUSY Bar
ℹ️ В случае использования USB-подключения IP-адрес BUSY Bar'а всегда будет 10.0.4.20 — он даже указан на задней крышке устройства. При подключении через Wi‑Fi IP-адрес назначается роутером. В следующих примерах мы будем использовать USB-подключение.
IP-адрес BUSY Bar’а указан на задней крышке устройства
Документация HTTP API прямо на устройстве
Все поддерживаемые HTTP-запросы, их параметры и форматы ответов описаны в документации HTTP API, которая хостится прямо на устройстве. При подключении по USB она доступна по адресу: http://10.0.4.20/docs.
Документация HTTP API, открытая с устройства
Открыть документацию HTTP API также можно с главной страницы web-интерфейса BUSY Bar, который доступен по адресу http://10.0.4.20.
Главная страница web-интерфейса BUSY Bar и ссылка на документацию HTTP API на ней
HTTP-запросы можно тестировать прямо на странице с документацией, выполнив следующее:
Выберите запрос, например: /api/display/draw(вывод текста и картинок на экран).
Нажмите Try it out.
Скорректируйте параметры запроса.
Нажмите кнопку Execute, чтобы отправить запрос на BUSY Bar.
После нажатия Execute браузер отправляет HTTP API-запрос в BUSY Bar, который возвращает ответ, указывающий либо на успешное выполнение (OK), либо на ошибку (Bad Request), если с запросом что-то не так. В случае успеха BUSY Bar выводит на экран «HELLO, WORLD!».
[Видео] При успешном выполнении запроса BUSY Bar выводит на экран строку "HELLO, WORLD!"
Как AI может помочь использовать HTTP API
В сети есть тонны гайдов, обсуждений и примеров кода для работы с HTTP. А еще со всеми этими знаниями умеют работать AI-ассистенты. Поэтому даже без навыков программирования вы можете создавать виджеты для BUSY Bar.
ℹ️ Для продвинутых пользователей мы также предлагаем готовые библиотеки для Python и JavaScript, реализующие наш HTTP API.
Для создания виджета с помощью AI-ассистента (ChatGPT, Gemini, Claude и других) нужно:
Объяснить ему, как выводить картинки и текст на экран (1 промпт).
Объяснить, что должен делать виджет (1-2 промпта).
Попросить устранить недостатки (0-10 промптов).
В результате вы получите скрипт, который запускается на ПК и по HTTP API отправляет UI виджета на подключенный по USB девайс.
Скрипт работает на ПК и отрисовывает виджет на экране BUSY Bar через HTTP API
Дальше мы покажем на реальных практических примерах, как можно сделать виджет, не прибегая к программированию. Мы будем использовать ChatGPT. Все сгенерированные AI-скрипты доступны по ссылкам на каждом шаге.
Шаг 0: Учим AI использовать экран BUSY Bar
При создании каждого виджета сначала нужно объяснить AI, как использовать HTTP API, а именно два запроса:
/api/assets/upload — для загрузки картинок в память BUSY Bar.
/api/display/draw — для вывода текста и ранее загруженных картинок.
Промпт к AI (сделан на основе документации HTTP API):
Результат: AI теперь умеет через USB выводить на экран изображения и тексты, а также использовать разные шрифты и цвета текста.
Делаем виджет часов
Для начала, просто для тренировки, сделаем очень простой виджет — часы с датой. Время и дата будут браться с ПК и обновляться на экране BUSY Bar раз в секунду. Время выведем крупным шрифтом — чаще всего увидеть его важнее, чем дату.
Шаг 1: Вывод времени и даты
🤖 Промпт к AI: Выведи на экран текущую дату (мелко) и время (крупно) по центру экрана. Формат даты — день.месяц.год. Время выведи с секундами.
Результат: AI написал скрипт на языке Python. Его нужно сохранить в файл с расширением .py и запустить командой python file.ру (Windows) или python3 file.ру (Linux/macOS).
Мы получили готовый виджет всего за 3 промпта. Единственное замечание — AI выравнивает текст по центру с погрешностью, т.к. символы имеют разную ширину (например, цифр 1 и 5). В следующей версии HTTP API мы добавим выравнивание текста по горизонтали и вертикали, что полностью решит эту проблему.
Делаем погодный виджет
Скрипт, запущенный на ПК, будет получать погоду из открытых источников в интернете и выводить ее на экран BUSY Bar для нескольких городов. Для каждого города скрипт выведет иконку погоды, город и температуру.
Шаг 1: Вывод погоды
🤖 Промпт к AI: Сделай скрипт, выводящий поочередно погоду в 3 городах: Dubai, London, New York с паузой 3 секунды. Погоду бери из открытых источников без необходимости регистрации.
[Видео] Погодный виджет. Шаг 1: Вывод погоды в 3 городах
Видно, что скрипт успешно получает погодные данные, но из-за быстрой прокрутки текста и частого переключения городов прочитать сейчас ничего невозможно. Исправим это.
Шаг 2: Улучшение интерфейса
🤖 Промпт к AI: Слева на экран выведи иконку погоды (16×16), пусть скрипт сам их нарисует. Справа выведи: город (мелко) и температуру (крупно).
[Видео] Погодный виджет. Шаг 3: Теперь символ градуса отображается корректно
Почти готово. Смущают только непонятные погодные иконки. Похоже, что это слабая сторона ChatGPT. Почему бы тогда не использовать погодные иконки из эмодзи?
Шаг 4: Делаем красивые иконки
Нужно подготовить иконки для основных погодных явлений (солнечно, облачно, дождь и т.д.). Сами иконки можно взять в открытых источниках — например, существует отличный шрифт Noto Color Emoji 16.0 от компании Google. Изображения всех символов доступны в репозитории на GitHub.
Эти картинки нужно смасштабировать до 16×16 и сохранить в папке icons, которая должна быть расположена в папке со скриптом. После этого нужно попросить AI доработать скрипт.
🤖 Промпт к AI: Сделай вывод иконок из готовых файлов, которые я положил в папку icons: cloud.png, fog.png, partly.png, rain.png, snow.png, sun.png.
🚀 Готово! В скрипте можно изменять список городов. Можно оставить только один город и тогда будет отображаться только его погода, обновляясь каждые 3 секунды.
Делаем пинг-монитор
Ping — это способ проверки доступности устройств в сети. Смысл в отправке специального запроса на IP-адрес проверяемого узла и измерении времени от отправки запроса до получения ответа.
Этот параметр важен в некоторых онлайн играх, где от скорости реакции игрового сервера и качества соединения может зависеть исход игры. Поэтому полезно иметь индикатор пинга, обновляющийся в реальном времени.
Индикатор пинга в игре Pokémon UNITE
Шаг 1: Вывод графика пинг
🤖 Промпт к AI: Сделай скрипт, который выводит график пинга игрового сервера по IP. Обновление графика раз в секунду. В верхнем левом углу выведи пинг маленьким шрифтом.
AI сгенерировал скрипт, который принимает IP-адрес сервера в качестве параметра. Поэтому адрес нужно указать при запуске скрипта. Например, если адрес сервера — 8.8.8.8, то для мониторинга его доступности команда будет выглядеть так:
[Видео] Пинг-монитор. Шаг 1: На экран выведен график и текущее значение пинга
Отлично, почти готово. Но непонятно, какие именно значения мы видим на графике. Но это и не так важно. Важнее, чтобы сразу можно было увидеть отклонения пинга от нормальных значений. Мы можем использовать разные цвета, чтобы обозначить хороший, средний и плохой пинг.
Шаг 2: Разукрашиваем график
🤖 Промпт к AI: Пусть на графике столбцы, соответствующие 0-20 мс, будут зелеными, 21-50 — желтыми, а больше 50 — красными. Высота шкалы — 100 мс.
[Видео] Пинг-монитор. Шаг 2: График разукрашивается в соответствии со значением пинга
Супер! Осталась одна маленькая, косметическая, деталь — вывод логотипа игры в левой части экрана.
Шаг 3: Добавляем логотип игры
🤖 Промпт к AI: Давай еще слева от графика выведем логотип игры CS:GO.
AI просит, чтобы файл с логотипом игры назывался csgo.png и лежал в папке со скриптом. Нагуглим подходящую картинку, смасштабируем до 16×16 и сохраним.
🚀 Готово! Всего за несколько шагов, не прибегая к программированию, мы смогли создать наглядный виджет. Его можно использовать не только для мониторинга доступности игрового сервера, но и в целом для мониторинга доступности любых других серверов в LAN или интернете.
Скоро Kickstarter
В начале 2026 года мы запустим нашу Kickstarter-кампанию. Оформите предзаказ в нашем магазине чтобы получить доступ к специальной цене для первых заказов когда кампания начнется: https://busy.bar/shop
Подпишитесь на наши X, Instagram и Reddit, чтобы следить за обновлениями BUSY Bar.
Instagram — продукт компании Meta Platforms Inc., признанной экстремистской организацией, деятельность которой запрещена на территории Российской Федерации.
А можно рассмотреть старые компы типа XT? Эмулятор для них есть в проекте "мурмулятор". Там же схемы эмуляции различных приставок, компьютеров типа "Радио-86РК" и "ZX-Spectrum".
Надеюсь скоро можно будет эмулировать i286 и i386 - и, возможно, даже получится запустить OS/2 Warp 4.0 Merlin или что-то подобное для офисной работы...
Я маргинал, который знает исключительно вершки-корешки и не умеет ни код нормальный писать, ни что то доводить до конца. Я не закончил три пту в своем городе из за того, что просто отбитый маргинал. Поэтому мне не светит ни госка, ни частная контора, ни даже работа на галере - у меня нет скиллов, а умело продавать себя я не умею и у меня не хватает хватки.
Так что фигня это все, мой максимум - второсортные развлекательные статейки, чисто как бульварное чтиво, только про IT. Почти как нейромусор.