Subversion Repositories HomeAutomation

Rev

Rev 1956 | Rev 1962 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1.  
  2. function TrackerManager(host, username, password, database, server_port)
  3. {
  4.   var self = this;
  5.  
  6.   this.host_              = host;
  7.   this.username_          = username;
  8.   this.password_          = password;
  9.   this.database_          = database;
  10.   this.tracked_node_ids_  = {};
  11.   this.db_resource_       = null;
  12.   this.server_port_       = server_port;
  13.   this.server_id_         = null;
  14.  
  15.   this._StartServer = function()
  16.   {
  17.     self.server_id_ = Socket_StartServer(self.server_port_, self._HandleClientDataReceived, self._HandleConnectedTracker);
  18.    
  19.     if (self.server_id_ === false)
  20.     {
  21.       return false;
  22.     }
  23.    
  24.     return true;
  25.   }
  26.  
  27.   this._ConnectToDatabase = function()
  28.   {
  29.     if (self.db_resource_)
  30.     {
  31.       MySql_Close(self.db_resource_);
  32.       self.db_resource_ = null;
  33.     }
  34.    
  35.     self.db_resource_ = MySql_Connect(self.host_, self.username_, self.password_);
  36.  
  37.     if (self.db_resource_ === false)
  38.     {
  39.       return false;
  40.     }
  41.    
  42.     MySql_SelectDb(self.db_resource_, self.database_);
  43.  
  44.     MySql_Query(self.db_resource_, "SET time_zone='+0:00';");
  45.    
  46.     return true;
  47.   }
  48.  
  49.  
  50.   /* Function for finding tracked object */
  51.   this._IdentifyTracker = function(data)
  52.   {
  53.     var result = MySql_Query(self.db_resource_, "SELECT `Nodes`.* FROM `Nodes`, `Attributes` WHERE `Nodes`.`type` = 'tracker' AND `Nodes`.`id` = `Attributes`.`node_id` AND `Attributes`.`name` = 'Imei' AND `Attributes`.`value` = '" + data.Imei + "'");
  54.      
  55.     if (result === false || result.length == 0)
  56.     {
  57.       Log("Unable to find a tracker with IMEI " + data.Imei);
  58.     }
  59.     else
  60.     {
  61.       var tracker_node_id = result[0]["id"];
  62.       var tracker_node_name = result[0]["name"];
  63.      
  64.       Log("Found tracker \"" + tracker_node_name + "\" (NodeId " + tracker_node_id + ") that corresponds to IMEI " + data.Imei);
  65.        
  66.       result = MySql_Query(self.db_resource_, "SELECT * FROM `Links` WHERE `node_id_down` = " + tracker_node_id + " AND `Role` = 'tracker'");
  67.      
  68.       if (result === false || result.length == 0)
  69.       {
  70.         Log("Unable to find an object that is being tracked with this tracker, will store positions on the tracker itself!");
  71.        
  72.         return tracker_node_id;
  73.       }
  74.       else
  75.       {
  76.         result = MySql_Query(self.db_resource_, "SELECT * FROM `Nodes` WHERE `id` = " + result[0]["node_id_up"]);
  77.      
  78.         if (result === false || result.length == 0)
  79.         {
  80.           Log("Failed to fetch the name of the tracked object (node_id " + result[0]["node_id_up"] + ")!");
  81.         }
  82.         else
  83.         {
  84.           Log("Found \"" + result[0]["name"] + "\" (node_id " + result[0]["id"] + ") which is being tracked by \"" + tracker_node_name + "\".");
  85.  
  86.           return result[0]["id"];
  87.         }
  88.       }
  89.     }
  90.    
  91.     return false;
  92.   }
  93.  
  94.   /* Function for inserting new position in database */
  95.   this._InsertPosition = function(tracker_node_id, data)
  96.   {
  97.     if (data.Type != "NO")
  98.     {
  99.       var query  =  "INSERT INTO `Positions` (`node_id`, `source`, `type`, `latitude_longitude`, `datetime`, `pdop`, `hdop`, `vdop`, `satellites`, `altitude`, `height_of_geoid`, `speed`, `angle`) VALUES (";
  100.       query     +=  tracker_node_id + ",";
  101.       query     +=  "'gps',";
  102.       query     +=  "'" + data.Type + "',";
  103.       query     +=  "GeomFromText('POINT(" + data.Latitude + " " + data.Longitude + ")'),";
  104.       query     +=  "'" + data.Datetime + "',";
  105.       query     +=  data.Pdop + ",";
  106.       query     +=  data.Hdop + ",";
  107.       query     +=  data.Vdop + ",";
  108.       query     +=  data.Satellites + ",";
  109.       query     +=  data.Altitude + ",";
  110.       query     +=  data.HeightOfGeoid + ",";
  111.       query     +=  data.Speed + ",";
  112.       query     +=  data.Angle;
  113.       query     +=  ");";
  114.      
  115.       if (!MySql_Query(self.db_resource_, query))
  116.       {
  117.         if (self._ConnectToDatabase())
  118.         {
  119.           Log("Reconnected to MySql database!");
  120.          
  121.           MySql_Query(self.db_resource_, query);
  122.         }
  123.       }
  124.      
  125.       /*query = "SELECT `node_id`, `source`, AsText(latitude_longitude), `created`, `datetime`, `hdop`, `satellites`, `altitude`, `height_of_geoid`, `speed`, `angle` FROM `Positions` WHERE `id` = " + MySql_InsertId(self.db_resource_) + " LIMIT 1";
  126.      
  127.       Log("From DB:" + JSON.stringify(MySql_Query(self.db_resource_, query)));*/
  128.     }
  129.      
  130.     Log(JSON.stringify(data));
  131.   }
  132.  
  133.   /* Function for handling tracker connected disconnected */
  134.   this._HandleClientStatusUpdate = function(client_id, state)
  135.   {
  136.     switch (state)
  137.     {
  138.       case SOCKET_STATE_CONNECTED:
  139.       {
  140.         Log("Client " + client_id + " connected!");
  141.        
  142.         self.tracked_node_ids_[client_id] = true;
  143.        
  144.         break;
  145.       }
  146.       case SOCKET_STATE_DISCONNECTED:
  147.       {
  148.         Log("Client " + client_id + " disconnected!");
  149.        
  150.         if (self.tracked_node_ids_[client_id])
  151.         {
  152.           delete self.tracked_node_ids_[client_id];
  153.         }
  154.        
  155.         break;
  156.       }
  157.       default:
  158.       {
  159.         Log("Unknown state (" + state + ") for client " + client_id + "!");
  160.         break;
  161.       }
  162.     }
  163.   }
  164.  
  165.   /* Functio for handling tracker data */
  166.   this._HandleClientDataReceived = function(client_id, data)
  167.   {
  168.     if (self.tracked_node_ids_[client_id])
  169.     {
  170.       Log(data);
  171.    
  172.       var json_data = eval("(" + data + ")");
  173.      
  174.       if (json_data.method == "MBB.OnPosition")
  175.       {
  176.         if (self.tracked_node_ids_[client_id])
  177.         {
  178.           self._InsertPosition(self.tracked_node_ids_[client_id], json_data);
  179.         }
  180.       }
  181.       else if (json_data.method == "MBB.OnConnected")
  182.       {
  183.         self.tracked_node_ids_[client_id] = self._IdentifyTracker(json_data);
  184.       }
  185.       else
  186.       {
  187.         Log("Got unknown data \"" + data + "\" from client " + client_id);
  188.       }
  189.     }
  190.   }
  191.  
  192.   /* Initialize connection */
  193.   self._ConnectToDatabase();
  194.   self._StartServer();
  195. }
  196.