【问题标题】:How to ensure parallel communication between 3 Raspberry Pi?如何保证 3 个树莓派之间的并行通信?
【发布时间】:2017-08-02 08:52:54
【问题描述】:

我正在尝试与 3 个 Raspberry Pi 通信:一个作为服务器,另一个是客户端。服务器同时接收和发送信息给两个客户端。我正在寻找一种方法来确保这种沟通。请问有什么帮助吗! PS:我正在使用 Python3

【问题讨论】:

标签: python-3.x raspberry-pi


【解决方案1】:

MQTT 可能适用于这类事情,但您的问题非常模糊。

有可用的 Python 库,但您可以在终端中的命令行中进行测试:

安装方式:

sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients python-mosquitto

首先以详细模式运行服务器(消息代理),这样我们就可以看到发生了什么:

mosquitto -v

现在,在一个新的终端中,运行一个监听“调试”流的订阅者:

mosquitto_sub -h localhost -t debug

现在,在另一个新终端中,运行发送到“调试”流的发布者:

mosquitto_pub -h 127.0.0.1 -t debug -m "Hello"

显然要更改 IP 地址以匹配您的设置,上面是一台机器上的一个非常简单的示例。


因此,具体而言,您的服务器可能对其两个客户端的状态感兴趣,因此它会订阅两个频道,即client0statusclient1status,而client0 将在频道client0status 上发布,而client1 将发布在频道client1status

关于命令,client0 将订阅频道client0cmd 以接收命令,client1 将订阅频道client1cmd,而服务器将在这两个频道上发布命令。

这里有一个这样的设置工作的小视频。左上角的窗口正在运行 mosquitto 服务器。右上角的窗口订阅了两个 Raspberry Pi 的状态通道 - 这可能与服务器在同一台机器上。左下窗口是第一个树莓派,右下窗口是第二个树莓派:

【讨论】:

    【解决方案2】:

    如果您想要并行通信,您可以考虑使用 websocket。 见:https://pypi.python.org/pypi/websockets

    但 HTTP 和 TCP 也是一种选择,这取决于您的用例...

    【讨论】:

    • 每个 RPi(充当客户端)都被保留用于打开/关闭许多 LED 并将它们的状态发送到服务器。那个人同时接收信息。我尝试使用套接字和线程,但我可能做得不好。有没有想法如何为每个 RPi 编写“线程”代码?感谢您的帮助
    【解决方案3】:

    另一种选择可能是在您的 Raspberry Pi 上安装 Redis。它是一个非常快速的“数据结构服务器”——这意味着你可以用它来实现散列、集合、队列等。

    您可以将它安装在您的 Raspberry Pi 上:

    sudo apt-get install redis-server
    

    如果你想在多个树莓派之间使用它,你需要注释掉配置文件中只绑定到本地主机的行,使其在/etc/redis/redis.conf中看起来像这样,然后重新启动它:

    #bind 127.0.0.1
    

    然后,您可以使用 ping 命令从任何 Raspberry Pi 测试服务器,它应该以 PONG 响应:

    redis-cli -h <SERVER> ping
    PONG
    

    现在,在您的 pi0 客户端上,您可以在 pi0cmd 队列上执行阻塞等待 (BLPOP) 以等待命令:

    redis-cli -h <SERVER> <<< "blpop pi0cmd 0"
    

    这将等到您的服务器在pi0cmd 队列上发送命令:

    redis-cli -h <SERVER> <<< "lpush pi0cmd 000"
    

    所以,那些命令是在Redis数据结构服务器的队列中实现的。

    您可以在一个简单的字符串数据结构中实现 status。所以客户在pi0status更新他的状态:

    redis-cli -h <SERVER> <<< "set pi0status HAPPY"
    

    服务器可以随时获取状态:

    redis-cli <<< "get pi0status"
    "HAPPY"
    

    这是一个像上面那样工作的小动画:

    列出了所有 Redis 命令here

    同样,还有 Python 版本。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多