APP前端使用mqtt发布消息比较麻烦,于是使用FastAPI做一个Mqtt消息发布的中转站

简介:

最近有一个需求是前端APP需要通过mqtt发布消息,让硬件接收APP发送过来的消息,实现一个点播视频的功能。但是前端视乎不太会在APP上搭建mqtt。于是想到用FastAPI做一个消息中转站,具体原理如下:前端将需要发送的消息发给FastAPI,FastAPI在作为mqtt发布端将消息发布出去。

遇到的问题:

但是,在我写这个接口的时候遇到了一个问题:APP传过来的数据我是以参数的形式去接收的,结果就是这里出现了问题。这个消息看似可以发布出去,实际上,订阅端更本接收不到数据。

错误代码如下:

@router.post("/MqttWeb", summary="Mqtt请求中转站", tags=['xxx接口'])
async def MqttWeb(topic: str, message: str):  

    client_id = f'python-mqtt-subscribe-{random.randint(0, 1000)}'  # 可自定义,但要注意客户端id不能重复
    mqtt_broker = 'xxx.xxx.x..x.x'
    mqtt_port = 1883
    mqtt_keepalive = 600
    username = "xxxxx"
    password = "xxxxx"

    publisher = MqttPublisher(mqtt_broker, mqtt_port, mqtt_keepalive, client_id, topic, username, password)
    try:
        publisher.publish_message(.message)
        publisher.disconnect()
        return {'msg': True}
    except BaseException as e:
        print('error:', str(e))
        publisher.disconnect()
        return {'msg': False, 'error': str(e)}

正确示例代码:

class Item(BaseModel):
    message: str
    topic: str



@router.post("/MqttWeb", summary="Mqtt请求中转站", tags=['xxxxx接口'])
async def MqttWeb(item: Item):  

    client_id = f'python-mqtt-subscribe-{random.randint(0, 1000)}'  # 可自定义,但要注意客户端id不能重复
    mqtt_broker = 'xxxx'
    mqtt_port = 1883
    mqtt_keepalive = 600
    username = "xxx"
    password = "xxx"

    publisher = MqttPublisher(mqtt_broker, mqtt_port, mqtt_keepalive, client_id, item.topic, username, password)
    try:
        publisher.publish_message(item.message)
        publisher.disconnect()
        return {'msg': True}
    except BaseException as e:
        print('error:', str(e))
        publisher.disconnect()
        return {'msg': False, 'error': str(e)}

这里的参数必须要用官方的BaseModel来实现,具体原因我也不知道。。。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT是一种轻量级的通信协议,被广泛应用于物联网、移动应用、传感器网络等领域。前端页面如果使用MQTT协议在1883端口完成消息发布与订阅,可以实现实时的数据交换和通信。 使用MQTT协议进行消息发布和订阅,需要先建立一个MQTT客户端,然后向指定的MQTT服务器连接。连接成功后,就可以进行消息发布和订阅操作。 在前端页面中,可以使用各种MQTT客户端库来实现对MQTT协议的支持。比如,可以使用paho-mqtt库来创建MQTT客户端,并支持发布和订阅操作。通过该库的接口,可以指定需要订阅的主题和消息的QoS级别,以及发布消息内容、主题和QoS级别。例如,可以使用以下代码段对MQTT客户端进行初始化: ```javascript var client = new Paho.MQTT.Client("broker.hivemq.com", 1883, "clientId"); client.connect({ onSuccess: function() { console.log("MQTT connected."); }, onFailure: function() { console.log("MQTT failed to connect."); } }); ``` 在连接成功后,可以使用以下代码段订阅指定主题: ```javascript client.subscribe("/example/topic1", {qos: 1}); ``` 同时,也可以使用以下代码段发布消息到指定主题: ```javascript var message = new Paho.MQTT.Message("hello world"); message.destinationName = "/example/topic1"; message.qos = 1; client.send(message); ``` 总之,MQTT协议可以实现前端页面与后台的实时数据通信,提高了应用程序的交互性和用户体验。在开发过程中,需要注意协议的版本、网络连接的稳定性和客户端库的使用等方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值