UNPKG

htd-lync

Version:

This library is meant to be used to interact with an HTD Lync 12

556 lines (470 loc) 15 kB
var systems = JSON.parse(localStorage.getItem('systems')); var system = localStorage.getItem('system'); if (system) { system = system.replace('"', ""); system = system.replace('"', ""); } if (!systems) { systems = []; } document.addEventListener('deviceready', function onDeviceReady() { console.log("Device ready") var agent = navigator.userAgent; var isIPad = (agent.indexOf("iPad") > 0); var isIPhone = (agent.indexOf("iPhone") > 0); if (isIPad) { device = "iPad"; } else if (isIPhone) { device = "iPhone" window.screen.orientation.lock('portrait'); } else if (window.innerWidth < 500 || window.innerHeight < 500) { console.log("lock android phone rotation"); window.screen.orientation.lock('portrait'); } window.addEventListener('orientationchange', function() { console.log("rotated:" + screen.orientation.type); // e.g. portrait window.location.reload(); }); // fakeTCPtoTriggerPopup(); // console.log("done with fake"); loadExisitingSystems(); if (system) { //console.log(system); for (i = 0; i < systems.length; i++) { if (systems[i].system.uuid == system) { connectx(systems[i].system.ip, systems[i].system.port * 1); } } } //setTimeout(showReload, 2000); }, false); function showReload() { // if (systemCnt == 0) { var html = "<div class='button-item' onClick='fakeTCPtoTriggerPopup()'>Try Again...</div>"; $('#beaconData').append(html); // } } function loadExisitingSystems() { console.log("load existing systems") for (i = 0; i < systems.length; i++) { console.log(JSON.stringify(systems[i])) var systemName = systems[i].system.name; console.log("systemName: " + systemName) var html = "<div class='button-item beacon' name='" + systems[i].system.name + "'port='" + systems[i].system.port + "' uuid='" + systems[i].system.uuid + "' ip='" + systems[i].system.ip + "' >" + systemName + "</div>"; $('#storedSystemList').append(html); $('#removeSystem').show(); $('.button-item.beacon').on("click", function() { var self = $(this); var uuid = self.attr("uuid"); var ipFound = self.attr("ip"); var port = self.attr("port"); var name = self.attr("name"); console.log(uuid); if (uuid && ipFound) { connectAutoBeacon(uuid, ipFound, name, port); } else { console.log("no uuid or ip") } }) } } function removeSystem() { var list = []; var obj = new Object(); for (var i = 0; i < systems.length; i++) { var obj = new Object(); obj.text = systems[i].system.name + ""; obj.value = i + ""; list.push(obj); } //console.log(list); var config = { title: "Select System To Remove", items: list, selectedValue: i + "", doneButtonLabel: "Remove", cancelButtonLabel: "Cancel" }; // Show the picker window.plugins.listpicker.showPicker(config, function(selection) { systems.splice(selection, 1); localStorage.setItem("systems", JSON.stringify(systems)); location.reload(); }); } function connectManually() { var inputBox = $("#ipAddress").val(); var ip = prompt("Enter IP address of gateway"); console.log(ip); if (!ip) { return; } var port = prompt("Enter Port # of gateway. Default is 10006", "10006"); port = port * 1; if (ip.length > 8 && port) { var mac = prompt("Enter MAC Address of Gateway. Include '-' between values.", "A4-4F-29-"); //console.log(system); if (mac.length != 17) { mac = prompt("MAC Address length not correct, be sure to include '-' between values.", mac); } mac = mac.toUpperCase(); console.log(66); if (systems) { for (var i = 0; i < systems.length; i++) { console.log(systems[i].system.uuid) console.log(JSON.stringify(systems[i])); if (systems[i].system.uuid == "UUID" + mac) { systems[i].system.ip = ip; systems[i].system.ip = port; localStorage.setItem("systems", JSON.stringify(systems)) $('#loginError').text("Connecting..."); connectx(ip, port); setTimeout(errorMsg, 3000); return; } } } //no match with existing systems var name = prompt("This will be setup as a new system. Please give it a name", "Lync") var system = { system: { settingsLocked: true, name: name, enableDoorbell: false, shortcutsEnabled: false, password: 9970, uuid: "UUID" + mac, ip: ip, port: port, showBassTreble: true, }, zones: [], sources: [] } systems.push(system); localStorage.setItem("system", "UUID" + mac) localStorage.setItem("systems", JSON.stringify(systems)) $('#loginError').text("Connecting..."); connectx(ip, port); setTimeout(errorMsg, 3000); } } function errorMsg() { $('#loginError').text("System not found"); } function formatHexString(hexArray) { var hexString = "" for (i = 0; i < hexArray.length; i++) { hexString += hexArray[i]; } return (hexString); } function connectx(ip, port) { //tcpSocketCom(ip, port, [0X02, 0X00, 0X00, 0X08, 0X00, 0X0A]); console.log("connecting to socket", ip, port) if (!ip || !port) { console.log("no ip or port"); return; } tcpSocketCom(ip, port); } function connectAutoBeacon(uuid, ip, name, port) { // alert(window.location.host); console.log("connectBeacon") console.log(uuid, ip, name); // //system.name = name; if (!systems || systems.length == 0) { console.log("new system") var systemNew = { uuid: uuid, ip: ip, port: 10006, name: name, shortcutsEnabled: false, settingsLocked: true, password: 9970, enableDoorbell: false, showBassTreble: true, } systems[0] = new Object(); systems[0].system = systemNew; systems[0].zones = []; systems[0].sources = []; localStorage.setItem("system", uuid) localStorage.setItem("systems", JSON.stringify(systems)) console.log("trying to connect 164") connectx(ip, 10006); setTimeout(errorMsg, 3000); return; } else { console.log("systems found: " + systems.length) for (i = 0; i < systems.length; i++) { console.log(i) if (systems[i].system.uuid == uuid) { //match console.log("match") systems[i].system.ip = ip; systems[i].system.port = 10006; localStorage.setItem("system", uuid) localStorage.setItem("systems", JSON.stringify(systems)) console.log("trying to connect 180") connectx(ip, 10006); setTimeout(errorMsg, 3000); return; } } //existing systems, but not a match var system = { system: { settingsLocked: true, name: name, enableDoorbell: false, shortcutsEnabled: false, password: 9970, uuid: uuid, ip: ip, port: port, showBassTreble: true, } } systems.push(system); localStorage.setItem("system", uuid) localStorage.setItem("systems", JSON.stringify(systems)) $('#loginError').text("Connecting..."); connectx(ip, port); setTimeout(errorMsg, 3000); return; } } function socketConnected() { console.log('connect success!'); window.location.href = 'index2.html'; } function sError() { console.log('connect error'); } function sClose() { console.log('connect close') $('#loginError').text("System not found"); } // TCP communication part for cordova plugin function arrayBuffer2HEX(buf) { var gbuf = new Uint8Array(buf, 0); var dat = ""; for (var i in gbuf) { dat += gbuf[i].toString(16) + " "; } return dat; } function str2arrayBuffer(str) { var buf = new ArrayBuffer(str.length); var bufView = new Uint8Array(buf); for (var i = 0; i < str.length; i++) { bufView[i] = str.charCodeAt(i); } return buf; } function tcpSocketCom(ip, port) { try { if (typeof chrome.sockets !== 'undefined') { console.log(1); chrome.sockets.tcp.create({}, function(createInfo) { console.log(createInfo); var _socketTcpId = createInfo.socketId; console.log(ip, port); chrome.sockets.tcp.connect(_socketTcpId, ip, port, function(result, message) { if (result === 0) { chrome.sockets.tcp.close(); console.log("Connected to socket") socketConnected(); /// connection ok, send the packet } else { console.log("connection failed") } }); chrome.sockets.tcp.onReceive.addListener(function(info) { //// success /// recived, then close connection // chrome.sockets.tcp.close(_socketTcpId); var data = arrayBuffer2HEX(info.data); console.log("Receive HEX: " + data + "\r\n"); }); chrome.sockets.tcp.onReceiveError.addListener(function(error) { //// failed //var data = arrayBuffer2HEX(info.data); console.log("TCP error: " + error + "\r\n"); }); }); } } catch (e) { console.log("TCP socket error", e) } } function fakeTCPtoTriggerPopup() { try { if (typeof chrome.sockets !== 'undefined') { console.log("Fake request"); chrome.sockets.tcp.create({}, function(createInfo) { console.log(createInfo); var _socketTcpId = createInfo.socketId; console.log(ip, port); chrome.sockets.tcp.connect(_socketTcpId, "192.168.1.1", 80, function(result, message) { console.log("Response from fake connection", result, message) chrome.sockets.tcp.close(); window.location = "index.html"; }); window.location = "index.html"; }); } } catch (e) { console.log("TCP socket error", e) } } var systemCnt = 0; // UDP communication part for cordova plugin function str2ab(str) { var buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char var bufView = new Uint16Array(buf); for (var i = 0, strLen = str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } function ab2str(buf) { return String.fromCharCode.apply(null, new Uint8Array(buf)); } var dataReceived = []; var uuids = []; function gettingInfoFromBeacon() { var _udpAddress = "239.255.250.250"; var _udpScanPort = 9131; console.log("getting info from beacon 1") // only do udp stuff if there is plugin defined if (typeof chrome.sockets !== 'undefined') { console.log("getting info from beacon 2") chrome.sockets.udp.create({}, function(createInfo) { var _socketUdpId = createInfo.socketId; console.log(_socketUdpId); chrome.sockets.udp.onReceive.addListener(function(info) { if (info.socketId !== _socketUdpId) return; var exists = false; if (dataReceived) { for (i = 0; i < dataReceived.length; i++) { if (ab2str(info.data) == dataReceived[i]) { exists = true; } } } else { dataReceived = []; } if (exists) { //console.log("already exists") //return; } dataReceived.push(ab2str(info.data)); console.log('Recv from socket line 439: ', ab2str(info.data)); var data = ab2str(info.data); data = data.split("<-"); console.log("data", data); if (!data[5]) { console.log("Missing data") return; } var uuid = data[1]; var ipFound = data[5]; uuid = uuid.replace(">", ""); uuid = uuid.replace(/[\n\r]/g, ''); var model = data[4]; model = model.replace(/[\n\r]/g, ''); console.log(model); ipFound = ipFound.replace("Config-URL=http://", ""); ipFound = ipFound.replace(":80>", ""); ipFound = ipFound.replace(/[\n\r]/g, ''); console.log("Found:", uuid, ipFound, model); console.log(data); if (model == "Model=WGW-SL1>" || model == "Model=GW-SL1>") { console.log("pass model") for (var i = 0; i < uuids.length; i++) { if (uuid == uuids[i]) { console.log("already exists") return; } } var text = $('#beaconData').text(); console.log(text); console.log(ipFound); console.log("Add button"); //Check for system Name; if (ipFound != null) { systemCnt++; var systemName = getSystemName(uuid); if (systemName != false) { var html = "<div class='button-item beacon' uuid='" + uuid + "' ip='" + ipFound + "'>" + systemName + "</div>"; } else { var html = "<div class='button-item beacon' uuid='" + uuid + "' ip='" + ipFound + "'>" + ipFound + "</div>"; } console.log("Add button", html); uuids.push(uuid); $('#beaconData').append(html); $('.button-item.beacon').on("click", function() { var self = $(this); var uuid = self.attr("uuid"); var systemName = getSystemName(uuid); if (!systemName && uuid) { systemName = prompt("Please enter a name for this system", "Lync"); } var ipFound = self.attr("ip"); console.log(uuid); if (uuid && ipFound && systemName) { console.log("connectBeacon " + systemName); connectAutoBeacon(uuid, ipFound, systemName, 10006); } else { console.log("no uuid or ip") return; } }); } } }); chrome.sockets.udp.onReceiveError.addListener(function(error) { console.log('Recv ERROR from socket: ', error); }); chrome.sockets.udp.bind(_socketUdpId, _udpAddress, _udpScanPort, function(bindresult) { if (bindresult < 0) { console.log("Error binding socket."); return; } console.log("bind result : ", bindresult); chrome.sockets.udp.joinGroup(_socketUdpId, _udpAddress, function(joinresult) { if (joinresult < 0) { console.log('join fail: ' + joinresult); // close all the stuff, send has failed } else { console.log('joinGroup: success ' + _udpScanPort, createInfo, bindresult, joinresult); } }); }); }); } } function getSystemName(uuid) { console.log("getSystemName") if (!systems) { return false; } for (i = 0; i < systems.length; i++) { if (systems[i].system.uuid == uuid) { console.log("match", uuid); var systemName = systems[i].system.name; if (systemName) { //console.log(systemName); return systemName; } else { return false; } } } return false; }