【发布时间】:2017-08-02 08:52:54
【问题描述】:
我正在尝试与 3 个 Raspberry Pi 通信:一个作为服务器,另一个是客户端。服务器同时接收和发送信息给两个客户端。我正在寻找一种方法来确保这种沟通。请问有什么帮助吗! PS:我正在使用 Python3
【问题讨论】:
-
你可以看看
mpi4pympi4py.readthedocs.io/en/stable
我正在尝试与 3 个 Raspberry Pi 通信:一个作为服务器,另一个是客户端。服务器同时接收和发送信息给两个客户端。我正在寻找一种方法来确保这种沟通。请问有什么帮助吗! PS:我正在使用 Python3
【问题讨论】:
mpi4pympi4py.readthedocs.io/en/stable
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 地址以匹配您的设置,上面是一台机器上的一个非常简单的示例。
因此,具体而言,您的服务器可能对其两个客户端的状态感兴趣,因此它会订阅两个频道,即client0status 和client1status,而client0 将在频道client0status 上发布,而client1 将发布在频道client1status。
关于命令,client0 将订阅频道client0cmd 以接收命令,client1 将订阅频道client1cmd,而服务器将在这两个频道上发布命令。
这里有一个这样的设置工作的小视频。左上角的窗口正在运行 mosquitto 服务器。右上角的窗口订阅了两个 Raspberry Pi 的状态通道 - 这可能与服务器在同一台机器上。左下窗口是第一个树莓派,右下窗口是第二个树莓派:
【讨论】:
如果您想要并行通信,您可以考虑使用 websocket。 见:https://pypi.python.org/pypi/websockets
但 HTTP 和 TCP 也是一种选择,这取决于您的用例...
【讨论】:
另一种选择可能是在您的 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 版本。
【讨论】: