如何让MQTT客户端在Appengine(python)上工作

时间:2017-04-03 16:31:47

标签: python google-app-engine paho

尝试在付费 GAE应用上运行简单的MQTT客户端(而不是代理)。但是,以下内容永远不会发生on_connect回调:

worker.py

import webapp2
import paho.mqtt.client as paho

class WorkerHandler(webapp2.RequestHandler):

    def on_subscribe(client, userdata, mid, granted_qos):
        print("Subscribed: "+str(mid)+" "+str(granted_qos))

    def on_message(client, userdata, msg):
        print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

    def on_connect(client, userdata, flags, rc):
        client.subscribe("$SYS/#")
        print "Subscribed to wildcard"

    def get(self):
        client = paho.Client()
        client.on_connect = self.on_connect
        client.on_subscribe = self.on_subscribe
        client.on_message = self.on_message
        client.connect("iot.eclipse.org")
        print "connected to broker"
        client.loop_forever()

app = webapp2.WSGIApplication([
    (r'/_ah/start', WorkerHandler),
])

在开发环境中,它在一分钟左右之后只是一条消息而无声地失败

INFO     2017-04-04 01:51:40,958 module.py:813] worker: "GET /_ah/start HTTP/1.1" 500 220
INFO     2017-04-04 01:51:41,869 module.py:1759] New instance for module "worker" serving on: http://localhost:8080

connected to broker
WARNING  2017-04-04 01:52:10,860 module.py:1927] All instances may not have restarted

这被配置为“后端”/服务,yaml看起来像这样:

worker.yaml

service: worker
runtime: python27
api_version: 1
threadsafe: true

instance_class: B8

manual_scaling:
  instances: 1

handlers:
# If a service has an _ah/start handler, it should be listed first.
- url: /_ah/start
  script: worker.app

注意:在开发环境中,socket.py直接从python install导入... / 2.7 / lib / python2.7 / socket.py

1 个答案:

答案 0 :(得分:0)

您正在尝试将独立脚本作为GAE应用worker服务运行。它不会起作用。

您的worker.py需要包含一个名为app的WSGI应用程序,以匹配您的worker.yaml配置。

Handlers element表中的script行:

  

脚本:指令必须是python导入路径,例如,    package.module.app 指向WSGI应用程序。使用 Python模块路径的脚本:指令的最后一个组件是   模块中全局变量的名称:该变量必须是a   WSGI应用程序,通常按惯例称为 app

您最有可能发生的错误表明尝试启动工作者模块WSGI应用程序失败。

在您更新以恢复WSGI应用程序之后,错误消息的原因变得更加清晰:WorkerHandler.get()方法不响应/_ah/start请求,因为它卡在{{1}中}。

来自Startup

  

创建每个服务实例以响应启动请求   是client.loop_forever()的空HTTP GET请求。 App Engine发送此信息   要求提出实例;用户无法发送   请求/_ah/start。手动和基本扩展实例必须   在他们可以处理另一个请求之前响应开始请求。

     

...

     

当实例使用HTTP响应/_ah/start请求时   状态代码为/_ah/start200–299,认为已成功完成   已启动,可以处理其他请求。否则,App Engine   终止实例。手动缩放实例重新启动   立即,而基本缩放实例仅在重新启动时重新启动   提供交通所需。