В связи с переходом на частично удаленную работу у меня появилась потребность дистанционного включения рабочего (домашнего) компьютера с программой удаленного управления, из-за пределов локальной сети.

Реализацию осуществил двумя способами: первый с помощью SIP сервера FreeSWITCH, посредством телефонного соединения через IVR меню; второй способ с помощью системы домашней автоматизации ("Умный Дом") MajorDoMo.

Устройство, выполняющее отправку «магического пакета» - мини компьютер Rasberry Pi Model 3B, в первом случаю выполняет роль IP АТС, во втором сервер «Умного Дома».

Первоначальная идея была создание возможности удаленного управления элементами "Умного Дома" при отсутствии (блокировки, нестабильной связи и т.д.) сети Internet или отдельных сервисов. Однако для написания статьи я выбрал наиболее актуальное (для меня) применение. Итак, основная задача: набрав с телефона номер своего «Умного дома» и введя подтверждение, дистанционно включить свой ПК.

Wake-On-LAN (иногда сокращенно WoL) является стандартным протоколом для пробуждения компьютеров дистанционно. ПК должен быть подключен физически и к электричеству и к роутеру с помощью проводного (иногда Wi-Fi) соединения. Включение Wake-On-LAN зависит от двух вещей: материнской платы и сетевой карты. Материнская плата должна быть подключена к ATX-совместимому блоку питания, на данный момент среди ПК таких большинство. Сетевая карта или беспроводная карта также должны поддерживать эту функцию.

Технология WoL позволяет удалённо включить компьютер посредством отправки через локальную сеть специальной последовательности байтов — пакета данных (так называемого magic packet — «волшебного пакета»).

Подготовительная часть

Настраиваем свой ПК для работы с magic packet: в БИОСе и настройках сетевой карты. Настройку я подробно описывать не буду, довольно много статей и инструкций есть в сети на эту тему, к тому же наименование функции меняются в зависимости от производителя материнской платы.  Если коротко, то в BIOS включение функции обычно находится в «Power Management Setup», или «ACPI Configuration». Требуется активировать опцию Wake-Up by PCI devices (или “Wake-on-LAN”, «Power on by Ethernet Card», “Power by PCI” и т.д.) для встроенной в материнскую плату сетевой карты.

В настройках Windows включение требуется активировать в двух местах: Диспетчер Устройств – Сетевые адаптеры – Свойства:

Управление электропитанием: опция Разрешить этому устройству пробуждать компьютер и опцию пробуждения ПК с помощью “магического пакета” и дополнительно (у меня), включение по локальной сети после отключения;

Узнаем MAC адрес ПК. В случае с ОС Windows. В командной строке набираем ipconfig/all и ищем физический адрес сетевого адаптера.

У меня: Физический адрес. . . . . . . . . : 38-05-47-78-3B-35
Проверим включение через локальную сеть. Подключаемся к Raspberry Pi с помощью SSH клиента.

Для того, что бы наш Raspberry Pi мог отправлять магический пакет по сети устанавливаем пакет etherwake:

sudo apt-get install etherwake

Если БИОС и ОС настроены правильно, то после установки пакета Etherwake, удаленно включить ПК можно задав следующую команду на RPi :

sudo etherwake 38:05:47:78:3B:35

Где 38:05:47:78:3B:35 MAC адрес удаленного ПК, который мы недавно узнали, для каждого компьютера он будет свой. Утилита Etherwake работает только от пользователя sudo. Создадим скрипт сделаем его исполняемым и проверим отработку включения ПК этим скриптом:

nano /home/pi/wakeup.sh
sudo chmod +x /home/pi/wakeup.sh
sudo /home/pi/wakeup.sh
Содержимое файла скрипта:
#! /bin/bash
sudo etherwake 38:05:47:78:3B:35

Способ 1. Удаленное включение ПК через телефонную сеть

В этой части установим, произведём минимальную первоначальную настройку SIP сервера FreesWITCH на Raspberry Pi и дистанционное включение ПК (возможность управления элементами «Умного Дома») через телефонные сети.

В качестве устройства подключения к телефонным сетям я использовал VoIP-GSM шлюз с поддержкой 1 GSM линии Yeastar TG100.

Установка Freeswitch:

Устанавливаем freeswitch из пакетов на официальном сайте есть рабочая инструкция по установке для Raspberry Pi.

Приведу свои действия.

Входим под пользователем sudo и выполняем следующие команды:

sudo -i
apt-get update && apt-get install -y gnupg2 wget lsb-release
wget -O - https://files.freeswitch.org/repo/deb/rpi/debian-release/freeswitch_archive_g0.pub | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/rpi/debian-release/ `lsb_release -sc` main" > /etc/apt/sources.list.d/freeswitch.list
echo "deb-src http://files.freeswitch.org/repo/deb/rpi/debian-release/ `lsb_release -sc` main" >> /etc/apt/sources.list.d/freeswitch.list
apt-get update && apt-get install -y freeswitch-meta-all

Установка длится около получаса. По окончании перегрузим малинку. Для проверки работоспособности можем войти в консоль freeswitch (выход из консоли quit или же CTRL+D):

sudo fs_cli

Первоначальная настройка FreeSWITCH

После установки FreeSWITCH почти готов к работе, в нём по умолчанию есть 20 абонентов с номерами 1000-1019. Пароль по умолчанию для абонентов VoIP указан в файле /usr/local/freeswitch/conf/vars.xml и равен 1234.

В директории /usr/local/freeswitch/conf/derectory/default находятся 20 xml файлов, каждый из которых отвечает за абонента с соответствующим номером. Можем добавлять абонентов копированием файлов с подстановкой данных.

Из коробки freeswitch частично работоспособен, имеет довольно обширный диалплан.

Зарегистрировав VoIP телефон (софтфон) можем попробовать произвести несколько тестовых звонков: набрав номер 500 попадаем в демо IVR меню Freeswitch на английском языке. Позвонив на номер 779 используется расширение eavesdrop: после набора номера идёт автоматический ответ на SIP сервере и посылка звонящему звуковых тональных сигналов. Эти два направления и будем использовать в дальнейшем. Небольшое замечание при полностью дефолтном пароле при наборе номера идёт задержка 10 секунд.

Отредактируем файлы конфигурации: сменим дефолтный пароль, изменим язык голосовых сообщений на русский, так же поменяем профиль с external на internal.

 sudo nano /etc/freeswitch/vars.xml
Измененные строки файла vars.xml
<X-PRE-PROCESS cmd="set" data="default_password=1111"/>
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/ru/RU/vika"/>
<X-PRE-PROCESS cmd="set" data="use_profile=internal"/>
<X-PRE-PROCESS cmd="set" data="default_country=RU"/>

Так же исправим одну строчку с указанием неправильной директории звуковых файлов в файле: etc/freeswitch/lang/ru/ru.xml приводя строку к виду

<language name="ru" sound-prefix="$${sounds_dir}/ru/RU/vika" tts-engine="cepstral" tts-voice="elena">

Перегружаем сип сервер (можно в консоли fs_cli набрать reloadxml), снова подключаемся sip клиентом, изменив пароль. Набираем номер 500 и уже слышим приветствие FreeSWITCH в IVR меню уже на русском языке. Можно собрать из существующих при установке звуковых файлов FreeSWITCH нужную вам фразу, можно использовать заранее записанный *.wav файл, указав полный путь, в файле /etc/freeswitch/ivr_menus/demo_ivr.xml.

Перейдём к диалплану (номерной план, dialplan) — формальное описание схемы маршрутизации и обработки телефонных звонков. Номерной план подробно описывает, что система должна делать со входящими и исходящими звонками: передавать их дальше, сохранять, отвечать на них самостоятельно и так далее. Основные настройки по умолчанию находятся в файле /etc/freeswitch/dialplan/default.xml

Отредактируем его, найдём строчку с номером 779 и добавляем всего одну строчку в секции eavesdrop с номером 779. <action application="system" data="/home/pi/wakeup.sh "/>, которая и запустит ранее сделанный скрипт с посылкой магического пакета.

Номер (направление) я тоже решил поменять на 7777, можно указать любой, в качестве своего ПИН-кода. В итоге секция у меня приняла такой вид:

Секция eavesdrop файла /etc/freeswitch/dialplan/default.xml
<extension name="eavesdrop">
      <condition field="destination_number" expression="^7777$">
	<action application="answer"/>
<action application="system" data="/home/pi/wakeup.sh "/>
	<action application="set" data="eavesdrop_indicate_failed=tone_stream://%(500, 0, 320)"/>
	<action application="set" data="eavesdrop_indicate_new=tone_stream://%(500, 0, 620)"/>
	<action application="set" data="eavesdrop_indicate_idle=tone_stream://%(250, 0, 920)"/>
	<action application="eavesdrop" data="all"/>
      </condition>
    </extension>

Сейчас при наборе номера 7777 идёт автоматический ответ, запуск скрипта, и посылка тоновых сигналов.

Небольшое примечание: как вы помните утилита etherwake запускается с правами суперпользователя. При установке SIP сервера у нас создается новый простой пользователь freeswitch, не имеющий пароля. Нужно разрешить ему запускать скрипт от Sudo, с посылкой магического пакета. Есть два варианта: первый разрешаем ему выполнять любые действия без ввода пароля от sudo, второй вариант в sudoers разрешаем запускать без пароля только определённые программы (в данном случае скрипта).

Я применил первый вариант, для этого создаем группу для пользователей, которые будут использовать sudo без ввода пароля, добавляем пользователя freeswitch к этой группе:

sudo groupadd sudo
sudo usermod -a -G sudo freeswitch
sudo nano /etc/sudoers.d/freeswitch-nopasswd

Создаём ещё один файл. Содержимое файла всего одна строчка:

freeswitch ALL=(ALL) NOPASSWD: ALL

   Изменим немного демонстрационное голосовое меню (IVR), установленное по умолчанию:

sudo nano /etc/freeswitch/ivr_menus/demo_ivr.xml

Добавим всего одну строку с регулярным выражением, после строки с трансфером добавочного номера (цифры номерного плана 1000-1019) в XML features передадим набранный номер 7777, с командой на  выполнение скрипта, в дефолтное направление:

<entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML features"/> 
<entry action="menu-exec-app" digits="/^(7777)$/" param="transfer 7777 XML default"/>

Сейчас, в локальной сети, набрав номер 5000 попадаем в IVR меню и далее набрав наш номер 7777 (ПИН-код), отрабатывает скрипт и в качестве ответа слышим тоновые посылки.

Настроим выход SIP сервера во внешнюю сеть. Для этого перейдем к небольшой настройке VoIP шлюза. Зайдя в интерфейс GSM шлюза (по умолчанию: адрес 192.168.5.150   логин admin и паролем password).  Изменим IP адрес, можем поменять имя пользователя и пароль на подключение к шлюзу.

По умолчанию у нас имеется 2 Sip аккаунта. Для примера буду использовать один из них с именем 20001 и паролем на подключение pincode20001.

Перейдём опять к настройке FreesWITCH. Отредактируем профиль internal, в файле /etc/freeswitch/sip_profiles/internal.xml. В секции gateways добавим возможность чтения xml файлов из директории internal и принудительно выставим параметры ext-rtp-ip и ext-sip-ip указав в них IP адрес нашего SIP сервера (малинки). Без этих указания этих параметров профиль internal  у меня подымался на некорректном IP адресе и соответственно не работал.

sudo nano /etc/freeswitch/sip_profiles/internal.xml
Изменения в файле профиля internal.xml
<gateways>
<X-PRE-PROCESS cmd="include" data="internal/*.xml"/>
  </gateways>
...
   <param name="ext-rtp-ip" value="192.168.1.101"/>
    <param name="ext-sip-ip" value="192.168.1.101"/>

Создадим директорию для xml файлов шлюза  и файл с настройками подключения к GSM шлюзу:

sudo -u freeswitch mkdir /etc/freeswitch/sip_profiles/internal
freeswitch nano /etc/freeswitch/sip_profiles/internal/GSM.xml
Содержимое файла /etc/freeswitch/sip_profiles/internal/GSM.xml
<include>
 <gateway name="GSM">
<param name="username" value="20001" />
<param name="password" value="pincode20002" />
<param name="proxy" value="192.168.1.101" />
<param name="from-domain" value="192.168.1.101"/>
 <param name="ignore_early_media" value="true"/>
 <param name="expire-seconds" value="600" />
 <param name="register" value="true" />
 <param name="register-transport" value="udp" />
<param name="retry-seconds" value="60" />
 <param name="context" value="default" />
<param  name="caller-id-in-from" value="true"/>
        </gateway>
 </include>

Перегружаем freeswitch: sudo systemctl restart freeswitch.service. Заходим в консоль freeswitch и проверяем состояние профилей FS, задав команду sofia status

Как видим появился дополнительный профиль GSM, с состоянием REGED (зарегистрирован), профили internal и internal.gsm подняты на правильном интерфейсе, профиль external на неверном, можем отредактировать его в соответствующем файле.

Создадим  файл, который отвечают за входящую GSM шлюза с  freeswitch сервером. В файле from_GSM.xml все входящие звонки, поступающие от 20001 запускают IVR меню. Набрав свой ПИН-код запускается скрипт, в котором мы ранее прописали запуск ПК. Ну а далее, помощью программы удаленyого доступа можно соединится с компьютером с любого места.

sudo -u freeswitch nano /etc/freeswitch/dialplan/default/from_GSM.xml
Содержимое файла from_GSM.xml
<include>
<extension name="call from GSM">
<condition field="destination_number" expression="^20001$">
 <action application="answer"/>
 <action application="sleep" data="800"/>
<action application="set" data="transfer_ringback=$${ru-ring}"/>
 <action application="ivr" data="demo_ivr"/>
 <action application="hangup"/>
    </condition>
</extension>
</include>

Перегружаем сервер IP телефонии и проверяем уже через сеть мобильного оператора. Если всё сделано правильно, то можно включать ПК из любого места набрав номер GSM шлюза.
Так же можно и продублировать любую команду управления "Умным домом", не зависимо от наличия интернета или удаленного доступа к системе домашней автоматизации.

Способ второй, удаленное включение ПК с помощью системы домашней автоматизации MajorDoMo

Этот способ гораздо проще, рассмотрим его на примере Raspberry Pi с установленной системой УД MajorDoMo с базового образа. Первым делом после установки обновляем систему MajorDoMo.

Переходим в Панель Управления - Система - Маркет дополнений. В разделе Оборудование находим модуль WoL и добавляем его в нашу систему домашней автоматизации.

В пункте Меню - Устройства, добавился Раздел WakeOnLan, перейдём к нему и запустим сканер обнаружения:

В помощи к модулю есть примеры вызова этого модуля из сценария.

Дальше создаём  вначале сценарий, затем элемент управления.
В поле код я прописал следующее:

include_once(DIR_MODULES . 'wol/wol.class.php');
$wake = new wol();
$wake->WakeOnLan('192.168.1.255','38:D5:47:78:3B:35');

В меню Объекты панели управления – добавляем новый раздел, используя недавно созданный сценарий:

В итоге в меню Сервис на главной странице нашей домашней системы автоматизации получаем новый элемент (кнопку) WoL PC, нажав которую запускаем включение ПК.

Организовать доступ к своей системе домашней автоматизации MajorDoMo можно разными способами. Наиболее быстрый и простой - использование сервиса CONNECT и мобильного приложения MajorDroid от создателей системы MajorDoMo.

Можно использовать или первый или второй способ, а можно и продублировать выполнение любой команды системы домашней автоматизации MajorDoMo через SIP сервер FreeSWITCH.