2015년 12월 16일 수요일

Amazon Dash Button을 다른 용도로 사용하기

 아마존에서 판매하고 있는 Dash button을 구해 보았다. 이 버튼은 버튼에 특정 제품을 등록해 놓으면 버튼을 누르는 것 만으로 아마존으로 자동으로 주문이 되도록 되어 있어 화장지, 면도크림, 기저귀 등 반복적으로 주문해야 하는 제품을 매우 손쉽게 주문할 수 있도록 해 준다.

아마존 prime member면 개당 $4.99에 구입할 수 있다. (이 정도 가격이면 거의 하드웨어 가격 그대로거나 약간의 손해를 보고 판매하는 수준이라고 본다. 아마존의 킨들과 마찬가지로 비지니스 모델이 하드웨어는 손해를 보고 팔아도 그를 통해 아마존에서 반복적인 주문을 하도록 하는게 목적이기 때문)





이 버튼은 무선랜을 사용해서 통신을 하는데 인터넷을 검색해 보니 Ted Benson이라는 사람이 이 버튼을 해킹(?)해 다른 용도로 사용하는 방법을 소개해 놓았다. (How I hacked Amazon's $5 WiFi button to track baby data)

간단하게 설명하자면 버튼이 눌려도 주문하지 않도록 하고, 버튼의 ARP 패킷을 검출해 버튼이 눌린걸 알아내는 것이다. Ted는 2개의 dash 버튼을 사용해 하나는 아기가 똥을 쌌을 때 누르고, 다른 하나는 잠에서 깨었을 때 눌러 각각이 눌린 시간이 구글 스프레드쉬트에 자동으로 기록되도록 만들어 놓았다.

원 글에서는 python과 scapy를 사용해서 프로그램을 만들었는데 scapy는 설치하기가 까다롭고 이번에 필요한 것 이상의 기능을 가지고 있다보니 좀 무거운 느낌이 든다. 그래서 Bob Steinbeiser가 만든 python 코드를 수정해 보았다.

Dash 버튼을 사용하려면 먼저 설정을 해 줘야 한다.

스마트폰에서 Amazon 앱을 실행한다.


앱 좌측 상단의 메뉴 버튼을 클릭한다.


메뉴에서 Your Account를 선택한다.


화면을 아래로 내려 Dash Devices 에서 'Set up a new device'를 선택한다.



기본적으로 화면에 그림으로 잘 설명되어 있으므로 그대로 따라하면 된다.



자신이 현재 연결되어 있는 공유기의 SSID와 암호를 넣어준다. 


 이 단계에서 Dash button의  버튼 바로 위의 LED가 파란색으로 깜빡일 때 까지 흰색 버튼을 누르고 있는다.


 Dash button은 무선네트웍 정보(SSID, 암호)를 전달받기 위해 초음파를 사용하고 있다.위의 그림처럼 폰의 스피커와 Dash button의 마이크(흰색 버튼 반대쪽의 조그마한 구멍)을 가까이 가져다 대고 'Connect' 버튼을 누른다. 잠시 기다리면 깜빡이던 파란색 불빛이 켜져 있게 된다. 그러면 정상적으로 정보가 전달된 것이다.


마지막 단계로 Dash button에 특정 상품을 등록하는 단계인데 여기서는 이 단계에서 우측상단에 있는 'X' 버튼을 눌러 상품을 등록하지 않아야 한다. (여기서 상품을 등록해 놓으면 버튼을 누를 때 마다 해당 상품이 자동주문됨)

이제 버튼이 눌린걸 감지하기 위한 코드를 실행하면 된다. 여기서는 Raspberry Pi를 사용했다.

코드는 아래와 같다.

$ cat dash-socktest.py
import socket
import struct
import binascii





rawSocket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003))


while True:
    packet = rawSocket.recvfrom(2048)

    ethernet_header = packet[0][0:14]
    ethernet_detailed = struct.unpack("!6s6s2s", ethernet_header)

    arp_header = packet[0][14:42]
    arp_detailed = struct.unpack("2s2s1s1s2s6s4s6s4s", arp_header)

    # skip non-ARP packets
    ethertype = ethernet_detailed[2]
    if ethertype != '\x08\x06':
        continue

    src_mac = binascii.hexlify(arp_detailed[5])
    dst_mac = binascii.hexlify(arp_detailed[7])
    src_ip = socket.inet_ntoa(arp_detailed[6])
    dst_ip = socket.inet_ntoa(arp_detailed[8])

    # print source_mac

    if src_mac == '001122334455' and dst_ip != '192.168.0.1':
        print "Tide button pressed!"
        print    "SrcIP = " + src_ip + ", SrcMAC = " + src_mac + \
                    ", DstIP = " + dst_ip + ", DstMAC = " + dst_mac


$

위에서 빨간색 001122334455 부분은 자신의 Dash button의 MAC address로 바꿔준다.

위의 코드를 실행할 때는 sudo로 실행시켜 줘야 한다.

$ sudo python dash-socktest.py
Tide button pressed!
SrcIP = 0.0.0.0, SrcMAC = 001122334455, DstIP = 192.168.0.20, DstMAC = 000000000000

위와 같이 버튼이 눌릴 때 마다 버튼의 정보를 출력해 준다.
코드를 백그라운드에서 실행하려면 다음과 같이 하면 된다.

$ (sudo python dash-socktest.py &)
$

위의 코드는 단순히 버튼이 눌리면 그 정보를 출력하도록 되어 있지만 이 코드를 약간 수정하면 원하는 여러가지 동작을 하도록 쉽게 만들어 줄 수 있다.