預約系統電腦版

index.js 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. "use strict";
  2. const electron = require("electron");
  3. const path = require("path");
  4. const utils = require("@electron-toolkit/utils");
  5. const axios = require("axios");
  6. const mqtt = require("mqtt");
  7. const events$1 = require("events");
  8. const dayjs = require("dayjs");
  9. const utc = require("dayjs/plugin/utc");
  10. const AsyncLock = require("async-lock");
  11. var client;
  12. const sub_topic1 = "20005000A0001";
  13. var lock = new AsyncLock();
  14. var em = new events$1.EventEmitter();
  15. function mqttClient(mqtt_address, mywindow, hmap2) {
  16. const clientId = "mqttjs_giga" + Math.random().toString(16).substr(2, 8);
  17. const host = "mqtt://" + mqtt_address;
  18. console.log("=======>>>> MQTT Client Start " + host);
  19. const options = {
  20. keepalive: 30,
  21. clientId,
  22. protocolId: "MQTT",
  23. protocolVersion: 4,
  24. clean: true,
  25. reconnectPeriod: 1e3,
  26. connectTimeout: 30 * 1e3,
  27. will: {
  28. topic: "WillMsg",
  29. payload: "Connection Closed abnormally..!",
  30. qos: 0,
  31. retain: false
  32. },
  33. rejectUnauthorized: false
  34. };
  35. console.log("start connecting mqtt client....");
  36. client = mqtt.connect(host, options);
  37. client.on("error", (err) => {
  38. console.log("mqtt Connection error: ", err);
  39. client.end();
  40. });
  41. client.on("reconnect", () => {
  42. console.error("MQTT reconnect");
  43. });
  44. client.on("connect", () => {
  45. console.log("MQTT Client connected : " + clientId + " OK");
  46. client.subscribe(sub_topic1, {
  47. qos: 2
  48. });
  49. var param = {
  50. success: true,
  51. action: "mqttconnect",
  52. data: {
  53. status: "0"
  54. }
  55. };
  56. console.log("Send mqtt:connectReply");
  57. mywindow.webContents.send("mqtt:connectReply", param);
  58. });
  59. client.on("offline", () => {
  60. console.log("MQTT offline");
  61. var param = {
  62. success: false,
  63. action: "mqttconnect",
  64. data: {
  65. status: "0"
  66. }
  67. };
  68. console.log("Send mqtt:connectReply");
  69. mywindow.webContents.send("mqtt:connectReply", param);
  70. });
  71. client.on("message", (topic, payload) => {
  72. console.log("Received Message:", topic, payload.toString());
  73. var obj = JSON.parse(payload.toString());
  74. lock.acquire("hmap", () => {
  75. var hobj = hmap2.get(obj.TimeStamp);
  76. if (hobj !== void 0) {
  77. hobj.data = payload.toString();
  78. hobj.stat = 1;
  79. hmap2.set(obj.TimeStamp, hobj);
  80. }
  81. }).then(function() {
  82. });
  83. });
  84. electron.ipcMain.on("mqtt:publish", function(event, param) {
  85. console.log("mqttclient(ipcMain) 接收到 mqtt:publish : " + JSON.stringify(param));
  86. client.publish(param.topic, param.message, {
  87. qos: 2,
  88. retain: false
  89. });
  90. });
  91. em.on("mqtt:publish", (param) => {
  92. console.log("mqttclient(eventEmitter) 接收到 mqtt:publish : " + JSON.stringify(param));
  93. client.publish(param.topic, param.message, {
  94. qos: 2,
  95. retain: false
  96. });
  97. });
  98. }
  99. function cmsHttpRequest(mywindow, hmap2) {
  100. electron.ipcMain.on("cms:getMasterDeviceSN", function(event, param) {
  101. console.log("cmsHttpRequest 接收到 cms:getMasterDeviceSN : " + JSON.stringify(param));
  102. var url;
  103. if (param.data.cid.slice(0, 6) == "886235")
  104. url = "http://intercom.nxt.tw:8006";
  105. else
  106. url = "http://aws.gigatech.tw:8006";
  107. axios.get(url + "/Common/CloudCMS/devices/devicelist.ashx?CID=" + param.data.cid).then((res) => {
  108. if (res.status == 200 && res.data.success) {
  109. res.data.data.every((element) => {
  110. console.log(element);
  111. var data = element.split(";");
  112. if (data.length > 3) {
  113. if (data[2] === "00000000-1") {
  114. console.log("Master Device SN : " + data[0]);
  115. return false;
  116. }
  117. }
  118. return true;
  119. });
  120. }
  121. });
  122. });
  123. electron.ipcMain.on("cms:loginVerify", function(event, param) {
  124. console.log("cmsHttpRequest 接收到 cms:loginVerify : " + JSON.stringify(param));
  125. setImmediate((param2, event2, hmap3, mywindow2) => {
  126. em.emit("loginverify:Step1", param2, event2, hmap3, mywindow2);
  127. }, param, event, hmap2, mywindow);
  128. });
  129. }
  130. em.on("convertStep1", (param, num) => {
  131. console.log("convertStep1...." + param.cid + " , " + param.userID + " , " + param.passwd);
  132. console.log(num);
  133. });
  134. em.on("loginverify:Step1", (param, event, hmap2, mywindow) => {
  135. var url;
  136. if (param.data.cid.slice(0, 6) == "886235")
  137. url = "http://intercom.nxt.tw:8006";
  138. else
  139. url = "http://aws.gigatech.tw:8006";
  140. axios.get(url + "/Common/CloudCMS/devices/devicelist.ashx?CID=" + param.data.cid).then((res) => {
  141. if (res.status == 200 && res.data.success) {
  142. res.data.data.every((element) => {
  143. console.log(element);
  144. var data = element.split(";");
  145. if (data.length > 3) {
  146. if (data[2] === "00000000-1") {
  147. console.log("Master Device SN : " + data[0]);
  148. dayjs.extend(utc);
  149. const ts = dayjs().utc().format("YYYY/MM/DD_HH:mm:ss").toString();
  150. var querydata = {
  151. topic: data[0],
  152. message: '{"action":"mqttqueryMobileList","data":{"Command":"CID=' + param.data.cid + '&ID=00000000","SerialNo":"' + sub_topic1 + '","TimeStamp":"' + ts + '","Token":"FFFFFGIGATECH0529FFFFF"}}'
  153. };
  154. var cb_param = {
  155. stat: 0,
  156. data: ""
  157. };
  158. hmap2.set(ts, cb_param);
  159. client.publish(querydata.topic, querydata.message, {
  160. qos: 2,
  161. retain: false
  162. });
  163. var inparam = {
  164. ts,
  165. retrycnt: 0,
  166. cid: param.data.cid,
  167. userID: param.data.userID,
  168. vpasswd: param.data.vpasswd,
  169. passwd: "",
  170. topic: querydata.topic
  171. };
  172. var chkflg = setInterval(function(inparam2) {
  173. lock.acquire("hmap", () => {
  174. var hobj = hmap2.get(inparam2.ts);
  175. if (hobj !== void 0) {
  176. if (hobj.stat == 1) {
  177. clearInterval(chkflg);
  178. var dobj = JSON.parse(hobj.data);
  179. console.log("===>>>" + dobj.data[0].Password);
  180. inparam2.passwd = dobj.data[0].Password;
  181. hmap2.delete(inparam2.ts);
  182. setImmediate((inparam3, event2, hmap3, mywindow2) => {
  183. em.emit("loginverify:Step2", inparam3, event2, hmap3, mywindow2);
  184. }, inparam2, event, hmap2, mywindow);
  185. } else {
  186. if (inparam2.retrycnt > 50) {
  187. clearInterval(chkflg);
  188. hmap2.delete(inparam2.ts);
  189. var lparam2 = {
  190. action: "loginVerifyReply",
  191. data: {
  192. code: 404,
  193. token: ""
  194. }
  195. };
  196. setImmediate((lparam3, event2, hmap3, mywindow2) => {
  197. em.emit("loginverify:Step3", lparam3, event2, hmap3, mywindow2);
  198. }, lparam2, event, hmap2, mywindow);
  199. } else
  200. inparam2.retrycnt++;
  201. }
  202. } else {
  203. clearInterval(chkflg);
  204. }
  205. }).then(function() {
  206. });
  207. }, 100, inparam);
  208. return false;
  209. }
  210. }
  211. return true;
  212. });
  213. } else {
  214. var lparam = {
  215. action: "loginVerifyReply",
  216. data: {
  217. code: 404,
  218. token: ""
  219. }
  220. };
  221. setImmediate((lparam2, event2, hmap3, mywindow2) => {
  222. em.emit("loginverify:Step3", lparam2, event2, hmap3, mywindow2);
  223. }, lparam, event, hmap2, mywindow);
  224. }
  225. });
  226. });
  227. em.on("loginverify:Step2", (param, event, hmap2, mywindow) => {
  228. console.log("loginverify:Step2 -> " + param.cid + " , " + param.userID + " , " + param.passwd);
  229. dayjs.extend(utc);
  230. const ts = dayjs().utc().format("YYYY/MM/DD_HH:mm:ss").toString();
  231. var querydata = {
  232. topic: param.topic,
  233. 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"}}'
  234. };
  235. var cb_param = {
  236. stat: 0,
  237. data: ""
  238. };
  239. hmap2.set(ts, cb_param);
  240. client.publish(querydata.topic, querydata.message, {
  241. qos: 2,
  242. retain: false
  243. });
  244. var inparam = {
  245. ts,
  246. retrycnt: 0,
  247. cid: param.cid,
  248. userID: param.userID,
  249. vpasswd: param.vpasswd,
  250. passwd: param.passwd,
  251. topic: param.topic
  252. };
  253. var chkflg = setInterval(function(inparam2) {
  254. lock.acquire("hmap", () => {
  255. var hobj = hmap2.get(inparam2.ts);
  256. if (hobj !== void 0) {
  257. if (hobj.stat == 1) {
  258. clearInterval(chkflg);
  259. console.log(hobj.data);
  260. var dobj = JSON.parse(hobj.data);
  261. hmap2.delete(inparam2.ts);
  262. var lparam = {
  263. action: "loginVerifyReply",
  264. data: {
  265. code: 0,
  266. token: ""
  267. }
  268. };
  269. if (dobj.success && dobj.data.code == 200) {
  270. lparam.data.code = dobj.data.code;
  271. lparam.data.token = dobj.data.token;
  272. } else {
  273. lparam.data.code = dobj.data.code;
  274. }
  275. setImmediate((lparam2, event2, hmap3, mywindow2) => {
  276. em.emit("loginverify:Step3", lparam2, event2, hmap3, mywindow2);
  277. }, lparam, event, hmap2, mywindow);
  278. } else {
  279. if (inparam2.retrycnt > 50) {
  280. clearInterval(chkflg);
  281. hmap2.delete(lparam.ts);
  282. var lparam = {
  283. action: "loginVerifyReply",
  284. data: {
  285. code: 404,
  286. token: ""
  287. }
  288. };
  289. setImmediate((lparam2, event2, hmap3, mywindow2) => {
  290. em.emit("loginverify:Step3", lparam2, event2, hmap3, mywindow2);
  291. }, lparam, event, hmap2, mywindow);
  292. } else
  293. inparam2.retrycnt++;
  294. }
  295. } else {
  296. clearInterval(chkflg);
  297. }
  298. }).then(function() {
  299. });
  300. }, 100, inparam);
  301. });
  302. em.on("loginverify:Step3", (param, event, hmap2, mywindow) => {
  303. console.log("loginverify:Step3 -> ", param);
  304. mywindow.webContents.send("cms:loginVerifyReply", param);
  305. });
  306. const events = require("events");
  307. var varmap = new Array();
  308. function varSubProc(mywindow) {
  309. console.log("varSubProc run.....");
  310. var em2 = new events.EventEmitter();
  311. em2.on("em:setDate", function(cmd) {
  312. console.log(cmd);
  313. var index = cmd.data.name + "-" + cmd.data.user;
  314. if (cmd.data.type == "Number") {
  315. varmap[index] = parseInt(cmd.data.value);
  316. } else if (cmd.data.type == "Float") {
  317. varmap[index] = parseFloat(cmd.data.value);
  318. } else {
  319. varmap[index] = cmd.data.value;
  320. }
  321. });
  322. em2.on("em:getDate", function(cmd) {
  323. console.log(cmd);
  324. });
  325. electron.ipcMain.on("ipc:setData", function(event, cmd) {
  326. console.log(cmd);
  327. var index = cmd.data.name + "-" + cmd.data.user;
  328. if (cmd.data.type == "Number") {
  329. varmap[index] = parseInt(cmd.data.value);
  330. } else if (cmd.data.type == "Float") {
  331. varmap[index] = parseFloat(cmd.data.value);
  332. } else {
  333. varmap[index] = cmd.data.value;
  334. }
  335. });
  336. electron.ipcMain.on("ipc:getData", function(event, cmd) {
  337. var retv;
  338. console.log(cmd);
  339. var index = cmd.data.name + "-" + cmd.data.user;
  340. if (varmap[index] == null) {
  341. if (cmd.data.type == "Number") {
  342. retv = 0;
  343. } else {
  344. retv = "";
  345. }
  346. } else {
  347. retv = varmap[index];
  348. }
  349. var param = {
  350. success: true,
  351. action: "getData",
  352. data: {
  353. name: cmd.data.name,
  354. user: cmd.data.user,
  355. type: cmd.data.type,
  356. value: retv
  357. }
  358. };
  359. event.sender.send("ipc:getDataReply", param);
  360. });
  361. }
  362. const icon = path.join(__dirname, "../../resources/icon.png");
  363. const remote = require("@electron/remote/main");
  364. const HashMap = require("hashmap");
  365. remote.initialize();
  366. var hmap = new HashMap();
  367. function createWindow() {
  368. const mainWindow = new electron.BrowserWindow({
  369. width: 900,
  370. height: 670,
  371. show: false,
  372. autoHideMenuBar: true,
  373. ...process.platform === "linux" ? { icon } : {},
  374. webPreferences: {
  375. nodeIntegration: true,
  376. contextIsolation: false,
  377. enableRemoteModule: true,
  378. preload: path.join(__dirname, "../preload/index.js"),
  379. sandbox: false
  380. }
  381. });
  382. mainWindow.on("ready-to-show", () => {
  383. mainWindow.show();
  384. });
  385. mainWindow.webContents.setWindowOpenHandler((details) => {
  386. electron.shell.openExternal(details.url);
  387. return { action: "deny" };
  388. });
  389. if (utils.is.dev && process.env["ELECTRON_RENDERER_URL"]) {
  390. mainWindow.loadURL(process.env["ELECTRON_RENDERER_URL"]);
  391. } else {
  392. mainWindow.loadFile(path.join(__dirname, "../renderer/index.html"));
  393. }
  394. remote.enable(mainWindow.webContents);
  395. varSubProc();
  396. cmsHttpRequest(mainWindow, hmap);
  397. electron.ipcMain.on("debug-log", (event, message) => {
  398. console.log(message);
  399. });
  400. electron.ipcMain.on("renderer:cmd", (event, message) => {
  401. if (message === "onMounted") {
  402. setTimeout(() => {
  403. mqttClient("iotmqtt.gigatech.tw:1883", mainWindow, hmap);
  404. }, "1000");
  405. }
  406. });
  407. }
  408. electron.app.whenReady().then(() => {
  409. utils.electronApp.setAppUserModelId("com.electron");
  410. electron.app.on("browser-window-created", (_, window) => {
  411. utils.optimizer.watchWindowShortcuts(window);
  412. });
  413. createWindow();
  414. electron.app.on("activate", function() {
  415. if (electron.BrowserWindow.getAllWindows().length === 0)
  416. createWindow();
  417. });
  418. });
  419. electron.app.on("window-all-closed", () => {
  420. if (process.platform !== "darwin") {
  421. electron.app.quit();
  422. }
  423. });