Merge pull request #890 from lasanthaDLPDS/master

Fixed geo-dashoard stream connection issue and broken pipe issue
4.x.x
Rasika Perera 7 years ago committed by GitHub
commit 78fb150e93

@ -17,30 +17,38 @@
*/ */
function onRequest(context) { function onRequest(context) {
var log = new Log("geo-dashboard.js"); var log = new Log("geo-dashboard.js");
var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"];
var viewModel = {}; var viewModel = {};
var carbonServer = require("carbon").server; var carbonServer = require("carbon").server;
var device = context.unit.params.device; var device = context.unit.params.device;
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var wsEndpoint = devicemgtProps["wssURL"].replace("https", "wss") + "/secured-websocket/t/"; var wsEndpoint = null;
var spatialWSEndpoint = devicemgtProps["wssURL"].replace("https", "wss");
var alertsWSEndpoint = devicemgtProps["wssURL"].replace("https", "wss");
var jwtService = carbonServer.osgiService( var jwtService = carbonServer.osgiService(
'org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService'); 'org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService');
var jwtClient = jwtService.getJWTClient(); var jwtClient = jwtService.getJWTClient();
var encodedClientKeys = session.get(constants["ENCODED_TENANT_BASED_WEB_SOCKET_CLIENT_CREDENTIALS"]); var encodedClientKeys = session.get(constants["ENCODED_TENANT_BASED_WEB_SOCKET_CLIENT_CREDENTIALS"]);
var tokenPair = null;
var token = ""; var token = "";
if (encodedClientKeys) { if (encodedClientKeys) {
var tokenUtil = require("/app/modules/oauth/token-handler-utils.js")["utils"]; var tokenUtil = require("/app/modules/oauth/token-handler-utils.js")["utils"];
var resp = tokenUtil.decode(encodedClientKeys).split(":"); var resp = tokenUtil.decode(encodedClientKeys).split(":");
var tokenPair = jwtClient.getAccessToken(resp[0], resp[1], context.user.username, "default", {}); if (context.user.domain == "carbon.super") {
tokenPair = jwtClient.getAccessToken(resp[0], resp[1], context.user.username,"default", {});
if (tokenPair) { if (tokenPair) {
token = tokenPair.accessToken; token = tokenPair.accessToken;
wsEndpoint = devicemgtProps["wssURL"].replace("https", "wss") + "/secured-websocket/";
} }
} else {
tokenPair = jwtClient.getAccessToken(resp[0], resp[1], context.user.username + "@" + context.user.domain,"default", {});
if (tokenPair) {
token = tokenPair.accessToken;
wsEndpoint = devicemgtProps["wssURL"].replace("https", "wss") + "/secured-websocket/t/"+context.user.domain+"/";
}
}
} }
viewModel.device = device; viewModel.device = device;
viewModel.wsToken = token; viewModel.wsToken = token;

@ -46,6 +46,65 @@ function processPointMessage(geoJsonFeature) {
} }
} }
window.onbeforeunload = function () {
disconnect();
};
function initializeSpatialStreamWebSocket() {
spatialWebsocket = new WebSocket(webSocketURL);
spatialWebsocket.onopen = webSocketSpatialOnOpen;
spatialWebsocket.onmessage = webSocketSpatialOnMessage;
spatialWebsocket.onclose = webSocketSpatialOnClose;
spatialWebsocket.onerror = webSocketSpatialOnError;
}
function initializeOnAlertWebSocket() {
onAlertWebsocket = new WebSocket(alertWebSocketURL);
onAlertWebsocket.onmessage = webSocketOnAlertMessage;
onAlertWebsocket.onclose = webSocketOnAlertClose;
onAlertWebsocket.onerror = webSocketOnAlertError;
onAlertWebsocket.onopen = webSocketOnAlertOpen;
}
function initializeGeoLocation(geoFencingEnabled) {
var deviceDetails = $(".device-id");
deviceId = deviceDetails.data("deviceid");
deviceType = deviceDetails.data("type");
if (deviceId && deviceType) {
var geoCharts = $("#geo-charts");
var wsEndPoint = geoCharts.data("ws-endpoint");
wsToken = geoCharts.data("ws-token");
geoPublicUri = geoCharts.data("geo-public-uri");
geoPublicUri = geoCharts.data("geo-public-uri");
webSocketURL = wsEndPoint + "iot.per.device.stream.geo.FusedSpatialEvent/1.0.0?"
+ "deviceId=" + deviceId + "&deviceType=" + deviceType + "&websocketToken=" + wsToken;
alertWebSocketURL = wsEndPoint + "iot.per.device.stream.geo.AlertsNotifications/1.0.0?"
+ "deviceId=" + deviceId + "&deviceType=" + deviceType + "&websocketToken=" + wsToken;
$("#proximity_alert").hide();
if (geoFencingEnabled) {
disconnect();
initializeSpatialStreamWebSocket();
initializeOnAlertWebSocket();
}
initialLoad(geoFencingEnabled);
InitSpatialObject(geoFencingEnabled);
} else {
noty({text: 'Invalid Access! No device information provided to track!', type: 'error'});
}
}
function disconnect(){
if (spatialWebsocket && spatialWebsocket.readyState == spatialWebsocket.OPEN){
spatialWebsocket.close();
}
if (onAlertWebsocket && onAlertWebsocket.readyState == onAlertWebsocket.OPEN){
onAlertWebsocket.close();
}
}
function SpatialObject(json) { function SpatialObject(json) {
this.id = json.id; this.id = json.id;
this.type = json.properties.type; this.type = json.properties.type;
@ -175,7 +234,6 @@ SpatialObject.prototype.removeFromMap = function () {
function clearMap() { function clearMap() {
for (var spacialObject in currentSpatialObjects) { for (var spacialObject in currentSpatialObjects) {
console.log(spacialObject);
currentSpatialObjects[spacialObject].removePath(); currentSpatialObjects[spacialObject].removePath();
currentSpatialObjects[spacialObject].removeFromMap(); currentSpatialObjects[spacialObject].removeFromMap();
} }
@ -199,7 +257,6 @@ SpatialObject.prototype.createLineStringFeature = function (state, information,
SpatialObject.prototype.setSpeed = function (speed) { SpatialObject.prototype.setSpeed = function (speed) {
this.speed = speed; this.speed = speed;
this.speedHistory.push(speed); this.speedHistory.push(speed);
// console.log("DEBUG: this.speedHistory.length = "+this.speedHistory.length+" ApplicationOptions.constance.SPEED_HISTORY_COUNT = "+ApplicationOptions.constance.SPEED_HISTORY_COUNT);
if (this.speedHistory.length > ApplicationOptions.constance.SPEED_HISTORY_COUNT) { if (this.speedHistory.length > ApplicationOptions.constance.SPEED_HISTORY_COUNT) {
this.speedHistory.splice(1, 1); this.speedHistory.splice(1, 1);
} }
@ -227,7 +284,6 @@ SpatialObject.prototype.drawPath = function () {
var currentSection = new L.polyline(this.pathGeoJsons[lineString].geometry.coordinates, this.getSectionStyles(currentSectionState)); // Create path object when and only drawing the path (save memory) TODO: if need directly draw line from geojson var currentSection = new L.polyline(this.pathGeoJsons[lineString].geometry.coordinates, this.getSectionStyles(currentSectionState)); // Create path object when and only drawing the path (save memory) TODO: if need directly draw line from geojson
var currentSectionFirstPoint = this.pathGeoJsons[lineString].geometry.coordinates[0]; var currentSectionFirstPoint = this.pathGeoJsons[lineString].geometry.coordinates[0];
console.log("DEBUG: previousSectionLastPoint = " + previousSectionLastPoint + " currentSectionFirstPoint = " + currentSectionFirstPoint);
previousSectionLastPoint.push(currentSectionFirstPoint); previousSectionLastPoint.push(currentSectionFirstPoint);
var sectionJoin = new L.polyline(previousSectionLastPoint, this.getSectionStyles()); var sectionJoin = new L.polyline(previousSectionLastPoint, this.getSectionStyles());
sectionJoin.setStyle({className: "sectionJointStyle"});// Make doted line for section join , this class is currently defined in map.jag as a inner css sectionJoin.setStyle({className: "sectionJointStyle"});// Make doted line for section join , this class is currently defined in map.jag as a inner css
@ -235,7 +291,6 @@ SpatialObject.prototype.drawPath = function () {
previousSectionLastPoint = [this.pathGeoJsons[lineString].geometry.coordinates[this.pathGeoJsons[lineString].geometry.coordinates.length - 1]]; previousSectionLastPoint = [this.pathGeoJsons[lineString].geometry.coordinates[this.pathGeoJsons[lineString].geometry.coordinates.length - 1]];
sectionJoin.addTo(map); sectionJoin.addTo(map);
this.path.push(sectionJoin); this.path.push(sectionJoin);
console.log("DEBUG: Alert Information: " + this.pathGeoJsons[lineString].properties.information);
currentSection.bindPopup("Alert Information: " + this.pathGeoJsons[lineString].properties.information); currentSection.bindPopup("Alert Information: " + this.pathGeoJsons[lineString].properties.information);
currentSection.addTo(map); currentSection.addTo(map);
this.path.push(currentSection); this.path.push(currentSection);
@ -278,7 +333,6 @@ function processTrafficMessage(json) {
if (json.id in currentSpatialObjects) { if (json.id in currentSpatialObjects) {
var existingObject = currentSpatialObjects[json.id]; var existingObject = currentSpatialObjects[json.id];
existingObject.update(json); existingObject.update(json);
console.log("existing area");
} }
else { else {
var receivedObject = new GeoAreaObject(json); var receivedObject = new GeoAreaObject(json);
@ -289,7 +343,6 @@ function processTrafficMessage(json) {
function processAlertMessage(json) { function processAlertMessage(json) {
if (json.state != "NORMAL" && json.state != "MINIMAL") { if (json.state != "NORMAL" && json.state != "MINIMAL") {
console.log(json);
notifyAlert("Object ID: <span style='color: blue;cursor: pointer' onclick='focusOnSpatialObject(" + json.id + ")'>" + json.id + "</span> change state to: <span style='color: red'>" + json.state + "</span> Info : " + json.information); notifyAlert("Object ID: <span style='color: blue;cursor: pointer' onclick='focusOnSpatialObject(" + json.id + ")'>" + json.id + "</span> change state to: <span style='color: red'>" + json.state + "</span> Info : " + json.information);
} }
} }
@ -302,9 +355,7 @@ function processAlertMessage(json) {
var type = typeof o; var type = typeof o;
return type === 'object' || type === 'function'; return type === 'object' || type === 'function';
} }
if (!isObject(obj)) return; if (!isObject(obj)) return;
var prop; var prop;
for (var i=1; i < arguments.length-1; i++) for (var i=1; i < arguments.length-1; i++)
{ {
@ -312,13 +363,11 @@ function processAlertMessage(json) {
if (!isObject(obj[prop])) obj[prop] = {}; if (!isObject(obj[prop])) obj[prop] = {};
if (i < arguments.length-2) obj = obj[prop]; if (i < arguments.length-2) obj = obj[prop];
} }
obj[prop] = arguments[i]; obj[prop] = arguments[i];
}*/ }*/
function processPredictionMessage(json) { function processPredictionMessage(json) {
setPropertySafe(currentPredictions, json.day, json.hour, json.longitude, json.latitude, json.traffic - 1); setPropertySafe(currentPredictions, json.day, json.hour, json.longitude, json.latitude, json.traffic - 1);
//console.log(json);
} }
WebSocket.prototype.set_opened = function () { WebSocket.prototype.set_opened = function () {
@ -334,9 +383,7 @@ WebSocket.prototype.get_opened = function () {
var _longitudeStart = -0.0925 var _longitudeStart = -0.0925
var _latitudeStart = 51.4985 var _latitudeStart = 51.4985
var _unit = 0.005; var _unit = 0.005;
function requestPredictions(longitude, latitude, d) { function requestPredictions(longitude, latitude, d) {
var serverUrl = "http://localhost:9763/endpoints/GpsDataOverHttp/predictionInput"; var serverUrl = "http://localhost:9763/endpoints/GpsDataOverHttp/predictionInput";
function loop(i) { function loop(i) {
setTimeout(function() { setTimeout(function() {
@ -362,7 +409,6 @@ WebSocket.prototype.get_opened = function () {
} }
var d= new Date(); var d= new Date();
//requestPredictions(-0.09,51.5,d); //requestPredictions(-0.09,51.5,d);
function getPredictions(longitude, latitude, d) { function getPredictions(longitude, latitude, d) {
var longitude = Math.round((longitude - _longitudeStart)/_unit); var longitude = Math.round((longitude - _longitudeStart)/_unit);
var latitude = Math.round((latitude - _latitudeStart)/_unit); var latitude = Math.round((latitude - _latitudeStart)/_unit);
@ -379,7 +425,6 @@ WebSocket.prototype.get_opened = function () {
traffic[0][i+1] = hour; traffic[0][i+1] = hour;
traffic[1][i+1] = currentPredictions[day][hour][longitude][latitude]; traffic[1][i+1] = currentPredictions[day][hour][longitude][latitude];
} catch(e) { } catch(e) {
console.log(i);
} }
} }
return traffic; return traffic;
@ -440,7 +485,6 @@ GeoAreaObject.prototype.update = function (geoJSON) {
this.marker.setIconAngle(this.heading); this.marker.setIconAngle(this.heading);
this.marker.setIcon(this.stateIcon()); this.marker.setIcon(this.stateIcon());
console.log("update called");
// TODO: use general popup DOM // TODO: use general popup DOM
this.popupTemplate.find('#objectId').html(this.id); this.popupTemplate.find('#objectId').html(this.id);
this.popupTemplate.find('#information').html(this.information); this.popupTemplate.find('#information').html(this.information);
@ -509,7 +553,6 @@ function LocalStorageArray(id) {
var initLoading = true; var initLoading = true;
var webSocketOnAlertOpen = function () { var webSocketOnAlertOpen = function () {
onAlertWebsocket.set_opened();
$('#ws-alert-stream').removeClass('text-muted text-danger text-success').addClass('text-success'); $('#ws-alert-stream').removeClass('text-muted text-danger text-success').addClass('text-success');
}; };
@ -525,19 +568,13 @@ var webSocketOnAlertMessage = function processMessage(message) {
}; };
var webSocketOnAlertClose = function (e) { var webSocketOnAlertClose = function (e) {
if (onAlertWebsocket.get_opened()) {
$('#ws-alert-stream').removeClass('text-muted text-danger text-success').addClass('text-danger');
}
waitForSocketConnection(onAlertWebsocket, initializeOnAlertWebSocket);
}; };
var webSocketOnAlertError = function (e) { var webSocketOnAlertError = function (e) {
if (!onAlertWebsocket.get_opened()) return;
noty({text: 'Something went wrong when trying to connect to <b>' + alertWebSocketURL + '<b/>', type: 'error'}); noty({text: 'Something went wrong when trying to connect to <b>' + alertWebSocketURL + '<b/>', type: 'error'});
}; };
var webSocketSpatialOnOpen = function () { var webSocketSpatialOnOpen = function () {
spatialWebsocket.set_opened();
if (initLoading) { if (initLoading) {
initLoading = false; initLoading = false;
} }
@ -558,94 +595,13 @@ var webSocketSpatialOnMessage = function (message) {
}; };
var webSocketSpatialOnClose = function (e) { var webSocketSpatialOnClose = function (e) {
if (spatialWebsocket.get_opened()) {
$('#ws-spatial-stream').removeClass('text-muted text-danger text-success').addClass('text-danger');
}
waitForSocketConnection(spatialWebsocket, initializeSpatialStreamWebSocket);
}; };
var webSocketSpatialOnError = function (err) { var webSocketSpatialOnError = function (err) {
if (!spatialWebsocket.get_opened()) return;
noty({text: 'Something went wrong when trying to connect to <b>' + webSocketURL + '<b/>', type: 'error'}); noty({text: 'Something went wrong when trying to connect to <b>' + webSocketURL + '<b/>', type: 'error'});
}; };
var waitTime = 1000;
var waitQueue = {};
function waitForSocketConnection(socket, callback) {
if(waitQueue[socket.url]) return;
setTimeout(
function () {
if (socket.readyState === 1) {
//connectToSource();
console.log("Connection is made");
if (callback != null) {
callback();
}
return;
} else {
ws = new WebSocket(socket.url);
if(socket)socket.close();
waitTime += 400;
waitForSocketConnection(ws, callback);
}
}, waitTime); // wait 5 milisecond for the connection...
waitQueue[socket.url] = true;
}
function initializeSpatialStreamWebSocket() {
if(spatialWebsocket) spatialWebsocket.close();
spatialWebsocket = new WebSocket(webSocketURL);
spatialWebsocket.onopen = webSocketSpatialOnOpen;
spatialWebsocket.onmessage = webSocketSpatialOnMessage;
spatialWebsocket.onclose = webSocketSpatialOnClose;
spatialWebsocket.onerror = webSocketSpatialOnError;
}
function initializeOnAlertWebSocket() {
if(onAlertWebsocket) onAlertWebsocket.close();
onAlertWebsocket = new WebSocket(alertWebSocketURL);
onAlertWebsocket.onmessage = webSocketOnAlertMessage;
onAlertWebsocket.onclose = webSocketOnAlertClose;
onAlertWebsocket.onerror = webSocketOnAlertError;
onAlertWebsocket.onopen = webSocketOnAlertOpen;
}
function initializeGeoLocation(geoFencingEnabled) {
var deviceDetails = $(".device-id");
deviceId = deviceDetails.data("deviceid");
deviceType = deviceDetails.data("type");
var loggedInUser = $("#logged-in-user");
var username = loggedInUser.data("username");
var userDomain = loggedInUser.data("domain");
if (deviceId && deviceType) {
var geoCharts = $("#geo-charts");
var wsEndPoint = geoCharts.data("ws-endpoint");
wsToken = geoCharts.data("ws-token");
geoPublicUri = geoCharts.data("geo-public-uri");
webSocketURL = wsEndPoint + userDomain + "/iot.per.device.stream.geo.FusedSpatialEvent/1.0.0?"
+ "deviceId=" + deviceId + "&deviceType=" + deviceType + "&websocketToken=" + wsToken;
alertWebSocketURL = wsEndPoint + userDomain + "/org.wso2.geo.AlertsNotifications/1.0.0?"
+ "deviceId=" + deviceId + "&deviceType=" + deviceType + "&websocketToken=" + wsToken;
$("#proximity_alert").hide();
initialLoad(geoFencingEnabled);
InitSpatialObject(geoFencingEnabled);
if (geoFencingEnabled) {
initializeSpatialStreamWebSocket();
initializeOnAlertWebSocket();
window.onbeforeunload = function () {
spatialWebsocket.close();
onAlertWebsocket.close();
}
}
} else {
noty({text: 'Invalid Access! No device information provided to track!', type: 'error'});
}
}
SpatialObject.prototype.stateIcon = function () { SpatialObject.prototype.stateIcon = function () {
//TODO : Need to add separate icons for each device type //TODO : Need to add separate icons for each device type
var iconUrl = geoPublicUri + "/img/markers/object-types/default"; var iconUrl = geoPublicUri + "/img/markers/object-types/default";
@ -664,7 +620,6 @@ SpatialObject.prototype.stateIcon = function () {
}); });
}; };
var normalMovingIcon = L.icon({ var normalMovingIcon = L.icon({
iconUrl: ApplicationOptions.leaflet.iconUrls.normalMovingIcon, iconUrl: ApplicationOptions.leaflet.iconUrls.normalMovingIcon,
shadowUrl: false, shadowUrl: false,

Loading…
Cancel
Save