Subversion Repositories HomeAutomation

Rev

Rev 1956 | Rev 1962 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

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