我想使用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);
}
在您的程式碼中,您使用 UrlFetchApp.fetch()
方法試圖向 MQTT Broker 發送訊息。然而,Google Apps Script 的 UrlFetchApp
不支援直接連接 MQTT Broker 進行發佈(publish)消息。要解決這個問題,您需要使用一個支持 MQTT 的 JavaScript 客戶端庫,但在 Google Apps Script 環境中這可能較為困難。
一個替代方案是將 MQTT 發布功能轉移到另一個環境,例如 Node.js 運行的伺服器,並通過 HTTP API 來觸發 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 訊息到指定的主題