在App Engine Python应用中使用paho-mqtt出错

1 投票
1 回答
1078 浏览
提问于 2025-04-18 08:25

我正在尝试用Python和Flask在Google Cloud Platform上写一个应用,这个应用需要建立MQTT连接。我通过运行pip install paho-mqtt -t libs/来引入paho这个Python库。但是,当我尝试运行这个应用时,即使我并没有尝试连接MQTT,我也遇到了一个奇怪的错误,关于IP地址检查的:

RuntimeError: error('illegal IP address string passed to inet_pton',)

看起来是remote_socket这个库出了问题。这个是安全问题吗?有没有办法可以禁用它?

相关代码:

from flask import Flask
import paho.mqtt.client as mqtt
import logging as logger


app = Flask(__name__)


# Note: We don't need to call run() since our application is embedded within
# the App Engine WSGI application server.

#callback to print out connection status
def on_connect(mosq, obj, rc):
    logger.info('on_connect')
    if rc == 0:
        logger.info("Connected")
        mqttc.subscribe('test', 0)
    else:
        logger.info(rc)

def on_message(mqttc, obj, msg):
    logger.info(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

mqttc = mqtt.Client("mqttpy")
mqttc.on_message = on_message
mqttc.on_connect = on_connect

还有完整的错误堆栈信息:

ERROR    2014-06-03 15:14:57,285 wsgi.py:262]
Traceback (most recent call last):
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 239, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 298, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 84, in LoadObject
    obj = __import__(path[0])
  File "/Users/cbarnes/code/ignite/tank-demo/appengine-flask-demo/main.py", line 24, in <module>
    mqttc = mqtt.Client("mqtthtpp")
  File "/Users/cbarnes/code/ignite/tank-demo/appengine-flask-demo/lib/paho/mqtt/client.py", line 403, in __init__
    self._sockpairR, self._sockpairW = _socketpair_compat()
  File "/Users/cbarnes/code/ignite/tank-demo/appengine-flask-demo/lib/paho/mqtt/client.py", line 255, in _socketpair_compat
    listensock.bind(("localhost", 0))
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/dist27/socket.py", line 222, in meth
    return getattr(self._sock,name)(*args)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 668, in bind
    self._SetProtoFromAddr(request.mutable_proxy_external_ip(), address)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 632, in _SetProtoFromAddr
    proto.set_packed_address(self._GetPackedAddr(address))
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 627, in _GetPackedAddr
    AI_NUMERICSERV|AI_PASSIVE):
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 338, in getaddrinfo
    canonical=(flags & AI_CANONNAME))
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 211, in _Resolve
    canon, aliases, addresses = _ResolveName(name, families)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 229, in _ResolveName
    apiproxy_stub_map.MakeSyncCall('remote_socket', 'Resolve', request, reply)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 94, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 328, in MakeSyncCall
    rpc.CheckSuccess()
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl
    self.request, self.response)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 200, in MakeSyncCall
    self._MakeRealSyncCall(service, call, request, response)
  File "/Users/cbarnes/google-cloud-sdk/platform/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 234, in _MakeRealSyncCall
    raise pickle.loads(response_pb.exception())
RuntimeError: error('illegal IP address string passed to inet_pton',)
INFO     2014-06-03 15:14:57,291 module.py:639] default: "GET / HTTP/1.1" 500 -

谢谢!

1 个回答

-1

你正在尝试连接到主机 test 和端口 0,通常你应该使用 localhost1883

可以查看这里的入门示例: https://pypi.python.org/pypi/paho-mqtt/0.9#usage-and-api

撰写回答