diff options
Diffstat (limited to 'www/js')
| -rw-r--r-- | www/js/DataModel.js | 11 | ||||
| -rw-r--r-- | www/js/EventCtrl.js | 22 | ||||
| -rw-r--r-- | www/js/EventServer.js | 73 | ||||
| -rw-r--r-- | www/js/LoginCtrl.js | 22 | ||||
| -rw-r--r-- | www/js/PortalLoginCtrl.js | 20 | ||||
| -rw-r--r-- | www/js/app.js | 21 |
6 files changed, 155 insertions, 14 deletions
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 |
