----------------------------------------------------------------------------

[목차]

1. IoT 사물 / 인증서 / 정책 생성

2. Python + paho-mqtt 를 사용하여 주제 구독, 게시 및 테스트

3. AWS Lambda에 연결하고 텔레그램 봇 메시지 보내기

----------------------------------------------------------------------------


2. Python + paho-mqtt 를 사용하여 주제 구독, 게시 및 테스트


AWS IoT 용 파이썬 패키지도 있는 것 같았지만, 메서드명도 괴랄하고 어떻게 쓰는지 한눈에 안보여서 사용하지 않았다.

Prepare your Raspberry Pi to work with AWS IoT (Getting started with IoT #2)

글을 참고하여, 작성해보았는데, 잘되어서 걍 이거 쓸 듯.


테스트용 AWS MQTT 클라이언트 사용

우선 AWS 에서 MQTT 테스트용 클라이언트를 제공한다.

일단 임의로 test/1 토픽을 구독해본다



구독할 토픽 이름을 임의로 설정하고, 주제 구독을 누른다. 와일드카드(+) 도 사용가능하다.




그럼 이런 화면이 나오는데, 좌측에 구독 중인 주제들이 보이고, 구독한 주제에 대해 메시지가 있으면 하단에 표시된다.




구독하고 있는 주제로 바로 게시도 가능하니, 해볼 경우 이렇게 나온다.



라즈베리파이 + Python

(사실 꼭 라즈베리일 필요는 없다. 나도 처음 해볼 땐 파이에서 했지만, 지금은 맥에서 그냥 진행.)


특정 버전 이상의 ssl 이 필요하지만, 내 기억에 파이에 기본으로 설치되어 있었던 것으로 기억한다.

파이썬3 기준으로 할거니 2로 쓰고 싶으신 분은 알아서 필요한 부분을 수정.


pip 이 없다면 이것부터 설치

$ curl https://bootstrap.pypa.io/get-pip.py | sudo python3


paho-mqtt 설치

$ sudo python3 -m pip install paho-mqtt


Python 코드는 아래처럼 작성하면 된다. 적당히 mqtt.py 정도로 만들자.

대충 mqtt 연결을 수립하고, 연결되면 test/2 주제를 구독하기 시작하며,

test/2 주제로 메시지가 게시되면 json 으로 load 해서 message 키의 값을 출력하는 코드이다.




--------------------------------------------------

[유의사항]

1.  클라이언트 생성자에 clean_session 인자가 있는데, True(기본값)로 해야한다. False 로 할시 AWS 에서 연결을 끊어버린다.

2. publish 할때 retain 인자는 False(기본값)로 해야한다. True 로 보내면 마찬가지로 AWS 에서 연결을 끊어버린다.

3. 같은 아이디로 두개 이상이 연결되면 둘 다 연결이 종료된다.

4. AWS IoT 에서 qos 0 은 "0번 이상 전달"을 의미한다. qos 2 는 지원되지 않는다.


* 자세한건 AWS IoT 메시지 브로커 - 프로토콜 문서 참고.

--------------------------------------------------



publish 도 테스트해보려고 메인 루프는 주석처리 해뒀으니, 인터프리터 모드로 실행

$ python3 -i mqtt.py



정상적으로 연결되었을 경우 connected 로그가 뜬다.


혹시 ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown

같은 에러가 뜬다면, AWS 에서 인증서를 활성화하지 않은 경우니 활성화해주고 다시 시도해보자.


이후 아래쪽에 주석 처리 해둔대로 publish 를 시도해보면


>>> payload = json.dumps({'action': 'test'})

>>> mqtt_client.publish('test/1', payload, qos=1)



이렇게 아까 열어둔 mqtt 테스트 클라이언트에서 정상적으로 publish 된 것을 확인할 수 있다.


마찬가지로 파이에서 구독하고 있는 test/2 주제로 게시하면, 파이에서 on_message 함수가 실행되어 로그가 찍히는걸 확인할 수 있다.


메시지는 꼭 json 일 필요는 없다. 코드를 보면 알겠지만, 보낼땐 dump 하고 받을땐 load 한다. 다만 걍 json 을 쓰자..ㅋㅋ

  1. 박재완 2020.09.14 23:40

    안녕하세요. 이런 자료 올려주셔서 정말 감사합니다. pub은 잘 되는걸 확인 하는데 sub 와 관련되서는 어떻게 확인 해야 하는지 알수 있을까요?

    • BlogIcon iolate 2020.09.15 19:53 신고

      파이에서 subscript 하게 되면 메시지를 받았을 때 호출되는 코드가 있을텐데 (글에서는 아마 on_message 함수일려나요)
      거기서 로그를 출력시켜보시면 될 것 같습니다

  2. maxkun 2021.08.15 15:32

    안녕하세요
    글을 읽다가 제가 이쪽 지식이 없어서...
    지금 글은 aws iot 상 테스트로 기기등록하고 파이썬이랑 연동시킨 것 같은데
    혹시 시중의 스마트플러그 같은 제품을 구매해서 aws iot에 등록할 수도 있나요?

    • BlogIcon iolate 2021.08.26 01:38 신고

      어떤 제품인지 모르겠지만 보통은 안될겁니다

그냥 나보고 만들어라고 하면 http 리퀘스트 만으로 어떻게 퉁쳤겠지만... 다른 사람의 서비스 제작을 도와줄 필요가 있었다.

최대한 AWS 의 솔루션을 사용하는게 향후 유지관리에도 좋을 것이고, AWS IoT 를 써보고도 싶었고, 서버->디바이스 요청도 쉽게 보낼 수 있게 되니, 한번 써보고 정리하는 글. 사실 친구놈 보라고 쓰는거다 휘수야 보고 있니


우선 AWS IoT 에 대한 특징 같은건 다른 글에 많으니 다 생략하고 내가 찾는데 시간이 걸렸거나, 관심이 있는 부분만 기술한다.

즉 mqtt 가 뭔지, 주제 구독이 뭔지 이런건 생략.


이번 글의 목표는, 라즈베리파이에서 mqtt 주제를 publish, subscribe 해보고 라즈베리파이에서 publish 된 주제를 통해 aws lambda 함수를 실행시켜서 텔레그램 알림을 받는 것 까지.


----------------------------------------------------------------------------

[목차]

1. IoT 사물 / 인증서 / 정책 생성

2. Python + paho-mqtt 를 사용하여 주제 구독, 게시 및 테스트

3. AWS Lambda에 연결하고 텔레그램 봇 메시지 보내기

----------------------------------------------------------------------------


1. [AWS 콘솔] IoT 사물 / 인증서 / 정책 생성



AWS 에서 IoT 대시보드로 이동한 후 좌측 관리 - 사물 - 사물 등록



지금은 한개만 등록할거니 단일 사물 생성.




관리의 편의성을 위해 유형이나 그룹 등등을 설정할 수 있지만, 지금은 필요없다. 이름만 적당히 생성하고 다음으로 넘어가자.

이 이름은 thing name 이자 client id 로 사용된다.




ioT 디바이스를 인증하고 암호화 통신을 위해 사용하는 인증서를 선택해야한다.

이미 만든 인증서가 있다면 그걸 사용해도 되지만 없을테니 이 창이 뜰텐데, 권장하는 방법을 쓰자! ㅋㅋㅋ




적혀있듯이 퍼블릭 키와 프라이빗 키는 이 창이 지나가면 다시는 받을 수 없다.

혹시나 못 받았다면 인증서를 새로 만들면 되니 부담은 안가져도 되지만, 잘 가지고 있도록 하자.


활성화는 말 그대로 이 인증서를 사용가능하게 할건지 설정하는건데, 조금 있다가 해도 된다.


정책은 아마 만들어진 정책이 없을테니, 0개 선택으로 두고 일단 넘어가면 된다.




IoT 디바이스가 어떠한 작업을 할 수 있는지 그 권한을 설정하는 정책(Policy)를 만들어야 한다.

참고로 이 정책은 개별 디바이스가 아니라 인증서에 연결된다.


즉, 같은 디바이스라도 사용하는 인증서에 따라 정책이 달라진다.

물론 인증서와 디바이스도 AWS 콘솔에서 연결 작업은 해줘야하지만.


IoT 대시보드 좌측 메뉴에서 보안 - 정책을 찾아가자.



이름을 적당히 설정해주고, 권한을 넣어주자.


작업 항목에는 

iot:Publish / Subscribe / Connect / Receive / UpdateThingShadow / GetThingShadow / DeleteThingShadow

7개 항목이 있지만 지금은 귀찮으니 와일드카드 * 로 사용.

다른건 이름만 봐도 알겠는데 Connect와 Receive 는 왜 있는지 모르겠다.. 나중에 찾아봐야지


리소스 ARN 은 토픽이나 shadow의 리소스 arn 을 넣으면 된다.

arn:aws:iot:<REGION>:<USER ID>:topic/<TOPIC NAME>

의 형태. 참고로 "토픽 이름"에서 와일드카드는 * 이 아니라 + 다.


일단은 테스트 목적이니 이것도 대충 와일드카드로 만들자




그 다음, 정책을 인증서에 연결해줘야 한다.

디바이스에 정책을 연결하는게 아님을 주의.


인증서 메뉴에서 아까 만든 인증서에 방금 만든 정책을 연결해주자.


아까 생성할때 활성화를 안했다면 여기서 활성화를 해줄 수 있다. 나중되면 까먹을테니 지금 활성화 ㄱㄱ





마지막으로 좌측 하단 설정에 들어가서 엔드포인트 URL 을 확인한다.


라즈베리파이3 기준  bluez 는 기본으로 설치가 되어있는 듯.


파이썬 라이브러리 설치

$ apt install python-bluez

..는 python2 밖에 안된다.


$ sudo apt install python3-dev libbluetooth-dev

$ sudo pip3 install pybluez



iBeacon 스캔

몇가지 예제들이 있던데, 내가 좀 수정함


https://github.com/iolate/rasp-ble-scanner



(작성 중...)

어차피 SSH 연결해서 쓸텐데, 첫 연결시에 모니터와 키보드 마우스를 연결해야하는게 너무 귀찮고 번거로웠다.


headless 설치법을 발견해서 정리.


1. SSH 활성화

컴퓨터에서, 라즈베리파이 부트 파티션 루트에 ssh 파일을 생성


2. 와이파이 연결 설정

마찬가지로 루트에 wpa_supplicant.conf 파일 생성 후 아래 내용 입력

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="<ssid>"
	psk="<password>"
}


3. SSH 연결

pi@raspberrypi.local 로 ssh 연결 시도.

비밀번호는 raspberry

passwd


hostname 변경

그냥 raspi-config 로 바꾸는게 낫다


sudo raspi-config

 -> 2 Network Options - N1 Hostname


timezone 변경

sudo timedatectl set-timezone Asia/Seoul



99. (내가 편할려고 쓰는) 기타


apt 리포지토리 변경

/etc/apt/sources.list


deb http://ftp.kaist.ac.kr/raspbian/raspbian/ stretch main contrib non-free rpi


apt 기본


sudo apt update
sudo apt upgrade

sudo apt install vim screen


Kodi 설치

sudo apt install kodi


Heroku는 Git 을 기반으로 패키지를 업로드한다.

프로젝트와 git 은 이미 만들어져있다고 가정하고, 해당 디렉토리 아래에서 진행한다.


참고로 Python 3.6


0. Prerequisite

heroku cli 바이너리가 필요한데, 맥에서는 그냥 brew 로 설치가능하다.

$ brew install heroku


Python 버전은 3.6 그리고 virtualenv 패키지가 여러개가 있는데, heroku 는 pipenv 를 쓰는 듯?

$ pip install pipenv


$ pipenv install

로 현재 경로에 virtualenv 환경을 만들고,

$ pipenv shell

을 입력하면 알아서 source 해준다.


1. virtualenv 패키지 설치

$ pipenv install 패키지명

으로 설치하면 Pipfile 에 알아서 넣어줌. 다른 방법은 모르겠음.


gunicorn 도 venv 안에 깔아줘야하는지 모르겠지만, 난 그냥 깔아줬다.


그리고 $ pipenv lock 을 하면 PipfilePipfile.lock 파일을 만들어주는데, 이것 역시 git 에 추가해주자.


2. Procfile 생성

heroku 에서 run 할때 어떤 command 를 실행해야하는지를 알려주는 파일이다.

나의 경우 
web: gunicorn flask_app:app
이렇게 한줄만 있으면 되었음.

web 은 heroku 서비스 관련 예약어이고, 그 뒤론 명령어인데
gunicorn 이란 wsgi 패키지를 이용하는 듯.

난 flask_app/__init__.py 의 형태지만,
프로젝트 루트의 flask_app.py 안에 app = Flask(name) 같은 형태도 가능하다.

마찬가지로 git 에 추가.

3. heroku cli

우선 로그인을 하자
$ heroku login

$ heroku local
로 현재 웹을 테스트 해볼 수 있다.

프로젝트 생성은
$ heroku create

이후 소스 푸시 및 빌드는
$ git push heroku master

$ heroku open

하면 주소가 열린다.


기존에 쓰던 맥북을 서버용도로 쓰려고 남겨 뒀는데, 활용도가 크지 않아 판매 후 NAS를 하나 사려다가,

어떤 제품을 고를지 머리 아파져서 그냥 Xpenology 란걸 사용하기로 했다.

데이터 용량이 크게 많이 필요한 것도 아니라서...


Xpenology 는 Synology의 핵펌인 듯


불친절 주의.

아래에서 참고를 했으니 친절을 원하면 저곳으로 가자.


1. VirtualBox 설치

알아서 설치하자


2. Jun's mod 및 DSM(Synology 펌웨어) 다운로드

정식 다운로드 경로는 잘 모르겠고, 여기저기 블로그에서 다운로드 링크를 제공한다.

나는 download.iroot.kr 에서 설치했다.


최신버전은 안될 수도 있다해서 그냥 이 곳에 있는걸 그대로 사용했다.



3. img 변환

부트로더인 synoboot.img 을 .vmdk(VMWare) 혹은 .vdi(VirtualBox)로 변환할 필요가 있다.

맥에 VirtualBox 를 설치했을테니, 

$ VBoxManage convertdd synoboot.img synoboot.vdi --format VDI

로 간단하게 변경하자.


4. VirtualBox 에서 이미지 생성

스샷도 찍어뒀지만... 귀찮다.


대충 아래와 같이 진행하면 된다.

  1. Linux (Other Linux 64-bit)로 생성
  2. RAM 1GB 이상(난 4GB)
  3. 하드디스크 추가 없이 생성
  4. 생성된 이미지 설정
    1. 프로세서 적당히 바꿔주기
    2. 저장소에서 IDE 제거하고
      1. SATA - synoboot.vdi 연결
      2. SCSI - 데이터용 하드 생성
    3. 오디오 사용안함
    4. 네트워크는 첫번째 어댑터는 NAT, 두번째 어댑터를 브리지 모드 (왜 이래야하는지 모르겠지만 이래야 잘됨)
  5. 시작
  6. find.synology.com 접속해서 기다리기
    • 네트워크 설정 때문에 2개가 나올 수 있는데, 무시하고 아무거나 하나 선택하면 됨
  7. 설정 쭉쭉하면 끗


단순 피곤에 의한 두통인줄 알고 하루종일 잤는데, 알고보니 감기였는지 새벽에 머리는 계속 아프고 잠은 오지 않았다..

머리가 아파서 딱히 뭘 할 수 있는 상황은 아니였으니, 간단한 확인작업들을 해봄.


우선 생각만하고 딱히 쓸 일은 없을 것 같았던 도어락 제어.


예전에 동아리방 도어락을 개조해보려고 할때, 무선모듈 포트 쪽으로 시도해보려고 수많은 삽질과.. 심지어 5만원 상당의 무선개폐 리모컨을 사서 분석을 시도해보기도 했지만 잘 안풀렸다.

포기하고 개폐버튼, 혹은 문고리 등의 스위치쪽으로 신호를 쏴주는걸로 변경하려고 했는데 수많은 삽질로 맥이 빠져서 당시에 걍 포기.


물론 집 도어락은 원격 제어(?)가 굳이 필요한가.. 란 생각이 들어서 오늘 이후로 다시 안쳐다볼 수도 있음.






자취방의 도어락. 우리집 도어락이 어떻게 생긴건지도 전혀 관심없었는데, 글을 쓰면서 모델명을 적어야할 것 같아서 찾아봤다.


무선모듈 같은건 지원안함.

냅다 분해부터 해보자.




구조가 생각보다 너무 단순해서 신기했다. 이전에봤던 도어락들은 안이랬는데...


우선 빨간색이 개폐버튼.


초록색은 현재 잠금 장치가 열려있는지, 닫혀있는지 확인하는 부분.

아래쪽 두 센서로 윗쪽 튀어나온 부분이 어디에 위치해있는지를 감지한다.

예전에 누가 저 센서로 저금통에 돈넣으면 소리나는걸 만드는걸 봤었는데, 곧잘 고장나서 힘들다고 그랬던 기억이 나네...


파란색은 수동개폐 스위치가 모터에 연결된 부분.. 걍 평소에 궁금했던걸 봐서 표시해봤다.


모터는 서보모터일 줄 같았는데 전원선이 전부인걸 보면 센서에 감지될 때까지 한쪽방향으로 냅다 돌리게 되어있나보다.




목적으로 돌아와서, 개폐 스위치에 저렇게 선을 달았다.

납땜을 해야 맞겠지만.. 그렇게까지 하고 싶지도 않았고 왠지 공간이 있길래 선을 집어넣어서 그냥 감기만 했다.


안되면 안되는거고.. 애매하게 안되면 나중에 납땜하면 되지란 생각..?




재조립 후 간단히 확인.

스위치가 눌렸을 때처럼, 그냥 두극을 잠깐 연결시켰다가 떼주면 된다.


대충 연결한 것 치곤 매우 잘됨.


예전에 가지고놀던 도어락은 약간의 딜레이가 필요했던 것 같은데 얘는 그런거 없이 바로바로 작동한다.




일단 위쪽으로 선을 빼두고 다시 조립...


아두이노(혹은 라즈베리파이 등등)랑 연결할때는 트랜지스터로 스위치 회로를 만들어서 사용하면 된다.


내가 만들게 된다면 다시 글을 이어서 쓸테지만.... 솔직히 이 다음을 진행할지 잘 모르겠다... 귀찮아.... ㅋㅋㅋㅋ


  1. 2019.05.15 17:50

    안녕하세요 아두이노랑 도어락을 이용해 과제를 하고 있는 학생입니다. 현재 도어락은 같은 모델을 사용하고 있는데 lock /unlock 선을 달고 나서 그냥 하면 되나요? GND 부분은 어떻게 확인 할수 있나요?

    • BlogIcon iolate 2019.05.18 12:27 신고

      릴레이 같은걸 쓰신다면 GND 를 따로 물려줄 필요가 없을거 같고, 트랜지스터 스위칭 회로 같은걸 쓴다면 GND 를 도어락 기판 어딘가의 GND 나 배터리 쪽 - 극과 물려주시면 됩니다.

  2. 2020.08.06 13:54

    안녕하세요 라즈베리파이에서 도어락 lock, unlock 제어하고 싶은데 도어락 개폐 버튼에 연결한 선을 도어락 gnd, vcc, gpio에 연결해야하나요..?

  3. 구름 2020.08.07 18:18

    (스위치가 눌렸을 때처럼, 그냥 두극을 잠깐 연결시켰다가 떼주면 된다.)
    이 부분은 잘 이해가 안 가서 댓글을 남깁니다 ㅠㅠ
    그리고 개폐스위치는 라즈베리파이 스타터키트의 버튼과 같이 회로도를 구성해도 구현이 가능할까요?

    • BlogIcon iolate 2020.08.10 16:57 신고

      푸시버튼은 두 접점이 평소엔 떨어져있다가 눌린 상태에서는 접점이 이어집니다.
      제가 뜯은 도어락에서 개폐 스위치는 푸시버튼을 사용하여, 회로의 한 부분이 평소엔 떨어져있다가 사용자가 버튼을 누르면 회로가 연결되고, 그 연결됨을 인식하여 문을 열거나 닫도록 작동이 됩니다.

      제가 전선을 추가로 납땜한 두 부분이 평소에는 떨어져있다가, 버튼을 누르면 서로 연결되는 부분입니다.
      빨간선과 검은선을 그냥 연결해주면 버튼을 누른걸로 인식하는거죠.

    • BlogIcon iolate 2020.08.10 16:59 신고

      그래서 원래라면 버튼을 눌러야 문이 열리는 구조의 도어락입니다.
      따로 선을 연결해서 쉽게 제어하는 방법이 있으면 좋겠지만.. 그걸 모르니까 '버튼을 누른척' 하는 기능을 만드는겁니다.

      버튼 대신에 전선을 두개 연결하고, 이걸 이용해서 버튼을 눌렀을 때와 동일한 신호를 만들어내면, 도어락은 버튼이 눌린 줄 알고 문을 열어주겠죠.

    • BlogIcon iolate 2020.08.10 17:02 신고

      스타터키트의 버튼은 도어락 입장에서, 버튼을 달았을때 버튼이 눌렸는지를 인식하는 코드일 것 같습니다.

      지금 상황에서는 버튼이 눌렸는지를 인식하는게 아니라, 버튼을 누른 것처럼 만들어줘야하기 때문에 해당없을 것 같네요.

  4. 코코만두 2020.08.08 00:40

    안녕하세요! 라즈베리파이 아파치 웹에서 php로 도어락을 움직이게 하고 싶어서
    <?php
    system("gpio -g mode 23 out")
    system("gpio -g write 23 out")
    ?>
    이렇게 door.php파일을 만들고

    트랜지스터 이용해 gpio 23, gnd, 도어락 스위치를 라즈베리파이에 연결했는데 gpio가 작동 하지 않네요.. php로 led 작동은 잘 되었는데 ㅠㅠ
    어떤 문제인지 혹 아시나요 ~ ?

    • BlogIcon iolate 2020.08.10 17:04 신고

      정확한 회로를 모르는 상태에서는 답변이 어렵습니다...

      그리고 제품마다 다르겠지만 버튼을 누르고 (쇼트시켜주고) 일정 시간이 흐른 후 버튼을 떼줘야 작동합니다. (사람 입장에서는 버튼을 누르자마자 뗀다고 생각하겠지만, 기계입장에서는 버튼을 누르고 0.1초 지나서 버튼을 뗀다 라고 생각을 하겠죠)

      저 코드만으로는 버튼을 꾹 누르고 있는 상태이니 작동하지 않을 것 같네요.

  5. 씨앗새싹열매 2020.12.17 04:56

    2탄도 해주세여!!!!!!!!!!!!!!

[목차]

1탄 - 아두이노 세팅 및 코딩

2탄 - 벽 스위치에 교체 설치

3탄 - HomeKit 연동


미루고 미루다가 더 늦기전에 써본다.


============================



자, 이제 홈킷서버를 구성하고, 전등스위치와 통신해야한다.

보통 라즈베리파이로 많이 하지만, 나의 경우엔 블투내장인 PI3 이상이 없기도 했고,

서버로 쓰고 있는 맥북이 있었으니 이걸 사용.


결과적으론

전등 스위치 <-- Bluetooth --> 맥북 <-- HomeKit --> iOS

이런 느낌이 된다.



1. 블루투스 통신 프로그램 제작


https://github.com/iolate/BLEHomeKit

Swift 를 써보고 싶어서 Swift 로 간단한 커맨드라인 툴을 작성하였다.

Swift 를 배우는 삼아 작성한거기도 하고, 대충 짰으며, 

SwiftSocket 이라는 오픈소스를 사용하였는데, 이 글을 올릴려고 보니 CocoaPods, git submodule 등의 설정이 전혀 안되어 있어서

그냥 주석으로 퉁쳤다. 알아서 참고만 하자.

사실 이름도 BLEHomeKit 이면 안될 것 같지만 이 역시 바꾸기 귀찮으니 패쓰.


실행이 되면 전등 스위치의 HM-10 과 연결하고, tcp 소켓을 열어서 대기한다.

daemonize 는 귀찮아서 그냥 screen 으로 실행해주는 방식을 취했다.



2. node, npm 설치 (Mac)


Homebrew 가 없다면 먼저 설치해주자.

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


그 후 node 와 npm 을 설치해준다. brew 의 npm 은 버전이 낮아서(?) 아래와 같이 따로 설치해줬던 것으로 기억.

$ brew install node --without-npm

$ curl -L https://www.npmjs.com/install.sh | sh


node 가 설치된 경로를 환경변수에 넣어준다.

나의 경우 경로는 /usr/local/Cellar/node/7.6.0/bin/ 였으며, ~/.bash_profile 에 넣어주었다.

$ vi ~/.bash_profile

export PATH="/usr/local/Cellar/node/7.6.0/bin:$PATH"


이후 source 를 하든 쉘을 다시 로그인하든 알아서 하자.



3. 의존성 및 HAP-NodeJS 설치


나의 경우 아래와 같이 진행했는데 원래 node 를 안써서 뭔가 이상한 부분이 있을 수 있음.

$ npm install -g node-gyp

$ npm install node-persist debug mdns fast-srp-hap ed25519 buffer-shims curve25519-n ip


HAP-NodeJS 패키지도 npm 에 있는 듯 하지만, 나는 설치가 안되었음.그래서 git 에서 받아서 진행했다.

아마 npm 에서 바로 받으면 위 의존성들도 설치를 해주겠지?

$ git clone https://github.com/KhaosT/HAP-NodeJS.git

$ cd HAP-NodeJS/

$ npm rebuild



4. 액세서리 파일 편집


예시 파일들을 보고 적당히 수정해주면 된다.

나는 아래 접어둔 것과 같이 구성하였다.


이것저것 테스트해보면서 대충 짠거라 코드가 좀 부끄러웠던 것 같지만,

다시 보기도, 수정하기도 귀찮으니 일단 패쓰. 잘 작동하면 됐지...


위 BLEHomeKit 으로 tcp 커넥션이 필요하며 이게 비동기로만 가능한 node 의 조건상, feedback 이 제대로 안 올 수도 있는데,

뭐... 대충 잘 작동한다. ㅋ...





5. HAP-NodeJS 실행


$ cd /path/to/HAP-NodeJS

$ node Core.js


이렇게 실행해주면 끝!

마찬가지로 daemonize 는 귀찮아서 screen 으로 실행해주면 된다.





6. HomeKit 에 등록 및 사용


등록하는 과정은 귀찮아서 생략. 걍 홈 앱을 열면 알아서 잘 해준다.
그러면 아래와 같이 컨트롤센터 가장 우측에서 제어를 하거나, 시리로 제어가 가능해진다.

    


스크린샷에 보이는 에어컨은 아두이노로 에어컨 제어하기 (IR, HomeKit) 1탄  이 글에서... 다루다 말았다. ㅋ



여튼 끝. 개선할 점이 군데군데 많지만 수개월째 매우 만족스럽게 잘 사용하고 있다.


  1. 익명 2017.09.10 09:52

    비밀댓글입니다

    • BlogIcon iolate 2017.09.13 16:29 신고

      어.. 1편에 적어둔 사용한 부품 목록으론 부족할까요..? ㅎㅎㅎ

      저도 회로도를 종이에 대충 그리고 작업해서 남아있는게 없네요ㅠㅠ

    • 익명 2017.09.13 21:26

      비밀댓글입니다

    • BlogIcon iolate 2017.09.14 02:47 신고

      hc-06 은 제가 쓴것과 블루투스 버전 및 프로파일이 달라서,, 아마 맥과 연결은 될텐데 프로그램을 새로 짜야합니다.

      뭐.. 어떻게든 릴레이 토글이 가능하고, 맥 혹은 라즈베리파이 등과 유/무선으로 연결이 가능하다면 상관없습니다만.. 프로그래밍이 필요하겠죠?

      유선도 상관없다면 아두이노 + 맥을 라즈베리파이 하나로 대체할 수 있습니다.

    • BlogIcon iolate 2017.09.14 02:50 신고

      제가 처음하는 분도 따라하실 수 있게 친절하게 쓴게 아니라 아두이노든, 회로든, 프로그래밍이든 관련지식이 전혀 없다면 제 글만으론 힘드실 것 같습니다.

      홈킷지원 제품이 국내에 잘 없는게 문제긴 한데... 키트 같은걸 판매하면 좋을텐데 아쉽네요

  2. IoT 2018.01.21 00:29

    물리적인 전등 스위치는 항상 on으로 되어있어야 작동하나요?

    • BlogIcon iolate 2018.01.21 18:44 신고

      아뇨 물리 스위치 값을 아두이노에서 읽어서 제어를 해줍니다.



기대 안하고 있다가 다른 사람이 컷이 4문제 정도일 것 같다는 말에 혹시? 했는데..

본선 진출..... ㅋㅋㅋㅋㅋㅋ


가볼까 말까........


(08.11 18:12 수정)


----------------------------------------------------------------------




예선 참가 도중의 스크린샷도 하나도 없고, 끝나고 완전히 다 닫혀버려서 소스코드도 하나도 없어서 그냥 지나가려고 했지만,,

그래도 재밌었던 경험이라? 조금 부끄럽기도 하지만 짤막하게 남겨본다.


알고리즘 같은걸 제대로 배워본 적도, 공부해본 적도 없어서 보통 이런 대회는 자신이 전혀 없고,,

괜히 쳤다가 참혹한 현실의 결과에 우울할 것 같아 응시를 잘 안하지만,

그래도 잉여로운 나날에 변화점이 될 수 있지 않을까 시도해봄.


예선은 원래 오후 1시 ~ 7시였지만, 당일날 멍때리고 있다가 오후 2시부터 시작하였다.


다행히 문제를 보고 싶다는 동아리 선배의 말에, 스크린샷/복붙을 해둔 친구가 있어서 글 쓰기는 조금 편한 듯.

기본 코드를 제외한 문제 원문이 그대로 있지만, 혹시 모르니 다 올리진 않고 적당히 내 기억에따라 작성...


언어는 C++, Java 2가지였고, 원래 Java 를 별로 안좋아할 뿐더러 C++11 이라 Java 보다 불편할 이유가 없었기에 모두 C++ 로 풀었다.

여튼 문제는 총 6문제!


1 -> 2 -> 4 -> 5 -> 3 순으로 풀었는데, (6은 못품)

1 -> 2 -> 4 까지 2시간 정도 걸렸고, 5번을 푸는데 1시간 정도 투자했던 것 같다.


3번도 1시간 정도 투자했던 것 같지만 결국 못풀었고...

6번은 제대로 시도조차 못해봤다.


결론적으로 1, 2, 4, 5번 이렇게 4개 문제를 풀었음.



Code Festival 문제

1. 카카오 프렌즈 컬러링북


2차원 벡터로 표현된 이미지에서 가로세로 같은색끼리 classification 해서 총 몇개 그룹으로 나뉘는? 뭐 그런 문제였다.

그냥 재귀함수 하나 짜서 돌렸다.


2. 보행자 천국


2차원 맵을 주고 좌측 상단에서 우측 상단까지 최단거리로 가는데, 지점마다 제한(방향전환 불가 / 진입불가)이 있고, 총 몇개의 루트가 있는지를 구하는 문제.

얘도 마찬가지로 재귀로 짰는데, 타임아웃이 났다.

벡터를 하나 더 만들어서, 한번 경우의 수가 구해진 경로는 저장을 했더니 통과.



3. 브라이언의 고민

♚프☆렌☆즈☆레☆이☆싱♚★사전예약★진행중
$지금$예약시♜이모티콘♜100%※증정※
★라이언★카트♨전원♨획@득@기@회
즉시이동 http://...

sentence 

answer 

 HaEaLaLaObWORLDb

 HELLO WORLD

 SpIpGpOpNpGJqOqA

 SIGONG JOA

 AxAxAxAoBoBoB

 invalid


스팸필터를 피하기 위한 규칙적인 광고글을, 원래 문구로 복구시켜보는 문제.


파이썬을 사용하지 않는 문자열 처리를 싫어해서 젤 뒤로 미뤘는데, 결국 마감시간에 쫓겨 제출하지 못했다.

나름 짠다고 짰는데, 경우의 수를 제대로 고려해주지 못했다.

급하게 작성을 하다가 결국 풀지 못한 문제...

중간에 안놀고 1시부터 제때 풀기 시작했으면 풀 수 있지 않았을까 싶어서 아쉬움이 많이 남는다.



4. 4단 고음


어.. 음...

시작음이 1이라고 할때, x3 +1 +1 순서로 높아지는 3단 고음을 구현하는 아이유가,

삼단고음을 중간중간 섞어서 당일 컨디션에 따라 원하는 고음 높이를 구현하기 위한 가지수를 구하는...(뭔소리야)


(생략)

3단 고음은 다음과 같이 적용된다. 1단계에서는 음높이가 세 배가 되며, 2단계와 3단계에서 음높이가 각각 1씩 증가한다. 이를 기록으로 남길 때 * 와 + 기호를 사용하기로 했다. 즉, 3단 고음을 한 번 한 경우는 문자열로 나타내면 다음과 같다.

*++

(생략)

3단 고음의 2단계를 마친 후 3단 고음을 새로 시작한 다음, 나머지 단계를 이어서 하는 경우는 *+*+++

(생략)


 *

 x3

+1 

x3 

+1 

+1 

+1 


최종 음높이: 15



위 문제들과 마찬가지로 그냥 재귀로 역으로 찾으면서 내려갔다.

당연히 그냥 전체 돌면 타임아웃이 나고 중간에서 적당히 빠져나와줘야 하는데...


역계산 하면서 나오는 + 갯수상, 반드시 나와야하는 * 갯수(예를 들어 +가 3개라면 남은 *은 2개, 즉 현재 계산 중인 높이가 3^2 = 9 이상)로 먼저 걸렀는데 또 타임아웃.

그래서 다음으로 최종 음높이를, 밑을 3으로 하는 로그(log(n) / log(3)) 를 취한 값을 구해서, * 이 나올 수 있는 최대 갯수를 구한 다음에 이걸 기준으로 한번 더 걸러주니 정답처리 되었다.



5. 캠핑


쐐기의 좌표를 주고, 외곽선을 제외한 내부에 다른 쐐기가 없는, 대각선으로 쐐기 두개를 고르는 문제였다. (설명을 못하겠네.. ㅈㅅ..)


얘는 그냥 루프로 돌렸지만,, 당연히 그냥 다 돌면 타임아웃...


주어진 쐐기에 대한 좌표들을 x에 대해서, 그 다음 y에 대해서 정렬을 했고, 루프 안에서 인덱스 몇개를 저장하는 방식으로 루프 횟수를 줄이니 8.5초(...)로 통과가 되었다.



6. 신비로운 유적 탐험


트리의 최대 공통부분의 크기를 구하는 문제. 위 예시의 경우 답은 7


바이너리 트리였다면 좀 시도를 해봤을텐데, 시간도 없었고 감이 잘 안와서 시도도 못해본 문제...

1학년때 특허의 claims 항목과 관련하여 비슷한 논문(?)을 봤었는데, 그냥 그 기억만 떠오르고 말았다.




------


5문제 쯤 풀면 괜찮게 풀었다고 말할 수 있지 않을까.. 했는데 4문제로 그쳐 아쉬웠다.
사실 푼 4문제도 잘 풀었다고 말할 수 없을 것 같기도 하고...ㅠㅠㅠ

코드를 백업하지 못해 아쉽다고 생각하기도 했지만, 지금 생각해보니 있어봤자 부끄럽기만 했을 것 같기도 하다.
잘 푼 사람이나 모범답안(?) 같은거 몇개 공개해주면 정말 고마울 것 같은데....ㅠㅠㅠㅠ

결과가 어떤식으로 나올지, 잘한 사람들 코드를 공개해줄지 기대하며, 끝!


배틀그라운드를 하고싶어만 하던 와중에, 곧 입대하는 선배가 본인의 그래픽카드를 조금 저렴하게 판다고 하셔서,

약간의 고민 끝에 바로 질러버렸다.


eGPU 에 대한 궁금증 + 관심이 예전부터 조금 있기도 했고...


비싼 듯 싼 듯....


Mac 및 Bootcamp 를 공식지원하지 않는다곤 하지만, 이런저런 편법을 사용하면 된다고 하여 구매하도록 하였다.

그래픽카드를 바로 되팔아도 몇만원 이득보게 구매하기도 하였고, eGPU Box 도 크게 감가가 없는 듯 하기도 하였고.



     


비교군은 갤럭시s6.. 생각보다 너무 큰 택배상자가 와서 놀랐다


설명서, 나사, 전원케이블, 30cm TB3 케이블이 함께 온다.

저 파란 타이? 는 뭔지 모르겠고...




이건 선배가 쓰다가 나에게 판 그래픽카드!

어릴땐 형이 알아서 컴을 맞췄고 고등학생때부턴 맥을 사용해왔으니,

내 소유의 그래픽카드는 처음이다. 여전히 잘 모르기도 하고..ㅋㅋㅋ

어련히 좋겠거니....


장패드도 같이 주셨는데 나에겐 부담스럽다..ㅠㅠ



    


그래픽카드에 비해 eGPU BOX 가 너무 커서 그래픽카드 2개 설치하는 용도인가 했는데,

안에 두꺼운 팬? 이 자리하고 있다.

mini 제품도 따로 있던데,, 뭐 들고 다니면서 쓸건 아니니 아쉽지만 큰 사이즈는 그러려니...




TB3 케이블이 너무 짧아서 후면을 앞으로 배치하였다.




전원을 종료한 상태에서 연결하고 켜야한다고 하던데, 나의 경우엔 Mac, Windows 둘다 켜진 후에 연결해도 별 문제는 없었다.

물론 연결해도 될 뿐 정상작동한다는 소리는 아님..

또한, AKiTiO Node 가 전원도 공급해준다.



Windows 는 그래픽드라이버 잡고 재부팅하니 별문제 없이 바로 사용가능.

다만 후에 부팅하려고 하니 처음 로고화면에서 멎어서 부팅이 안되는 경우가 발생했다.

부팅 상태에서 연결하면 장치관리자에 error 12, 리소스 부족으로 사용할 수 없다는 메시지가 나오는데,,

egpu.io 에 가보면 아예 상단 메뉴로 [GUIDE] Macbook Pro: solving eGPU error 12 in Windows 10 가 링크되어 있다.


난 저 가이드를 하기 싫어서 부팅 상태에서 연결 후 가만히 있으니 윈도우가 재부팅해야한다고 하고, 재부팅 후에 다시 잘 되더라.

한번 더 부팅하면 어떻게 될지 모르겠다.... 바로 배틀그라운드 결제 후 재밌게 하고 옴..ㅋㅋ


USB-C 허브가 하나 있는데, eGPU 연결된 상태에서 얘를 추가로 연결하면 컴퓨터가 바로 재부팅된다.

HDMI 때문에 그런 것 같기도 하고... 이건 좀 불편함..



Mac 은 모델에 따라 조금 다른 것 같다.


나는 USB-C 지원 맥북을

Macbook Pro Touchbar (15", 2016) 모델과, 

뉴맥북 레티나 (12", 2016 early) 모델을 가지고 있는데,


맥북프로의 경우에는

부팅 전후 연결에 별 문제가 없다. 시스템 리포트에 정상 연결됨을 확인할 수도 있고.



다만 외장 그래픽으로써 사용이 되진 않는 것 같은데,

automate-eGPU 라는 스크립트가 있다.

루트리스를 꺼야하는게 귀찮고 맥북프로에서는 외장그래픽이 딱히 필요가 없어서 시도해보지 않았다.

tensorflow 를 돌려보고 싶어서 구동해봤다.

외장모니터가 반드시 물려있어야 작동한다는 점을 제외하면 그럭저럭 잘 됨.



뉴맥북은 연결되면 좋을 것 같아서 rootless 를 끄고 시도해보기로 했다.

다만 뉴맥북은 연결하자마자 아래와 같은 메시지가 뜨고 연결이 되지 않는다.

스크립트 역시 장치가 검색되지 않아서 작동하지 않고... 대역폭이 부족해서 안되나부다..

알고보니 뉴맥북은 썬더볼트3 지원이 아니였다....ㅠ







외장그래픽 연결 후 해본건 오버워치 훈련장이랑 배틀그라운드..

배틀그라운드는 첫판을 자동 설정 그대로, 모두 울트라로 진행하였고, 별로 렉이 없었다.


그 후론

안티 앨리어싱: 울트라

포스트 프로세싱: 매우 낮음

그림자: 매우 낮음

텍스쳐: 울트라

효과: 매우 낮음

식생: 매우 낮음

거리 보기: 중간

으로 무리 없이 플레이 하였다.


총 5판 정도?에 듀오로 팀 2위 까지(1킬이지만...ㅋㅋ) 가보고 멀미할 것 같아서 그만함..ㅋㅋㅋㅋ





한동안 재밌게 하다가, 게임 외에 사용처를 못찾으면 팔아버려야겠다.


  1. qaz 2017.08.07 15:18

    혹시 내장모니터로 구동하셨나요.. ㅠㅠ?

    • BlogIcon iolate 2017.08.08 13:49 신고

      아뇨 외장모니터가 연결이 안되면 제대로 작동을 안하는 것 같더라구요

  2. prz 2017.09.07 10:30

    저도 선더볼트3로 구매하였는데 맥북이 2012년형이라 썬더볼트2인데 ㅜㅜ HDMI로 연결해도 되나요?

    • BlogIcon iolate 2017.09.07 13:04 신고

      eGPU 랑 맥북 사이에 HDMI 로 연결한다는 말씀이신가요? 그렇게는 작동이 안됩니다....

      썬더볼트2-3 케이블로 작동이 가능한지 알아보시는게 빠를 것 같네요..

  3. asdf 2018.10.28 13:09

    에러 12 가 재부팅하면 해결이 되셨다구요..? 저는 절대 해결이 안됩니다 ㅠㅠ 어떡하죠..

    • BlogIcon iolate 2018.11.01 04:58 신고

      저도 한번 안되면 별 쌩쇼를 해도 안됩니다..
      포트를 바꿔보고 재부팅을 해보고 껐다가 켜보고..
      포기하고 한 2시간 있다가 하면 또 되고 그러더라구요....

      macOS 업데이트 이후에는 사용해보지 않아서 잘 모르겠네요.

  4. noew1 2019.09.29 13:32

    안녕하세요 잘 읽었습니다
    여쭤보고 싶은 점이 있어서 이렇게 댓글 남깁니다.
    macOS와 egpu연결을 하실때 macOS의 버전은 어떻게 되셨는지 여쭤봐도 괜찮을까요?

    • BlogIcon iolate 2019.10.01 14:24 신고

      작성한지 오래되어서 잘 기억이 나지 않네요ㅠㅠ

+ Recent posts