次のリストはArduinoをサブスクライバーにするためのプログラムです。
- #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};
- 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);
- 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(){
- char c;
- while (!mySerial.available());
- c = mySerial.read();
- Serial.write(c);
- }
ほとんどの流れは先に紹介したpublishのプログラムと同様です。30行からのMQTTメッセージを送るところがsub[]に変わっており、ここでサブスクリプション要求を送っています。トピックが”#”になっていますので、全てのトピックのサブスクリプションを要求していますね。
loop関数内では、ESP8266がシリアルポートに送った全ての内容をPC側のシリアルポートに送達します。ESP8266がシリアルポートに送信した内容はPC側のターミナルエミューたーでモニターできます。
以下がターミナルエミュレーターのログです。前回はターミナルエミュレーターで行った処理をマイコンで肩代わりしたイメージですね。
- T+RST
- OK
- WIFI DISCONNECT
- CLOSED
- ・"Bn"B・PBヨハ?SNタI
- ready
- WIFI CONNECTED
- WIFI GOT IP
- AT+CIPSTART="TCP","192.168.1.16",1883
- CONNECT
- OK
- AT+CIPSEND=35
- OK
- >
- Recv 35 bytes
- SEND OK
- +IPD,4: AT+CIPSEND=8
- OK
- >
- Recv 8 bytes
- SEND OK
- +IPD,5:
- +IPD,16:0
- arduino/d2/1
1行目は本来、「AT+RST」なのですが、シリアルポートの初期化のタイミングで最初の"A"が欠けることもあります。5行目はESP8266のリセット時のメッセージですが、リセット処理の直後はデフォルトのボーレートに戻るので文字化けしています。ログ最終行の「arduino/d2/1」が、他のノードからパブリッシュしたメッセージを受信したところです。
今回はマイコン(Arduino)でMQTTメッセージのやりとりに挑戦してみました。次回はIoTらしく、「マイコンを使って部屋の明るさをパブリッシュする」作例に挑戦したいと思います。お楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.