레이블이 amazon인 게시물을 표시합니다. 모든 게시물 표시
레이블이 amazon인 게시물을 표시합니다. 모든 게시물 표시

2016년 7월 6일 수요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

이전 포스트 (IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선랜 AP 모드 활용)에서 설명했던 것 처럼 IoT 디바이스를 무선랜에 접속하도록 하기 위해서는 접속할 공유기의 SSID, password를 넘겨줘야만 한다.

두번째 방법으로는 초음파를 사용해 SSID, password를 전송하는 것이다. 스마트폰에 있는 스피커는 가청 범위의 주파수 뿐 아니고 사람이 들을 수 없는 초음파도 재생이 가능하다. 그러므로 SSID, password를 FSK등의 방식으로 변조(modulation)하여 스피커로 플레이 하면 된다.

예전에 모뎀을 써 봤거나 팩스를 써 보면 삐~찌지지직~ 하는 소리를 들어 본 적이 있을 것이다. 그렇게 소리를 만드는데 그 소리의 주파수를 좀 더 높게 해서 사람 귀에는 안 들리는 소리로 만들어 플레이하는 것이다.



이 방식을 사용하는 디바이스로 아마존의 Dash 버튼이 있다. 아이폰의 화면에서 dash 버튼을 접속시킬 공유기의 SSID, password를 입력 받은 후 dash 버튼을 설정 모드로 만들어 주면 dash 버튼은 마이크를 통해 초음파 신호를 받아들여 소리를 복조(demodulation)하여 SSID, password를 알아낼 수 있다.

- 스마트 폰에서 공유기 정보를 입력


- Dash 버튼을 설정 모드로 변경한 후 아이폰의 스피커와 dash 버튼의 마이크를 일직선이 되게 가까이 가져다 놓는다. 그러면 아이폰이 스피커를 통해 변조된 신호를 출력하고 dash 버튼은 마이크를 통해 그 소리를 받아 공유기 설정정보를 얻게 된다.

정상적으로 공유기 설정정보를 얻으면 dash 버튼은 그 정보로 공유기에 접속한 다음 아이폰에 성공 메지시를 전송해 준다.

--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선 랜 AP모드 활용

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)

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 &)
$

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