パブリッシャーが送信したメッセージで、サブスクライバー側の発光ダイオードを点灯/消灯させるためには、パブリッシャーとサブスクライバーとの間で「どのトピックに対してどの様なメッセージを送ったとき、発光ダイオードをON/OFFさせるか」という取り決めが必要となります。
今回は以下のようにしました。
>mosquitto_pub -h 192.168.1.16 -t arduino/d2/ -m "1" >mosquitto_pub -h 192.168.1.16 -t arduino/d2/ -m "0" >mosquitto_sub -h 192.168.1.16 -t "#" -v arduino/d2/ 1 arduino/d2/ 0
これはmoquittoのインストールキットに同梱されている「mosquitto_pub」と「mosquitto_sub」でメッセージをやりとりした例です。トピックが「arduino/d2/で、メッセージが1」の場合に発光ダイオードを点灯させ、トピックが「arduino/d2/で、メッセージが0」の場合は発光ダイオードを消灯させることとします。
以下のリストが、Arduinoをサブスクライバーにしてメッセージに応じて発光ダイオードをON/OFFさせるプログラムです。ここで説明しない行については過去の記事(ArduinoをMQTTブローカーに接続する)など連載のバックナンバーを参考にしてください。
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX char con[]={0x10,0x21,0x00,0x06,'M','Q','I','s','d','p',0x03,0x02,0x00,0x3c,0x00,0x13,'m','o','s','q','s','u','b','/','1','2','5','1','6','-','h','i','r','o','3'}; char sub[]={0x82,0x06,0x00,0x01,0x00,0x01,'#',0x00}; char ledOn[] ="arduino/d2/1"; char ledOff[]="arduino/d2/0"; void getResponse(int j){ int i; for (i=0;i<j;i++){ if (mySerial.available()) Serial.write(mySerial.read()); delay(1); } } void setup() { int i,j; Serial.begin(9600); pinMode(2, OUTPUT); mySerial.begin(9600); while(!Serial); mySerial.print("AT+RST\r\n"); getResponse(5000); mySerial.print("AT+CIPSTART=\"TCP\",\"192.168.1.16\",1883\r\n"); getResponse(1000); mySerial.print("AT+CIPSEND=35\r\n"); getResponse(1000); for (i=0;i<35;i++)mySerial.write(con[i]); getResponse(1000); mySerial.print("AT+CIPSEND=8\r\n"); getResponse(1000); for (i=0;i<8;i++)mySerial.write(sub[i]); } void loop(){ static int i=0,j=0; char c; while (!mySerial.available()); c = mySerial.read(); if (ledOn[i++]!=c)i=0; if (i==12)digitalWrite(2, HIGH); if (ledOff[j++]!=c)j=0; if (j==12)digitalWrite(2, LOW); }
Copyright © ITmedia, Inc. All Rights Reserved.