服务器和树莓派之间的通信

物联网 智能家居 联网 树莓派
2021-06-09 02:04:57

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

打开灯(来自互联网)--> 数字海洋服务器--> 我的家庭路由器--> 树莓派

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


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

3个回答

在其他答案中已经说过,您应该在您的情况下使用 MQTT。

但为什么?

如果您的东西位于私有网络中的防火墙后面,则 MQTT 就是协议 [1]。所有技巧都是端口 1833 的出站规则,或者某些配置甚至可能不是 [2]。

采用 MQTT 而不是 http 后,情况会如何变化?

你的组合还需要一个方块

打开灯(来自互联网)--> 数字海洋服务器--> 我的家庭路由器--> 树莓派

你的流程是:

  1. 在 Raspberry Pi 上订阅 Lights on 事件(经纪人和 RP 之间的消息)

..晚上:

  1. 在服务器上的事件上发布灯(消息去服务器 -> 代理 -> RP)

什么是经纪人?

Message Broker 是一种服务,可以运行在数字海洋中,它接受发布和订阅请求。[3]

其中一个 Broker 称为 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] 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

如果您确实决定沿着 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_onand lightbulb_off,然后发送消息onoroff到 MQTT 主题lightbulb/state来切换灯泡的状态。这将通过您想要控制灯泡的设备来完成。

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

试试这些:https : //github.com/bluerhinos/phpMQTThttps://eclipse.org/paho/clients/java/只需留意客户端/代理支持的 MQTT 规范版本。我提到这一点,因为这些是来自不同存储库的项目。