기본 콘텐츠로 건너뛰기

라벨이 mqtt인 게시물 표시

MQTT 접속해제 - LWT(Last will and testament)

통신에서 중요하지만 구현이 까다로운 문제로 "상대방이 예상치 못한 상황으로 인하여 접속이 끊어졌을때"의 처리가 있다. 이것이 까다로운 이유는 상대방이 의도적으로 접속을 종료한 경우는 접속 종료 직전에 자신의 종료 여부를 알리고 나갈 수 있지만 프로그램 오류/네트웍 연결 강제 종료와 같은 의도치 않은 상황에선 자신의 종료를 알릴 수 있는 방법 자체가 없기 때문이다. 그래서 전통적 방식으로는 자신의 생존 여부를 계속 ping을 통해 서버가 물어보고 timeout 시간안에 pong이 안올 경우 서버에서 접속 종료를 인식하는 번거로운 방식을 취하는데 MQTT의 경우 subscribe 시점에서 자신이 접속 종료가 되었을 때 특정 topic으로 지정한 메시지를 보내도록 미리 설정할 수 있다. 이를 LWT(Last will and testament) 라고 한다. 선언을 먼저하고 브로커가 처리하게 하는 방식인 것이다. Last Will And Testament 라는 말 자체도 흥미롭다. 법률용어인데  http://www.investopedia.com/terms/l/last-will-and-testament.asp 대략 내가 죽으면 뒷산 xx평은 작은 아들에게 물려주고 어쩌고 하는 상속 문서 같은 내용이다. 즉, 내가 죽었을(연결이 끊어졌을) 때에 변호사(MQTT Broker - ex. mosquitto/mosca/rabbitMQ등)로 하여금 나의 유언(메시지)를 상속자(해당 토픽에 가입한 subscriber)에게 전달한다라는 의미가 된다. MQTT Client 가 있다면 한번 실습해보자. 여러가지가 있겠지만 다른 글에서처럼  https://www.npmjs.com/package/mqtt  을 사용하도록 한다. npm install mqtt --save 로 설치해도 되고 내 경우는 자주 사용하는 편이어서 npm install -g mqtt 로 전역설치를 했다. 호스트는 무료 제공하고 있는 test.mosquitto.o...

MQTT subscribe - Wildcard

MQTT를 사용하다보면 여러개의 topic 을 동시에 가입해야할 경우가 있는데 가령 대화방의 경우 같은 방에 있는데 누가 메시지를 보냈는지 알아야하는데 subscribe한 top에 들어온 client ID 를 알 수는 없을 때 사용자 별로 각자 topic을 만들어 publish 하고 모든 사용자가 서로의 topic을 죄다 가입한 후 topic을 보면서 구분할 수 있는데 이 경우 subscribe하기가 매우 번거롭다. Wildcard를 이용하여 이런 요구를 해결할 수 있다. 1. Single Level : + 해당 레벨에 한하여 topic을 확장한다. chatroom/roomA/+/profile로 subscribe를 하면 아래와 같이 topic들이 있을 경우 chatroom/ roomA /userA/message (X) chatroom/ roomA /userA/ profile (O) chatroom/ roomA /userA/status (X) chatroom/ roomA /userB/message (X) chatroom/ roomA /userB/ profile (O) chatroom/ roomA /userB/status (X) chatroom/roomB/userC/message (X) chatroom/roomB/userC/profile (X) chatroom/roomB/userC/status (X)  chatroom/roomB/userD/message (X) chatroom/roomB/userD/profile (X) chatroom/roomB/userD/status (X) roomA와 profile이 있는 topic에 모두 subscribe 한다. 2. Multi Level : # 해당 레벨과 그 하위 topic 모두 subscribe 한다. 마찬가지로 chatroom/roomA/# 로 subscribe를 하면 chatroom/ roomA /userA/messa...

MQTT Broker Mosquitto 설치 후 설정

우분투 기준 $ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa $ sudo apt-get update 하고 $ sudo apt-get install mosquitto 으로 설치하면 서비스까지 착실하게 올라간다. 설치는 간단한데 사용자를 만들어야한다. /etc/mosquitto/mosquitto.conf 파일에서 권한 설정을 변경하자. allow_anonymous false 를 추가해서 아무나 못들어오게 하자. $ service mosquitto restart 서비스를 재시작. 이제 사용자를 추가하자. mosquitto_passwd <암호파일 경로명> <사용자명> 하면 쉽게 만들 수 있다. # mosquitto_passwd /etc/mosquitto/passwd admin Password:  Reenter password:  암호 넣어준다. 두번 넣어준다. 이제 MQTT 약을 열심히 팔아서 Broker 사글세방 임대업을 하자.

MongoDB를 사용하지 않는 Meteor Publish(+MQTT)

오래간만에 Meteor 문서를 보던 중 흥미로운 내용을 발견. publish쪽을 보다 보니 이런게 있더라. http://docs.meteor.com/#/full/publish_added Meteor.subscribe한 컬렉션에서 observe를 해보면 added/changed/removed 를 받을 수 있는데 사실은 이게 publish에서 "만들"수 있는 것. 최초 publish 에 들어왔을 때 this.ready()를 한번 해주고 들어올때마다 publish에서 add를 해주는 식이다. 외부 API를 쓴다거나 TCP/UDP 연결해서 얻은 결과물을 Collection 형태로 받을 때 매우 유용하다. 그래서 MQTT pub/sub 연동 예제를 구현해보았다. http://meteorpad.com/pad/uGoYkgrkWxBbkfJhh/mqttMeteor test.mosquitto.org  를 바라보고 MQTT 메시지를 수신하고 송신할 수 있다. 구현이 얼마없는 것에 비해 매우 잘 작동하지 않는가!? MongoDB가 아닌 외부의 비동기 호출을 통해 받은 결과를 넘겨주는 것으로 실제 publish쪽 구현은 아주 간단한데 Meteor.publish("chats", function() {   var pub = this;   // async function   client.on('message', function(topic, message) {     pub.added("chats", Random.id(), {       message:message.toString(),       createdAt: +new Date()     });   });   this.ready(); }); 이게 전부다. subscribe쪽에 collection이 준비되었음을 알리기 위해 ready() ( h...

Mosca를 사용한 MQTT 연습

IoT에서 핵심 개념 중 사물간 통신 부분이 있는데 양방향 경량 통신 프로토콜로 MQTT라는 것이 있고 그것이 nodemcu  에 구현이 되어있어 흥미를 가지고 살펴보았다. 기본적으로 Meteor의 DDP 프로토콜처럼 pub/sub 구조인데 한번씩만 pub/sub을 하는 Meteor와는 다르게 구독(subscribe)은 지정 토픽에 대해 한번만 하고 발행(publish)은 그때그때 하는 구조였다. 기술적인 내용은 MQTT  같은 곳에 자세히 나와있으니 대충 읽고 실제적인 작동이 어떻게 되는지 직접 한번 경험해보고 싶었다. 물론 node.js와 javascript를 사랑하는 사람이기 때문에 npm 에서 찾았지만 이후의 내용은 어짜피 command line에서 작동하는 것이기 때문에 부담없이 해볼 수 있다. 먼저 MQTT Broker를 설치하자. 고양이 그림이 귀여운 Mosca  를 선택했다. node.js 가 없으면 먼저 설치하고 npm install mosca bunyan -g 부터 시작해보자. mosca 말고 bunyan이라는 것도 함께 설치하는데 JSON포멧의 로그를 볼때 편리하다. 덕분에 좋은 거 하나 배웠네. 여기서 Broker는 server랑은 조금 개념이 다른데 pub/sub을 하는 각각의 대상이 client/server의 관계가 아니기 때문이다. 서로서로 상호작용하는 관계이므로. 어쨌든 Broker가 없으면 sub과 pub을 서로 맺을 수가 없으니 반드시 하나는 구동해야한다. http://www.slideshare.net/BryanBoyd/mqtt-austin-api  자세한 내용은 이런 슬라이드를 보면 활용예나 패턴에 대해 잘 나와있으니 참조하자. mosca -v | bunyan 일단 이런 식으로 mosca 를 기동한다. mosquitto  같은 걸 써도 크게 다르지 않다. 어짜피 한번만 구동하면 끝이니까. $ mosca -v | bunyan ...