"Kembali Ke Dasar Elektronika Digital ... "

Kamis, 25 Juni 2020

[Solved] Bug Fatal Pada Mqtt Subscription - Library AntaresESP8266Mqtt - Part 2



[versi youtube dapat dilihat disini]

Kegatalan akibat "kutu" pada library AntaresEsp8266Mqtt berlanjut padahal telah diobati makan siang yang lumayan maknyus di sebual mall surabaya ( sekalian survey apa cafe sudah buka setelah psbb). Selama makan siang, saya beberapa kali ditegur tidak fokus sama kawan, ya iyalah karena pada tulisan sebelumnya http://www.aisi555.com/2020/06/solution-bug-pada-library-antares-mqtt.html , saya hanya berhasil melakukan proses PUB atau kirim dari esp8266 menuju server serta dibaca oleh client pc MQTT.FX. Kenapa tidak lanjut ke proses SUB atau menerima data ? Sebelumnya untuk mendapatkan konsep MQTT dan rangkaian yg saya gunakan sebaiknya lihat video youtube saya di https://www.youtube.com/watch?v=2o9JRb1FGEc .




Konsep yang berbeda ternyata ditemui pada proses PUBSUB apabila terbiasa menggunakan broker berbasis Mosquitto. Dari manual pada website antares.id dinyatakan bahwa proses Menyimpan dan Mengambil data baik secara http maupun mqtt berpola sama seperti ini :

PUSH/PUB  : /oneM2M/req/your-access-key/antares-cse/choose-a-serialization-format 
GET/SUB   : /oneM2M/resp/antares-cse/your-access-key/choose-a-serialization-format 

Dari keduanya ditemukan "oneM2M" yg merupakan standar IOT platform yg digunakan oleh antares, jadi data akan dikirim dan diolah menggunakan REST API dengan serialization berformat XML ata JSON. Pada library antares yg kita bahas kali ini yg karena library oprekan dari pubsubclient maka digunakan format JSON yang saya sangat sukai. Jadi dalam library ini dicopas juga berbagai file library ArduinoJSON untuk melakukan parsing data seperti contoh payload MQTT berikut:

{
   "m2m:rsp" : {
      "rsc" : 2001,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_702783788",
            "ty" : 4,
            "ri" : "/antares-cse/cin-702783788",
            "pi" : "/antares-cse/cnt-682859183",
            "ct" : "20200625T172017",
            "lt" : "20200625T172017",
            "st" : 0,
            "cnf" : "message",
            "cs" : 24,
            "con" : "{\"ledstatus\":\"hijau on\"}"
         }
      },
      "to" : "Accesskey:Password",
      "fr" : "/antares-cse"
   }
}


Nah, kini sudah jelas data yg di kirim-terima pada antares berformat json dan kita akan melakukan parsing untuk mendapatkan nilai pada bagian "con", dan saya oprek dulu tambahan  script untuk SUB sebuah topik yg akan menunggu perintah menyalakan atau mematikan LED. Gunakan saja script contoh subscribe yang ada pada LIBRARY ...dan ternyata hasilnya tidak bisa membaca respon SUB apapun ...kesalahan fatalnya ada dibagian ini  antares.checkMqttConnection(); dan kita check dulu


void AntaresESP8266MQTT::checkMqttConnection() {
    

_subscriptionTopic = "/oneM2M/req/" + _accessKey + "/antares-cse/json";

    if(!client.connected()) {
        while(!client.connected()) {
            printDebug("[ANTARES] Attempting MQTT connection...\n");

            String clientId = "ESP8266-" + _accessKey;

            char clientIdChar[clientId.length() + 1];
            clientId.toCharArray(clientIdChar, clientId.length() + 1);

            if(client.connect(clientIdChar)) {
                printDebug("[ANTARES] Connected! Client ID:");
                printDebug(clientIdChar);
                printDebug("\n");
                char subscriptionTopicChar[_subscriptionTopic.length() + 1];
                _subscriptionTopic.toCharArray(subscriptionTopicChar, _subscriptionTopic.length() + 1);

                Serial.println();
                Serial.print("[ANTARES] Topic: ");
                Serial.println(subscriptionTopicChar);

                client.publish(subscriptionTopicChar, "connect!");
                client.subscribe(subscriptionTopicChar);
            }
            else {
                printDebug("[ANTARES] Failed, rc=" + String(client.state()) + ", Will try again in 5 secs.\n");
                delay(5000);
            }
        }
    }
    client.loop();
}

Yang berwarna merah pada library antaresEsp8266mqtt.cpp merupakan KESALAHAN FATAL karena seharusnya pada proses SUBSCRIBE scriptnya seperti ini :

   _subscriptionTopic = "/oneM2M/resp/antares-cse/" + _accessKey + "/json";

Setelah dicoba..ehhh ternyata salah juga..pesan diterima tapi payloadnya kosong ..


Usut-punya usut setelah melakukan debug satu persatu kesalahn FATAL mengikuti kesalahan sebelumnya yaitu parsing JSON "rqp" vs "rsp", sehingga harus diubah pada bagian ini :

String AntaresESP8266MQTT::get(char* topic, byte* payload, unsigned int length) {
    _receivedTopic = String(topic);

    String payloadString;
    for(int i = 0; i < length; i++) {
        payloadString += char(payload[i]);
    }

    DynamicJsonBuffer jsonBuffer;
    JsonObject& object = jsonBuffer.parseObject(payloadString);
    //ASLINYA SALAH
    //String parsedString = object["m2m:rqp"]["pc"]["m2m:cin"]["con"];
    //BENAR NYA SEPERTI INI
    String parsedString = object["m2m:rsp"]["pc"]["m2m:cin"]["con"];
    
    
    _jsonSubDataString = parsedString;
    
    return _jsonSubDataString;
}


Dan ketika saya publish payload json dengan message con: "{\"hijau\":\"on\"} " dari MQTT.FX , saya sukses menyalakan LED pada Wemos D1 saya .




Karena penulis lagi bergembira dapat sukses mengoprek ANTARES yang terlihat cacat, maka saya share script lengkap untuk mengirim PUB tombol dan SUB led pada Wemos D1



#include <AntaresESP8266MQTT.h>

//gunakan acces key antares kamu
#define ACCESSKEY "access:key"

#define WIFISSID "myIOT" //wifi ssid
#define PASSWORD "selaluterhubung" //wifi pass

//Nama project dan device antares
#define projectName "AHOCOOL_IOT"
#define deviceName "test_pubsub"

AntaresESP8266MQTT antares(ACCESSKEY);

int counter=0;


void setup() {
  pinMode(16, INPUT); //Tombol pada port GPIO 16
  pinMode(4, OUTPUT); //LED pada port GPIO 4
  Serial.begin(9600);//Serial monitor
  //koneksi antares
  antares.setDebug(true);
  antares.wifiConnection(WIFISSID, PASSWORD);
  antares.setMqttServer();
  //set function callback yg akan mendeteksi pesan masuk
  antares.setCallback(callback);
}

void loop() {
  
  // ngecek koneksi
  antares.checkMqttConnection();
  
  //tombol ditekan = 0, pin GPIO pullup
  if( digitalRead(16) == 0 ){
  //tambah counter
  counter++;
  //kirim mqtt ke antares
  antares.add("counter", counter);
  antares.publish(projectName, deviceName);
  delay(300);
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  /*
   Function ini di panggil saat ada pesan masuk
   pada topic : "/oneM2M/resp/antares-cse/" + _accessKey + "/json" 
*/
antares.get(topic, payload, length); Serial.println("New Message!"); // Print topic and payload Serial.println("Topic: " + antares.getTopic()); Serial.println("Payload: " + antares.getPayload()); // Print individual data Serial.println("Lednya: " + antares.getString("ledstatus")); //nyala dan matikan LED if( antares.getString("ledstatus") == "hijau on" ) digitalWrite(4,HIGH); if( antares.getString("ledstatus") == "hijau off" ) digitalWrite(4,LOW); }
Untuk mengirim pada MQTT.FX maka ikuti aturan berikut :

TOPIK PUB :  /oneM2M/req/ACCESS:KEY/antares-cse/json
 
dengan format payload :

{"m2m:rqp": {"fr": "ACCESS:KEY","to": "/antares-cse/antares-id/AHOCOOL_IOT/test_pubsub","op": 1,"rqi": 123456,"pc": {"m2m:cin": {"cnf": "message","con": "{\"ledstatus\":\"hijau off\"}"}},"ty": 4}}

Sedangkan untuk menerima data pada MQTT.FX seperti berikut:

TOPIK SUB :  /oneM2M/resp/antares-cse/ACCESS:KEY/json


Bagaimana sudah puyeng kah ? yang penting ..

[CASE CLOSED and SOLVED]
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (2) arduino (12) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (2) gcc (1) iklan (1) infrared (2) Input Output (3) iot (11) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (2) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (50) mikrokontroller (2) mikrotik (5) ninmedia (1) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (29) pcb (2) praktek (1) project (33) proyek (1) python (1) radio (3) raspberry pi (3) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sms (6) software (18) tachometer (2) telepon (7) televisi (57) television (1) transistor (1) troubleshoot (3) tulisan (54) tutorial (76) tvri (1) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (2)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika