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

如何将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用于发布消息,步骤如下:

  1. 在EMQX控制台创建API密钥(路径:API密钥 → 创建密钥)
  2. 修改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);
  }
}
  1. 在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:

  1. 编写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'));
  1. 修改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. 测试验证

  1. 部署GAS Web App,确保LINE Bot的Webhook配置正确指向该Web App的URL
  2. 发送"Turn on"或"Turn off"消息给LINE Bot,查看GAS日志(查看 → 日志)确认是否有错误信息
  3. 检查MQTT Broker的消息订阅情况,确认命令是否成功发布到TestMQTT_microbit主题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:48:14