如何在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
相关产品推荐
相关产品推荐

