Kommunikation zwischen Server und Raspberry Pi

7

Ich arbeite an meinem Hausautomationsprojekt. Ich habe einen Server auf Digital Ocean. Ich möchte meinen PHP-Code auf diesen Server legen und dieser Server stellt eine Verbindung zu meinem Raspberry Pi her. Wie kann ich Nachrichten zwischen meinem Server und Raspberry Pi weitergeben? Ich möchte meine Website über das Internet steuern.

Licht einschalten (aus dem Internet) -> Digital Ocean Server -> My Home Router -> Raspberry Pi

Und umgekehrt. Der Grund, warum ich diese Frage schreibe, ist, wie man diese Dinge verbindet. Jedes Mal, wenn der Server eine Nachricht empfängt, muss er eine Nachricht an Raspberry Pi weitergeben (Push) oder Raspberry Pi muss prüfen, ob eine Nachricht für mich vorhanden ist oder nicht (Umfrage). Aber wie geht das? So übertragen Sie Nachrichten zwischen Intranet und Internet.


UPDATE: Ich habe einige Sachen gefunden. Kann mir jemand sagen, ob es nützlich ist oder nicht. Weil ich neu darin bin.
https://nodejs.org/api/http.html#http_http
http://aiohttp.readthedocs.io/en/stable/client.html

Keyur Shah
quelle

Antworten:

8

In anderen Antworten heißt es bereits, dass Sie in Ihrem Fall MQTT verwenden sollten.

Aber warum?

MQTT ist das Protokoll, wenn sich Ihre Daten hinter einer Firewall in einem privaten Netzwerk befinden [1]. Alle Tricks sind eine ausgehende Regel für Port 1833 oder mit einer Konfiguration möglicherweise nicht einmal das [2].

Wie werden sich die Dinge nach der Einnahme von MQTT und nicht von http ändern?

Sie benötigen einen Block mehr für Ihre Combo von

Licht einschalten (aus dem Internet) -> Digital Ocean Server -> My Home Router -> Raspberry Pi

Ihr Fluss wäre:

  1. Abonnieren Sie Lights on Event auf Raspberry Pi (Nachricht zwischen Broker und RP)

..later Nacht:

  1. Veröffentlichen Sie Lights on-Ereignis auf dem Server (Meldung lautet Server -> Broker -> RP)

Was ist Broker?

Message Broker ist ein Dienst, der im Digital Ocean ausgeführt werden kann und Anforderungen zum Veröffentlichen und Abonnieren berücksichtigt. [3]

Ein solcher Broker heißt Mosquitto und ist Open Source und einfach zu installieren. Sie installieren den Dienst und führen ihn aus. Keine Codierung erforderlich, möglicherweise wenig Konfiguration. [4]

Veröffentlichen und abonnieren?

Wenn Sie mit PHP vertraut sind, können Sie es auch mit Mosquitto [5] verwenden. Beispielcode sieht zumindest einfach aus, Link enthält weitere Beispiele:

<?php

$c = new Mosquitto\Client;
$c->onConnect(function() use ($c) {
    $c->publish('mgdm/test', 'Hello', 2);
});

$c->connect('test.mosquitto.org');

for ($i = 0; $i < 100; $i++) {
     // Loop around to permit the library to do its work
     $c->loop(1);
}

echo "Finished\n";

Quellen:

[1] https://mongoose-os.com/blog/why-mqtt-is-getting-so-popular-in-iot/

[2] /programming/32174272/how-mqtt-works-behind-the-firewall

[3] http://www.hivemq.com/blog/mqtt-essentials-part2-publish-subscribe

[4] https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-ubuntu-16-04

[5] https://github.com/mgdm/Mosquitto-PHP

mico
quelle
1
Wenn nur mehr Antworten so gut geschrieben wären wie diese Erklärung.
Gatorback
6

Wenn Sie sich für die Route von MQTT entscheiden, müssen Sie auf dem Pi Folgendes tun :

  • Wählen Sie eine Sprache aus, in die der Clientcode geschrieben werden soll. Die Bibliotheken, die Sie in Ihrer Bearbeitung verknüpft haben, sind HTTP-Bibliotheken für Node.js bzw. Python. Ihre Wahl hängt also davon ab, in welcher Sie sich am wohlsten fühlen.

  • Suchen Sie eine MQTT-Clientbibliothek für Ihre Sprache. Ich würde nicht empfehlen, eine HTTP-Bibliothek direkt zu verwenden. Es ist zu viel Arbeit, MQTT über eine unformatierte Verbindung zu verwenden. Verwenden Sie stattdessen eine Bibliothek wie paho-mqttfür Python. Es gibt einige Beispiele bei HiveMQ .

  • Abonnieren Sie ein Thema, das angibt, ob das Licht eingeschaltet sein soll .

Hier ist ein Beispiel dafür mit paho-mqtt:

import paho.mqtt.client as paho
LIGHTBULB_TOPIC = "lightbulb/state"

def lightbulb_on():
    # Put your code to turn the bulb on here
    pass

def lightbulb_off():
    # Put your code to turn the bulb off here
    pass

def on_message(client, userdata, msg):
    # Check that the message comes from the topic we expected
    if msg.topic == LIGHTBULB_TOPIC:
        if msg.payload == "on":
            lightbulb_on()
        elif msg.payload == "off":
            lightbulb_off()   
        else:
            print("Invalid message. Expected 'on'/'off', got", msg.payload)

client = paho.Client()
client.on_message = on_message
client.connect("example.com", 1883)
client.subscribe(LIGHTBULB_TOPIC, qos=1)

client.loop_forever()

Sie müssen nur implementieren lightbulb_onund lightbulb_offdann die Nachricht onoder offan das MQTT-Thema senden, um den lightbulb/stateStatus der Glühbirne umzuschalten. Dies würde von dem Gerät aus erfolgen, von dem aus Sie die Glühbirne steuern möchten.

Aurora0001
quelle
4

Vielleicht möchten Sie sich Beispiele des MQTT-Protokolls ansehen. Es wird Ihnen helfen, Server und Pi über einen Broker zu verbinden, um die Pub-Sub-Kommunikation zu ermöglichen.

Versuchen Sie Folgendes: https://github.com/bluerhinos/phpMQTT und https://eclipse.org/paho/clients/java/ Behalten Sie einfach die MQTT-Spezifikationsversion im Auge, die von den Clients / Brokern unterstützt wird. Ich erwähne dies, weil dies Projekte aus verschiedenen Repositories sind.

Cogito ergo sum
quelle