MQTTで始めるIoTデバイスの作り方 第4回:ArduinoをMQTTブローカーに接続するMQTTで始めるIoTデバイスづくり(4)(4/4 ページ)

» 2016年06月21日 07時00分 公開
[今岡通博MONOist]
前のページへ 1|2|3|4       

subscriberスケッチ

 次のリストはArduinoをサブスクライバーにするためのプログラムです。

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(10, 11); // RX, TX
  3. char con[]={0x10,0x21,0x00,0x06,'M','Q','I','s','d','p',0x03,0x02,0x00,0x3c,0x00,0x13,
  4. 'm','o','s','q','s','u','b','/','1','2','5','1','6','-','h','i','r','o','3'};
  5. char sub[]={0x82,0x06,0x00,0x01,0x00,0x01,'#',0x00};
  6. void getResponse(int j){
  7. int i;
  8. for (i=0;i<j;i++){
  9. if (mySerial.available())
  10. Serial.write(mySerial.read());
  11. delay(1);
  12. }
  13. }
  14. void setup(){
  15. int i,j;
  16. Serial.begin(9600);
  17. mySerial.begin(9600);
  18. while(!Serial);
  19. mySerial.print("AT+RST\r\n");
  20. getResponse(5000);
  21. mySerial.print("AT+CIPSTART=\"TCP\",\"192.168.1.16\",1883\r\n");
  22. getResponse(1000);
  23. mySerial.print("AT+CIPSEND=35\r\n");
  24. getResponse(1000);
  25. for (i=0;i<35;i++)mySerial.write(con[i]);
  26. getResponse(1000);
  27. mySerial.print("AT+CIPSEND=8\r\n");
  28. getResponse(1000);
  29. for (i=0;i<8;i++)mySerial.write(sub[i]);
  30. void loop(){
  31. char c;
  32. while (!mySerial.available());
  33. c = mySerial.read();
  34. Serial.write(c);
  35. }

 ほとんどの流れは先に紹介したpublishのプログラムと同様です。30行からのMQTTメッセージを送るところがsub[]に変わっており、ここでサブスクリプション要求を送っています。トピックが”#”になっていますので、全てのトピックのサブスクリプションを要求していますね。

 loop関数内では、ESP8266がシリアルポートに送った全ての内容をPC側のシリアルポートに送達します。ESP8266がシリアルポートに送信した内容はPC側のターミナルエミューたーでモニターできます。

 以下がターミナルエミュレーターのログです。前回はターミナルエミュレーターで行った処理をマイコンで肩代わりしたイメージですね。

  1. T+RST
  2. OK
  3. WIFI DISCONNECT
  4. CLOSED
  5. "Bn"BPBヨハ?SNI
  6. ready
  7. WIFI CONNECTED
  8. WIFI GOT IP
  9. AT+CIPSTART="TCP","192.168.1.16",1883
  10. CONNECT
  11. OK
  12. AT+CIPSEND=35
  13. OK
  14. >
  15. Recv 35 bytes
  16. SEND OK
  17. +IPD,4: AT+CIPSEND=8
  18. OK
  19. >
  20. Recv 8 bytes
  21. SEND OK
  22. +IPD,5:
  23. +IPD,16:0
  24. arduino/d2/1

 1行目は本来、「AT+RST」なのですが、シリアルポートの初期化のタイミングで最初の"A"が欠けることもあります。5行目はESP8266のリセット時のメッセージですが、リセット処理の直後はデフォルトのボーレートに戻るので文字化けしています。ログ最終行の「arduino/d2/1」が、他のノードからパブリッシュしたメッセージを受信したところです。

おわりに

 今回はマイコン(Arduino)でMQTTメッセージのやりとりに挑戦してみました。次回はIoTらしく、「マイコンを使って部屋の明るさをパブリッシュする」作例に挑戦したいと思います。お楽しみに。

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.