You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FaasD中使用OpenFaas mqtt-publisher并解决MQTT连接问题

解决方案

一、解决Faasd函数与本地Mosquitto的网络连通问题

1. 修正Mosquitto监听配置

Faasd函数运行在独立容器中,localhost指向容器自身而非RPi宿主机,这是Connection refused的核心原因。需要调整Mosquitto的监听范围:

  • 编辑Mosquitto配置文件(通常路径为/etc/mosquitto/mosquitto.conf),添加或修改监听规则:
    listener 1883 0.0.0.0  # 允许所有网络接口访问MQTT服务
    allow_anonymous true   # 调试阶段暂时开启匿名访问,后续可配置账号密码
    
  • 重启Mosquitto服务生效:
    sudo systemctl restart mosquitto
    
  • 函数中使用RPi的局域网IP(如192.168.x.x)连接Mosquitto,而非公网IP——公网IP需要额外端口转发,局域网内直接用内网IP更稳定。

2. 调整网络与防火墙设置

  • 开放RPi宿主机的MQTT端口:
    sudo ufw allow 1883/tcp
    sudo ufw allow 1883/udp
    
  • 若仍然无法连接,可让Faasd函数容器使用宿主机网络模式(牺牲部分隔离性,仅建议本地开发用):修改函数的stack.yml,添加network: host配置:
    functions:
      obstacle-trigger:
        image: your-function-image
        network: host  # 容器共享宿主机网络栈
        environment:
          MQTT_BROKER: localhost  # 此时localhost指向宿主机
    

二、完善「外部控制器」方案

针对picar_4wd无法在Faasd容器中运行的问题,外部控制器的思路完全可行,具体实现如下:

1. 宿主机端外部控制器脚本

在RPi宿主机上运行独立Python脚本,负责订阅MQTT指令并控制小车:

import paho.mqtt.client as mqtt
from picar_4wd import Picar_4WD

car = Picar_4WD()

def on_connect(client, userdata, flags, rc):
    print(f"Connected to MQTT broker, code: {rc}")
    client.subscribe("car/control")

def on_message(client, userdata, msg):
    cmd = msg.payload.decode().strip()
    print(f"Executing command: {cmd}")
    if cmd == "stop":
        car.stop()
    elif cmd == "backward":
        car.backward(50)  # 50为速度值,可调整
    # 按需添加其他控制指令(前进、转向等)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.loop_forever()

2. Faasd函数端指令发布逻辑

修改Faasd函数中的MQTT代码,使用RPi局域网IP连接并发布指令:

import paho.mqtt.client as mqtt

def handle(req):
    # 解析激光雷达传入的消息,判断是否存在20cm内的障碍物
    has_obstacle = your_obstacle_check_logic(req)  # 替换为你的实际判断逻辑

    if has_obstacle:
        client = mqtt.Client()
        client.connect("192.168.x.x", 1883, 60)  # 替换为RPi的局域网IP
        client.publish("car/control", "stop")
        client.disconnect()
        return "Obstacle detected, stop command sent"
    return "No obstacle, no action"

三、调试排查技巧

  • 在Faasd容器内测试连通性:执行telnet 192.168.x.x 1883,判断端口是否可达
  • 查看Mosquitto日志:sudo tail -f /var/log/mosquitto/mosquitto.log,排查连接失败的具体原因
  • 查看Faasd函数日志:faas-cli logs <your-function-name>,定位函数内的MQTT错误

内容的提问来源于stack exchange,提问作者hybrid143

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:33:36