"use strict"; const electron = require("electron"); const path = require("path"); const utils = require("@electron-toolkit/utils"); const axios = require("axios"); const mqtt = require("mqtt"); const events$1 = require("events"); const dayjs = require("dayjs"); const utc = require("dayjs/plugin/utc"); const AsyncLock = require("async-lock"); var client; const sub_topic1 = "20005000A0001"; var lock = new AsyncLock(); var em = new events$1.EventEmitter(); function mqttClient(mqtt_address, mywindow, hmap2) { const clientId = "mqttjs_giga" + Math.random().toString(16).substr(2, 8); const host = "mqtt://" + mqtt_address; console.log("=======>>>> MQTT Client Start " + host); const options = { keepalive: 30, clientId, protocolId: "MQTT", protocolVersion: 4, clean: true, reconnectPeriod: 1e3, connectTimeout: 30 * 1e3, will: { topic: "WillMsg", payload: "Connection Closed abnormally..!", qos: 0, retain: false }, rejectUnauthorized: false }; console.log("start connecting mqtt client...."); client = mqtt.connect(host, options); client.on("error", (err) => { console.log("mqtt Connection error: ", err); client.end(); }); client.on("reconnect", () => { console.error("MQTT reconnect"); }); client.on("connect", () => { console.log("MQTT Client connected : " + clientId + " OK"); client.subscribe(sub_topic1, { qos: 2 }); var param = { success: true, action: "mqttconnect", data: { status: "0" } }; console.log("Send mqtt:connectReply"); mywindow.webContents.send("mqtt:connectReply", param); }); client.on("offline", () => { console.log("MQTT offline"); var param = { success: false, action: "mqttconnect", data: { status: "0" } }; console.log("Send mqtt:connectReply"); mywindow.webContents.send("mqtt:connectReply", param); }); client.on("message", (topic, payload) => { console.log("Received Message:", topic, payload.toString()); var obj = JSON.parse(payload.toString()); lock.acquire("hmap", () => { var hobj = hmap2.get(obj.TimeStamp); if (hobj !== void 0) { hobj.data = payload.toString(); hobj.stat = 1; hmap2.set(obj.TimeStamp, hobj); } }).then(function() { }); }); electron.ipcMain.on("mqtt:publish", function(event, param) { console.log("mqttclient(ipcMain) 接收到 mqtt:publish : " + JSON.stringify(param)); client.publish(param.topic, param.message, { qos: 2, retain: false }); }); em.on("mqtt:publish", (param) => { console.log("mqttclient(eventEmitter) 接收到 mqtt:publish : " + JSON.stringify(param)); client.publish(param.topic, param.message, { qos: 2, retain: false }); }); } function cmsHttpRequest(mywindow, hmap2) { electron.ipcMain.on("cms:getMasterDeviceSN", function(event, param) { console.log("cmsHttpRequest 接收到 cms:getMasterDeviceSN : " + JSON.stringify(param)); var url; if (param.data.cid.slice(0, 6) == "886235") url = "http://intercom.nxt.tw:8006"; else url = "http://aws.gigatech.tw:8006"; axios.get(url + "/Common/CloudCMS/devices/devicelist.ashx?CID=" + param.data.cid).then((res) => { if (res.status == 200 && res.data.success) { res.data.data.every((element) => { console.log(element); var data = element.split(";"); if (data.length > 3) { if (data[2] === "00000000-1") { console.log("Master Device SN : " + data[0]); return false; } } return true; }); } }); }); electron.ipcMain.on("cms:loginVerify", function(event, param) { console.log("cmsHttpRequest 接收到 cms:loginVerify : " + JSON.stringify(param)); setImmediate((param2, event2, hmap3, mywindow2) => { em.emit("loginverify:Step1", param2, event2, hmap3, mywindow2); }, param, event, hmap2, mywindow); }); } em.on("convertStep1", (param, num) => { console.log("convertStep1...." + param.cid + " , " + param.userID + " , " + param.passwd); console.log(num); }); em.on("loginverify:Step1", (param, event, hmap2, mywindow) => { var url; if (param.data.cid.slice(0, 6) == "886235") url = "http://intercom.nxt.tw:8006"; else url = "http://aws.gigatech.tw:8006"; axios.get(url + "/Common/CloudCMS/devices/devicelist.ashx?CID=" + param.data.cid).then((res) => { if (res.status == 200 && res.data.success) { res.data.data.every((element) => { console.log(element); var data = element.split(";"); if (data.length > 3) { if (data[2] === "00000000-1") { console.log("Master Device SN : " + data[0]); dayjs.extend(utc); const ts = dayjs().utc().format("YYYY/MM/DD_HH:mm:ss").toString(); var querydata = { topic: data[0], message: '{"action":"mqttqueryMobileList","data":{"Command":"CID=' + param.data.cid + '&ID=00000000","SerialNo":"' + sub_topic1 + '","TimeStamp":"' + ts + '","Token":"FFFFFGIGATECH0529FFFFF"}}' }; var cb_param = { stat: 0, data: "" }; hmap2.set(ts, cb_param); client.publish(querydata.topic, querydata.message, { qos: 2, retain: false }); var inparam = { ts, retrycnt: 0, cid: param.data.cid, userID: param.data.userID, vpasswd: param.data.vpasswd, passwd: "", topic: querydata.topic }; var chkflg = setInterval(function(inparam2) { lock.acquire("hmap", () => { var hobj = hmap2.get(inparam2.ts); if (hobj !== void 0) { if (hobj.stat == 1) { clearInterval(chkflg); var dobj = JSON.parse(hobj.data); console.log("===>>>" + dobj.data[0].Password); inparam2.passwd = dobj.data[0].Password; hmap2.delete(inparam2.ts); setImmediate((inparam3, event2, hmap3, mywindow2) => { em.emit("loginverify:Step2", inparam3, event2, hmap3, mywindow2); }, inparam2, event, hmap2, mywindow); } else { if (inparam2.retrycnt > 50) { clearInterval(chkflg); hmap2.delete(inparam2.ts); var lparam2 = { action: "loginVerifyReply", data: { code: 404, token: "" } }; setImmediate((lparam3, event2, hmap3, mywindow2) => { em.emit("loginverify:Step3", lparam3, event2, hmap3, mywindow2); }, lparam2, event, hmap2, mywindow); } else inparam2.retrycnt++; } } else { clearInterval(chkflg); } }).then(function() { }); }, 100, inparam); return false; } } return true; }); } else { var lparam = { action: "loginVerifyReply", data: { code: 404, token: "" } }; setImmediate((lparam2, event2, hmap3, mywindow2) => { em.emit("loginverify:Step3", lparam2, event2, hmap3, mywindow2); }, lparam, event, hmap2, mywindow); } }); }); em.on("loginverify:Step2", (param, event, hmap2, mywindow) => { console.log("loginverify:Step2 -> " + param.cid + " , " + param.userID + " , " + param.passwd); dayjs.extend(utc); const ts = dayjs().utc().format("YYYY/MM/DD_HH:mm:ss").toString(); var querydata = { topic: param.topic, message: '{"action":"mqttverifyRemoteKeyAccount","data":{"Command":"User=' + param.userID + "&Account=" + param.cid + "_" + param.userID + "&PassWord=" + param.passwd + "&WebPassword=" + param.vpasswd + '","SerialNo":"' + sub_topic1 + '","TimeStamp":"' + ts + '","Token":"FFFFFGIGATECH0529FFFFF"}}' }; var cb_param = { stat: 0, data: "" }; hmap2.set(ts, cb_param); client.publish(querydata.topic, querydata.message, { qos: 2, retain: false }); var inparam = { ts, retrycnt: 0, cid: param.cid, userID: param.userID, vpasswd: param.vpasswd, passwd: param.passwd, topic: param.topic }; var chkflg = setInterval(function(inparam2) { lock.acquire("hmap", () => { var hobj = hmap2.get(inparam2.ts); if (hobj !== void 0) { if (hobj.stat == 1) { clearInterval(chkflg); console.log(hobj.data); var dobj = JSON.parse(hobj.data); hmap2.delete(inparam2.ts); var lparam = { action: "loginVerifyReply", data: { code: 0, token: "" } }; if (dobj.success && dobj.data.code == 200) { lparam.data.code = dobj.data.code; lparam.data.token = dobj.data.token; } else { lparam.data.code = dobj.data.code; } setImmediate((lparam2, event2, hmap3, mywindow2) => { em.emit("loginverify:Step3", lparam2, event2, hmap3, mywindow2); }, lparam, event, hmap2, mywindow); } else { if (inparam2.retrycnt > 50) { clearInterval(chkflg); hmap2.delete(lparam.ts); var lparam = { action: "loginVerifyReply", data: { code: 404, token: "" } }; setImmediate((lparam2, event2, hmap3, mywindow2) => { em.emit("loginverify:Step3", lparam2, event2, hmap3, mywindow2); }, lparam, event, hmap2, mywindow); } else inparam2.retrycnt++; } } else { clearInterval(chkflg); } }).then(function() { }); }, 100, inparam); }); em.on("loginverify:Step3", (param, event, hmap2, mywindow) => { console.log("loginverify:Step3 -> ", param); mywindow.webContents.send("cms:loginVerifyReply", param); }); const events = require("events"); var varmap = new Array(); function varSubProc(mywindow) { console.log("varSubProc run....."); var em2 = new events.EventEmitter(); em2.on("em:setDate", function(cmd) { console.log(cmd); var index = cmd.data.name + "-" + cmd.data.user; if (cmd.data.type == "Number") { varmap[index] = parseInt(cmd.data.value); } else if (cmd.data.type == "Float") { varmap[index] = parseFloat(cmd.data.value); } else { varmap[index] = cmd.data.value; } }); em2.on("em:getDate", function(cmd) { console.log(cmd); }); electron.ipcMain.on("ipc:setData", function(event, cmd) { console.log(cmd); var index = cmd.data.name + "-" + cmd.data.user; if (cmd.data.type == "Number") { varmap[index] = parseInt(cmd.data.value); } else if (cmd.data.type == "Float") { varmap[index] = parseFloat(cmd.data.value); } else { varmap[index] = cmd.data.value; } }); electron.ipcMain.on("ipc:getData", function(event, cmd) { var retv; console.log(cmd); var index = cmd.data.name + "-" + cmd.data.user; if (varmap[index] == null) { if (cmd.data.type == "Number") { retv = 0; } else { retv = ""; } } else { retv = varmap[index]; } var param = { success: true, action: "getData", data: { name: cmd.data.name, user: cmd.data.user, type: cmd.data.type, value: retv } }; event.sender.send("ipc:getDataReply", param); }); } const icon = path.join(__dirname, "../../resources/icon.png"); const remote = require("@electron/remote/main"); const HashMap = require("hashmap"); remote.initialize(); var hmap = new HashMap(); function createWindow() { const mainWindow = new electron.BrowserWindow({ width: 900, height: 670, show: false, autoHideMenuBar: true, ...process.platform === "linux" ? { icon } : {}, webPreferences: { nodeIntegration: true, contextIsolation: false, enableRemoteModule: true, preload: path.join(__dirname, "../preload/index.js"), sandbox: false } }); mainWindow.on("ready-to-show", () => { mainWindow.show(); }); mainWindow.webContents.setWindowOpenHandler((details) => { electron.shell.openExternal(details.url); return { action: "deny" }; }); if (utils.is.dev && process.env["ELECTRON_RENDERER_URL"]) { mainWindow.loadURL(process.env["ELECTRON_RENDERER_URL"]); } else { mainWindow.loadFile(path.join(__dirname, "../renderer/index.html")); } remote.enable(mainWindow.webContents); varSubProc(); cmsHttpRequest(mainWindow, hmap); electron.ipcMain.on("debug-log", (event, message) => { console.log(message); }); electron.ipcMain.on("renderer:cmd", (event, message) => { if (message === "onMounted") { setTimeout(() => { mqttClient("iotmqtt.gigatech.tw:1883", mainWindow, hmap); }, "1000"); } }); } electron.app.whenReady().then(() => { utils.electronApp.setAppUserModelId("com.electron"); electron.app.on("browser-window-created", (_, window) => { utils.optimizer.watchWindowShortcuts(window); }); createWindow(); electron.app.on("activate", function() { if (electron.BrowserWindow.getAllWindows().length === 0) createWindow(); }); }); electron.app.on("window-all-closed", () => { if (process.platform !== "darwin") { electron.app.quit(); } });