Comunicación entre el servidor y Raspberry Pi

7

Estoy trabajando en mi proyecto de domótica. Tengo un servidor en el océano digital. Quiero poner mi código php en ese servidor y ese servidor se conectará a mi Raspberry Pi. ¿Cómo puedo pasar mensajes entre mi servidor y Raspberry Pi? Quiero controlar mi sitio web a través de internet.

Encienda la luz (desde internet) -> Digital Ocean Server -> My Home Router -> Raspberry Pi

Y viceversa. Entonces, la razón por la que escribo esta pregunta es ¿Cómo conectar estas cosas? Cada vez que el servidor recibe un mensaje, tiene que pasar el mensaje a Raspberry Pi (push) o Raspberry Pi tiene que verificar si hay algún mensaje para mí o no (sondeo). pero como hacer esto? Cómo pasar mensajes entre intranet e internet.


ACTUALIZACIÓN: He encontrado algunas cosas. ¿Alguien puede decirme si es útil o no? Porque soy nuevo en esto.
https://nodejs.org/api/http.html#http_http
http://aiohttp.readthedocs.io/en/stable/client.html

Keyur Shah
fuente

Respuestas:

8

Ya se dice en otras respuestas que debe usar MQTT en su caso.

¿Pero por qué?

MQTT es el protocolo si sus cosas están detrás de un firewall en una red privada [1]. Todos los trucos son una regla de salida para el puerto 1833 o con alguna configuración tal vez ni siquiera eso [2].

¿Cómo cambiarán las cosas después de tomar MQTT y no http?

Necesitarás un bloque más para tu combo de

Encienda la luz (desde internet) -> Digital Ocean Server -> My Home Router -> Raspberry Pi

Tu flujo sería:

  1. Suscríbase al evento Lights on en Raspberry Pi (mensaje entre Broker y RP)

.. noche posterior:

  1. Publicar luces en evento en el servidor (el mensaje va Servidor -> Agente -> RP)

¿Qué es el corredor?

Message Broker es un servicio que puede ejecutarse en el océano digital y acepta solicitudes de publicación y suscripción. [3]

Uno de estos corredores se llama Mosquitto y es de código abierto y fácil de instalar. Instala el servicio y lo ejecuta. No hay codificación involucrada, tal vez poca configuración. [4]

Publicar y suscribirse?

Si está familiarizado con php, puede usarlo también con Mosquitto [5]. El código de muestra al menos parece sencillo, el enlace contiene más ejemplos:

<?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";

Fuentes:

[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
fuente
1
Si tan solo se escribieran más respuestas como esta explicación.
gatorback
6

Si decide seguir la ruta de MQTT, esto es lo que debe hacer en el Pi :

  • Elija un idioma para escribir el código del cliente. Las bibliotecas que vinculó en su edición son bibliotecas HTTP para Node.js y Python, respectivamente, por lo que su elección dependerá de la que le resulte más cómoda.

  • Encuentre una biblioteca de cliente MQTT para su idioma. Yo no lo recomendaría usar directamente una librería HTTP; es demasiado trabajo usar MQTT sobre una conexión sin formato. En su lugar, use una biblioteca como paho-mqttpara Python. Hay algunos ejemplos en HiveMQ .

  • Suscríbase a un tema que indique si la luz debe estar encendida .

Aquí hay un ejemplo de eso usando 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()

Solo necesita implementar lightbulb_ony lightbulb_off, luego, enviar el mensaje ono offal tema MQTT lightbulb/statepara alternar el estado de la bombilla. Esto se haría desde el dispositivo desde el que desea controlar la bombilla.

Aurora0001
fuente
4

Es posible que desee ver muestras de protocolo MQTT. Le ayudará a conectar el servidor un Pi a través de un intermediario para permitir la comunicación pub-sub.

Pruebe estos: https://github.com/bluerhinos/phpMQTT y https://eclipse.org/paho/clients/java/ Solo observe la versión de especificaciones MQTT que los clientes / intermediarios admiten. Menciono esto, porque estos son proyectos de diferentes repositorios.

cogito ergo sum
fuente