MQTT po druhé

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

martinius96

MQTT po druhé

Príspevok od používateľa martinius96 » 16 Aug 2017, 00:13

Ahojte, snažil som sa niečo o MQTT naučiť atď. No stále mi asi čosi uniká. Jeden pán postoval vo FB skupine, že sa pripája na ThingSpeak, kde odovzdáva data cez MQTT.. ThingSpeak je teda IoT služba pre vývojárov, nadšencov, ktorí chcú cez MQTT protokol nahrávať záznamy na server. No ja vidím v tomto jeho kóde, ktorý mi poslal iba obyčajný HTTP request, nesmeruje sa to ani na nejaký MQTT port či čosi podobné. Pripája sa na api, čo je teda Broker? Smeruje sa to na port 80... Nejako mi to do seba nepasuje. Ako je potom IoT aplikácia štandarizovaná z hľadiska naprogramovania? Keď sa to robí akokoľvek, tak môžem odosielať hodnoty na server (môj) napríklad každých 5 sekúnd a cez AJAX si vypísať poslednú nameranú hodnotu do stránky aby som mal real-time údaje, môžem túto aplikáciu potom nazvať IoT ready? :)

Kód: Vybrať všetko

// ESP8266 a Thingspeak, loguje 4 parametry
// Ono to opravdu funguje!
// OLED!

// připojení potřebné knihovny

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 0  // GPIO0
Adafruit_SSD1306 display(OLED_RESET);



#include <ESP8266WiFi.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#include <dht11.h> // teplomer DHT11
dht11 MojeCidlo; // 

const int dOut = D8;
 
// vytvoření proměnné s naším API klíčem z Thingspeak - viz návod
String apiKlic = "xxxxxxxxxxxxxxx";

// vytvoření proměnných s názvem WiFi sítě a heslem

const char* nazevWifi = "Amiliya_27.";
const char* hesloWifi = "xxxxxxxxxxxxxxx";

//const char* nazevWifi = "Boris Samsung WiFi";
//const char* hesloWifi = "xxxxxxxxxxxx";

float teplota = 0;
int vlhkost = 0;
int svetlo = 0;
int plyn = 0;

int anal = 0; //analogová hodnota = světlo

int pauza = 60*1000*10;





// vytvoření proměnné s názvem serveru Thingspeaku
const char* server = "api.thingspeak.com";
// inicializace WiFi v módu klienta
WiFiClient client;

OneWire oneWire(D4); // inicializace OneWire
DallasTemperature ds18b20(&oneWire); //vytvoření objektu čidla teploty
 
 
void setup() {
  // zahájení komunikace po sériové lince
  Serial.begin(9600);
  Serial.println(" ");
  Serial.println("Boot..........");

   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  // zahájení bezdrátové WiFi komunikace s připojením
  // na router skrze zadané přihl. údaje
  WiFi.begin(nazevWifi, hesloWifi);
  // čekání na úspěšné připojení k routeru,
  // v průběhu čekání se vytiskne každých
  // 500 milisekund tečka po sériové lince
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Pripojeno k WiFi siti ");
  Serial.println(nazevWifi);
  Serial.print("IP adresa: ");
  Serial.println(WiFi.localIP());
  Serial.println("");

  pinMode(dOut, INPUT);

  Serial.println("Setup ok");

  
}

void loop() {

  Serial.println("Loop jede");
  delay(150);
  ds18b20.requestTemperatures();   // zjisteni teploty ze senzoru
  teplota = ds18b20.getTempCByIndex(0);
  delay(150);
  
  MojeCidlo.read(D3); // přečte údaje z čidla DTH11 připojeného na pin 7
  vlhkost = MojeCidlo.humidity; 

  anal = analogRead(A0);
  svetlo = map(anal,0,1023,0,100); 

  plyn = digitalRead(dOut);
  
  Serial.println("Hodnoty zmereny");


  
  // připojení na server Thingspeak pro odeslání dat
  if (client.connect(server,80)) {
    // vytvoření zprávy, která bude odeslána na Thingspeak
    // každé pole je označeno jako "field" + pořadí pole,
    // je nutné každý údaj převést na String
    String zprava = apiKlic;
    zprava +="&field1=";
    zprava += String(teplota);
    zprava +="&field2=";
    zprava += String(vlhkost);
    zprava +="&field3=";
    zprava += String(svetlo);
    zprava +="&field4=";
    zprava += String(plyn);
    zprava += "\r\n\r\n";
    
    // po vytvoření celé zprávy ji odešleme na server Thingspeak
    // včetně našeho API klíče
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKlic+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(zprava.length());
    client.print("\n\n");
    client.print(zprava);

    Serial.print("Teplota: ");
    Serial.println(teplota);
    Serial.print("Vlhkost: ");
    Serial.println(vlhkost);
    Serial.print("Svetlo: ");
    Serial.println(svetlo);
    Serial.print("Plyn: ");
    Serial.println(plyn);
        
    Serial.println("Udaje odeslany na Thingspeak.");
  }
  // ukončení spojení se serverem Thingspeak
  client.stop();
 
  Serial.print("Pauza pred dalsim odeslanim dat - ");
  Serial.print(pauza/60/1000);
  Serial.print("minut");
  Serial.println(" ");
  Serial.println(" ");
  Serial.println(" ");

  display.display();
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("   METEOSTANICE");
  display.println(" ");
  display.setTextSize(1);
  display.print("Teplota: ");
  display.println(teplota);
  display.print("Vlhkost: ");
  display.println(vlhkost);
  display.print("Svetlo: ");
  display.println(svetlo);
  display.print("WiFi: ");
  display.println(nazevWifi);
  display.print("IP: ");
  display.println(WiFi.localIP());
  
  display.display();
  delay(pauza);
}
M

Používateľov profilový obrázok
Sl@Vo
Stály člen
Stály člen
Príspevky: 391
Dátum registrácie: 05 Feb 2008, 00:00
Vek: 31
Kontaktovať používateľa:

Re: MQTT po druhé

Príspevok od používateľa Sl@Vo » 16 Aug 2017, 00:27

Mozno budem kecat, lebo som dokumentaciu prebehol velmi rychlo.
MQTT som videl prvy krat, ale mam pocit, ze je to standard ktory definuje ako su data zakodovane do retazocov. Tieto retazce sa nasledne posielaju standardnym http / https.

S
0
Sl@Vo

martinius96

Re: MQTT po druhé

Príspevok od používateľa martinius96 » 16 Aug 2017, 00:43

Ja som čítal, že portom 1883 sa posiela nešifrovane a pod 8883 šifrovane. Možno s tým máš pravdu, no v takom stave v akom je ten request tak si ho viem spracovať obyčajným PHP kódom a dať na stránku. Fakt mi to nie je úplne jasné, alebo ak má niekto example iný, tak nech ho postne, rád by som to odskúšal. Na tejto stránke som čo-to našiel.. https://pubsubclient.knolleary.net/ Je tam odkaz aj na github na .ino súbory a je tam client.publish .. vyberám len výsek z toho kódu na ukážku:

Kód: Vybrať všetko

if (client.connect("arduinoClient", "testuser", "testpass")) {
    client.publish("outTopic","hello world");
    client.subscribe("inTopic");
  }

V kóde je ešte include na knižnicu <PubSubClient.h>, ktorá zrejme tento režim klienta umožňuje. Teda podobnými príkazmi by sa tá požiadavka mala utvoriť... Ten balík .ino súborov obsahuje aj nejaké Auth riešenia pre nejakú autentizáciu cez meno a heslo, example pre NodeMCU (ESP8266), publish in callback, reconnect, stream.. Tie callbacky mi nič nehovoria je to nejaká kontrola či správa dorazila? Inak ten .ino kód pre NodeMCU je podľa mňa naj, je tam fakt aj ten port 1883 a adresovať sa má na broker.

Napísať odpoveď