[英]Paho MQTT not working with Flask(Google app engine)
在我的 Flask(Google 應用引擎)應用程序中,我需要向 Mosquitto 代理發布一條消息,該代理在終端本地運行到端口 1884。
import paho.mqtt.client as mqtt
# ...
try:
# publish.single("Car/Command1", dict, hostname='localhost', port=1884)
client = mqtt.Client('Flask_Publisher')
client.connect("localhost", 1884, 60)
client.publish("mytopic", dict)
client.disconnect()
except Exception as e:
logging.warning("Exception occurred: {}".format(e))
error = e
# ...
我通過鍵入以下命令在終端的 1884 端口本地運行 Mosquitto 代理: sudo mosquitto -p 1884
出於測試目的,我編寫了一個具有 mqtt 訂閱者角色的 python 腳本。
但問題是,當我嘗試運行 Flask 時,它在嘗試發布消息時給了我以下錯誤(從異常中捕獲): [Errno 13] Permission denied
編輯:完整的追溯
ERROR 2018-08-30 16:47:52,665 wsgi.py:279]
Traceback (most recent call last):
File "/home/santoryu/Scrivania/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/santoryu/Scrivania/IOT/gae/lib/flask_restful/__init__.py", line 273, in error_router
return original_handler(e)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/santoryu/Scrivania/IOT/gae/lib/flask_restful/__init__.py", line 273, in error_router
return original_handler(e)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/home/santoryu/Scrivania/IOT/gae/lib/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/santoryu/Scrivania/IOT/gae/app/handlers/my_handler.py", line 44, in funzione1
client = mqtt.Client('Flask_Publisher')
File "/home/santoryu/Scrivania/IOT/gae/lib/paho/mqtt/client.py", line 498, in __init__
self._sockpairR, self._sockpairW = _socketpair_compat()
File "/home/santoryu/Scrivania/IOT/gae/lib/paho/mqtt/client.py", line 238, in _socketpair_compat
listensock.bind(("127.0.0.1", 0))
File "/home/santoryu/Scrivania/google-cloud-sdk/platform/google_appengine/google/appengine/dist27/socket.py", line 227, in meth
return getattr(self._sock,name)(*args)
File "/home/santoryu/Scrivania/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 679, in bind
raise _SystemExceptionFromAppError(e)
error: [Errno 13] Permission denied
問題在於 App Engine SDK 提供了 Python socket
模塊的沙盒版本。 當 MQTT 客戶端庫嘗試綁定到本地端口時,它使用這個沙盒模塊而不是它期望的標准庫模塊,並且無法綁定到本地主機。
您可以通過在開發模式下運行時將 GAE socket
模塊替換為原始標准庫模塊來解決此問題,從而允許您綁定到 localhost。
在您的appengine_config.py
文件中:
import os
# Only do the following if we're in development mode
if os.environ.get('SERVER_SOFTWARE', '').startswith('Development'):
import imp
import inspect
# Whitelist the ssl and socket modules
from google.appengine.tools.devappserver2.python import sandbox
sandbox._WHITE_LIST_C_MODULES += ['_ssl', '_socket']
# Use the standard library socket module instead
real_os_src_path = os.path.realpath(inspect.getsourcefile(os))
real_socket = os.path.join(os.path.dirname(real_os_src_path), 'socket.py')
imp.load_source('socket', real_socket)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.