如何触发 Raspberry Pi 3 从服务器采取行动

How to trigger Raspberry Pi 3 to take action from Server

我目前正在开发一个系统,我需要将通知发送到 Raspberry 到 运行 一个 Python 文件。它很像观察者模式设计,我的服务器是发布者,Raspberry 是观察者。值得注意的是,我当时实际上需要与一个 Raspberry 进行交互(即使我有几十个)。具体来说,在特定事件中,我需要警告单个 Raspberry 它必须采取行动。

我整晚都在字面上搜索它,但找不到任何有用的东西。没有什么能真正给我关于如何实现它的线索。

我能找到的最接近的答案是 this technology firm's product called PubNub,它实际上可以工作。但是,由于我需要的是一对一的交互,这可能是不必要的,因为它旨在将数据发布到多个客户端。

长话短说,我需要触发树莓派根据来自服务器的一些数据,每当它接收到数据时采取一些行动。

服务器 运行ning 在 Amazon 上并使用 Python 2.7.

实现

如果我遗漏了任何细节,请随时向我询问。

感谢大家的支持,


编辑

最近的更新,对我的回答进行了改进。据我了解,套接字能够管理这个过程。例如从客户端(在我的例子中是树莓派)监听服务器和服务器发送一些数据。取自 this site,我设法在我的计算机上从我的本地制作了一个样本 运行。我使用端口 5000 作为他们的 'meeting point'。

代码如下:

client.py

#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5000
BUFFER_SIZE = 1024
MESSAGE = b"Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

print("received data:", data)

server.py

#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5000
BUFFER_SIZE = 20  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print('Connection address:', addr)
while 1:
    data = conn.recv(BUFFER_SIZE)
    if not data: break
    print("received data:", data)
    conn.send(data)  # echo
conn.close()

不过,我还有一些疑问。

首先,我想了解在部署项目时同样的事情是否有效以及如何。如果那行得通-假设我有一个 url 用于服务器,例如 'www.thisisanexampleurl.com' - 只需为其分配一个端口,行得通吗?

其次,假设第一个问题已经完成,请问如何让它连续,使其在接收和发送数据一次后不停止。因为目前,当它进行数据传输时,它会停止工作。

再次感谢所有支持,请不要犹豫向我询问我遗漏的更多详细信息。

你应该可以做这么简单的事情:

运行 你的 pi 上有这样的东西:

import socket

s = socket.socket()
host = ""
port = 12345
s.bind((host, port))
s.listen(5)

while True:
    try:
        clientsock, addr = s.accept()
    except OSError:
        continue
    message = clientsock.recv(20)

    #the code you want to run
    print("doing %s" % message)

    clientsock.close()

每次你想让 pi 采取行动时,在你的服务器上:

import socket

s = socket.socket()
host = "0.0.0.0"
port = 12345
s.connect((host, port))
s.send("foo")
s.close()

看看Pyro4。它可以让您完全避免编写网络代码,而只需编写调用远程 Python 对象的代码,就好像它们是 运行 在同一台机器上一样。在你的情况下,服务器可以在你的 Raspberry Pi 上调用一个普通的 Python 方法来做一些事情。它有很多功能,但您可以从非常简单的东西开始。

raspberry pi代码:

import Pyro4

@Pyro4.expose
class Raspberry:
    def something(self, arg):
        print("called with:", arg)
        return "hi from pi"

Pyro4.Daemon.serveSimple({Raspberry: "raspberry"})

使 pi 做某事的服务器代码:

import Pyro4
rasp = Pyro4.Proxy("PYRONAME:raspberry")
print(rasp.something(42))