iT邦幫忙

0

我想使用linebot傳送訊息至mqtt,但mqtt端一直沒有成功收到訊息
mqtt broker我使用的是hivemq的public broker,已經確認連接成功並已訂閱主題了
linebot的程式我是使用app script撰寫的

想請問有沒有前輩知道該怎麼實現此功能呢?謝謝!

以下為程式碼:
var CHANNEL_ACCESS_TOKEN = 'my LINE Channel Access Token'; //已改成自己的LINE Channel Access Token

function doPost(e) {
var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
var userMessage = JSON.parse(e.postData.contents).events[0].message.text;

if (userMessage.includes('開燈') ) {
sendMqttCommandToBroker('mqtt-dashboard.com', '1883', 'on');// 調用函數發送 MQTT 指令
pushLineBotMessage('已開', replyToken);
}

// 模擬回傳 200 狀態碼
return ContentService.createTextOutput('Received').setMimeType(ContentService.MimeType.TEXT);
}

// 回覆使用者
function pushLineBotMessage(sMsg, sReplyToken){
var linePayload = {
'replyToken': sReplyToken,
'messages': [
{
'type': 'text',
'text': sMsg
}
]
};

var lineOptions = {
'method': 'post',
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
},
'payload': JSON.stringify(linePayload)
};

UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', lineOptions); // 將訊息送出
}

function sendMqttCommandToBroker(mqttBrokerHost, mqttBrokerPort, mqttCommand) {
// 連接到 MQTT Broker 並發送指令
var url = 'mqtt://' + mqttBrokerHost + ':' + mqttBrokerPort + '/TestMQTT_microbit'; // 替換為您的 MQTT Broker 主機和端口以及主題

// 構建 MQTT 訊息
var message = {
clientId: '20240115micobit',
topic: 'TestMQTT_microbit',
command: mqttCommand
};

var options = {
'method': 'post',
'payload': mqttCommand
};
try {
// 发送 MQTT 指令并等待响应
var response = UrlFetchApp.fetch(url, options);
console.log('MQTT Command sent:', response.getContentText());
} catch (error) {
console.error('Error sending MQTT command:', error);
}
// UrlFetchApp.fetch(url, options);
}

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
dashuai
iT邦新手 5 級 ‧ 2024-01-30 14:22:59

在您的程式碼中,您使用 UrlFetchApp.fetch() 方法試圖向 MQTT Broker 發送訊息。然而,Google Apps Script 的 UrlFetchApp 不支援直接連接 MQTT Broker 進行發佈(publish)消息。要解決這個問題,您需要使用一個支持 MQTT 的 JavaScript 客戶端庫,但在 Google Apps Script 環境中這可能較為困難。

一個替代方案是將 MQTT 發布功能轉移到另一個環境,例如 Node.js 運行的伺服器,並通過 HTTP API 來觸發 MQTT 發布。以下是一個基本的工作流程:

  1. 修改你的 Google Apps Script,當需要發送 MQTT 指令時,呼叫外部 HTTP API。
  2. 在 Node.js 或其他後端環境中建立一個 HTTP 伺服器,接收來自 Google Apps Script 的請求。
  3. 使用 MQTT 客戶端庫(例如 mqtt.js)在該伺服器中連接到 MQTT Broker,並根據收到的 HTTP 請求內容發送 MQTT 訊息。

以下是修改後的 Google Apps Script 部分代碼:

function sendMqttCommandToBroker(mqttCommand) {
  var url = 'https://your-backend-server.com/send-mqtt-command'; // 替換為您的後端伺服器 URL
  var options = {
    'method': 'post',
    'payload': {
      'command': mqttCommand
    }
  };
  
  try {
    var response = UrlFetchApp.fetch(url, options);
    console.log('MQTT Command sent:', response.getContentText());
  } catch (error) {
    console.error('Error sending MQTT command:', error);
  }
}

然後,在 Node.js 中:

const express = require('express');
const mqtt = require('mqtt');

const app = express();
const mqttClient = mqtt.connect('mqtt://mqtt-dashboard.com', { port: 1883 });

mqttClient.on('connect', () => {
  console.log('Connected to MQTT broker');
});

app.post('/send-mqtt-command', (req, res) => {
  const command = req.body.command;
  mqttClient.publish('TestMQTT_microbit', command);
  res.status(200).send('MQTT Command received and published');
});

app.listen(3000, () => {
  console.log('HTTP server listening on port 3000');
});

這樣,當 Google Apps Script 發出 HTTP POST 請求到 Node.js 伺服器時,伺服器就會透過 mqtt.js 發布 MQTT 訊息到指定的主題

我要發表回答

立即登入回答