Удаленное включение ПК при помощи ESP8266


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Аби: Подключение микроконтроллеров к шине RS-485
написано просто о...

Анатолий: Джойстик для денди на stm32
Автору 100500 рес...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


				

Удаленное включение ПК при помощи ESP8266

	
	
	

Дата: 2 Февраля 2019. Автор: Алексей

	
	
Всем привет! Давненько я не писал статейки...

Сегодня я хочу затронуть животрепесчушуую, тьфу, тему. Как-то за 40 километров от города приспичило мне поработать на своем домашнем ПК. Делов-то, TeamViewer и вся любовь. Да, это хорошо, но Хто ПК то включит??? Короче слава богу дома была родня и я позвонив попросил включить комп. А вот что делать если нет никого дома, а гандурас чешется достучаться до ПК? Правильно, сделать включение удаленно.

Тут в принципе есть несколько решений. Самый простой, это управление включением ПК по средством Wake-On-LAN, но блин у меня материнка сто летней давности и тратить 3,5 тыра вечнодеревянных на новую как-то не хочется. Так что этот вариант отпадает.

Вариант намбер ту.

Преобразователь Ethernet в UART

Да, да. Эта малышка может замутить из Ethernet виртуальный COM порт. Мега продвинутая FTDI или CP2102. Но и этот вариант не подходит. Для создания виртуального порта нужно на ПК устанавливать спецпрограмму, драйвер и только под форточную ось. Короче не пойдет)) У меня походный ноут работает на Ubuntu.

Вариант намбер сри.

SIM800C

Я думаю расписывать это чудо не надо. Но и тут есть жирный минус. Абонентская плата минимум 3 сотни вечнодеревянных. А если мне не нужно будет пол года подключаться? Не, лажа.

Думал я думал и надумал. Есть у меня вот такая штука.

ESP8266 NodeMCU

Кто не вкурсе, я расскажу. Это отладочная платка с WIFI модулем на базе микроконтроллера ESP8266 под управлением NodeMCU. Это такая штука, которую можно программировать на языке lua. И самое ценное, то что для нее написана большая библиотека с поддержкой работы в сети. Поэтому мы будем поднимать TCP сервер и писать TCP клиент. Сервером будет как раз наша платка и она при получении от клиента команды будет включать ПК. А клиент будет прогой под ПК и пихать серверу команду.
Начнем наверное со схемы, дабы знать на каких ногах что будет висеть.

Схема принципиальная

Покрупнее

Дык, описание. Модуль при получении команды дергает базу транзистора, а тот... А тот что?
А как сама кнопка включения ПК работает-то?
Я пытался это выяснить гуля и яндекся, а находил лишь заумные ответы типа: "Когда нажимают кнопку, то команду обрабатывает BIOS и разрешает БП подать напругу на материнку." В общем все в этом духе, а когда задавал прямой вопрос "Как на физическом уровне работает кнопка включения ПК?", мне говорили что я идиот, так как она просто замыкает контакты. Твою мать, логично. И не поспоришь.
Короче я забил на весь ентернеть и полез в системник с тестером. Что я выяснил. Кнопка работает следующим образом. Она замыкает контакты))) А именно два пина на гребенке на материнке с подписью SW PWR. Причем один пин железно прибит к корпусу, а именно на нем всегда GND, а на втором висит 3,3в. Данное напряжение подтянуто через резистор. То есть когда нажимается кнопка, то пин с питанием прижимается к корпусу и комп понимает что нужно включаться. Вывод, дабы заставить включиться ПК, нужно перевести ножку с 1 в 0. Вот для этого и прикручен на схеме транзистор. Да, можно было бы и напрямую от модуля ногу прикрутить и держать ее в 1, а при поступлении команды переводить в 0. Но есть одно большое НО. Представим себе ситуацию, наша железяка подключена к ПК и пихает 3,3в на ножку включения. Вроде все хорошо. Но тут случилось напасть, дома брат, сестра, мама, папа ну или бабушка на худой конец решили включить с кнопки. Чуете чем запахло? Ага, горелым. Мы модулем пихаем 3,3в, а кнопкой прижимают к корпусу. Так вот чтоб развязать этот недуг я и поставил транзистор. Пока команда на включение ПК не пришла, база транзистора жестко прижата к корпусу. Тот закрыт, а коллектор висит в воздухе. Можно обнажиматься на кнопку сколько угодно, ничего не будет, так как транзистор закрыт. А вот когда придет команда и модуль вжарит по базе единицей и транзистор откроется, то тоже ничего страшного не будет, так как он прижмет ножку включения на материнке к корпусу. И даже при выполнении команды кто-то нажмет на кнопку, замыкания не будет. Оба давят на корпус))).
Тэкс, с теорией закончили, топаем делать плату.

3D модель устройства

Зы, это модель в сборе модуля и платы. А вот это уже все готовое в реале.

Плата

Плата в корпусе

Плата в сборе

Железо готово, пора писать программу. Для железяки нам понадобиться ПО из статью про 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. Ее можно скачать с официального сайта бесплатно. Но для бесплатной версии есть ограничения. Проги не продавать, раздавая прикладывать исходники и она немного порезана по функционалу, но на нашу задачу это не повлияет. Выкладывать код С++ здесь я не буду, а лишь покажу вид программы. Все исходники, программы и описания будут в конце статьи для скачивания.

Qt Creator

TCP-Client

Чтобы послать команду, заполняем все поля и жмем кнопочку "Отправить".

Если сервер не ответил, то появится ответ "Пустой ответ!"
Если до сервера достучались, но команда не верная, то появится ответ "Фигня!"
Если до сервера достучались и команда выполнена, то появится ответ "Сделано!"


А теперь ссылочки на исходники и схемы с корпусом.

Проект DipTrace
3D модели корпуса
Проект QT форточный
Проект QT Ubuntu
Установщик для форточек
Прога для Ubuntu

Ну как-то так. Проект для lua я выкладывать не буду, просо скопируйте код из статьи и все. Программу под форточки я сделал с установщиком, так как мне лень расписывать какие файлы куда пихать. Так что просто качаем архив и устанавливаем на ПК. Для Ubuntu все сложнее. Я так и не смог разобраться как создать подобие инсталятора винды в линукс (если кто расскажет как, буду признателен.). Поэтому я в архиве приложил файл с инструкцией что куда скопировать для работы проги.
Вроде все))
Будут вопросы, пишите в коментах.




Алексейbird    10.03.19 16:43

Идея хорошая, хоть и не новая. Только обрати внимание, что включить можно только комп, который "смотрит" в глобальную сеть, или хотя бы есть свой маршрутизатор, который имеет белый IP и его можно настроить на проброс портов. В других случаях, а это большинство как раз так и выходит так в сеть, этот способ невозможен. Или искать девайсину, которая сама подключается к удалённому серверу и ждёт команды от него. А пользователь, где-нибудь далеко, также подключается к этому серверу и даёт команду на включение своего компа.

Алексей    11.03.19 06:27

Я думал об этом. Для этого есть серверы типа no-ip.com. Но тогда нужен включеный комп, а это порти всю картину. Либо 150р в месяц и статика обеспечена.




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика