サーバーとRaspberry Pi間の通信


7

私はホームオートメーションプロジェクトに取り組んでいます。デジタルオーシャンにサーバーがあります。私のphpコードをそのサーバーに配置すると、そのサーバーはRaspberry Piに接続します。サーバーとRaspberry Piの間でメッセージを受け渡す方法を教えてください。インターネットで自分のウェブサイトを管理したい。

ライトをオンにする(インターネットから)-> Digital Ocean Server->マイホームルーター-> Raspberry Pi

およびその逆。それで、私がこの質問を書いている理由は、これらのものを接続する方法ですか?サーバーがメッセージを受信するたびに、メッセージをRaspberry Piに渡す(プッシュ)か、Raspberry Piがメッセージを受信するかどうか(ポーリング)を確認する必要があります。しかし、これを行う方法は?イントラネットとインターネットの間でメッセージを渡す方法。


更新:私はいくつかのものを見つけました。誰かがそれが便利かどうか教えてもらえますか?私はこれが初めてなので。
https://nodejs.org/api/http.html#http_http
http://aiohttp.readthedocs.io/en/stable/client.html

回答:


8

他の回答では、MQTTを使用する必要があると既に述べられています。

しかし、なぜ?

MQTTは、物事がプライベートネットワークのファイアウォールの背後にある場合のプロトコルです[1]。すべてのトリックは、ポート1833のアウトバウンドルールであるか、いくつかの構成では、それもおそらく[2]ではありません。

HTTPではなくMQTTを使用すると、状況はどのように変わりますか?

あなたはあなたのコンボにさらに1ブロックが必要になります

ライトをオンにする(インターネットから)-> Digital Ocean Server->マイホームルーター-> Raspberry Pi

あなたの流れは:

  1. Raspberry PiのLights on eventの購読(ブローカーとRP間のメッセージ)

..夜遅く:

  1. サーバー上のイベントでライトを公開します(メッセージはサーバー->ブローカー-> RPになります)

ブローカーとは?

Message Brokerは、Digital Oceanで実行できるサービスであり、PublishおよびSubscriptionリクエストを受け取ります。[3]

そのようなブローカーの1つはMosquittoと呼ばれ、オープンソースであり、簡単にインストールできます。サービスをインストールして実行します。コーディングは必要ありませんが、設定はほとんどありません。[4]

パブリッシュしてサブスクライブしますか?

phpに慣れている場合は、Mosquitto [5]でも使用できます。サンプルコードは少なくともまっすぐに見えます、リンクはより多くの例を含みます:

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

出典:

[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


1
この説明のように、より多くの回答だけが書かれ​​ていれば。
gatorback 2017

6

MQTTのルートに沿って進むことにした場合は、Piで次のことを行う必要があります。

  • クライアントコードを書き込む言語選択します。編集でリンクしたライブラリは、それぞれNode.jsとPythonのHTTPライブラリであるため、どちらが最も使いやすいかに依存します。

  • ご使用の言語のMQTTクライアントライブラリ見つけます。私はしません直接HTTPライブラリを使用することをお勧めします。未加工の接続でMQTTを使用するのは大変な作業です。代わりに、paho-mqttPythonのようなライブラリを使用します。HiveMQにはいくつかの例があります。

  • ライトをオンにする必要があるかどうかを示すトピックにサブスクライブします。

以下はその使用例です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()

lightbulb_onとを実装してlightbulb_off、メッセージを送信するonoff、MQTTトピックlightbulb/stateに送信して電球の状態を切り替えるだけです。これは、電球を制御したいデバイスから行われます。


4

MQTTプロトコルのサンプルを見たいと思うかもしれません。ブローカーを介してPiをサーバーに接続し、pub-sub通信を有効にするのに役立ちます。

これらを試してください:https : //github.com/bluerhinos/phpMQTTおよびhttps://eclipse.org/paho/clients/java/クライアント/ブローカーがサポートするMQTT仕様バージョンに注意してください。これらは異なるリポジトリからのプロジェクトであるため、これについて言及します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.