ãã§ã«
MQTTãããŒã«ãŒãš
ãIntel Edisonã«åºã¥ããŠã»ã³ãµãŒããŒããçµã¿ç«ãŠãæ¹æ³ã«ã€ããŠæžããŠã
ãŸã ã ããã€ã¹ã«ã¯ããã¿ã³ãã¢ãŒã·ã§ã³ã枩床ãããã³å
ã»ã³ãµãŒãå«ãŸããŠããŸãã ä»æ¥ãããããã¹ãŠãMosquitto MQTTãµãŒããŒã«æ¥ç¶ããåæ¹åéä¿¡ã確ç«ãããã¶ã€ã³ãã¢ãã®ã€ã³ã¿ãŒãããã®æ¬æ Œçãªäžéšã«ããŸãã
MQTT
MQTTãããªãã·ã£ãŒ/ãµãã¹ã¯ã©ã€ããŒã¢ãã«
MQTTã¯ããã·ã³ééä¿¡ãæŽçããããã®äžè¬çãªãããã³ã«ã®1ã€ã§ãïŒM2MãMachine to MachineïŒã ããããªãã·ã£ãŒ-ãµãã¹ã¯ã©ã€ããŒãã®ååã«åºã¥ããŠåäœããTCP / IPã«åºã¥ããŠæ§ç¯ãããŸãã MQTTã®2ã€ã®äž»èŠã³ã³ããŒãã³ãã¯ãã¯ã©ã€ã¢ã³ããšãããŒã«ãŒã§ãã MQTTã¯ã©ã€ã¢ã³ãã¯ãç¹å®ã®ãããã¯ïŒãããã¯ïŒã§ã¡ãã»ãŒãžãå
¬éããããã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããŠããããèããŸãã MQTTãããŒã«ãŒã¯ããããªãã·ã£ãŒã«ãã£ãŠçºè¡ããããã¹ãŠã®ã¡ãã»ãŒãžãåä¿¡ããé¢é£ããã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ããŒã«ãªãã€ã¬ã¯ãããŸãã ãµãã¹ã¯ã©ã€ããŒãšãããªãã·ã£ãŒã¯ãäºãã«ã€ããŠç¥ãå¿
èŠã¯ãããŸãããã¡ãã»ãŒãžãããã¯ãšã¡ãã»ãŒãžèªäœã®ã¿ã圹å²ãæãããŸãã ãããªãã·ã£ãŒãšãµãã¹ã¯ã©ã€ããŒã¯ãéåžžã®å¯Ÿè©±ãæŽçããããã«ãå
±éã®ãããã¯åãšã¡ãã»ãŒãžåœ¢åŒã䜿çšããå¿
èŠããããŸãã
ã¡ãã»ãŒãžãå
¬éããããŸãã¯ç¹å®ã®ãããã¯ã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããã«ã¯ãMQTTã¯ã©ã€ã¢ã³ããå¿
èŠã§ãã Mosquitto MQTTãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ãã¡ãã»ãŒãžãçºè¡ããã¯ã©ã€ã¢ã³ãã¯mosquitto_pubãšåŒã°ããã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããã¯ã©ã€ã¢ã³ãã¯mosquitto_subãšåŒã°ããŸãã
ãããã¡ãã»ãŒãžã³ã°ã®å€èŠ³ã§ããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã èµ€ããŠã£ã³ããŠã¯ãã¯ã©ã€ã¢ã³ããµãã¹ã¯ã©ã€ããŒã®äœæ¥ã瀺ããé»ã¯ã¯ã©ã€ã¢ã³ããããªãã·ã£ãŒã®äœæ¥ã瀺ããŸãã ããŒã ã«ã¯ãåç
§ããããããã«ã¿ã°ãä»ããããŠããŸãã
ãµãã¹ã¯ã©ã€ããŒãããªãã·ã£ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãµãã¹ã¯ã©ã€ãããã¯ã©ã€ã¢ã³ãã«å¿
èŠãªåŒæ°ã®æå°ã»ããã¯ããããŒã«ãŒã®IPã¢ãã¬ã¹ãšã¡ãã»ãŒãžã®ä»¶åãããã³ãããªãã·ã£ãŒã¯ã©ã€ã¢ã³ãã®å Žåã¯ã¡ãã»ãŒãžããã¹ãã§ãã MQTTãããŒã«ãŒã127.0.0.1ïŒlocalhostïŒã§å©çšã§ããå Žåã以äžã«ç€ºãã³ãã³ãã¯ã件åãedison / helloãã§çºè¡ããããã¹ãŠã®ã¡ãã»ãŒãžã®ãªã¹ãã³ã°ãæå¹ã«ããŸãã
sub 3> mosquitto_sub âh localhost ât edison/hello
ãããŠã件åããedison / helloãã®ã¡ãã»ãŒãžãæçš¿ããæ¹æ³ã次ã«ç€ºããŸãã
pub 3> mosquitto_pub âh localhost ât edison/hello âm "Message#1: Hello World!"
MQTTãããŒã«ãŒãã件åãedison / helloãã®ãããªãã·ã£ãŒã¯ã©ã€ã¢ã³ãïŒpub 3ïŒããã¡ãã»ãŒãžãMessageïŒ1ïŒHello Worldããåä¿¡ãããšããããŒã«ãŒã¯ä»¶åãedison / helloãã«ãµãã¹ã¯ã©ã€ãããŠããã¯ã©ã€ã¢ã³ãã®ãªã¹ããã¹ãã£ã³ããŸãã ãµãã¹ã¯ã©ã€ããŒã»ã¯ã©ã€ã¢ã³ãïŒãµã3ïŒãæå®ããããããã¯ã«ãµãã¹ã¯ã©ã€ããããŠããããšãæ€åºãããšãMQTTãããŒã«ãŒã¯ã¡ãã»ãŒãžããã®ã¯ã©ã€ã¢ã³ãã«ãªãã€ã¬ã¯ãããŸãã
ãµãã¹ã¯ã©ã€ããŒã¯ã¡ãã»ãŒãžãåä¿¡ãããšãã¿ãŒããã«ãŠã£ã³ããŠã«è¡šç€ºããŸãã Sub 3 Subscriberããã³Pub 3 Publisherã®ã³ãã³ãã§ã¯ãããã©ã«ãã®MQTTããŒãçªå·ãæé»çã«èšå®ãããŠããããïŒ1833ïŒãã³ãã³ãã©ã€ã³ã«ã¯ç€ºãããŠããŸããã sub 4ããã³pub 4ã³ãã³ãã§ã¯ãããŒãçªå·ãæå®ãããŠããŸãã sub 5ããã³pub 5ã³ãã³ãã§ã¯ã-vãªãã·ã§ã³ããµãã¹ã¯ãªãã·ã§ã³åŒæ°ã«è¿œå ãããŸããã ããã«ãããã¡ãã»ãŒãžã ãã§ãªããããã¯ã®ååã端æ«ãŠã£ã³ããŠã«è¡šç€ºã§ããŸãã ããã¯ããã³ãã¬ãŒãã䜿çšããŠè€æ°ã®ãããã¯ããµãã¹ã¯ã©ã€ããããšãã«åœ¹ç«ã¡ãŸãã ãµãã¹ã¯ã©ã€ãã¯ã©ã€ã¢ã³ããèªåçã«ç Žæ£ãããªãå Žåãããšãã°pub 6ã³ãã³ãã䜿çšããŠãedison / helloããšãã件åã§çºè¡ãããè¿œå ã®ã¡ãã»ãŒãžã¯ããã®ãµãã¹ã¯ã©ã€ãã«ãªãã€ã¬ã¯ããããŸãã
MQTTãããŒã«ãŒã®æšæºçãªåäœã¯ã顧客ã«é
ä¿¡ãããçŽåŸã«ã¡ãã»ãŒãžãç Žæ£ããããšã§ãã pub 7ã¯ã©ã€ã¢ã³ãã¯æ°ãããããã¯ãedison / hello1ããå«ãã¡ãã»ãŒãžãçºè¡ããŸããããµã5ãµãã¹ã¯ã©ã€ããŒã¯ã©ã€ã¢ã³ãã¯ãããã¯ãedison / helloããå«ãã¡ãã»ãŒãžãåŸ
æ©ããŠãããããpub 7ããã®ã¡ãã»ãŒãžãåä¿¡ããŸããã 次ã«ããµãã¹ã¯ã©ã€ããŒã¯ã©ã€ã¢ã³ãããµã6ã¯ããããã¯ãedison / hello1ãã«ãµãã¹ã¯ã©ã€ãããŸãããæ¢ã«ç Žæ£ãããŠããããããã®ãããã¯ã§ä»¥åã«éä¿¡ãããã¡ãã»ãŒãžãåä¿¡ããŸããã 圌ã¯ããã®ãããã¯ãšãšãã«çºè¡ããã次ã®ã¡ãã»ãŒãžïŒããšãã°ãpub 8è¡ã§çºè¡ãããã¡ãã»ãŒãžïŒã®ã¿ãåãåããŸãã
ç¹å®ã®ãããã¯ã§çºè¡ãããæåŸã®ã¡ãã»ãŒãžãä¿æããããã«MQTTãããŒã«ãŒã«æ瀺ããè¿œå ã®ãã©ã¡ãŒã¿ãŒããããŸãã ãããŒã«ãŒãã¡ãã»ãŒãžãé
ä¿¡ããæ¹æ³ã«åœ±é¿ããQuality of ServiceïŒQoSïŒãæ§æã§ãããã£ã¬ã¯ãã£ãããããŸãã ãããã®æ©èœã®è©³çŽ°ã¯ã
MQTT Wikiã«èšèŒãããŠããŸãã
ããŒãèšå®ã«ãã£ãŠã¯ãè¿œå ã®åŒæ°ãå¿
èŠã«ãªãå ŽåããããŸãã åŸã§ãã®åé¡ã«æ»ããŸãã
è€æ°ã®ãããã¯ã賌èªãã
éåžžãå®éã«ã¯MQTTã¯ã©ã€ã¢ã³ãã䜿çšãããŸããMQTTã¯ã©ã€ã¢ã³ãã¯ãããã€ãã®ãããã¯ã«ãµãã¹ã¯ã©ã€ããããåä¿¡ããã¡ãã»ãŒãžã«å¿ããŠããŸããŸãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã MQTTãããã¯ã«ã€ããŠè©±ããŸãããã
MQTTãããã¯ã¯ãéå±€æ§é ã«ç·šæãããŠããŸãã ã/ãèšå·ã¯ããããã¯ã®è«çã¬ãã«ã匷調ããããã«äœ¿çšãããŸãã è«ççã«èšèšããããããã¯ã¹ããŒã¹ã¯æ¬¡ã®ããã«ãªããŸãã
Temperature/Building1/Room1/Location1 Temperature/Building1/Room1/Location2 Temperature/Building2/Room2 Temperature/Outdoor/West Temperature/Outdoor/East Temperature/Average
ãµãã¹ã¯ã©ã€ããŒã¯ããã³ãã¬ãŒãã䜿çšããŠãç¹å®ã®ãããã¯ïŒã枩床/å±å€/西ããªã©ïŒããµãã¹ã¯ã©ã€ãã§ããŸãã
MQTTã«ã¯ãã+ããšãïŒãã®2ã€ã®ã¯ã€ã«ãã«ãŒãæåããããŸãã ã+ãèšå·ã¯ãåãéå±€ã¬ãã«ã«ãããããã¯ããµãã¹ã¯ã©ã€ãããããã«äœ¿çšãããŸãã èšå·ãïŒãã¯ãç¹å®ã®ãããã¯ã®ãã¹ãŠã®ãµãã»ã¯ã·ã§ã³ã«ãµãã¹ã¯ã©ã€ãããããã«äœ¿çšãããŸãã
ããšãã°ããTemperature /ïŒãã«ãµãã¹ã¯ã©ã€ããããšãäŸã®ãããã¯ã®ãããããå«ãã¡ãã»ãŒãžãã¯ã©ã€ã¢ã³ãã«é
ä¿¡ãããŸãã ãTemperature / +ãã«ãµãã¹ã¯ã©ã€ããããšãã¯ã©ã€ã¢ã³ãã¯ä»¶åããTemperature / Averageãã®ã¡ãã»ãŒãžã®ã¿ãåä¿¡ããŸããããã¯ãä»ã®ãã¹ãŠã®ãããã¯ãäžäœéå±€ã¬ãã«ã«ããããã§ãã MQTTããŒãã¹ããŒã¹ã®ç·šæã®è©³çŽ°ã«ã€ããŠã¯ã
MQTT Wikiãåç
§ããŠãã ãã ã
å®å
šãªMosquittoãããŒã«ãŒã®ã»ããã¢ãã
MQTTã¯ã©ã€ã¢ã³ãã¯ãäž»ã«4ã€ã®æ¹æ³ã§MosquittoãµãŒããŒã«æ¥ç¶ã§ããŸãã
- éããŠããããŒããä»ããŠãã€ãŸãä¿è·ãªãã§ã ããã¯ãMQTTããã€ã¹ãå®éã«äœ¿çšããåã«éçºããã³ãã¹ãããå Žåã«äŸ¿å©ã§ãã ãããŒã«ãŒãšã¯ã©ã€ã¢ã³ãéã®ããŒã¿ã¯ãæå·åãããã«ãã¬ãŒã³ããã¹ãã§éä¿¡ãããŸãã ãã®çµæããããã¯ç°¡åã«ååãããŸãã
- ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã䜿çšããŸãã ãã®æ¹æ³ã䜿çšãããšããããŒã«ãŒã¯ã¯ã©ã€ã¢ã³ãã®ä¿¡é Œæ§ãæ€èšŒã§ããŸãã ãã ããããŒã¿ã¯éä¿¡äžã«æå·åãããŸããã
- TLS-PSKæå·åã䜿çšããŸãã ã¯ã©ã€ã¢ã³ããšãããŒã«ãŒã¯ãå®å
šãªæ¥ç¶ã確ç«ããããã«äœ¿çšãããå
±éã®ç§å¯éµãå
±æããŸãã ãã®æ©èœã¯ãMosquitto 1.3.5以éã§äœ¿çšã§ããŸãã
- SSLæå·åã䜿çšããŸãã ããã¯ãMosquitto MQTTã§å©çšå¯èœãªæãé«åºŠãªæå·åããã³èªèšŒã¹ããŒã ã§ãã SSLã䜿çšããå ŽåãVerisignãEquifaxãªã©ã®ä¿¡é Œã§ããèªèšŒå±ïŒCertificate AuthorityãCAïŒãããµãŒããŒèšŒææžãååŸããå¿
èŠããããŸãã å€ãã®å Žåããã¹ãã®ããã«ããµãŒããŒèšŒææžã®çœ²åã«äœ¿çšã§ããèªå·±çæ蚌ææžãäœæããŸãã SSLã䜿çšãããšãé«åºŠãªã»ãã¥ãªãã£ãå®çŸã§ããŸããããã®ãããªã¹ããŒã ãå®è£
ããããšã¯ä»ã®ã¹ããŒã ãããå°é£ã§ãã å®éãSSLã䜿çšããå Žåããã¹ãŠã®ã¯ã©ã€ã¢ã³ãããã€ã¹ã«é©åãªèšŒææžãæäŸããå¿
èŠããããŸãã ããã«ãã·ã¹ãã ã®éçšäžã«ã¯ã©ã€ã¢ã³ã蚌ææžãšãããŒã«ãŒèšŒææžã®äžè²«æ§ãç¶æããããã®æŽæ°ã¡ã«ããºã ãéçºããå¿
èŠããããŸãã
次ã®æ§æãã£ã¬ã¯ãã£ãã䜿çšããŠãMosquitto MQTTã»ãã¥ã¢ãããŒã«ãŒãæ§æããŸãã ãã¹ãç®çã«é©ããèªå·±çæ蚌ææžã䜿çšããŸãã ãã®ãããªèšŒææžã¯ãéçšãµãŒããŒã§ã¯äœ¿çšããªãã§ãã ããã
port 1883 password_file /home/mosquitto/conf/pwdfile.txt log_type debug log_type error log_type warning log_type information log_type notice user root pid_file /home/mosquitto/logs/mosquitto.pid persistence true persistence_location /home/mosquitto/db/ log_dest file /home/mosquitto/logs/mosquitto.log listener 1995 # 1995 TLS-PSK, # --psk-identity --psk psk_file /home/mosquitto/conf/pskfile.txt # psk_hint, 1995 psk_hint hint listener 1994 # 1994 SSL-, # , , # , , ca.crt cafile /home/mosquitto/certs/ca.crt certfile /home/mosquitto/certs/server.crt keyfile /home/mosquitto/certs/server.key
ãã®äŸã®
pwdfile.txtãã¡ã€ã«ã¯ãLinuxãã¹ã¯ãŒããã¡ã€ã«ãšåãæ¹æ³ã§æå·åããããã¹ã¯ãŒããã¡ã€ã«ã§ãã Mosquittoã«å梱ãããŠãã
mosquitto_passwdãŠãŒãã£ãªãã£ã䜿çšããŠäœæã§ããŸãã
pskfile.txtãã¡ã€ã«ã¯ã以åã«ã¯ã©ã€ã¢ã³ããšãµãŒããŒã§ãã¹ããããŠãããã¹ã¯ãŒããã¡ã€ã«ã§ãã TLS-PSKã䜿çšããŠæ¥ç¶ã確ç«ããããã«äœ¿çšãããŸãã ããã¯éåžžã®ããã¹ããã¡ã€ã«ã§ãåè¡ã«ã¯ãuserïŒpasswordããšãã圢åŒã®ãã¢ã1ã€å«ãŸããŠããŸãã TLS-PSKã«äœ¿çšããããã¹ã¯ãŒãã¯å€§æåãšå°æåãåºå¥ããã16é²æåã®ã¿ãå«ããããšãã§ããŸãã ãã¹ã¯ãŒããã¡ã€ã«ãšPSKãã¡ã€ã«ã®äŸã次ã«ç€ºããŸãã
user:$6$Su4WZkkQ0LmqeD/X$Q57AYfcu27McE14/MojWgto7fmloRyrZ7BpTtKOkME8UZzJZ5hGXpOea81RlgcXttJbeRFY9s0f+UTY2dO5xdg== user1:deadbeef user2:DEADBEEF0123456789ABCDEF0123456789abcdef0123456789abcdef0123456789abcdef <h1> MQTT </h1>
Intel Edisonã¯ãããã»ã¹ã®1ã€ãšããŠArduinoã®ããã°ã©ã ïŒã¹ã±ããïŒãå®è¡ã§ããLinuxã·ã¹ãã ã§ãããããæ¢ã«æºåããMosquitto MQTTããã±ãŒãžã䜿çšã§ããŸãã ã¹ã±ããå
ã§ã¯ã
mosquitto_subããã³
mosquitto_pubãåŒã³åºãããã®LinuxãœãããŠã§ã¢ãå©çšå¯èœã§ãã ãã®ã¢ãããŒãã«ã¯ããã€ãã®å©ç¹ããããŸãã
- Arduinoçšã«MQTTã¯ã©ã€ã¢ã³ããæžãæããå¿
èŠã¯ãããŸããã Mosquitto MQTTã¯ãããç¥ãããååã«ãã¹ããããã³ãŒãã§ãã Arduinoã¹ã±ããã§äœ¿çšã§ããããã«ãã©ãããŒã¯ã©ã¹ãäœæããå¿
èŠããããŸãã
- Mosquitto MQTTã¯ã©ã€ã¢ã³ãã¯ãå®å
šãªSSLæ¥ç¶ããµããŒãããŠããŸãã åæã«ãéåžžã®Arduinoã®äœé»åãã€ã¯ãã³ã³ãããŒã©ãŒã¯ãSSLã®èšç®èŠä»¶ãæºãããŠããŸããã
- ããé«åºŠãªMQTTããã±ãŒãžãçºèŠãããå ŽåããŸãã¯ãã§ã«äœ¿çšãããŠãããã®ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ãããå Žåãæ¢åã®ã³ãŒãã®å€§éšåãåå©çšããã€ãããŒã·ã§ã³ã®ãµããŒãã§è£è¶³ããããšãã§ããŸãã
ã¯ã©ã¹MQTTClient
Intel Edisonã¯ãã«æ©èœã®Linux OSãå®è¡ããŠããããããã¹ãŠã®LinuxéçºããŒã«ã¯Arduinoããã°ã©ã ã§äœ¿çšã§ããŸãã ã¹ã±ããã«é¢äžããã©ãããŒã¯ã©ã¹MQTTClientãäœæããŸãã MQTTClietnã¡ãœããã§ã¯ãLinuxã·ã¹ãã ã³ãŒã«ã䜿çšããŠmosquitto_subããã³mosquitto_pubãåŒã³åºããMQTTãããã³ã«ã䜿çšããŠéä¿¡ã¿ã¹ã¯ãåŠçããŸãã 以äžã«ãMQTTClentã¯ã©ã¹ã®èª¬æã瀺ããŸãããæäœéå¿
èŠãªæ©èœã«ãã£ãŠå¶éãããŠããŸãã
// : MQTTClient.h /* MQTT-, mosquitto_sub mosquitto_pub , Mosquitto MQTT mosquitto_pub/sub */ #ifndef __MQTTClient_H__ #define __MQTTClient_H__ #include <Arduino.h> #include <stdio.h> enum security_mode {OPEN = 0, SSL = 1, PSK = 2}; class MQTTClient { public: MQTTClient(); ~MQTTClient(); void begin(char * broker, int port, security_mode mode, char* certificate_file, char *psk_identity, char *psk); boolean publish(char *topic, char *message); boolean subscribe(char* topic, void (*callback)(char *topic, char* message)); boolean loop(); boolean available(); void close(); private: void parseDataBuffer(); FILE* spipe; char mqtt_broker[32]; security_mode mode; char topicString[64]; char certificate_file[64]; char psk_identity[32]; char psk_password[32]; int serverPort; char *topic; char *message; boolean retain_flag; void (*callback_function)(char* topic, char* message); char dataBuffer[256]; }; #endif
ãã®ã¯ã©ã¹ã䜿çšããã«ã¯ãMQTTClientãªããžã§ã¯ãã®äœæããéå§ãã
MQTTClient :: beginïŒïŒãåŒã³åºããŠ
MQTTClient :: subscribeïŒïŒããã³
MQTTClient :: publishïŒïŒã䜿çšããŠMQTTãããŒã«ãŒã«æ¥ç¶ããããŸããŸãªå€æ°ãåæåããå¿
èŠããããŸãã ãããã®å€æ°ã®èª¬æã¯æ¬¡ã®ãšããã§ãã
- mqtt_broker ïŒMQTTãããŒã«ãŒã®ååã IPã¢ãã¬ã¹ãŸãã¯DNSåãæå®ã§ããŸãã ãã®å ŽåããããŒã«ãŒã¯ã¹ã±ãããšåãIntel EdisonããŒãã§å®è¡ãããããããlocalhostãã䜿çšããŸãã EdisonãéçIPã¢ãã¬ã¹ã䜿çšããããã«æ§æãããŠããå Žåããlocalhostãã®ä»£ããã«äœ¿çšã§ããŸãã
- serverPort ïŒäœ¿çšãããããŒãã MosquittoãããŒã«ãŒã«3ã€ã®ç°ãªãããŒããå²ãåœãŠãŸãããããããã«ç¬èªã®ã»ãã¥ãªãã£ããªã·ãŒããããŸãã
- 1883ã¯ããã©ã«ãã®MQTTããŒãã§ããããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠéãããŠããŸãã
- 1994ã¯å®å
šãªSSLããŒããšããŠèšå®ãããŠããŸãã ãã®ãããªããŒãã«æ¥ç¶ããã¯ã©ã€ã¢ã³ãã«ã¯ããµãŒããŒèšŒææžãçºè¡ãã蚌ææ©é¢ãçºè¡ããSSL蚌ææžãå¿
èŠã§ãã
- 1995ã¯å®å
šãªTLS-PSKããŒãã§ãã ããã«ã¢ã¯ã»ã¹ããã«ã¯ããŠãŒã¶ãŒåãšãã¹ã¯ãŒããå¿
èŠã§ããããã¯ãã·ã¹ãã ã®ã¯ã©ã€ã¢ã³ãéšåãšãµãŒããŒéšåã®äž¡æ¹ã§äºåã«ç¥ãããŠããŸãã
- mode ïŒäœ¿çšããã»ãã¥ãªãã£ã¢ãŒãã ãã®äŸã«ã¯ãOPENãSSLãããã³PSKã®3ã€ã®ã¢ãŒãããããŸãã éžæããã»ãã¥ãªãã£ã¢ãŒãã«å¿ããŠã蚌ææžãŸãã¯ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããä»ã®åŒæ°ã§ã¡ãœããã«æž¡ãããŸãã éžæããã»ãã¥ãªãã£ã¢ãŒãã§äœ¿çšãããªãåŒæ°ã¯ç¡èŠãããŸãã
ãããã¯ããµãã¹ã¯ã©ã€ãããã«ã¯ããããã¯ã®ååãšãæ°ããã¡ãã»ãŒãžãå°çãããšãã«èµ·åãããã³ãŒã«ããã¯é¢æ°ã䜿çšããŠã
MQTTClientïŒsubscribeïŒïŒã¡ãœãããåŒã³åºããŸãã ç¹å®ã®ä»¶åã§ã¡ãã»ãŒãžãå
¬éããã«ã¯ã
MQTTClientïŒpublishïŒïŒã件åãšã¡ãã»ãŒãžåã§åŒã³åºããŸãã
ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããæ¹æ³ãšãããªã±ãŒã·ã§ã³ã®æ¹æ³ã®äž¡æ¹ã§ã
mosquitto_subãŸãã¯
mosquitto_pubãåŒã³åºããåŒæ°ã¡ãœãããšä¿åããããã©ã¡ãŒã¿ãŒã䜿çšããé©åãªã³ãã³ããçæãããŸãã 次ã«ãLinuxãã£ãã«ãéããã³ãã³ããå®è¡ãããçµæããã£ãã«ãä»ããŠã¹ã±ããã«è¿ãããŸãã
å
¬éãããšãããã£ãã«ã¯ã¡ãã»ãŒãžãéä¿¡ããçŽåŸã«éããŸãã ãµãã¹ã¯ã©ã€ããããšãã¯ãæ°ããããŒã¿ãåä¿¡ã§ããããã«ãã£ãã«ãéãããŸãŸã«ããŠããå¿
èŠããããŸãã
MQTTClientïŒloopïŒïŒã¡ãœããã¯ããã£ãã«å
ã®ããŒã¿ãå®æçã«ãã§ãã¯ããã³ãŒã«ããã¯é¢æ°ãåŒã³åºããŠæ°ããã¡ãã»ãŒãžãåŠçããããã«èšèšãããŠããŸãã Linuxãã£ãã«ã¯ãããã¯ããããããæ€èšŒäžã«Linuxãã£ãã«ã«äœããªãå Žåããã£ãã«ãéãããã¯ã«ããŸããã ãããã£ãŠã
MQTTClientïŒloopïŒïŒã¡ãœãã
ã§ã®ãã§ãã¯äžã«ãã£ãã«ã空ã§ãã
ããšãå€æããå Žåãã¡ãœããããããã«æ»ããŸãã 以äžã®ç䌌ã³ãŒãã¯ãMQTTClientã¯ã©ã¹ã®äžè¬çãªäœ¿çšæ³ã瀺ããŠããŸãã
#include <MQTTClient.h> #define SAMPLING_PERIOD 100 #define PUBLISH_INTERVAL 30000 MQTTClient mqttClient; void setup() { mqttClient.begin("localhost",1833,PSK,NULL,"psk_user","psk_password"); mqttClient.subscribe("edison/#",myCallBack); } void myCallBack(char* topic, char* message) { // , , } unsigned long publishTime = millis(); void loop() { mqttClient.loop(); // if (millis() > publishTime) { publishTime = millis() + PUBLISH_INTERVAL; mqttClient.publish("edison/sensor1","sensor1value"); mqttClient.publish("edison/sensor2","sensor2value"); } delay(SAMPLING_PERIOD); }
å€æ°ã
SAMPLING_PERIOD ãã¯ãæ°ããã¡ãã»ãŒãžããã§ãã¯ãããé »åºŠãèšå®ããŸãã ãã®å€æ°ã®å€ã¯ãArduinoããã°ã©ã ã®äžéšã§ã¢ã¯ã·ã§ã³ãããªã¬ãŒããã¡ãã»ãŒãžãé
ãå°çããŠæå³ã倱ããªãããã«éžæããå¿
èŠããããŸãã
äœæ¥æéã®ã»ãšãã©ã§ã
MQTTClietnïŒloopïŒïŒã¡ãœããã¯éåžžã«è¿
éã«çµäºããããããã®ã¡ãœãããé »ç¹ã«åŒã³åºããšãã·ã¹ãã ã®è² è·ãéåžžã«å°ãããªããŸãã ã¡ãã»ãŒãžãå
¬éãããééã¯ã
PUBLISH_INTERVALå€æ°ã䜿çšããŠèšå®ãããŸãã ééã®é·ãã¯ãã»ã³ãµãŒãããŒã¿ãå
¬éããé »åºŠã«å¯Ÿå¿ããå¿
èŠããããŸãã ããšãã°ã枩床ã»ã³ãµãŒã¯ãã€ã³ãžã±ãŒã¿ãæ
å ±ç®çã§äœ¿çšãããå Žåã宀枩æ
å ±ã1åã«1åå
¬éããå ŽåããããŸãã ãã ããç
ã»ã³ãµãŒãæ°ç§ããšã«ããŒã¿ãå
¬éããã®ã¯çã«ããªã£ãŠããŸãããã®ãããã»ã³ãµãŒãããªã¬ãŒãããå Žåã«ã¡ãã»ãŒãžãåŸ
ã£ãŠãããµãã¹ã¯ã©ã€ããŒã¯ãæé
ãã«ãªãåã«äœããããæ©äŒããããŸãã
MQTTClientã¯ã©ã¹ã®å®è£
ã¯æ¬¡ã®ãšããã§ãã
// : MQTTClient.cpp #include "MQTTClient.h" #include <fcntl.h> /*====================================================================== / ========================================================================*/ MQTTClient::MQTTClient() { } MQTTClient::~MQTTClient() { close(); } void MQTTClient::close() { if (spipe) { fclose(spipe); } } /*======================================================================== . ==========================================================================*/ void MQTTClient::begin(char *broker, int port, security_mode smode, char* cafile, char *user, char *psk) { strcpy(mqtt_broker, broker); serverPort = port; mode = smode; if (mode == SSL) { strcpy(certificate_file, cafile); } else if (mode == PSK) { strcpy(psk_identity, user); strcpy(psk_password, psk); } Serial.println("MQTTClient initialized"); Serial.print("Broker: "); Serial.println(mqtt_broker); Serial.print("Port: "); Serial.println(serverPort); Serial.print("Mode: "); Serial.println(mode); } /*======================================================================= , (*callback) , , . =========================================================================*/ boolean MQTTClient::subscribe(char* topic, void (*callback)(char* topic, char* message)) { char cmdString[256]; if (mqtt_broker == NULL) { return false; } if (topic == NULL) { return false; } callback_function = callback; switch(mode) { case OPEN: sprintf(cmdString, "mosquitto_sub -h %s -p %d -t %s -v", mqtt_broker, serverPort, topic); break; case SSL: sprintf(cmdString, "mosquitto_sub -h %s -p %d -t %s -v --cafile %s", mqtt_broker, serverPort, topic, certificate_file); break; case PSK: sprintf(cmdString, "mosquitto_sub -h %s -p %d -t %s -v --psk-identity %s --psk %s", mqtt_broker, serverPort, topic, psk_identity, psk_password); break; default: break; } if ((spipe = (FILE*)popen(cmdString, "r")) != NULL) { // int fd = fileno(spipe); int flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags); strcpy(topicString, topic); return true; } else { return false; } } /*==================================================================== , , , . , . ======================================================================*/ boolean MQTTClient::loop() { if (fgets(dataBuffer, sizeof(dataBuffer), spipe)) { parseDataBuffer(); callback_function(topic, message); } } /*==================================================================== . ======================================================================*/ boolean MQTTClient::publish(char *topic, char *message) { FILE* ppipe; char cmdString[256]; boolean retval = false; if (this->mqtt_broker == NULL) { return false; } if (topic == NULL) { return false; } switch (this->mode) { case OPEN: sprintf(cmdString, "mosquitto_pub -h %s -p %d -t %s -m \"%s\" %s", mqtt_broker, serverPort, topic, message, retain_flag?"-r":""); break; case SSL: sprintf(cmdString, "mosquitto_pub -h %s -p %d --cafile %s -t %s -m \"%s\" %s", mqtt_broker, serverPort, certificate_file, topic, message, retain_flag?"-r":""); break; case PSK: sprintf(cmdString, "mosquitto_pub -h %s -p %d --psk-identity %s --psk %s -t %s -m \"%s\" %s", mqtt_broker, serverPort, psk_identity, psk_password, topic, message, retain_flag?"-r":""); break; } if (!(ppipe = (FILE *)popen(cmdString, "w"))) { retval = false; } if (fputs(cmdString, ppipe) != EOF) { retval = true; } else { retval = false; } fclose(ppipe); return retval; } /*====================================================================== , . . , , NULL ========================================================================*/ void MQTTClient::parseDataBuffer() { topic = dataBuffer; message = dataBuffer; while((*message) != 0) { if ((*message) == 0x20) { // NULL (*message) = 0; message++; break; } else { message++; } } if (strlen(message) == 0) { topic = NULL; message = dataBuffer; } } <h2> </h2>
以åã®åºçç©ã®1ã€ã§ãã»ã³ãµãŒãšã¢ã¯ãã¥ãšãŒã¿ãåããã»ã³ãµãŒã¢ã»ã³ããªã®ã¢ã»ã³ããªã«ã€ããŠèª¬æããŸããã ã€ãŸãããããããã€ã¹ã®æ§æèŠçŽ ã§ãããäœæããããã®ã§ãã
- åããæ€åºããã¢ãŒã·ã§ã³ã»ã³ãµãŒã
- åšå²æž©åºŠã枬å®ã§ãã枩床ã»ã³ãµãŒã
- å
ã枬å®ããå
ã»ã³ãµãŒã
- ã¿ãŒã²ãããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãèªèã§ããã³ãã³ããã¿ã³ã ãã®å Žåããã¿ã³ãæŒããŸãã
- ãã¿ã³ãæŒããšãªã³/ãªãããèµ€è²ã®LEDã
- ã¢ãŒã·ã§ã³ã»ã³ãµãŒãããªã¬ãŒããããšç¹ç¯ããç·è²ã®LEDã
Intel Edison TouchããŒãMQTTã䜿çšããŠãããŸããŸãªã»ã³ãµãŒã®ã€ã³ãžã±ãŒã¿ãŒãå®æçã«çºè¡ããåãIntel Edisonã·ã¹ãã ã§å®è¡ãããMosquittoãããŒã«ãŒã«ã¡ãã»ãŒãžãæž¡ããŸãã ãã¹ãŠã®ãããã¯ãã€ãŸããedison /ïŒãã賌èªããŸãã ããã«ãã»ã³ãµãŒããŒãã®ããžãã¯ã«ããã€ãã®å€æŽãå ããŸãã
- ã³ãã³ããã¿ã³ã¯ãèµ€è²ã®LEDããªã³ããã³ãªãã«ããªããªããŸãã ãããã¯ãªãã¯ãããšãè«çå€æ°ã®å€ãå€æŽããä¿¡å·ãšããŠæ©èœããMQTTãµãã¹ã¯ã©ã€ããŒã«éä¿¡ãããŸãã
- èµ€ãLEDã¯ãMQTTã¡ãã»ãŒãžã䜿çšããŠãªã³ããã³ãªãã«ãªããŸãã åæ§ã®ã¡ã«ããºã ããã€ã³ã¿ãŒãããçµç±ã§å¶åŸ¡å¯èœãªç
§æåšå
·ã®ã¢ã¯ã»ã¹ã¢ãžã¥ãŒã«ã®åœ¹å²ãæããããšãã§ããŸãã
- ç·è²ã®LEDã®åäœã¯ãMQTTã䜿çšããŠèª¿æŽã§ããŸãã ã€ãŸããã¢ãŒã·ã§ã³ã»ã³ãµãŒãããªã¬ãŒããããšãã«ãªã³ã«ããããšããåžžã«ãªãã®ãŸãŸã«ããããšãã§ããŸãã
åºæ¬çãªã¹ã±ããã³ãŒãã次ã«ç€ºããŸãã
// : MQTT_IoT_Sensor.ino /****************************************************************************** , Intel Edison ******************************************************************************/ #include <stdio.h> #include <Arduino.h> #include "sensors.h" #include "MQTTClient.h" // unsigned long updateTime = 0; // volatile unsigned long activityMeasure; volatile unsigned long activityStart; volatile boolean motionLED = true; unsigned long resetActivityCounterTime; // boolean toggleLED = false; volatile unsigned long previousEdgeTime = 0; volatile unsigned long count = 0; volatile boolean arm_alarm = false; // MQTT- #define SECURE_MODE 2 MQTTClient mqttClient; char fmtString[256]; // char topicString[64]; // char msgString[64]; // /***************************************************************************** ******************************************************************************/ void setup() { Serial.begin(115200); delay(3000); Serial.println("Ready"); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(BUTTON, INPUT_PULLUP); pinMode(PIR_SENSOR, INPUT); // . attachInterrupt(BUTTON, buttonISR, RISING); // . attachInterrupt(PIR_SENSOR, pirISR, CHANGE); digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED,LOW); resetActivityCounterTime = 0; // MQTTClient #if ( SECURE_MODE == 0 ) Serial.println("No security"); mqttClient.begin("localhost", 1883, OPEN, NULL, NULL, NULL); #elif ( SECURE_MODE == 1 ) Serial.println("SSL security"); mqttClient.begin("localhost", 1994, SSL, "/home/mosquitto/certs/ca.crt", NULL, NULL); #elif ( SECURE_MODE == 2 ) Serial.println("TLS-PSK security"); mqttClient.begin("localhost", 1995, PSK, NULL, "user", "deadbeef"); #endif // edison mqttClient.subscribe("edison/#", mqttCallback); mqttClient.publish("edison/bootMsg","Booted"); digitalWrite(RED_LED, LOW); } /************************************************************************** MQTT **************************************************************************/ void mqttCallback(char* topic, char* message) { sprintf(fmtString, "mqttCallback(), topic: %s, message: %s",topic,message); Serial.print(fmtString); // if (strcmp(topic,"edison/LED") == 0) { // if (message[0] == 'H') { digitalWrite(RED_LED, HIGH); toggleLED = false; } else if (message[0] == 'L') { digitalWrite(RED_LED, LOW); toggleLED = false; } else if (message[0] == 'B') { toggleLED = true; } } if (strcmp(topic, "edison/motionLED") == 0) { // , // . // strncmp , if (strncmp(message, "OFF", 3) == 0) { digitalWrite(GREEN_LED, LOW); motionLED = false; } else if (strncmp(message, "ON", 2) == 0) { motionLED = true; } } } /*********************************************************************** ***********************************************************************/ void loop() { // , mqtt_sub mqttClient.loop(); if (millis() > resetActivityCounterTime) { resetActivityCounterTime = millis() + 60000; // , sprintf(msgString,"%.0f",100.0*activityMeasure/60000.0); mqttClient.publish("edison/ActivityLevel",msgString); activityMeasure = 0; } if (millis() > updateTime) { updateTime = millis() + 10000; // sprintf(msgString,"%.1f",readTemperature(TEMP_SENSOR)); mqttClient.publish("edison/Temperature",msgString); // sprintf(msgString,"%d",readLightSensor(LIGHT_SENSOR)); mqttClient.publish("edison/LightSensor",msgString); // arm_alarm sprintf(msgString,"%s", (arm_alarm == true)? "ARMED" : "NOTARMED"); mqttClient.publish("edison/alarm_status", msgString); } if (toggleLED == true) { digitalWrite(RED_LED, digitalRead(RED_LED) ^ 1); } delay(100); }
. , , , ,
sensor.h sensor.cpp .
SECURE_MODE Arduino- . ,
mqttCallback(), , MQTT-. , , , . , , , .
â , IoT- . «edison/LED» , . «edison/motionLED» . , .
// : sensors.h // #define USE_TMP036 0 #define RED_LED 10 // #define GREEN_LED 11 // #define BUTTON 13 // 10K #define PIR_SENSOR 12 // #define LIGHT_SENSOR A0 // #define TEMP_SENSOR A1 // TMP36 LM35 #define MIN_PULSE_SEPARATION 200 // #define ADC_STEPSIZE 4.61 // , . #if (USE_TMP036 == 1) #define TEMP_SENSOR_OFFSET_VOLTAGE 750 #define TEMP_SENSOR_OFFSET_TEMPERATURE 25 #else // LM35 temperature sensor #define TEMP_SENSOR_OFFSET_VOLTAGE 0 #define TEMP_SENSOR_OFFSET_TEMPERATURE 0 #endif // extern unsigned long updateTime; // extern volatile unsigned long activityMeasure; extern volatile unsigned long activityStart; extern volatile boolean motionLED; extern unsigned long resetActivityCounterTime; // extern boolean toggleLED; extern volatile unsigned long previousEdgeTime; extern volatile unsigned long count; extern volatile boolean arm_alarm; float readTemperature(int analogPin); int readLightSensor(int analogPin); void buttonISR(); void pirISR(); // : sensors.cpp #include <Arduino.h> #include "sensors.h" void pirISR() { int pirReading; unsigned long timestamp; timestamp = millis(); pirReading = digitalRead(PIR_SENSOR); if (pirReading == 1) { // activityStart = timestamp; } else { int pulseWidth = timestamp-activityStart; activityMeasure += pulseWidth; } // , if (motionLED == true) { digitalWrite(GREEN_LED, pirReading); } } int readLightSensor(int sensorPin) { return analogRead(sensorPin); } float readTemperature(int sensorPin) { int sensorReading; float temperature; sensorReading = analogRead(sensorPin); // temperature = sensorReading * ADC_STEPSIZE; // LM35, TMP036, : // 10 // LM35 â 0 , TMP036 - 750 // LM35 â 0 , TMP036 â 25 . temperature = (temperature - TEMP_SENSOR_OFFSET_VOLTAGE)/10.0 + TEMP_SENSOR_OFFSET_TEMPERATURE; // temperature = temperature * 1.8 + 32.0; return temperature; } void buttonISR() { // , if ((millis()-previousEdgeTime) >= MIN_PULSE_SEPARATION) { arm_alarm = !arm_alarm; Serial.print("Alarm is: "); if (arm_alarm == true) { Serial.println("ARMED"); } else { Serial.println("NOT ARMED"); } count++; Serial.print("Count: "); Serial.println(count); } previousEdgeTime=millis(); }
ãã¹ãäž
, , MQTT- , , â , .
Edison SSH
mosquitto_sub/pub . -, Mosquitto.
, .
, , :
$> mosquitto_sub âh ipaddr âp 1883 ât edison/
ipaddr â IP- Intel Edison. Edison, IP- «localhost». , 1883. 1994, SSL-. 1995, PSK, . «edison/#» , .
, , «edison/LED», , «edison/motionLED», .
$> mosquitto_pub âh ipaddr âp 1883 ât Edison/LED âm {H, L, B} $> mosquitto_pub âh ipaddr âp 1883 ât Edison/motionLED âm {ON, OFF}
(H, L, B) , .
, , , , ON OFF.
, .
çµè«
æ¯èŒçè€éãªãœãããŠã§ã¢ã·ã¹ãã Mosquitto MQTTã䜿çšããIntel EdisonããŒãäžã®Linuxããã°ã©ãã³ã°ã¡ã«ããºã ã䜿çšããŠã¹ã±ããããåäœãããæ¹æ³ãåŠã³ãŸãããåãåçã¯ãArduinoãã©ãããã©ãŒã çšã«éçºãããããŸããŸãªã»ã³ãµãŒããµããŒãããããã«èšèšãããå€ãã®ã©ã€ãã©ãªãžã®ã¢ãããŒããèŠã€ããã®ã«åœ¹ç«ã¡ãŸãããã®å Žåã¯Arduinoããã°ã©ã ã®åºç€ã§ããLinuxã䜿çšãããšãLinuxçšã«äœæããããªãŒãã³ãœãŒã¹ããã±ãŒãžãç°¡åã«äœ¿çšã§ããŸãã