我正在从事家庭自动化项目。我在数字海洋上有一台服务器。我想将我的php代码放在该服务器上,该服务器将连接到我的Raspberry Pi。如何在服务器和Raspberry Pi之间传递消息。我想通过互联网控制我的网站。

(从互联网)打开灯-> Digital Ocean Server->我的家庭路由器-> Raspberry Pi

反之亦然。所以我写这个问题的原因是如何连接这些东西?每次服务器收到消息时,它都必须将消息传递给Raspberry Pi(推送),或者Raspberry Pi必须检查是否有适合我的消息(轮询)。但是该怎么做呢?如何在Intranet和Internet之间传递消息。

更新:我发现了一些东西。谁能告诉我它是否有用。因为我是新来的。
https://nodejs.org/api/http.html#http_httphttp://aiohttp.readthedocs.io/en/stable/client.html

#1 楼

在其他答案中已经说过您应该使用MQTT。
但是为什么呢?
如果您的东西在专用网络的防火墙后面,则MQTT是The Protocol。所有技巧都是端口1833的出站规则,或者具有某些配置,甚至可能不是[2]。
使用MQTT而不使用http之后,情况将如何变化?
组合中还需要一个块of

打开灯(来自互联网)-> Digital Ocean Server->我的家庭路由器-> Raspberry Pi

您的流程将是:


订阅Raspberry Pi上的事件指示灯(Broker和RP之间的消息)

..晚一点:

在服务器上发布事件的指示灯(消息进入服务器->代理-> RP)


什么是代理?
消息代理是一项服务,可以在数字海洋中运行,并接受发布和订阅要求。 [3]
这类中介称为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";
 

来源:
[2] https://stackoverflow.com/questions/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

评论


如果只有更多的答复被写成和这个解释一样好。

–gatorback
17年7月22日在13:11

#2 楼

如果您确实决定遵循MQTT的路线,则需要在Pi上执行以下操作:


选择一种语言编写客户端代码。在您链接的库中edit分别是用于Node.js和Python的HTTP库,因此您的选择将取决于您最喜欢哪种。
为您的语言找到一个MQTT客户端库。我不建议直接使用HTTP库。在原始连接上使用MQTT太多了。而是使用类似paho-mqtt的Python库。 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_onlightbulb_off,然后将消息onoff发送到MQTT主题lightbulb/state即可切换灯泡的状态。这可以从您要控制灯泡的设备上完成。

#3 楼

您可能想要查看MQTT协议的样本。它将帮助您通过代理将服务器连接到Pi,以启用发布-订阅通信。

请尝试以下操作:https://github.com/bluerhinos/phpMQTT和https://eclipse.org/paho / clients / java /只需关注客户端/经纪人支持的MQTT规范版本。我之所以这样说是因为这些是来自不同存储库的项目。