我正在编写py-script html页面,我想通过mqtt在一个特定的主题中发布一条消息。我将python代码放在标记中。
import asyncio
import os
import signal
import time
from gmqtt import Client as MQTTClient
STOP = asyncio.Event()
def on_connect(client, flags, rc, properties):
print('Connected')
client.subscribe('TEST/#', qos=0)
def on_message(client, topic, payload, qos, properties):
print(payload)
def on_disconnect(client, packet, exc=None):
print('Disconnected')
def on_subscribe(client, mid, qos, properties):
print('SUBSCRIBED')
async def main(broker_host):
client = MQTTClient("3232DZQ")
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.on_subscribe = on_subscribe
await client.connect(broker_host)
client.publish('TEST/TIME', 'IZISIUIQY', qos=1)
await STOP.wait()
await client.disconnect()
def ask_exit(*args):
STOP.set()
if __name__ == '__main__':
loop = asyncio.new_event_loop()
host = 'broker.hivemq.com'
loop.run_until_complete(main(host))当我单独运行python文件时,它可以正常工作:python文件工作正常,但是当我将代码放在标记中时,我就不能工作了。我想通过mqtt运行并发布消息的html页面,使用标签pyscript和属性src="publish.py“指向python文件。
<!DOCTYPE html>
<html>
<head>
<title>Publish MQTT</title>
<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
<script defer src="https://pyscript.net/alpha/pyscript.js"></script>
<py-env>
- gmqtt
</py-env>
</head>
<body>
<!--calling publish python code-->
<py-script src="publish.py"></py-script>
</body>
</html>发布于 2022-06-14 21:52:01
包gmqtt需要操作系统TCP。
套接字API在web浏览器中不可用。这是对所有基于浏览器的应用程序的安全限制。唯一的解决方案是修改gmqtt包以使用Fetch API。
您的代码使用__main__约定,该约定在PyScript中不存在。把那条线移开。
if __name__ == '__main__':下一个小项目是您不需要创建事件循环。移除这一行:
loop = asyncio.new_event_loop()您只需使用以下代码:
await loop.run_until_complete(main(host))我写了一篇关于如何捕捉程序报告的错误的文章:
https://stackoverflow.com/questions/72620014
复制相似问题