summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www/index.html5
-rw-r--r--www/js/DataModel.js11
-rw-r--r--www/js/EventCtrl.js22
-rw-r--r--www/js/EventServer.js73
-rw-r--r--www/js/LoginCtrl.js22
-rw-r--r--www/js/PortalLoginCtrl.js20
-rw-r--r--www/js/app.js21
-rw-r--r--www/templates/login.html8
8 files changed, 168 insertions, 14 deletions
diff --git a/www/index.html b/www/index.html
index bfd27722..0f9d206e 100644
--- a/www/index.html
+++ b/www/index.html
@@ -67,7 +67,11 @@
<script src="js/TimelineCtrl.js"></script>
<script src="js/PortalLoginCtrl.js"></script>
<script src="js/LowVersionCtrl.js"></script>
+ <script src="js/EventServer.js"></Script>
+ <script src="external/ng-websocket.js"></script>
+
+
<script src="lib/vis/dist/vis-dev.js"></script>
<script src="lib/ionic-content-banner/dist/ionic.content.banner.min.js"></script>
<script src="external/angular-circular-navigation.js"></script>
@@ -78,6 +82,7 @@
<script src="lib/angular-touch/angular-touch.js"></script>
<script src="external/angular-carousel.js"></script>
<script src="external/ion-pullup.js"></script>
+
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index b0fc405b..24a96776 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -25,6 +25,7 @@ angular.module('zmApp.controllers').service('ZMDataModel',
'password': '',
'url': '', // This is the ZM portal path
'apiurl': '', // This is the API path
+ 'eventServer':'', //experimental Event server address
'maxMontage': "10", //total # of monitors to display in montage
'streamingurl': "",
'maxFPS': "3", // image streaming FPS
@@ -84,7 +85,8 @@ angular.module('zmApp.controllers').service('ZMDataModel',
//-------------------------------------------------------------
// used by various controllers to log messages to file
//-------------------------------------------------------------
-
+
+
zmLog: function (val,type) {
var logtype = 'info';
if (type != undefined)
@@ -171,6 +173,12 @@ angular.module('zmApp.controllers').service('ZMDataModel',
window.localStorage.getItem("url");
}
+
+ if (window.localStorage.getItem("eventServer") != undefined) {
+ loginData.eventServer =
+ window.localStorage.getItem("eventServer");
+
+ }
if (window.localStorage.getItem("apiurl") != undefined) {
loginData.apiurl =
@@ -313,6 +321,7 @@ angular.module('zmApp.controllers').service('ZMDataModel',
window.localStorage.setItem("url", loginData.url);
window.localStorage.setItem("apiurl", loginData.apiurl);
window.localStorage.setItem("streamingurl", loginData.streamingurl);
+ window.localStorage.setItem("eventServer", loginData.eventServer);
window.localStorage.setItem("useSSL", loginData.useSSL?"1":"0");
window.localStorage.setItem("usePin", loginData.usePin?"1":"0");
window.localStorage.setItem("pinCode", loginData.pinCode);
diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js
index b9eba5a1..4e09b8b8 100644
--- a/www/js/EventCtrl.js
+++ b/www/js/EventCtrl.js
@@ -7,7 +7,7 @@
// and whether the new API has a better mechanism
angular.module('zmApp.controllers')
- .controller('zmApp.EventCtrl', ['$scope', '$rootScope', 'zm', 'ZMDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', '$ionicSlideBoxDelegate', '$ionicPosition', '$ionicPopover', '$ionicPopup', function ($scope, $rootScope, zm, ZMDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, $ionicSlideBoxDelegate, $ionicPosition, $ionicPopover, $ionicPopup) {
+ .controller('zmApp.EventCtrl', ['$scope', '$rootScope', 'zm', 'ZMDataModel', 'message', '$ionicSideMenuDelegate', '$timeout', '$interval', '$ionicModal', '$ionicLoading', '$http', '$state', '$stateParams', '$ionicHistory', '$ionicScrollDelegate', '$ionicPlatform', '$ionicSlideBoxDelegate', '$ionicPosition', '$ionicPopover', '$ionicPopup', 'EventServer', function ($scope, $rootScope, zm, ZMDataModel, message, $ionicSideMenuDelegate, $timeout, $interval, $ionicModal, $ionicLoading, $http, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, $ionicPlatform, $ionicSlideBoxDelegate, $ionicPosition, $ionicPopover, $ionicPopup, EventServer) {
// events in last 5 minutes
// TODO https://server/zm/api/events/consoleEvents/5%20minute.json
@@ -15,6 +15,26 @@ angular.module('zmApp.controllers')
//---------------------------------------------------
// Controller main
//---------------------------------------------------
+
+ // console.log ("******** NEW SOCKET IN EVENT");
+
+
+
+ //EventServer.start();
+ var loginData = ZMDataModel.getLogin();
+ // console.log ("********************EVENT SERVER LOCAL");
+ //var dataStream = $websocket('wss://arjunrc.ddns.net:9000/?user='+loginData.username+'&passwd='+loginData.password,null, {reconnectIfNotNormalClose: true});
+
+
+
+
+ /*dataStream.onMessage = function(message) {
+ console.log("CONTROLLER GOT WEBSOCKET MESSAGE:" + message.data);
+ };*/
+
+
+ //$scope.MyData = EventServer;
+
$scope.hours = [];
$scope.days = [];
diff --git a/www/js/EventServer.js b/www/js/EventServer.js
new file mode 100644
index 00000000..9e95adb2
--- /dev/null
+++ b/www/js/EventServer.js
@@ -0,0 +1,73 @@
+/* jshint -W041 */
+
+
+/* jslint browser: true*/
+/* global cordova,StatusBar,angular,console */
+
+// Websockets
+
+angular.module('zmApp.controllers')
+
+.factory('EventServer',
+[ 'ZMDataModel', '$rootScope','$websocket', function
+ ( ZMDataModel, $rootScope, $websocket) {
+
+
+
+ function start()
+ {
+ if ($rootScope.websocketActive == 1)
+ {
+ ZMDataModel.zmDebug ("Connection established. Not doing WebSocketInit again...");
+ return;
+ }
+ var loginData = ZMDataModel.getLogin();
+
+
+ if (loginData.eventServer)
+ {
+ var evtsvrUrl=loginData.eventServer+'/?user='+
+ loginData.username+'&passwd='+loginData.password;
+ // if (ws) ws.$close();
+ ZMDataModel.zmLog("Event Server URL constructed as " + evtsvrUrl);
+ var ws = $websocket.$new ({
+ url:evtsvrUrl,
+ reconnect:true,
+ reconnectInterval:5000
+ });
+
+ ws.$on ('$open', function() {
+ ZMDataModel.zmLog("Websocket open");
+ $rootScope.websocketActive=1;
+ });
+
+ ws.$on ('$close', function() {
+ ZMDataModel.zmLog ("Websocket closed");
+ $rootScope.websocketActive = 0;
+ });
+
+ ws.$on ('$message', function(str) {
+ ZMDataModel.zmLog("Real-time event: " + str);
+ var evt=str.split(":");
+ var evtStr = "New Alarm in " + evt[0]+" ("+evt[2]+")";
+ ZMDataModel.displayBanner('alarm',[evtStr],6000,6000);
+
+
+ });
+
+ }
+ else
+ {
+ ZMDataModel.zmLog("No Event Server configured, skipping");
+ }
+
+ }
+
+ return {
+ start:start
+ };
+
+
+}]);
+
+
diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js
index 2322391f..c1a5cd48 100644
--- a/www/js/LoginCtrl.js
+++ b/www/js/LoginCtrl.js
@@ -2,7 +2,7 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console */
-angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'ZMDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', 'zmAutoLogin', '$cordovaPinDialog', function ($scope, $rootScope, zm, $ionicModal, ZMDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, zmAutoLogin, $cordovaPinDialog) {
+angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'ZMDataModel', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', 'zmAutoLogin', '$cordovaPinDialog', 'EventServer', function ($scope, $rootScope, zm, $ionicModal, ZMDataModel, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, zmAutoLogin, $cordovaPinDialog, EventServer) {
$scope.openMenu = function () {
$ionicSideMenuDelegate.toggleLeft();
};
@@ -105,6 +105,15 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
return url;
}
+
+
+ function addWsOrWss(url) {
+
+ if ((!/^wss?:\/\//i.test(url)) && (url != "")) {
+ url = "ws://" + url;
+ }
+ return url;
+ }
//-----------------------------------------------------------------------------
// Perform the login action when the user submits the login form
@@ -130,6 +139,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.loginData.apiurl = $scope.loginData.apiurl.trim();
$scope.loginData.username = $scope.loginData.username.trim();
$scope.loginData.streamingurl = $scope.loginData.streamingurl.trim();
+ $scope.loginData.eventServer = $scope.loginData.eventServer.trim();
$scope.loginData.isUseAuth = ($scope.auth.isUseAuth) ? "1" : "0";
@@ -149,6 +159,10 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
+ if ($scope.loginData.eventServer.slice(-1) == '/') {
+ $scope.loginData.eventServer = $scope.loginData.eventServer.slice(0, -1);
+
+ }
// strip cgi-bin if it is there but only at the end
if ($scope.loginData.streamingurl.slice(-7).toLowerCase() == 'cgi-bin') {
$scope.loginData.streamingurl = $scope.loginData.streamingurl.slice(0, -7);
@@ -159,18 +173,22 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
$scope.loginData.url = addhttp($scope.loginData.url);
$scope.loginData.apiurl = addhttp($scope.loginData.apiurl);
$scope.loginData.streamingurl = addhttp($scope.loginData.streamingurl);
+ $scope.loginData.eventServer = addWsOrWss($scope.loginData.eventServer);
if ($scope.loginData.useSSL) {
// replace all http with https
$scope.loginData.url = $scope.loginData.url.replace("http:", "https:");
$scope.loginData.apiurl = $scope.loginData.apiurl.replace("http:", "https:");
$scope.loginData.streamingurl = $scope.loginData.streamingurl.replace("http:", "https:");
+ $scope.loginData.eventServer = $scope.loginData.eventServer.replace("ws:", "wss:");
+
} else {
// replace all https with http
$scope.loginData.url = $scope.loginData.url.replace("https:", "http:");
$scope.loginData.apiurl = $scope.loginData.apiurl.replace("https:", "http:");
$scope.loginData.streamingurl = $scope.loginData.streamingurl.replace("https:", "http:");
+ // don't do it for WSS - lets mandate that
}
var apiurl = $scope.loginData.apiurl + '/host/getVersion.json';
@@ -212,6 +230,8 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
ZMDataModel.zmLog("Validating APIs at " + apiurl);
$http.get(apiurl)
.success(function (data) {
+
+ EventServer.start();
$ionicPopup.alert({
title: 'Login validated',
diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js
index ec287cf7..4207c18e 100644
--- a/www/js/PortalLoginCtrl.js
+++ b/www/js/PortalLoginCtrl.js
@@ -3,7 +3,7 @@
/*This is for the loop closure I am using in line 143 */
/* jslint browser: true*/
/* global vis,cordova,StatusBar,angular,console,moment */
-angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'ZMDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', '$cordovaTouchID', function ($ionicPlatform, $scope, zm, ZMDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, $cordovaTouchID) {
+angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionicPlatform', '$scope', 'zm', 'ZMDataModel', '$ionicSideMenuDelegate', '$rootScope', '$http', '$q', '$state', '$ionicLoading', '$ionicPopover', '$ionicScrollDelegate', '$ionicModal', '$timeout', 'zmAutoLogin', '$ionicHistory', '$cordovaTouchID', 'EventServer', function ($ionicPlatform, $scope, zm, ZMDataModel, $ionicSideMenuDelegate, $rootScope, $http, $q, $state, $ionicLoading, $ionicPopover, $ionicScrollDelegate, $ionicModal, $timeout, zmAutoLogin, $ionicHistory, $cordovaTouchID, EventServer) {
$scope.$on('$ionicView.enter',
@@ -86,7 +86,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
$state.go('lowversion', {"ver":data});
}
});
-
+ initWebSocket();
$state.go($rootScope.lastState ? $rootScope.lastState : 'montage', $rootScope.lastStateParam);
},
// coming here means auth error
@@ -143,6 +143,18 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return 0;
}
+
+ function initWebSocket()
+ {
+ var loginData = ZMDataModel.getLogin();
+
+
+ ZMDataModel.zmLog (" webSocketStart: attempting to start a WSS connection");
+ EventServer.start();
+ $rootScope.websocketActive = 1;
+
+
+ }
function unlock(touchVerified) {
ZMDataModel.zmDebug("Trying to unlock PIN");
@@ -154,6 +166,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
zmAutoLogin.doLogin("authenticating...")
.then(function (data) // success
{
+ initWebSocket();
// don't get stuck in this state
// will happen if you switch to background in portal state
if ($rootScope.lastState == "zm-portal-login") {
@@ -204,7 +217,6 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
var loginData = ZMDataModel.getLogin();
$ionicSideMenuDelegate.canDragContent(false);
-
-
+
}]); \ No newline at end of file
diff --git a/www/js/app.js b/www/js/app.js
index c5440937..6f1320f7 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -14,6 +14,7 @@ angular.module('zmApp', [
'fileLogger',
'angular-carousel',
'angularAwesomeSlider',
+
@@ -25,7 +26,7 @@ angular.module('zmApp', [
//-----------------------------------------------
.constant('zm', {
- minAppVersion: '1.28.107',
+ minAppVersion: '1.28.105',
httpTimeout: 15000,
largeHttpTimeout: 60000,
logFile: 'zmNinjaLog.txt',
@@ -178,6 +179,9 @@ angular.module('zmApp', [
}])
+
+
+
//------------------------------------------------------------------
// In Android, HTTP requests seem to get stuck once in a while
// It may be a crosswalk issue.
@@ -238,7 +242,7 @@ angular.module('zmApp', [
// This service automatically logs into ZM at periodic intervals
//------------------------------------------------------------------
-.factory('zmAutoLogin', function ($interval, ZMDataModel, $http, zm, $browser, $timeout, $q, $rootScope, $ionicLoading, $ionicPopup, $state, $ionicContentBanner) {
+.factory('zmAutoLogin', function ($interval, ZMDataModel, $http, zm, $browser, $timeout, $q, $rootScope, $ionicLoading, $ionicPopup, $state, $ionicContentBanner, EventServer) {
var zmAutoLoginHandle;
//------------------------------------------------------------------
@@ -356,11 +360,11 @@ angular.module('zmApp', [
// so we will check if the data has
// <title>ZM - Login</title> -- it it does then its the login page
-
+
if (data.indexOf(zm.loginScreenString) == -1) {
-
+ //eventServer.start();
$rootScope.loggedIntoZm = 1;
-
+
ZMDataModel.zmLog("zmAutologin successfully logged into Zoneminder");
d.resolve("Login Success");
@@ -454,7 +458,7 @@ angular.module('zmApp', [
// First run in ionic
//------------------------------------------------------------------
-.run(function ($ionicPlatform, $ionicPopup, $rootScope, zm, $state, $stateParams, ZMDataModel, $cordovaSplashscreen, $http, $interval, zmAutoLogin, $fileLogger, $timeout, $ionicHistory, $window, $ionicSideMenuDelegate) {
+.run(function ($ionicPlatform, $ionicPopup, $rootScope, zm, $state, $stateParams, ZMDataModel, $cordovaSplashscreen, $http, $interval, zmAutoLogin, $fileLogger, $timeout, $ionicHistory, $window, $ionicSideMenuDelegate, EventServer, $websocket) {
$rootScope.zmGlobalCookie = "";
$rootScope.isEventFilterOn = false;
@@ -465,6 +469,7 @@ angular.module('zmApp', [
$rootScope.fromString = "";
$rootScope.toString = "";
$rootScope.loggedIntoZm = 0;
+ $rootScope.websocketActive = 0;
//console.log ("HERE");
ZMDataModel.init();
@@ -475,7 +480,7 @@ angular.module('zmApp', [
var loginData = ZMDataModel.getLogin();
-
+
// This code takes care of trapping the Android back button
// and takes it to the menu.
@@ -654,6 +659,8 @@ angular.module('zmApp', [
console.log("Setting up POST LOGIN timer");
zmAutoLogin.start();
+
+
}) //run
diff --git a/www/templates/login.html b/www/templates/login.html
index 0d16af8b..76b99f42 100644
--- a/www/templates/login.html
+++ b/www/templates/login.html
@@ -55,6 +55,14 @@
type="text" placeholder="ZM api url"
ng-model="loginData.apiurl">
</label>
+
+ <label class="item item-input item-floating-label" >
+ <span class="input-label">Event Server</span>
+ <input autocapitalize="none"
+ autocomplete="off" autocorrect="off"
+ type="text" placeholder="Event notification url"
+ ng-model="loginData.eventServer">
+ </label>
<label>
<ion-toggle ng-model="loginData.usePin" ng-change="pinPrompt();"