htd-lync
Version:
This library is meant to be used to interact with an HTD Lync 12
556 lines (470 loc) • 15 kB
JavaScript
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;
}