Удаленное включение ПК при помощи ESP8266
Дата: 2 Февраля 2019. Автор: Алексей
Всем привет! Давненько я не писал статейки...
Сегодня я хочу затронуть животрепесчушуую, тьфу, тему. Как-то за 40 километров от города приспичило мне поработать на своем домашнем ПК. Делов-то, TeamViewer и вся любовь. Да, это хорошо, но Хто ПК то включит??? Короче слава богу дома была родня и я позвонив попросил включить комп. А вот что делать если нет никого дома, а гандурас чешется достучаться до ПК? Правильно, сделать включение удаленно.
Тут в принципе есть несколько решений. Самый простой, это управление включением ПК по средством Wake-On-LAN, но блин у меня материнка сто летней давности и тратить 3,5 тыра вечнодеревянных на новую как-то не хочется. Так что этот вариант отпадает.
Вариант намбер ту.
Да, да. Эта малышка может замутить из Ethernet виртуальный COM порт. Мега продвинутая FTDI или CP2102. Но и этот вариант не подходит. Для создания виртуального порта нужно на ПК устанавливать спецпрограмму, драйвер и только под форточную ось. Короче не пойдет)) У меня походный ноут работает на Ubuntu.
Вариант намбер сри.
Я думаю расписывать это чудо не надо. Но и тут есть жирный минус. Абонентская плата минимум 3 сотни вечнодеревянных. А если мне не нужно будет пол года подключаться? Не, лажа.
Думал я думал и надумал. Есть у меня вот такая штука.
Кто не вкурсе, я расскажу. Это отладочная платка с WIFI модулем на базе микроконтроллера ESP8266 под управлением NodeMCU. Это такая штука, которую можно программировать на языке lua. И самое ценное, то что для нее написана большая библиотека с поддержкой работы в сети. Поэтому мы будем поднимать TCP сервер и писать TCP клиент. Сервером будет как раз наша платка и она при получении от клиента команды будет включать ПК. А клиент будет прогой под ПК и пихать серверу команду.
Начнем наверное со схемы, дабы знать на каких ногах что будет висеть.
Покрупнее
Дык, описание. Модуль при получении команды дергает базу транзистора, а тот... А тот что?
А как сама кнопка включения ПК работает-то?
Я пытался это выяснить гуля и яндекся, а находил лишь заумные ответы типа: "
Короче я забил на весь ентернеть и полез в системник с тестером. Что я выяснил. Кнопка работает следующим образом. Она замыкает контакты))) А именно два пина на гребенке на материнке с подписью SW PWR. Причем один пин железно прибит к корпусу, а именно на нем всегда GND, а на втором висит 3,3в. Данное напряжение подтянуто через резистор. То есть когда нажимается кнопка, то пин с питанием прижимается к корпусу и комп понимает что нужно включаться. Вывод, дабы заставить включиться ПК, нужно перевести ножку с 1 в 0. Вот для этого и прикручен на схеме транзистор. Да, можно было бы и напрямую от модуля ногу прикрутить и держать ее в 1, а при поступлении команды переводить в 0. Но есть одно большое НО. Представим себе ситуацию, наша железяка подключена к ПК и пихает 3,3в на ножку включения. Вроде все хорошо. Но тут случилось напасть, дома брат, сестра, мама, папа ну или бабушка на худой конец решили включить с кнопки. Чуете чем запахло? Ага, горелым. Мы модулем пихаем 3,3в, а кнопкой прижимают к корпусу. Так вот чтоб развязать этот недуг я и поставил транзистор. Пока команда на включение ПК не пришла, база транзистора жестко прижата к корпусу. Тот закрыт, а коллектор висит в воздухе. Можно обнажиматься на кнопку сколько угодно, ничего не будет, так как транзистор закрыт. А вот когда придет команда и модуль вжарит по базе единицей и транзистор откроется, то тоже ничего страшного не будет, так как он прижмет ножку включения на материнке к корпусу. И даже при выполнении команды кто-то нажмет на кнопку, замыкания не будет. Оба давят на корпус))).
Тэкс, с теорией закончили, топаем делать плату.
Зы, это модель в сборе модуля и платы. А вот это уже все готовое в реале.
Железо готово, пора писать программу. Для железяки нам понадобиться ПО из статью про wifi термодатчик. Топаем туда и вникаем в суть происходящего. А именно ставим все ПО, качаем прошивку для NodeMCU, заливаем в модуль и возвращаемся сюда.
Если все готово, то пишем код.
-- ========================================= -- ЭТИ ДАННЫЕ НУЖНО НАСТРОИТЬ ПОД СЕБЯ -- ========================================= -- Имя сети и пароль station_cfg={} station_cfg.ssid="Имя точки WIFI" station_cfg.pwd="Пароль для подключения к точке" --Номер пина noga_pc = 1 -- Вкл ПК noga_ip = 0 -- Регистрация в сети noga_light = 2 -- Включения света -- Данные для проверки -- Максимальная длинна команды 12 символов com_1 = "PC_on" com_2 = "L1_on" com_3 = "L1_off" --com_X = "Команда" -- Флаг правильности полученной команды errCom = 0 -- Номер порта port = 80 -- ========================================= -- КОНЕЦ НАСТРОЙКИ ДАННЫХ -- ========================================= -- Режим клиента wifi.setmode(wifi.STATION) -- Запись конфигурации wifi.sta.config(station_cfg) -- Подключаемся к роутеру wifi.sta.autoconnect(1) --Настройка пина На вывод gpio.mode(noga_pc, gpio.OUTPUT) gpio.mode(noga_ip, gpio.OUTPUT) gpio.mode(noga_light, gpio.OUTPUT) --Создаем сервер srv=net.createServer(net.TCP, 30) --Ждем подключения к точке и получения IP адреса --При удачном подключении гасим светодиод do tmr.alarm(0, 10000, 1, function () ipadress = wifi.sta.getip() if ipadress == nil then gpio.write(noga_ip, gpio.LOW) else gpio.write(noga_ip, gpio.HIGH) end print(ipadress) end) end function receiver(sck, data) print(data) sck:on("sent", function(sck) sck:close() end) -- ========================================= -- КОМАНДА УПРАВЛЕНИЯ ТРАНЗИСТОРОМ -- ========================================= if data == com_1 then tmr.alarm(0, 1500, 1, function () gpio.write(noga_pc, gpio.LOW) end) gpio.write(noga_pc, gpio.HIGH) errCom = 1 end -- ========================================= -- КОМАНДА ВКЛЮЧИТЬ СВЕТ -- ========================================= if data == com_2 then gpio.write(noga_light, gpio.HIGH) errCom = 1 end -- ========================================= -- КОМАНДА ВЫКЛЮЧИТЬ СВЕТ -- ========================================= if data == com_3 then gpio.write(noga_light, gpio.LOW) errCom = 1 end -- ========================================= -- ШАБЛОН КОМАНДЫ -- ========================================= -- if data == com_X then -- Какие-то действия при выполнении команды -- errCom = 1 -- end -- ========================================= --Ответ клиенту if errCom == 1 then sck:send("Сделано!") errCom = 0 else sck:send("Фигня!") end end if srv then srv:listen(port, function(conn) conn:on("receive", receiver) end) endДалее заливаем в модуль и все готово. Да, да в коде сть две лишних команды на включение и выключение света. Эти команды я вставил для того чтобы можно было расширять функционал модуля. Например им можно будет чем-то управлять по сети. Далее в конце команд я закоментировал болванку для создания новых команд. Так как клиент будет принимать команды введенные вручную, то система становиться резиновой. Выполняемых команд можно напихать столько, сколько позволит память модуля.
Отлично, поехали кодить под ПК. С учетом того что я решил писать клиента под форточки и пингвина, то буду использовать не Visual Studio, а Qt Creator. Ее можно скачать с официального сайта бесплатно. Но для бесплатной версии есть ограничения. Проги не продавать, раздавая прикладывать исходники и она немного порезана по функционалу, но на нашу задачу это не повлияет. Выкладывать код С++ здесь я не буду, а лишь покажу вид программы. Все исходники, программы и описания будут в конце статьи для скачивания.
Чтобы послать команду, заполняем все поля и жмем кнопочку "Отправить".
Если сервер не ответил, то появится ответ "Пустой ответ!"
Если до сервера достучались, но команда не верная, то появится ответ "Фигня!"
Если до сервера достучались и команда выполнена, то появится ответ "Сделано!"
А теперь ссылочки на исходники и схемы с корпусом.
Проект DipTrace
3D модели корпуса
Проект QT форточный
Проект QT Ubuntu
Установщик для форточек
Прога для Ubuntu
Ну как-то так. Проект для lua я выкладывать не буду, просо скопируйте код из статьи и все. Программу под форточки я сделал с установщиком, так как мне лень расписывать какие файлы куда пихать. Так что просто качаем архив и устанавливаем на ПК. Для Ubuntu все сложнее. Я так и не смог разобраться как создать подобие инсталятора винды в линукс (
Вроде все))
Будут вопросы, пишите в коментах.
Алексейbird 10.03.19 16:43
Идея хорошая, хоть и не новая. Только обрати внимание, что включить можно только комп, который "смотрит" в глобальную сеть, или хотя бы есть свой маршрутизатор, который имеет белый IP и его можно настроить на проброс портов. В других случаях, а это большинство как раз так и выходит так в сеть, этот способ невозможен. Или искать девайсину, которая сама подключается к удалённому серверу и ждёт команды от него. А пользователь, где-нибудь далеко, также подключается к этому серверу и даёт команду на включение своего компа.
Алексей 11.03.19 06:27
Я думал об этом. Для этого есть серверы типа no-ip.com. Но тогда нужен включеный комп, а это порти всю картину. Либо 150р в месяц и статика обеспечена.