Subversion Repositories HomeAutomation

Rev

Rev 1962 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

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