WEEK 2 Arduino IoTs – MQTT and Anto Interface

1.      MQTT and Anto Interface คืออะไร


1.     IoT and MQTT
Message Queuing Telemetry Transport (MQTT) เป็นProtocol ที่ออกแบบมาเพื่อการเชื่อมต่อแบบ M2M (machine-to-machine) คืออุปกรณ์กับอุปกรณ์ สนับสนุนเทคโนโลยี iot (Internet of Things) คือเทคโนโลยีที่อินเทอร์เน็ตเชื่อมต่อกับอุปกรณ์ต่าง ๆ เช่น โทรศัพท์มือถือ รถยนต์ โทรทัศน์ ตู้เย็น เข้ากับอินเทอร์เน็ตทำให้สามารถเชื่อมโยงสื่อสารกับอุปกรณ์ต่าง ๆ ได้ โดยผ่านเครือข่ายอินเทอร์เน็ต ซึ่งจะทำให้มนุษย์สามารถ ควบคุมอุปกรณ์ต่าง ๆ จากที่อื่นได้ เช่นการสั่งปิดเปิดไฟในบ้านจากที่อื่น ๆ
เนื่องจากโปรโตคอลตัวนี้มีน้ำหนักเบา  ออกแบบมาเพื่อใช้งานกับอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก การรับส่งข้อมูลในเครื่อข่ายที่มีขนาดเล็ก แบนร์วิธต่ำ ใช้หลักการแบบ publisher / subscriber คล้ายกับหลักการที่ใช้ใน Web Service ที่ต้องใช้ Web Server เป็นตัวกลางระหว่างคอมพิวเตอร์ของผู้ใช้ แต่ MQTT จะใช้ตัวกลางที่เรียกว่า Broker เพื่อทำหน้าที่ จัดการคิว รับ – ส่ง ข้อมูลระหว่างอุปกรณ์ และทั้งในส่วนที่เป็น Publisher และ Subscriberปัจจุบันเทคโนโลยีที่กำลังมาแรงสำหรับนักพัฒนาด้าน Embedded
IoT มันคืออะไร พอค้นดูมีหลายลิงค์อธิบายไว้มากมาย เช่น Internet of Things เมื่อคอมพิวเตอร์เริ่มคุยกันเองได้ , โลกแห่ง IoT มาถึงแล้ว IoT เทคโนโลยีที่ธุรกิจต้องรู้. ลองนึกภาพดูครับว่าถ้าหากอุปกรณ์สามารถสั่งงานไปมาหากันได้ผ่าน www ไม่ว่าจะเป็น PC, Smart Phone หรือแม้แต่อุปกรณ์ขนาดเล็กพวก Micro-Controller, PLC, HUB, Switch หรืออะไรก็แล้วแต่ที่มันสามารถต่อระบบ Network ไม่ว่ามันจะอยู่ที่บ้าน ที่โรงงาน ไร่ นา ฟาร์มโรงเรือน โรงงานอุตสาหกรรมหรือที่อื่นๆที่มีระบบเน็ตเวอร์ที่เข้าถึง www ได้เราจะสามารถควบคุมมันได้ทั้งหมดที่ไหนก็ได้ในโลกใบนี้
IoT ทำมีวิธีการทำงานอย่างไร องค์ประกอบหลักของ IoT จะมี 3 ส่วนคือ Broker, Publisher และ Subscriber. ซึ่งการรับและส่งข้อมูลนั้นมันจะส่งข้อมูลไปมาหากันนั้นจะส่งผ่านตัวกลางนั้นก็คือ Broker Server โดยตัวส่งนี้จะเรียกว่า Publisher ส่งข้อมูลขึ้นไปยัง Broker พร้อมระบุหัวข้อ (Topic) ที่ต้องการส่งข้อออกไป จากนั้นตัวรับซึ่งเรียกว่า Subscriber ถ้าหากตัวรับต้องการรับข้อมูลจากตัวส่งจะต้องทำการ Subscribe หัวข้อ Topic ของ Publisher นั้นๆ ผ่าน Broker เช่นกัน


IoT
จากรูปภาพด้านบนจะมีตัว Publisher ทำการ Public ข้อความ “Hello” ใน Topic Device1 เมื่อและถ้าหากมีคอมพิวเตอร์ หรืออุปกรณ์อื่นๆทำการ Subscribe หัวข้อ Topic Device1 เมื่อ Publisher ทำการส่งข้อมูลไปยัง Topic อุปกรณ์ Subscribe จะได้ข้อความ “Hello” เช่นเดียวกัน. ก็คล้ายๆกับที่ใช้งานไลน์ที่คุยกันเป็นกลุ่มนั้นเลยครับ. ซึ่งจะเห็นข้อความ “Hello” ในเวลาเดียวกันนั้นหมายความว่าอุปกรณ์ใดๆที่ทำการ Subscribe Topic เดียวกันก็จะได้ข้อความเดียวกันครับ
โปรโตคอลที่ใช้สำหรับรับและส่งข้อมูลนั้นคือ MQTT ปัจจุบันถึง Version 3. 1 ในที่นี้จะมาทำการทดลองส่งข้อมูลกันตัว Server จะมีอยู่ด้วยกันหลายค่ายครับสำหรับที่ลิสมาด้านล่างนี้ครับ
Open Source MQTT Broker Server
·        Mosquitto
·        RSMB
·        ActiveMQ
·        Apollo
·        Moquette
·        Mosca
·        RabbitMQ
MQTT Client
·        Paho
·        Xenqtt
·        mqtt.js
·        node_mqtt_client
·        Ascoltatori
·        Arduino MQTT Client
สำหรับ MQTT Broker Server ฟรีที่ผมพอค้นได้ก็มีดังนี้ครับ
·        test.mosquitto.org
·        broker.mqttdashboard.com

2.     Anto
Anto คือสื่อกลางในการสื่อสารและตัวช่วยเหลือที่ช่วยให้คุณสร้างสรรค์นวัตกรรมโดยเฉพาะทางด้าน IoT ได้ง่ายขึ้น โดยที่ไม่ต้องมีปัญหาจุกจิก หรือตั้งค่าอะไรให้วุ่นวาย
Anto เป็นสื่อกลางในการสื่อสาร Anto ตั้งเซิร์ฟเวอร์ให้คุณใช้บริการฟรี เป็นเสมือนตัวกลางในการสื่อสารระหว่างสิ่งต่างๆบนโลกอินเตอร์เน็ตเช่น คุณต้องการสั่งงานบอร์ดไมโครคอลโทรลเลอร์ผ่านอินเตอร์เน็ตโดยใช้โทรศัพท์มือถือของคุณ เป็นต้น ซึ่งปัจจุบันระบบเรารองรับการติดต่อสื่อสารผ่าน HTTP, HTTPS, MQTT, MQTTS, Websocket ทำให้: ทีมของคุณไม่ต้องเสียเวลาในการติดตั้งและตั้งค่าเซิร์ฟเวอร์ รวมถึงคอยมาดูแลรักษาระบบ
Anto สร้าง Library/API ที่ใช้งานง่าย Anto สร้าง Library ในการเขียนโปรแกรมและสร้าง API ให้นักพัฒนาสามารถเข้าถึงใช้งานและพัฒนาต่อยอดได้อย่างง่ายดาย ยกตัวอย่าง คุณสามารถส่งค่าไปยัง server โดยใช้เพียงแค่หนึ่งคำสั่งเช่น Anto.DigitalUpdate(“led”,true); ทั้งนี้เพื่อความง่ายในการเขียนโปรแกรม ซึ่งปัจจุบันเราได้ทำ Library รองรับ ESP8266 (Nodemcu), Arudino แล้ว และกำลังพัฒนาเพื่อให้รองรับ Rasserby Pi และอื่นๆ ทำให้: ทีมของคุณพัฒนาได้อย่างรวดเร็วมากขึ้น ใช้เวลากับส่วนอื่นได้มากขึ้นเช่น การทำฮาร์ดแวร์-กลไก การออกแบบผลิตภัณฑ์ เรื่องติดต่อธุรกิจอื่น เป็นต้นครับ

การทำ
ติดตั้ง Arduino IDE ที่รองรับ ESP8266
ดาว์โหลด และ ติดตั้ง Arduino IDE v1.6.9+



2.      ทำให้ Arduino IDE ของเรารู้จักกับบอร์ด ESP8266 เข้าเมนู File > Preferences จากนั้นใส่ข้อความว่า http://arduino.esp8266.com/stable/package_esp8266com_index.json ลงไปในช่อง Additional Board Manager URLs แล้วกดตกลง


3.      Install lib โดยเข้าเมนู Tools > Boards Manager พิมพ์ในช่องค้นหาว่า esp8266 จากนั้นกดเลือก Install รอการติดตั้งสักครู่


4.      ติดตั้ง Lib Anto และ สมัครสมาชิก Anto
·       ดาวน์โหลด Lib Anto (Ver. 0.5.2) แล้วแตกไฟล์ที่ดาวน์โหลด เปลี่ยนชื่อโฟลเดอร์เป็น AntoIO

·       วางโฟลเดอร์ AntoIO ไปไว้ที่ Documents > Arduino > Libraries

·       สมัครสมาชิกเป็นครอบครัว Anto กรอกข้อมูลให้ครบถ้วนแล้วกดยืนยันการสมัคร และ Login เข้าสู่ระบบ




ไปโหลดแอป MQTTLens ใน GoogleChrome


ทำการสร้างไฟล์ใน MQTT






Subscribe: android@10logic ในที่นี้ผมจะทำการ Subscriber ที่ Topic ชื่อว่า android@10logic




MyMQTT เมื่อใช้ Smart Phone ที่มีอยู่ทำการ Public ข้อความ “Hello 10logic” ผ่าน MyMQTT แสดงผลตามรูป


Mqttlens จะเห็นว่าสามารถรับข้อความ Hello 10logic ได้ตามตัวอย่างดังภาพ เห็นภาพกันแล้วใช่ไหมครับ ทีนี้เมื่อนักพัฒนาต้องการส่งข้อมูลจากอุปกรณ์ embedded สามารถส่งข้อมูลขึ้นมาได้เช่นกัน
ควบคุมหลอดไฟ LED ผ่าน Internet


สร้าง led ใน auto และกำหนดสิทธิ ใน read/update


ใส่โค้ชลงไปใน arduino

#include <AntoIO.h>

#define LED1 D8
#define LED2 D0 
#define LED3 D2
#define LED4 D3 
#define LED5 D4
#define LED6 D5 
#define LED7 D6
#define LED8 D7 

// username of anto.io account
const char *user = "NoonNapas";

// key of permission, generated on control panel anto.io
const char* key = "Fvkqi3C6a7YNqAul5wioqQ7d1RursljOKHS3Pvi0";

// your default thing.
const char* thing = "NodeMCU";

// create AntoIO object named anto.
// using constructor AntoIO(user, key, thing)
// or use AntoIO(user, key, thing, clientId)
// to generate client_id yourself.
AntoIO anto(user, key, thing);

int value = 0;

void setup() {
    // SSID and Password of your WiFi access point.
    const char* ssid = "HelloKitty";
    const char* pwd  = "NoonNapassorn";

    Serial.begin(115200);
    delay(10);

    Serial.println();
    Serial.println();
    Serial.print("Anto library version: ");
    Serial.println(anto.getVersion());
    Serial.print("Connecting to ");
    Serial.println(ssid);

    // Connect to your WiFi access point
    if (!anto.begin(ssid, pwd)) {
        Serial.println("Connection failed!!");

        // Stop everything.
        while (1);
    }

    Serial.println();
    Serial.println("WiFi connected"); 

   
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
    pinMode(LED5, OUTPUT);
    pinMode(LED6, OUTPUT);
    pinMode(LED7, OUTPUT);
    pinMode(LED8, OUTPUT);
}

void loop() {
    delay(5000);
    ++value;

    bool var = LOW;

    var = anto.digitalGet("LED1");
    var = not var;
    digitalWrite(LED1, var);
    Serial.print("LED1: ");
    Serial.println(var);

    var = anto.digitalGet("LED2");
    var = not var;
    digitalWrite(LED2, var);
    Serial.print("LED2: ");
    Serial.println(var);

    var = anto.digitalGet("LED3");
    var = not var;
    digitalWrite(LED3, var);
    Serial.print("LED3: ");
    Serial.println(var);

    var = anto.digitalGet("LED4");
    var = not var;
    digitalWrite(LED4, var);
    Serial.print("LED4: ");
    Serial.println(var);

    var = anto.digitalGet("LED5");
    var = not var;
    digitalWrite(LED5, var);
    Serial.print("LED5: ");
    Serial.println(var);

    var = anto.digitalGet("LED6");
    var = not var;
    digitalWrite(LED6, var);
    Serial.print("LED6: ");
    Serial.println(var);

    var = anto.digitalGet("LED7");
    var = not var;
    digitalWrite(LED7, var);
    Serial.print("LED7: ");
    Serial.println(var);

    var = anto.digitalGet("LED8");
    var = not var;
    digitalWrite(LED8, var);
    Serial.print("LED8: ");
    Serial.println(var);


    Serial.println(value);
}





#include <AntoIO.h>
#include <Wire.h>
#include "ClosedCube_HDC1080.h"

ClosedCube_HDC1080 hdc1080;

// username of anto.io account
const char *user = "NoonNapas";
// key of permission, generated on control panel anto.io
const char* key = "e9MKy0eBXK2EydlbQoqLvS9hN6tkg4EyxOsl0Dpe";
// your default thing.
const char* thing = "NodeMCU";

// create AntoIO object named anto.
// using constructor AntoIO(user, key, thing)
// or use AntoIO(user, key, thing, clientId)
// to generate client_id yourself.
AntoIO anto(user, key, thing);


#define SW1 D5
#define SW2 D6
#define LED1 D3
#define LED2 D4
#define LED3 D7

int StepCount = 1;

void setup() {
  // SSID and Password of your WiFi access point.
  const char* ssid = "HelloKitty";
  const char* pwd  = "NoonNapassorn";

  hdc1080.begin(0x40);

  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);

  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Anto library version: ");
  Serial.println(anto.getVersion());
  Serial.print("Connecting to ");
  Serial.println(ssid);

  // Connect to your WiFi access point
  if (!anto.begin(ssid, pwd)) {
    Serial.println("Connection failed!!");
    while (1);  // Stop everything.
  }

  Serial.println();
  Serial.println("WiFi connected");
}

void loop()
{ delay(1000);
  bool varBoolean1 = LOW, varBoolean2 = LOW, varBoolean3 = LOW;
  // put your main code here, to run repeatedly:
  float temp = hdc1080.readTemperature();
  float humid = hdc1080.readHumidity();
  Serial.println("StepCount  = ");    Serial.println(StepCount);
  Serial.print("Temperature  = ");    Serial.println(temp);
  Serial.print("Humidity     = ");    Serial.println(humid);
  Serial.print("DigitalInput = ");    Serial.println(digitalRead(SW1));
  Serial.print("DigitalInput1 = ");    Serial.println(digitalRead(SW2));
  if (StepCount % 10 == 0)
  { Serial.println("--------------------------------------------");
    anto.digitalUpdate("DigitalInput", digitalRead(SW1));
    anto.digitalUpdate("DigitalInput1", digitalRead(SW2));
    anto.analogUpdate("Temperature", temp);
    anto.analogUpdate("Humidity", humid);
    varBoolean1 = anto.digitalGet("LED1");  digitalWrite(LED1, varBoolean1 );
    varBoolean2 = anto.digitalGet("LED2");  digitalWrite(LED2, varBoolean2 );
    varBoolean3 = anto.digitalGet("LED3");  digitalWrite(LED3, varBoolean3 );
    Serial.print("Digital Echo      : ");   Serial.println((anto.digitalGet("DigitalInput")));
    Serial.print("Temperature Echo  : ");   Serial.println(anto.analogGet("Temperature")); //analogGet¤×Í´Ö§¤èÒÁÒ¨Ò¡¢éÒ§º¹
    Serial.print("Humidity Echo     : ");   Serial.println(anto.analogGet("Humidity"));
    Serial.print("LED-1 Echo  : ");         Serial.println(varBoolean1);
    Serial.print("LED-2 Echo  : ");         Serial.println(varBoolean2);
    Serial.print("LED-3 Echo  : ");         Serial.println(varBoolean3);
    Serial.println("--------------------------------------------");
    Serial.println();
  }
  StepCount++;
}

ถ้าจะใช้ lad ไหนก็เปลี่ยนใช้ค่านั้น
https://api.anto.io/channel/set/ e9MKy0eBXK2EydlbQoqLvS9hN6tkg4EyxOsl0Dpe/ NodeMCU/LED1/1



ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

WEEK 1 Arduino – Basic I/O (Digital Input/Output, Shields, Sensors)

Raspberry Pi III คืออะไร

WEEK 9 NI labview 2014