如何将LINE Bot与MQTT连接实现灯光控制?
问题分析与修复方案
核心问题
你的代码无法连接MQTT的主要原因是UrlFetchApp仅支持HTTP/HTTPS协议,不能直接使用mqtt://协议——MQTT是基于TCP的专用协议,和HTTP不兼容。此外代码还有几处语法和配置错误,逐一修复如下:
1. 修复语法错误
else if语句缺少闭合括号,会导致代码运行报错:
原代码:
else if (userMessage.includes('Turn off') {
修改为:
else if (userMessage.includes('Turn off')) {
2. 修正CHANNEL_ACCESS_TOKEN配置
你的Token前后有空格,会导致LINE API授权失败:
原代码:
var CHANNEL_ACCESS_TOKEN = ' My LINE Channel Access Token ';
修改为:
var CHANNEL_ACCESS_TOKEN = '你的LINE Channel Access Token'; // 去掉前后空格
3. 替换MQTT消息发送方式(关键修复)
由于Google Apps Script(GAS)不支持原生MQTT协议,你需要通过MQTT Broker提供的HTTP REST API或WebSocket接口来转发消息。以下是两种可行方案:
方案一:使用MQTT Broker的REST API(以EMQX为例)
大部分主流MQTT Broker(如EMQX)都提供HTTP REST API用于发布消息,步骤如下:
- 在EMQX控制台创建API密钥(路径:API密钥 → 创建密钥)
- 修改
sendMqttCommandToBroker函数:
function sendMqttCommandToBroker(mqttBrokerHost, apiPort, apiKey, apiSecret, mqttCommand) { var url = `http://${mqttBrokerHost}:${apiPort}/api/v4/mqtt/publish`; // 构造MQTT发布请求的JSON参数 var payload = { "topic": "TestMQTT_microbit", "payload": mqttCommand, "qos": 0, // 根据需求调整QoS等级 "retain": false }; var options = { 'method': 'post', 'headers': { 'Content-Type': 'application/json', // 使用Base64编码API密钥和密钥 'Authorization': 'Basic ' + Utilities.base64Encode(`${apiKey}:${apiSecret}`) }, 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(url, options); console.log('MQTT Command sent:', response.getContentText()); } catch (error) { console.error('Error sending MQTT command:', error); } }
- 在
doPost中调用该函数:
if (userMessage.includes('Turn on')) { // 填入你的EMQX主机、API端口(默认18083)、API密钥和密钥 sendMqttCommandToBroker('你的MQTT主机', 18083, '你的API密钥', '你的API密钥密码', 'on'); pushLineBotMessage('Turned on the light', replyToken); } else if (userMessage.includes('Turn off')) { sendMqttCommandToBroker('你的MQTT主机', 18083, '你的API密钥', '你的API密钥密码', 'off'); pushLineBotMessage('Turned off the light', replyToken); }
方案二:搭建HTTP转MQTT中间层
如果你的MQTT Broker不支持REST API,可以用Node.js搭建一个简单的中间服务,接收HTTP请求后转发到MQTT:
- 编写Node.js服务(示例):
const express = require('express'); const mqtt = require('mqtt'); const app = express(); app.use(express.text()); const client = mqtt.connect('mqtt://你的MQTT主机:端口'); client.on('connect', () => console.log('Connected to MQTT Broker')); app.post('/publish', (req, res) => { const command = req.body; client.publish('TestMQTT_microbit', command, (err) => { if (err) res.status(500).send('Failed to send MQTT command'); else res.send('Command sent'); }); }); app.listen(3000, () => console.log('HTTP server running on port 3000'));
- 修改GAS中的
sendMqttCommandToBroker函数,调用这个中间层的HTTP接口:
function sendMqttCommandToBroker(middlewareHost, middlewarePort, mqttCommand) { var url = `http://${middlewareHost}:${middlewarePort}/publish`; var options = { 'method': 'post', 'headers': { 'Content-Type': 'text/plain' }, 'payload': mqttCommand }; try { var response = UrlFetchApp.fetch(url, options); console.log('MQTT Command sent:', response.getContentText()); } catch (error) { console.error('Error sending MQTT command:', error); } }
4. 测试验证
- 部署GAS Web App,确保LINE Bot的Webhook配置正确指向该Web App的URL
- 发送"Turn on"或"Turn off"消息给LINE Bot,查看GAS日志(查看 → 日志)确认是否有错误信息
- 检查MQTT Broker的消息订阅情况,确认命令是否成功发布到
TestMQTT_microbit主题
内容的提问来源于stack exchange,提问作者user23316150
相关产品推荐
相关产品推荐

