{"id":1199,"date":"2020-02-19T16:44:37","date_gmt":"2020-02-19T09:44:37","guid":{"rendered":"http:\/\/wiki.rdd-tech.com\/?post_type=ht_kb&#038;p=1199"},"modified":"2020-08-14T15:53:19","modified_gmt":"2020-08-14T08:53:19","slug":"pengenalan-komunikasi-m2m-machine-to-machine-via-mqtt","status":"publish","type":"ht_kb","link":"https:\/\/wiki.rdd-tech.com\/index.php\/knowledge-base\/pengenalan-komunikasi-m2m-machine-to-machine-via-mqtt\/","title":{"rendered":"Pengenalan Komunikasi M2M (Machine to Machine) Via MQTT"},"content":{"rendered":"\n<h3 id=\"1-apa-itu-komunikasi-m2m-machine-to-machine\" >1. Apa itu komunikasi M2M (Machine to Machine)?<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Komunikasi <em>machine to machine<\/em> (M2M) adalah komunikasi langsung antar perangkat menggunakan sebuah kanal (<em>channel<\/em>) komunikasi yang terhubung menggunakan kabel <em>(wired<\/em>) maupun nirkabel (<em>wireless<\/em>).  <\/p><cite> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_to_machine\">https:\/\/en.wikipedia.org\/wiki\/Machine_to_machine<\/a> <\/cite><\/blockquote>\n\n\n\n<h3 id=\"2-m2m-menggunakan-hivemq\" >2. M2M menggunakan HiveMQ<\/h3>\n\n\n\n<p>Telah dibahas pada artikel sebelumnya mengenai MQTT HiveMQ. MQTT ini berperan sebagai<em> hub<\/em> (penghubung) dari beberapa perangkat, hal ini memungkinkan perangkat-perangkat untuk bertukar informasi satu sama lain. Pada artikel ini akan dibahas bagaimana caranya dua perangkat arduino MKR1000 untuk saling berkomunikasi melalui HiveMQ, berikut adalah alat dan bahan yang diperlukan.<\/p>\n\n\n\n<ol><li>Arduino MKR1000 development board @ 2 unit<\/li><li>Arduino IDE<\/li><li>Analog Sensor @ 1 unit<\/li><li>Push Button @1 unit atau lebih<\/li><li>LCD @ 2 unit<\/li><li>LED @ 1 unit atau lebih<\/li><li>PC @ 1 unit<\/li><li>Koneksi WiFi <\/li><\/ol>\n\n\n\n<p>Untuk percobaan kali ini tentukan peran dari masing-masing board Arduino MKR1000, ada yang berperan sebagai <em>publisher<\/em> (<em>transmiter<\/em>\/pemancar data) dan <em>subscriber<\/em> (<em>receiver<\/em>\/penerima data). Pasanglah sensor analog dan push button pada unit <em>publisher<\/em> dan pasang LED dan LCD pada unit <em>subscriber<\/em>. Setelah dipasang upload program dibawah ini pada unit <em>publisher<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/Program RDD M2M MQTT Publisher Unit\r\n\/\/RDD Team\r\n\r\n#include &lt;WiFi101.h>\r\n#include &lt;PubSubClient.h>\r\n\/\/#include \"mkr1000_secrets.h\"\r\n#define MSG_BUFFER_SIZE  (50)\r\n#include &lt;Wire.h>\r\n#include \"DFRobot_RGBLCD.h\"\r\n\r\nchar msg&#91;MSG_BUFFER_SIZE];\r\nIPAddress ReadIP;\r\nconst char* ssid = \"RDD Office\";\r\nconst char* password = \"Honeyw3ll1\";\r\nconst char* mqtt_server = \"broker.mqttdashboard.com\";\r\n\r\nString StrTopic;\r\nString StrPayload;\r\n\r\nWiFiClient mkrClient;\r\nPubSubClient client(mkrClient);\r\n\r\n\r\nconst int  lm35Pin = A0;\r\nfloat lm35Val;\r\nconst int numReadings = 10;\r\nint lm35Raw;\r\n\r\nconst int buttonPin0 = 0;\r\nint buttonPushCounter0 = 0;\r\nint buttonState0 = 0; \r\nint lastButtonState0 = 0;\r\nint buttonUpdate0;\r\nunsigned long currentMillis,previousMillis;\r\nunsigned long currentMillis1,previousMillis1;\r\nconst int colorR = 255;\r\nconst int colorG = 255;\r\nconst int colorB = 255; \r\nDFRobot_RGBLCD lcd(16,2);\r\nvoid setup_wifi() \r\n{\r\n  delay(10);\r\n  \r\n  Serial.println();\r\n  Serial.print(\"Connecting to \");\r\n  Serial.println(ssid);\r\n\r\n  WiFi.begin(ssid, password);\r\n\r\n  while (WiFi.status() != WL_CONNECTED) \r\n  {\r\n    delay(500);\r\n    Serial.print(\".\");\r\n  }\r\n  randomSeed(micros());\r\n\r\n  Serial.println(\"\");\r\n  Serial.println(\"WiFi connected\");\r\n  Serial.print(\"IP address: \");\r\n  ReadIP = WiFi.localIP();\r\n  Serial.println(ReadIP);\r\n}\r\n\r\nvoid callback(char* topic, byte* payload, unsigned int length) \r\n{\r\n  StrTopic=topic;\r\n  Serial.print(\"Message arrived &#91;\");\r\n  Serial.print(StrTopic);\r\n  Serial.print(\"] \");\r\n  for (int i = 0; i &lt; length; i++) \r\n  {\r\n      StrPayload=StrPayload+(char)payload&#91;i];\r\n  }\r\n  Serial.print(StrPayload);\r\n  Serial.println();\r\n\r\n  if (StrTopic == \"RDD\/Ack_LED0\")\r\n  {\r\n    Serial.println(\"RDD\/Ack_LED0\");\r\n    if (StrPayload == \"OFF\") \r\n    {\r\n      \r\n      lcd.setCursor(0,1);\r\n      lcd.print(\"LED : OFF\");\r\n      Serial.println(\"LED0 OFF\");\r\n    } \r\n    else if (StrPayload == \"ON\") \r\n    {\r\n      \r\n      lcd.setCursor(0,1);\r\n      lcd.print(\"LED : ON \"); \r\n      Serial.println(\"LED0 ON\");\r\n    }\r\n    else\r\n    {\r\n      \r\n      lcd.setCursor(1,1);\r\n      lcd.print(\"OFF\");  \r\n      Serial.println(\"LED0 OFF\");\r\n    }\r\n    StrPayload=\"\";\r\n  }\r\n}\r\nvoid reconnect() \r\n{\r\n \r\n  while (!client.connected()) \r\n  {\r\n    Serial.print(\"Attempting MQTT connection...\");\r\n    \r\n    String clientId = \"rdd_mkr1000_unit0\";\r\n    clientId += String(random(0xffff), HEX);\r\n    if (client.connect(clientId.c_str())) \r\n    {\r\n      Serial.println(\"connected\");\r\n      client.publish(\"RDD\/Get_Temp\", msg);\r\n      client.subscribe(\"RDD\/Ack_LED0\");\r\n    } \r\n    else \r\n    {\r\n      Serial.print(\"failed, rc=\");\r\n      Serial.print(client.state());\r\n      Serial.println(\" try again in 5 seconds\");\r\n      delay(5000);\r\n    }\r\n  }\r\n}\r\nvoid setup() {\r\n Serial.begin(115200);\r\n\r\n lcd.init();\r\n lcd.setRGB(colorR, colorG, colorB);\r\n lcd.setCursor(0,0);\r\n lcd.print(\"MQTT PUBLISHER\");\r\n lcd.clear();\r\n delay(2000);\r\n\r\n analogReadResolution(12);\r\n analogReference(AR_DEFAULT);\r\n \r\n pinMode(buttonPin0, INPUT);\r\n setup_wifi();\r\n client.setServer(mqtt_server, 1883);\r\n client.setCallback(callback);\r\n buttonUpdate0=100;\r\n}\r\n\r\nvoid loop() {\r\n  if (!client.connected()) \r\n  {\r\n    reconnect();\r\n  }\r\n  client.loop();\r\n  lm35Raw = analogRead(A0);\r\n  lm35Val = (lm35Raw\/4095.0)*3.3;\r\n  lm35Val = lm35Val*147.252;\r\n  buttonState0 = digitalRead(buttonPin0);\r\n  currentMillis = millis();\r\n  currentMillis1 = millis();\r\n  if (currentMillis-previousMillis > 200)\r\n  {\r\n    if (buttonState0 != lastButtonState0) \r\n    {\r\n      if (buttonState0 == HIGH) \r\n      {\r\n        client.publish(\"RDD\/Set_LED0\", \"ON\");\r\n      }\r\n    }  \r\n    else\r\n    {\r\n        client.publish(\"RDD\/Set_LED0\", \"OFF\");\r\n    }\r\n    \r\n    previousMillis = currentMillis;\r\n    buttonState0 = lastButtonState0;\r\n  }\r\n  if (currentMillis1-previousMillis1 > 2000)\r\n  {\r\n      snprintf (msg, MSG_BUFFER_SIZE , \"%.2f\",  lm35Val);\r\n      previousMillis1 = currentMillis1;\r\n      client.publish(\"RDD\/Get_Temp\", msg);\r\n      lcd.setCursor(0,0);\r\n      lcd.print(\"Temp:\");\r\n      lcd.setCursor(5,0);\r\n      lcd.print(lm35Val);\r\n      lcd.setCursor(11,0);\r\n      lcd.print(\"^C\");\r\n  }\r\n}<\/code><\/pre>\n\n\n\n<p>Program diatas menggunakan pin D0 sebagai input <em>push button <\/em>dan A0 sebagai sebagai input sensor analog. Lalu mengirimkan datanya melalui MQTT. LCD pada unit publisher sebagai indikator bahwa perintah sudah diterima \/ ack (<em>acknowledged<\/em>) oleh<em> unit subcriber<\/em>. Setelah <em>upload <\/em>program <em>publisher<\/em>, <em>upload<\/em>-lah program dibawah ini pada unit <em>subscriber<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/Program RDD M2M MQTT Subscriber Unit\r\n\/\/RDD Team\r\n\r\n\r\n#include &lt;WiFi101.h>\r\n#include &lt;PubSubClient.h>\r\n#include \"DFRobot_RGBLCD.h\"\r\n\r\n#define LED0         5\r\n#define FB_LED0_ON        10\r\n#define FB_LED0_OFF       15\r\n#define LCD_Update        100\r\n#define LCD_OFF           0\r\n\r\nconst int colorR = 255;\r\nconst int colorG = 0;\r\nconst int colorB = 0;\r\nchar LCD;\r\nchar Feedback_LED;\r\nfloat Temp;\r\nIPAddress ReadIP;\r\nDFRobot_RGBLCD lcd(16,2);\r\nconst char* ssid = \"RDD Office\";\r\nconst char* password = \"Honeyw3ll1\";\r\nconst char* mqtt_server = \"broker.mqttdashboard.com\";\r\n\r\nWiFiClient MKRClient;\r\nPubSubClient client(MKRClient);\r\nlong lastMsg = 0;\r\nchar msg&#91;50];\r\nint value = 0;\r\nString StrTopic;\r\nString StrPayload;\r\nunsigned long currentMillis,previousMillis;\r\nvoid setup_wifi() {\r\n\r\n  delay(10);\r\n  \/\/ We start by connecting to a WiFi network\r\n  Serial.println();\r\n  Serial.print(\"Connecting to \");\r\n  Serial.println(ssid);\r\n\r\n  WiFi.begin(ssid, password);\r\n\r\n  while (WiFi.status() != WL_CONNECTED) {\r\n    delay(500);\r\n    Serial.print(\".\");\r\n  }\r\n\r\n  randomSeed(micros());\r\n\r\n  Serial.println(\"\");\r\n  Serial.println(\"WiFi connected\");\r\n  Serial.print(\"IP address: \");\r\n  ReadIP = WiFi.localIP();\r\n  Serial.println(ReadIP);\r\n}\r\nvoid callback(char* topic, byte* payload, unsigned int length) \r\n{\r\n  StrTopic=topic;\r\n  Serial.print(\"Message arrived &#91;\");\r\n  Serial.print(StrTopic);\r\n  Serial.print(\"] \");\r\n  for (int i = 0; i &lt; length; i++) {\r\n      StrPayload=StrPayload+(char)payload&#91;i];\r\n  }\r\n  Serial.print(StrPayload);\r\n  Serial.println();\r\n\r\n  \/\/Scan Topic\r\n  if (StrTopic == \"RDD\/Set_LED0\")\r\n  {\r\n    if (StrPayload == \"OFF\") \r\n    {\r\n      digitalWrite(LED0, LOW);   \/\/ Turn the LED off\r\n      Serial.println(\"LED0 OFF\");\r\n      Feedback_LED= FB_LED0_OFF;\r\n    } \r\n    if (StrPayload == \"ON\") \r\n    {\r\n      digitalWrite(LED0, HIGH);  \/\/ Turn the LED on\r\n      Serial.println(\"LED0 ON\");\r\n      Feedback_LED= FB_LED0_ON;\r\n    }\r\n    StrPayload=\"\";\r\n  }\r\n  else if (StrTopic == \"RDD\/Get_Temp\")\r\n  {\r\n    Serial.println(StrPayload);\r\n    Temp=StrPayload.toFloat();\r\n    StrPayload=\"\";\r\n    LCD=LCD_Update;\r\n  }\r\n  else\r\n  {\r\n    StrPayload=\"\";\r\n  }\r\n}\r\nvoid reconnect() {\r\n  \/\/ Loop until we're reconnected\r\n  while (!client.connected()) {\r\n    Serial.print(\"Attempting MQTT connection...\");\r\n    \/\/ Create a random client ID\r\n    String clientId = \"MKRClient-\";\r\n    clientId += String(random(0xffff), HEX);\r\n    \/\/ Attempt to connect\r\n    if (client.connect(clientId.c_str())) {\r\n      Serial.println(\"connected\");\r\n      \/\/ Once connected, publish an announcement...\r\n      \/\/ ... and resubscribe\r\n      client.subscribe(\"RDD\/Set_LED0\");\r\n      client.subscribe(\"RDD\/Get_Temp\");\r\n    } else {\r\n      Serial.print(\"failed, rc=\");\r\n      Serial.print(client.state());\r\n      Serial.println(\" try again in 5 seconds\");\r\n      \/\/ Wait 5 seconds before retrying\r\n      delay(5000);\r\n    }\r\n  }\r\n}\r\nvoid setup() {\r\n  pinMode(LED0,OUTPUT);\r\n   lcd.init();\r\n   lcd.setRGB(colorR, colorG, colorB);\r\n   lcd.setCursor(0,0);\r\n   lcd.print(\"MQTT Subscriber\");\r\n   Serial.begin(115200);\r\n   setup_wifi();\r\n   client.setServer(mqtt_server, 1883);\r\n   client.setCallback(callback);\r\n   LCD=LCD_Update;\r\n   Feedback_LED = FB_LED0_OFF;\r\n}\r\n\r\nvoid loop() {\r\n\r\n  if (!client.connected()) {\r\n  reconnect();\r\n  }\r\n  client.loop();\r\n\r\n  if (LCD == LCD_Update)\/\/Update data in LCD screen\r\n  { \r\n    lcd.setCursor(0,1);\r\n    lcd.print(\"Temp:\");\r\n    lcd.setCursor(5,1);\r\n    lcd.print(Temp);\r\n    lcd.setCursor(11,1);\r\n    lcd.print(\"^C\");\r\n    LCD=LCD_OFF;\r\n  }\r\n  currentMillis = millis();\r\n  if (currentMillis - previousMillis >200)\r\n  {\r\n    if (Feedback_LED == FB_LED0_ON)\r\n    {\r\n      client.publish(\"RDD\/Ack_LED0\",\"ON\");\r\n    }\r\n    if (Feedback_LED == FB_LED0_OFF)\r\n    {\r\n      client.publish(\"RDD\/Ack_LED0\",\"OFF\");\r\n    }\r\n    previousMillis = currentMillis;\r\n  }\r\n\r\n}<\/code><\/pre>\n\n\n\n<p>Program diatas menggunakan Pin D5 dan LCD. LCD digunakan untuk menampilkan data suhu yang didapatkan dari <em>publisher<\/em>. <\/p>\n\n\n\n<p>Buka HiveMQ pada web browser dan tambahlah <em>topic subcription<\/em> sesuai dengan yang ada diprogram. Setelah ditambah maka akan muncul seperti gambar 1.1 dibawah. Coba nyalakan LED pada unit subscriber dengan menekan button pada unit publisher dan juga lihat apakah pembacaan nilai analog pada unit publisher muncul pada layar LCD unit subscriber. Jika kedua hal diatas telah berhasil maka M2M menggunakan HiveMQ telah tercapai. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"542\" src=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-1024x542.png\" alt=\"\" class=\"wp-image-1402\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-1024x542.png 1024w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-300x159.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-768x406.png 768w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-50x26.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-1536x813.png 1536w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-920x487.png 920w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-600x318.png 600w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ-320x169.png 320w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/08\/SS_HiveMQ.png 1591w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>1.1 HiveMQ<\/figcaption><\/figure>\n","protected":false},"author":4,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0},"ht_kb_category":[10],"ht_kb_tag":[],"_links":{"self":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb\/1199"}],"collection":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/comments?post=1199"}],"version-history":[{"count":12,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb\/1199\/revisions"}],"predecessor-version":[{"id":1403,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb\/1199\/revisions\/1403"}],"wp:attachment":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/media?parent=1199"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb_category?post=1199"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb_tag?post=1199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}