Comunicação entre servidor e Raspberry Pi

7

Estou trabalhando no meu projeto de automação residencial. Eu tenho um servidor no oceano digital. Quero colocar meu código php nesse servidor e esse servidor se conectará ao meu Raspberry Pi. Como posso passar mensagens entre meu servidor e o Raspberry Pi. Quero controlar meu site pela internet.

Turn On Light (da internet) -> Servidor Digital Oceano -> My Home Router -> Raspberry Pi

E vice versa. Portanto, a razão pela qual estou escrevendo esta pergunta é Como conectar essas coisas? Cada vez que o servidor recebe uma mensagem, ele deve passar a mensagem para o Raspberry Pi (push) ou o Raspberry Pi deve verificar se há alguma mensagem para mim ou não (pesquisa). Mas como fazer isso? Como passar mensagens entre intranet e internet.


ATUALIZAÇÃO: Encontrei algumas coisas. Alguém pode me dizer se é útil ou não. Porque eu sou novo nisso.
https://nodejs.org/api/http.html#http_http
http://aiohttp.readthedocs.io/en/stable/client.html

Keyur Shah
fonte

Respostas:

8

Já foi dito em outras respostas que você deve usar o MQTT no seu caso.

Mas por que?

MQTT é o protocolo se suas coisas estiverem protegidas por um firewall em uma rede privada [1]. Todos os truques são uma regra de saída para a porta 1833 ou, com algumas configurações, talvez nem isso [2].

Como as coisas mudam depois de usar o MQTT e não o http?

Você precisará de mais um bloco para o seu combo de

Turn On Light (da internet) -> Servidor Digital Oceano -> My Home Router -> Raspberry Pi

Seu fluxo seria:

  1. Inscreva-se no evento Lights on no Raspberry Pi (mensagem entre Broker e RP)

..Mais tarde:

  1. Publicar luzes no evento no servidor (a mensagem passa Server -> Broker -> RP)

O que é Broker?

O Message Broker é um serviço que pode ser executado no Oceano Digital e recebe solicitações de publicação e assinatura. [3]

Um desses Broker é chamado Mosquitto e é de código aberto e fácil de instalar. Você instala o serviço e o executa. Nenhuma codificação envolvida, talvez pouca configuração. [4]

Publicar e se inscrever?

Se você está familiarizado com o php, você pode usá-lo também com o Mosquitto [5]. Um exemplo de código, pelo menos, parece simples, o link contém mais exemplos:

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

Fontes:

[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
fonte
11
Se apenas mais respostas fossem tão bem escritas quanto esta explicação.
Gatorback
6

Se você decidir seguir a rota do MQTT, eis o que você precisa fazer no Pi :

  • Escolha um idioma para escrever o código do cliente. As bibliotecas que você vinculou em sua edição são bibliotecas HTTP para Node.js e Python, respectivamente, portanto, sua escolha dependerá de qual você se sentir mais confortável.

  • Encontre uma biblioteca do cliente MQTT para o seu idioma. Eu não recomendaria usar uma biblioteca HTTP diretamente; é muito trabalhoso usar o MQTT em uma conexão bruta. Em vez disso, use uma biblioteca como paho-mqttpara Python. Existem alguns exemplos no HiveMQ .

  • Inscreva-se em um tópico que indica se a luz deve estar acesa .

Aqui está um exemplo disso 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()

Você só precisa implementar lightbulb_one lightbulb_off, em seguida, enviar a mensagem onou offpara o tópico MQTT lightbulb/statepara alternar o estado da lâmpada. Isso seria feito no dispositivo do qual você deseja controlar a lâmpada.

Aurora0001
fonte
4

Você pode querer olhar para amostras do protocolo MQTT. Isso ajudará você a conectar um Pi ao servidor por meio de um broker para ativar a comunicação pub-sub.

Tente estes: https://github.com/bluerhinos/phpMQTT e https://eclipse.org/paho/clients/java/ Apenas fique de olho na versão de especificação do MQTT que os clientes / corretores suportam. Estou mencionando isso, porque esses são projetos de diferentes repositórios.

cogito ergo sum
fonte