首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyscript MQTT发布消息

Pyscript MQTT发布消息
EN

Stack Overflow用户
提问于 2022-06-14 15:55:01
回答 1查看 223关注 0票数 0

我正在编写py-script html页面,我想通过mqtt在一个特定的主题中发布一条消息。我将python代码放在标记中。

代码语言:javascript
复制
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文件。

代码语言:javascript
复制
<!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>

错误

EN

回答 1

Stack Overflow用户

发布于 2022-06-14 21:52:01

gmqtt需要操作系统TCP。

套接字API在web浏览器中不可用。这是对所有基于浏览器的应用程序的安全限制。唯一的解决方案是修改gmqtt包以使用Fetch API。

您的代码使用__main__约定,该约定在PyScript中不存在。把那条线移开。

代码语言:javascript
复制
if __name__ == '__main__':

下一个小项目是您不需要创建事件循环。移除这一行:

代码语言:javascript
复制
loop = asyncio.new_event_loop()

您只需使用以下代码:

代码语言:javascript
复制
await loop.run_until_complete(main(host))

我写了一篇关于如何捕捉程序报告的错误的文章:

PyScript:调试和错误管理策略

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72620014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档