시놀로지 NAS 를 사용하면서 24시간 사용이 필요치 않기에
필요시마다 WOL 을 이용하여 부팅을 하고 있다.
구글 홈 미니와 Sonoff 를 연동해서 조명을 켜고 끄는데 컴퓨터도 켤 수 있지 않을까? 해서 생각을 해보니
다음과 같은 방법으로 사용이 가능하다.
1. 준비물
- 구글 홈 또는 구글 홈 미니 기기
- 라즈베리 파이 (Web 요청을 받으면 자신의 네트워크에서 WOL 매직 패킷을 전달하기 위함)
- WOL 이 작동 하는 컴퓨터
2. 설계
작동 방식 구성은 다음 처럼..
- 구글 홈에게 컴퓨터 켜 라고 말하면 IFTTT 에서 구글 홈 명령을 해석하여 특정 URL 을 호출
- 라즈베리파이 웹 서버에서 해당 요청을 받으면 WOL 매직 패킷 보내기
3. 방법
3-1. 구글 홈 앱에서 루틴 설정 하기.
다음을 말하면 조건에 "컴퓨터 켜", "컴퓨터 켜 줘" 문장을 등록 한다.
필요 하다면 다른 문장을 추가 해도 좋다.
"Google 어시스턴트가 할 행동" 에는 IFTTT 가 알아 들어야 할 문장을 등록해야 하는데 영어만 지원 되기 때문에
작업 추가를 클릭 -> "my desktop on" 이라고 등록 한다.
한번 더 작업 추가를 눌러-> 인기 있는 작업을 누르고
가장 아래에 말하기 기능에 톱니 모양을 누른다.
"내 컴퓨터를 켭니다" 라고 등록한다. (문장을 각자 알아서 수정)
3-2. 라즈베리파이에 Web 요청 처리 만들기
라즈베리파이는 WOL 로 켤 컴퓨터와 같은 네트워크상에 존재 해야 한다.
그리고 ngnix 또는 apache 와 같이 WAS 가 설치되어 있고 php 가 연동이 되어 있는 상태여야 한다. (was 및 php 구성은 구글 검색으로 설치)
필자는 nginx 와 php 7.0 이 연동되어 작동 중이므로 해당 환경으로 설명한다.
/var/www/html 경로에 wol 이라는 디렉토리를 생성하여 wol.php 코드를 작성 한다.
전체 경로 (/var/www/html/wol/wol.php)
<?php
function wol($broadcast, $mac)
{
if (strstr($mac, "-"))
{
$mac_array = explode('-', $mac);
}
else
{
$mac_array = explode(':', $mac);
}
$hwaddr = '';
foreach($mac_array AS $octet)
{
$hwaddr .= chr(hexdec($octet));
}
// Create Magic Packet
$packet = '';
for ($i = 1; $i <= 6; $i++)
{
$packet .= chr(255);
}
for ($i = 1; $i <= 16; $i++)
{
$packet .= $hwaddr;
}
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($sock)
{
$options = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, true);
if ($options >=0)
{
$e = socket_sendto($sock, $packet, strlen($packet), 0, $broadcast, 7);
socket_close($sock);
}
}
}
$AUTH_KEY="";
$PC_TYPE="";
$broadcast_ip = "";
$mac_addr = "";
$WOL_KEY="RANDOMKEY";
if( isset($_GET['wolkey']) ){ $AUTH_KEY=$_GET['wolkey']; }
if( isset($_GET['wolpc']) ){
$PC_TYPE=$_GET['wolpc'];
}
else{
$res_data = ['result' => 'fail'];
header('Content-type: application/json');
echo json_encode($res_data);
return;
}
if( strcmp($WOL_KEY, $AUTH_KEY) != 0 ) {
$res_data = ['result' => 'fail'];
header('Content-type: application/json');
echo json_encode($res_data);
return;
}
// PC Type is NAS or PC
if( strcmp($PC_TYPE, "NAS") == 0 ){
$broadcast_ip = "192.168.0.2";
$mac_addr = "00-11-22-33-44-55";
$res_data = ['result' => 'success', 'pctype' => 'NAS'];
}else if( strcmp($PC_TYPE, "PC") == 0){
$broadcast_ip = "192.168.0.3";
$mac_addr = "AA-BB-CC-DD-EE-FF";
$res_data = ['result' => 'success', 'pctype' => 'PC'];
}else{
$res_data = ['result' => 'fail'];
header('Content-type: application/json');
echo json_encode($res_data);
return;
}
wol($broadcast_ip, $mac_addr);
header('Content-type: application/json');
echo json_encode($res_data);
?>
위 코드 중$WOL_KEY 에 있는 값은 적당하게 긴 문자열로 만들어 준다. (WOL Url 에 최소한의 보안을 위함)
// PC Type is NAS or PC 주석 아래에 WOL 컴퓨터의 IP 와 MAC 주소 값을 입력해 준다.
필요한 컴퓨터가 많다면 $PC_TYPE 의 문자열과 else if 부분을 복사/붙여넣기 하여 추가 하면 된다.
php 가 작성이 완료 되었다면 라즈베리 파이에서 다음 명령으로 시험을 해본다.
curl "http://127.0.0.1/wol/wol.php?wolkey=RANDOMKEY&wolpc=NAS"
RANDOMKEY 와 NAS 는 각자 세팅에 맞게 변경 한다.
위 테스트로 WOL 이 작동 하면 이제 외부에서 url 호출만으로 WOL 을 사용 할수 있게 된다.
※ IFTTT 와 연동 해야 하므로 공유기를 사용 한다면 라즈베리파이의 WAS 포트를 포트 포워딩 해야 한다.
라즈베리파이의 WAS 포트는 80 이고 포트 포워딩은
외부 포트는 8080 , 내부 포트는 80으로 포트 포워딩을 설정 하였다면
WOL 작동 주소는 다음과 같이 된다.
http://공인IP:8080/wol/wol.php?wolkey=RANDOMKEY&wolpc=NAS
3-3. IFTTT 에서 구글 홈 문장을 분석하는 애플릿 만들기
IFTTT 에 접속하여 Explore 를 클릭
+ 버튼을 눌러 애플릿 생성으로 들어 간다.
+ This 를 클릭한다.
google 을 검색하여 Google Assistant 를 클릭
(Google Assistant 가 나오지 않거나 say a simple phrase 항목이 나오지 않는 다면 IFTTT 와 구글 계정 연동이 먼저 되어 있야 나오게 된다.)
Say a simple phrase 를 클릭
What do you want to say? 항목에 루틴에서 설정 하였던 "my desktop on" 을 입력
What do you want the Assistant to say in response? 항목에는 해당 애플릿 수행 후 구글 홈에서 말 할 TTS 문장을 입력한다. (TTS 재생이 필요 없다면 굳이 하지 않아도 되며 한국어는 지원하지 않는다.)
아래로 내려서 "Create trigger" 버튼을 클릭
+ That 을 클릭
webhook 을 검색하여 Webhooks 선택
Make a web request 선택
URL 항목에 라즈베리파이의 WOL URL 을 작성하고 Create Action 버튼을 눌러 애플릿 작성을 완료 한다.
구글 홈에서 "컴퓨터 켜" 라고 명령 하게 되면 다음과 같은 순서로 작동을 한다.
구글 홈 -> IFTTT -> 라즈베리 파이 PHP 호출 -> WOL 패킷 송신.
잘 되지 않는 경우 IFTTT 의 로그에서 구글 홈 명령이 전달이 되었는지, 라즈베리파이의 URL 은 정상적으로 호출 되는지 등을 확인 하면 된다.
'강좌 > IoT' 카테고리의 다른 글
구글 홈 - 네스트 미니, 네스트 허브 출시 (0) | 2020.06.30 |
---|