维护硬件设备远程服务连接的最佳方法?

cjm*_*671 1 websocket raspberry-pi

这是一个尴尬的问题,但这里有.

我正在尝试使用Raspberry Pi构建一个门解锁系统.我希望Pi保持与远程服务器的开放连接,这样我就可以测试存在(即Pi是否存活),并发送命令.我还希望减轻典型的家庭路由器NAT和动态IP问题.

我的问题是:什么协议最适合这个?

我在想的是使用类似网络套接字的东西,这样我就可以连接到像Pusher这样的服务或我自己的服务器.这个问题是我将从直接Python中完成它,因此中间没有Web浏览器.我不知道我有什么其他选择,如果有的话.

对这个问题的开放式性质表示道歉,但我不知道还能在哪里问.

小智 5

实时网络将是在Raspberry Pi和远程服务器(或任意数量的远程设备)之间传输数据的绝佳媒介.我听了Gordon Hollingworth 在API战略会议上就Raspberry Pi的教育策略发表演讲从那时起,我一直在玩一个.这是我学到的.

首先,由于Pi运行linux,您可以使用您喜欢的任何语言进行编码.我最熟悉的实时网络,PubNub,有50种语言的SDK.特别是,使用PubNub Python SDK,您可以使用此代码块订阅事件:

pubnub = Pubnub(
    "demo",  ## PUBLISH_KEY
    "demo",  ## SUBSCRIBE_KEY
    None,    ## SECRET_KEY
    False    ## SSL_ON?
)

def receive(message) :
    print(message)
    return True

pubnub.subscribe({
    'channel'  : 'hello_world',
    'callback' : receive 
})
Run Code Online (Sandbox Code Playgroud)

要发送消息,现在您已经定义了pubnub变量,您只需使用:

info = pubnub.publish({
    'channel' : 'hello_world',
    'message' : {
        'some_text' : 'Hello my World'
    }
})
print(info)
Run Code Online (Sandbox Code Playgroud)

这个SDK非常轻巧,易于实现(PubNub 每月最多免费发送1条消息.)

由于您询问了不同的协议,我不妨提一下,如果您想使用更低级别的服务,您可以使用此要点中的说明TCP数据包 直接发送到PubNub接口.简单地说,

telnet pubsub.pubnub.com 80

GET /stream/demo/a/0/10000 HTTP/1.1
Host: pubsub.pubnub.com
Run Code Online (Sandbox Code Playgroud)

与使用SDK或WebSocket解决方案相比,这显然有助于降低功耗.

另一方面,由于您熟悉Python和WebSockets,因此您始终可以使用自己的解决方案.Heroku有一篇关于使用异步回调和Redis 在他们的博客上使用Python WebSockets来启动聊天服务器的帖子.以下是将消息联合到不同客户端的代码示例:

def run(self):
    """Listens for new messages in Redis, and sends them to clients."""
    for data in self.__iter_data():
        for client in self.clients:
            gevent.spawn(self.send, client, data)
Run Code Online (Sandbox Code Playgroud)

祝你好运,让我知道它是怎么回事!