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

文章讲述了如何使用FastAPI作为MQTT消息中转站,解决前端APP通过POST请求发送消息时的接收问题。作者发现使用BaseModel模型正确包装参数是关键,解决了实际发布的数据无法被订阅端接收到的错误。
摘要由CSDN通过智能技术生成

简介:

最近有一个需求是前端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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值