Еще раз про WOL

    Нужно включать комп по сети. А Wake-on-LAN не работает.
    Предлагаемый метод универсален, но нестандартен и подразумевает наличие творческого оптимизма «во что бы то ни стало».

    Когда-то у меня был FTP-сервер. По факту это был обычный комп образца 2004 года. Вот тут в п.7 я писал что есть такое WOL и тонкость в настройке ARP таблицы маршрутизатора, что бы оный не забывал по какому порту у него висит этот комп (после того как питание компа выключится). И так уж получилось, что проблем у меня со всем этим делом не было — в BIOS была включена соответствующая опция и сервер бодро включался в любое время дня и ночи в независимости отключали от него когда-то питание или нет.
    Но все хорошее всегда имеет свойство заканчиваться: или ты к нему привыкаешь, или оно пропадает. Комп у меня отобрали…
    Однако недавно опять возникла потребность в своем FTP. А так как в перспективе еще хочется на него кое-что повесить, то я решил собрать под эти цели новый относительно производительный комп. И вот, платформа «ASUS P8H77-M + Intel® Core™ i3-2105 + 2 х 4Gb Corsair Vengeance CMZ4GX3M1A1600C9B» в корпусе «Thermaltake VK72721N2E SD200» появилась у меня дома. После диких восторгов домочадцев по стильному виду корпуса комп был засунут под телевизор вместо уволенного комбайна VHS+DVD, который там бессменно находился с 2004 года. В порядке эксперимента я решил усложнить себе жизнь и поставил на этот сервер винду, а в винде устроилась VMWare со своими тремя виртуальными компами. Одним из виртуальных компов и стал новый FTP-сервер. После проброса портов на роутере и в виртуальной сетевой среде VMWare FTP-сервер стал отзываться и исправно работать.


    Тут я, конечно же, вспомнил про WOL, поправил проброс портов на роутере, скачал под андроид программку «Wake On LAN» (раньше я пользовался сервисом wakeonlan.ru). Помните про все хорошее? И вот, в один прекрасный день я не смог удаленно включить этот комп. 130Гб я унести с собой не мог ну никак и поэтому был крайне опечален. Нехорошими словами досталось проектантам реализации WOL в целом и инженерам фирмы ASUS в частности. Я извиняюсь, если в тот день кто-то сильно икал, но я был реально опечален. После разбора полетов, оказалось, что эта материнка должна хоть раз включиться, что бы потом будиться по WOL. А если меня дома нет, а свет электричество отключали (свет обещали к концу декабря 2012 отключить)? То есть, удаленно я комп включить никак не смогу. В BIOS есть функция восстановление питания, т.е. если комп был включен когда произошел сбой питания, то после появления питания комп сам запустится. А если он был выключен? Да, в обозримой перспективе другая виртуалка будет под торрентом и комп будет работать круглосуточно, но все это какой-то форменный непорядок.
    Данным вопросом я интересовался в интернетах и у знающих людей. Знающие люди обычно работают с более серьезным сетевым оборудованием и как выворачиваться в этой ситуации сказать толком не могут. Мало того! Многие говорили мне, что это нормально, т.е. компу надо знать на какое устройство подавать питание для ожидания команды на включение. И достаточно многие меня уверяли, что комп будет пробуждаться нормально, только если его включать через «Пуск» (???). Что говорили в интернете пересказывать не буду, но меставми я откровенно веселился.

    Встал вопрос: что делать?
    Идей была куча. От идеи выдвигающегося сидирома какого-нибудь «нормально-пробуждающегося» древнего компа до идеи вывести сигнал WOL сетевого чипа через какую-то логику на разъем кнопки питания компа. Проблема работы на уровне элементной базы в том, что дома отсутствует осциллограф (С1-112А не считается). Но потом я поумерил аппетиты и решил сделать решение независимое от компьютерного железа. В закромах была найдена сетевая карта D-Link DGE-528T. На ней размещается замечательный белый разъемчик WOL. Если посмотреть распиновку, то разъем содержит три сигнала: +5VSB, GND, Ring. На многих старых материнка тоже существовал такой же разъем, сейчас от этой тенденции уходят. Очевидно, питание к сетевой карте подводится автономно. Сам комп включатлся или при нажатии кнопки питания или после поступления сигнала Ring. На ASUS P8H77-M такого разъема нет!
    И тут очень кстати пришлась освободившаяся плата Марсоход с ПЛИС на борту. Я решил сделать пожизненное универсальное решение для любого компьютера (этот тоже могут отобрать):
    1) вставляем любую сетевую карту с разъемом WOL на борту в комп;
    2) в комп куда-нибудь прикручиваем плату с ПЛИСом;
    3) к плате ПЛИС подключаем интерфейсную плату для WOL;
    4) изготовленными спецкабелями соединяем разъемы WOL на сетевой карте и интерфейсной плате, подключаем к интерфейсной плате кнопку питания и разъемчик PWR_BUT материнской платы, а так же заводим на эту плату питание +5VSB.
    Таким образом очерчиваем круг поставленных задач:
    1) для ПЛИСа нужна прошивка, которая бы опрашивала сигналы с кнопки питания на компе и сигнал Ring с сетевой карты и в случае их обнаружения выдавала бы сигнал на разъем PWR_BUT материнской платы;
    2) интерфейсная плата должна осуществлять питание платы с ПЛИС (ставим стабилизатор на +3,3В), а так же неплохо было бы иметь развязку для WOL и PWR_BUT на всякий случай (ставим парочку оптронов);
    3) нужно изготовить кабели: 3хпроводной для WOL (причем разъем со стороны ПЛИС с шагом 2,54, а со стороны сетевой карты 2мм), 2хпроводной для подключения PWR_BUT (2 разъема с шагом 2,54), 2хпроводной для питания (1 разъем с шагом 2,54, а другой конец присобачить как-то к разъему питания материнской платы — к проводам GND и +5VSB).

    Засучили рукова.
    Прошивку я написал за полчаса. Прошивка банальна: опрашивать два порта и выводить, например, полусекундный импульс на третий порт. Я учел дребезг кнопки питания, детектировал только фронт сигнала Ring, сделал точный генератор времени с диапазонам до суток и прочие мелочи — развлекался как мог) Прошивка получилась в результате гораздо тяжелее самого первого варианта, но все же половина ПЛИСа еще осталось свободной. Много места пожрал универсальный генератор времени, который подключался к проекту как модуль.
    Кабели я сделал тоже за полчаса. Но у меня все было под рукой — повезло с разъемами.
    С интерфейсной платой я страдал весь следующий вечер. Саму плату я выпилил из куска двухсторонней макетной печатной платы. Плата одевается на плату Марсохода «мостиком» на разъемы «Rigth Motor» и «Left Motor». «Rigth Motor» был отдан под WOL, а второй разъем я пробросил на интерфейсную плату — как это ни парадоксально, но отсутствие женщины в личной жизни способствует не менее интересному времяпрепровождению и неизвестно что еще захочется прикрутить к этой плате. Так как паять проводками мне было лень, а припоя у меня много, то я просто «выращивал» нужные дорожки. Получилось неказисто и, в принципе, делать так не советую. DC-DC стабилизатор дома тоже нашелся, а вот оптронов не было. Вместо них запаял колодки и на неделю все было заброшено. Через две недели я поставил оптроны и решил проверить как это все будет работать.




    Самое сложное было разделать разъем питания ATX. В интернете есть куча советов как подпихнуть скрепку от степлера (ну нет у меня экстрактора) в разъем, что бы отогнуть фиксаторы. Я даже видео смотрел на каком-то сайте. Но у меня никак контакт не хотел вылазить из разъема. Призывая на помощь всем известные слова я провел почти два часа сломав иголку и перепортив несколько скрепок. Но зато получилось цивилизованно)


    Решение работоспособно и позволяет включать/отключать комп с кнопки питания на корпусе и включать комп по сети путем подачи команды WOL. К сожалению, выкючать комп по сети не получается — после включения питания сетевая карта перестает выдавать сигнал Ring. Кроме того, имеется задел для дальнейшего творчества! Например, можно переделать прошивку ПЛИС так, что бы после получения в течение 20 секунд восьми команд WOL подавалось бы питание на USB контроллер. Вставленная флешка в USB контроллер монтировалась бы автоматом в виртульную машину и по ФТП под спецлогином и спецпаролем становилась бы доступна папочка, содержащая, например, документ с паролем на хабре)

    Осталось аккуратно закрепить полученноу устройство в системном блоке и поставить оный на дежурство. Что и будет сделано, когда приедет заказанная плата. А нынешняя вернется обратно для контроля автосигнализации машины — когда купаешься удобно запереть все вещи в машине и поставить таймер на открытие через заданное время)))

    Цена вопроса:
    — сетевая карта D-Link DGE-528T = 300р.
    — плата Марсоход + программатор к ней (если нужен) + доставка по почте россии = 1000р. + 600р. + 150р.

    Ниже привожу текст прошивки для ПЛИС и, схематично, интерфейсную плату. Для новичков в VHDL, думаю, текст будет полезен. Генератор времени написать нетрудно — сосчитали счетчиком до CLOCK — вот вам и секунда. При припиновке не забываем для портов F0 и F1 установить «Sсhmitt Trigger Input» и включить pull-up резистор. На интерфейсной плате резисторами эти входы тоже подтянуты, но для других целей — защита от статики.

    ----------------------------------------------------------------------------------------------------------
    -- Company: House
    -- Engineer: AlexanderS
    -- 
    -- Create Date: 13/06/2012
    -- Modification Date: --/--/----
    -- Module Name: manag_pc
    -- Project Name: - 
    -- Version: v.1.1
    -- Description: обработка сигналов с кнопки PWR ПК, команды WOL с сетевой карты 
    -- и выдача сигнала вкл/откл на PWR SW на матплате ПК
    ----------------------------------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    --use IEEE.STD_LOGIC_SIGNED.ALL;
    use IEEE.NUMERIC_STD.ALL;
    --use IEEE.MATH_REAL.ALL;
    --library UNISIM;
    --use UNISIM.VComponents.ALL;
    
    entity project is
    	GENERIC (
    				---------- установка параметров ----------
    				CLOCK : integer := 100000000 -- частота тактирования модуля, [Гц; кратно 1000]
    				);
    	
    	Port (
    		---------- интерфейс ----------
    		led: out std_logic_vector(7 downto 0) :=(others=>'0');
    		f0: in std_logic_vector(9 downto 0) :=(others=>'1');
    		f1: in std_logic_vector(9 downto 0) :=(others=>'1');
    		f2: out std_logic_vector(9 downto 0) :=(others=>'0');
    		---------- контроль и телеметрия ----------
    		CLK: in std_logic :='0' -- частота тактирования модуля (параметр CLOCK)
    	);
    end project;
    
    architecture Behavioral of project is
    
    signal df : std_logic_vector(5 downto 0) :=(others=>'0');
    signal sw_lock : std_logic :='0';
    signal hl : std_logic_vector(7 downto 0) :=(others=>'0');
    
    signal PWR_BUT1, WOL1, PWRB_on, WOL, lock : std_logic :='0';
    signal PWR_BUT2, WOL2 : std_logic :='1';
    signal st : integer range 3 downto 0 :=0;
    
    signal sec0125, sec025, sec05, sec, sec2, min, hour, day, res_time : std_logic :='0';
    signal time_s, time_m : std_logic_vector(5 downto 0) :=(others=>'0');
    signal time_h : std_logic_vector(4 downto 0) :=(others=>'0');
    
    COMPONENT gen_time is -- формирователь времени
    	GENERIC (
    			CLOCK : integer := 100000000
    			);
    	Port (
    		---------- интерфейс ----------
    		sec0125: out std_logic :='0';
    		sec025: out std_logic :='0';
    		sec05: out std_logic :='0';
    		sec2: out std_logic :='0';
    		sec: out std_logic :='0';
    		time_s : out std_logic_vector(5 downto 0) :=(others=>'0');
    		min: out std_logic :='0';
    		time_m : out std_logic_vector(5 downto 0) :=(others=>'0');
    		hour: out std_logic :='0';
    		time_h : out std_logic_vector(4 downto 0) :=(others=>'0');
    		day: out std_logic :='0';
    		---------- контроль и телеметрия ----------
    		RES: in std_logic :='0';
    		CLK: in std_logic :='0'
    	);
    end COMPONENT;
    
    begin
    
    Inst_gen_time: gen_time  -- формирователь времени
    	GENERIC MAP(
    				CLOCK => 100000000
    				)
    	Port MAP (
    		sec0125 => sec0125,
    		sec025 => sec025,
    		sec05 => sec05,
    		sec => sec,
    		sec2 => sec2,
    		time_s => time_s,
    		min => min,
    		time_m => time_m,
    		hour => hour,
    		time_h => time_h,
    		day => day,
    		RES => res_time,
    		CLK => CLK
    	);
    res_time <= '0';
    	
    ---- BEGIN блок ввода-вывода
    Process(CLK) begin if (CLK'Event) and (CLK='1') then
    	if (sw_lock = '0') then
    		if (f0(0) = '0') or (f1(0) = '0') then sw_lock <= '1'; end if;
    		df(0) <= not f0(0); hl(6) <= f0(0);
    		df(1) <= not f1(0); hl(7) <= f1(0);
    	elsif (sec0125 = '1') then sw_lock <= '0'; end if;
    	end if;
    
    	if (df(2) = '1') then f2 <= (others=>'1'); else f2 <= (others=>'0'); end if;
    	
    	led <= hl;
    end if; end process;
    ----- END блок ввода-вывода
    
    
    --- BEGIN 
    process(CLK) begin if (CLK'event and CLK = '1') then
    	PWR_BUT1 <= df(0); PWR_BUT2 <= not PWR_BUT1;
    	WOL1 <= df(1); WOL2 <= not WOL1;
    	if ((PWR_BUT1 = '1') and (PWR_BUT2 = '1')) then -- передний фронт сигнала нажатия кнопки
    		PWRB_on <= '1';
    	elsif ((PWR_BUT1 = '0') and (PWR_BUT2 = '0')) then -- задний фронт сигнала нажатия кнопки
    		PWRB_on <= '0';
    	elsif ((WOL1 = '1') and (WOL2 = '1')) then WOL <= '1'; else WOL <= '0'; end if; -- передний фронт сигнала WOL
    	
    	if (PWRB_on = '1') and (lock = '0') then -- обработка нажатой кнопки
    		df(2) <= '1';
    		hl(0) <= not hl(0);
    		lock <= '1';
    	elsif (PWRB_on = '0') and (lock = '1') then -- обработка отжатой кнопки
    		df(2) <= '0';
    		lock <= '0';
    	else -- обработка команды WOL
    		case st is
    			when 0 => if (WOL = '1') then st <= st + 1; end if; -- рееагирования только если комп выключен
    			when 1 => df(2) <= '1'; if (sec025 = '1') then st <= st + 1; end if;
    			when 2 => if (sec025 = '1') then st <= st + 1; end if;
    			when 3 => hl(0) <= not hl(0); df(2) <= '0'; st <= 0;
    			when others => null;
    		end case;
    	end if;
    	
    end if; end process;
    --- END 
    
    end Behavioral;
    




    К плате с ПЛИСом еще можно управление ИБП прикрутить. И этот дежруный комп своим сетевым запуском будет еще разблокировать возможность сетевого включения другого оборудования)))

    P.S.
    Один товарищ сказал что при отсутствии поддержки производителей оборудования сделать все это (WOL) будет очень сложно и смысла браться нет и т.д. и т.п. Поспорили с ним на «просто так»…
    Ну и кто сказал что мы что-то не смогем? :)

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 37

      +5
      Ожидал ардуино, но марсоход даже интереснее.
      День паяльника на хабре :)
        +1
        Уважаю.
          +1
          Поясните, пожалуйста, преимущества ПЛИС перед схемой на двух диодах (диодное ИЛИ).
            +1
            На самом деле изначально планировалось завести Ethernet на ПЛИС, обнаруживать Magic Packet и будить комп. Я даже приемопередатчик наваял для 10Mbps и модуль приема и обработки Magic Packet последовательности. Но потом встал вопрос о согласовапнном подключении к линии, коннектора с трансформатором не нашел, потом свои дела и, короче, все затянулось и на этот метод положили. Ну, а ПЛИС остался)

            У диодов преимущества бесспорны с точки зрения рациональности, но самый главный недостаток — отсутствие расширяемости функциональности. ПЛИС дает больше творчества и интереса: например, я упоминал про управление USB-контроллером)
              0
              Кстати, даже если напрямую соединять WOL сетевухи с PWR BT, то комп не запускался. А через диод, всего скорее, и подавно не будет.
                0
                у меня старенький cel 1300 на GA-60Xt заводился от сигнала WOL от pci'ной сетевухи со включенным параметром «wake up by pci card»
              +1
              В BIOS есть функция восстановление питания, т.е. если комп был включен когда произошел сбой питания, то после появления питания комп сам запустится. А если он был выключен?

              запуститься с таким же успехом. Я еще не встречал биоса где бы отсутствовала такая опция. Для вашей материнки нужно изменить настройку Restore AC Power Lost на Power On вместо Last State.
              И не нужно было бы городить велосипеды
                0
                Если комп был выключен в момент пропажи питания, то после его появления он не дожен включаться, т.к. он был выключен. А у вас он включится. А так не надо.
                  0
                  И какая проблема что он включится? Через определенное время он перейдет в режим сна или гибернации, и затем будет готов включится по первому зову WOL
                    0
                    Не надо никакого сна и прочих наворотов!
                    Если он включился, то автоматом запускается VMW и в ней через каждые 5 минут стартуют виртуалки. Одна из них тот самый FTP-сервер.
                      0
                      какие же это навороты, это значительно дешевле чем плата марсоход и программатор к ней
                        0
                        Вы не поняли — после включения компа комп не должен засыпать и быть доступным из сети.
                          0
                          UPS с управлением по шнурку бы целиком решил Вашу проблему. Сам бужу домашний комп через заход на роутер dd-wrt по внешнему IP в вебморду и нажатие там кнопки WOL.
                          Если добавить UPS, то он будет гасить комп, если нет питания. А включить потом можно через WOL.
                            0
                            Есть только один ньюанс. Если питания долго не будет и ИБП сам сдохнет, то после подачи питания я уже через WOL свой комп не включу)
                              0
                              Ну это наверное сутки должны пройти, что маловероятно в крупных городах, например.

                              В моем случае мне бы хватило. В квартире, где я сейчас живу, свет вырубался раза 3 за 3 года (секунды на 3-15 каждый раз).
                        0
                        кстати, а какие преимущества у связки виртуалок перед единым линупсом с серверами?
                          0
                          Не могу сказать — на линуксе так не реализовывал.
                          Просто в моем случае нужно было, что бы комп мог использоваться домашними как обычный, а они с линуксом не очень того…
                          0
                          Поддерживаю gogijan. Я так и не понял, чем вас так расстроил спящий режим. Даже если предположить, что без виртуалок никак, можно программно заставить компьютер засыпать после засыпания виртуалок и будить виртуалки при пробуждении компьютера. Преимущества такого подхода два, но зато каких (!):
                          — не нужно дополнительное железо
                          — все сервера практически мгновенно приходят в рабочий режим после получения WoL
                            0
                            Мне звонит человек. Я с трубы из любого места где есть сотовая сеть включаю ФТП. Человек заливает туда какие-то файлы за какое-то время. Время не лимитировано. При чем тут сон? Как комп определит что после одного включения он должен засыпать (и когда?), а после другого — нет? Под сном имею ввиду режим гибернации.

                            Поясните. Или я не понимаю, или вы советуете не зная моих задач.
                              0
                              Ну так наверное можно настроить, чтобы компьютер не засыпал пока идёт передача данных и ещё минут 10 после.
                                0
                                Время не лимитировано)
                                Может его гасить можно будет через 10 минут, а может не ранее чем через 7 часов)))
                                  0
                                  Всё равно программно решается. Достаточно использовать какой-нибудь персистентный онлайн флаг, при установке которого не засыпать.
                                    0
                                    Просто вам проще сделать это программно. А мне аппаратно. Просто потому что вы, например, ITшник-программист, а я инженер, получивший олдскульное образование — мы умеем грамотно владеть инструментами в своих сферах)
                                    Тем более, мне было интересно сделать именно так)
                    +4
                    2050 рублей (без учета проводов, разъемов и прочего).
                    Я всё понимаю, «задел на будущее», «огромные возможности», «just for fun», но, мне кажется, это перебор.
                      0
                      Я не пью и не курю
                      Потому и потяну!

                      Уважаемые, если оценивать проект с точки зрения экономической эффективности, то все это нецелесообразно (а 5 рублей на прическу целесообразно?). Можно сделать проще, дешевле и надежнее. Просто все, что я делаю проще, дешевле и надежнее на хабр не будет попадает ввиду скучности)
                        0
                        Я был удивлен и раздосадован, когда узнал что моя современная материнка ASUS M4A77TD с гигабитной сетевой Realtek не поддерживает WOL Oo
                          +1
                          Да вот. За этим нынче следить надо.
                          Причем наверняка прошивка контроллера это поддерживает и соответствующий выход у чипа есть. Удивительнее всего что копейки экономят именно на недешевых платах.
                            0
                            Вроде как можно. По крайней мере, здесь сказано как.
                            0
                            А на работу вы на личном самолёте перемещаетесь?
                              0
                              Ага. У которого 96 колес…
                              0
                              Когда я в прошлый раз баловался с WOL, я отправлял пакеты на broadcast адрес. В самом пакете закодирован MAC-адрес сетевой карты, так что ничего лишнего не проснется. Зачем тут хитрить с ARP?
                                0
                                В DD-WRT нельзя прокинуть порт на broadcast. Только на статичный IP. А для того что бы роутер правильно ассоцииоровал этот IP с каким-то одним из своих портов и приходится править ARP таблицу.
                                0
                                А нельзя ли как-то на сетевушку pci подать питание прямо на шину, воткнуть ее в ethernet и попробовать ей пакет слать и смотреть за wol контактом?
                                  0
                                  Такая идея тоже была. Но я не хотел чекрыжить комповое оборудование.
                                    0
                                    Идея даже такая была — купить любую карточку за 100р. и с хаба завести еще один сетевой кабель на нее. А уже после трансформатора сигналы завести прямо на ПЛИС. Тогда можно пытаться анализировать сетевой поток)
                                    0
                                    Вот еще интересная платформа: Lattice MachXO2 Breakout board.
                                    Питание берет, насколько я понимаю, с USB. Содержит FTDI USB/UART, а так же поля для распайки пользовательских пинов.
                                      0
                                      А я себе на андроиде написал прогу для WOL ) железо у меня поддерживает но всё что предлагается в инете не учитывает что роутер может быть за NATом

                                      Only users with full accounts can post comments. Log in, please.