diff --git a/software/app.php b/software/app.php index 2db1cc9..b0fcf94 100644 --- a/software/app.php +++ b/software/app.php @@ -2,10 +2,10 @@ require_once('debug.php'); require_once('router.php'); -$router = new Router(new Request); - require_once('database/sqlite.php'); -$db = new DB(); + +$router = new Router(new Request); +$db = new DB(); $router->get('/', function($req) { echo "Nothing to see here!\n"; diff --git a/software/database/sqlite.php b/software/database/sqlite.php index 8a9f8f7..fcf0229 100644 --- a/software/database/sqlite.php +++ b/software/database/sqlite.php @@ -3,7 +3,7 @@ interface DBIface { public function __construct(); - public function addDevice(DeviceData $deviceData); + public function addDevice($deviceData); public function getDevices(); public function getDeviceById($id); public function updateDevice($id, $deviceData); @@ -39,17 +39,17 @@ class DB implements DBIface { id INTEGER PRIMARY KEY, mac_address TEXT NOT NULL, ip_address TEXT NOT NULL, - seen_ip_address TEXT NOT NULL, - firmware_version TEXT NOT NULL, + ip_address_seen TEXT NOT NULL, + firmware_version INTEGER NOT NULL, temperature_offset INTEGER DEFAULT 0, humidity_offset INTEGER DEFAULT 0, - last_updated TEXT DEFAULT CURRENT_TIMESTAMP, last_seen TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS readings ( dev_id INTEGER PRIMARY KEY, temperature INTEGER NOT NULL, humidity INTEGER NOT NULL, + updated_at TEXT DEFAULT CURRENT_TIMESTAMP FOREIGN KEY(dev_id) REFERENCES devices(id) ON UPDATE CASCADE ON DELETE CASCADE ); @@ -64,8 +64,8 @@ class DB implements DBIface { public function addDevice($deviceData) { $sql = " - INSERT INTO devices (mac_address, ip_address, seen_ip_address, firmware_version, temperature_offset, humidity_offset, last_updated, last_seen) - VALUES (:mac_address, :ip_address, seen_ip_address, :firmware_version, :temperature_offset, :humidity_offset, :last_updated, :last_seen) + INSERT INTO devices (mac_address, ip_address, ip_address_seen, firmware_version, temperature_offset, humidity_offset, last_seen) + VALUES (:mac_address, :ip_address, :ip_address_seen, :firmware_version, :temperature_offset, :humidity_offset, :last_seen) "; try { $stmt = $this->pdo->prepare($sql); @@ -103,11 +103,10 @@ class DB implements DBIface { SET id = :id, mac_address = :mac_address, ip_address = :ip_address, - seen_ip_address = :seen_ip_address, + ip_address_seen = :ip_address_seen, firmware_version = :firmware_version, temperature_offset = :temperature_offset, humidity_offset = :humidity_offset, - last_updated = :last_updated, last_seen = :last_seen WHERE id = :id "; @@ -169,7 +168,7 @@ $newDevice = [ 'id' => 'device123', 'mac_address' => '00:1B:44:11:3A:B7', 'ip_address' => '192.168.1.2', - 'seen_ip_address' => '212.71.123.123', + 'ip_address_seen' => '212.71.123.123', 'firmware_version' => '1.0.1', 'temperature_offset' => 0, 'humidity_offset' => 0, diff --git a/software/device-api.php b/software/device-api.php index 1fa6a97..4c44e66 100644 --- a/software/device-api.php +++ b/software/device-api.php @@ -1,5 +1,6 @@ post('/api/config', function($req) { +$router->post('/api/config', function($req) use($db) { $msg = $req->getJSONBody(); if(!valid($msg,'mac_address', '/^[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]$/i') || !valid($msg,'ip_address', '/^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$/i') || - !valid($msg,'firmware_version', '/^[0-9]+\.[0-9]+$/') || + !valid($msg,'firmware_version', '/^[0-9]+$/') || !valid($msg,'temperature_offset', '/^[0-9]+\.*[0-9]*$/') || !valid($msg,'humidity_offset', '/^[0-9]+\.*[0-9]*$/') ) { @@ -35,6 +36,23 @@ $router->post('/api/config', function($req) { // If device is already registered (it sends an ID) then figure out what values changed and send those back for the device to re-configure itself. else if(valid($msg,'id','/^[0-9]+$/')) { + $deviceData = $db->getDeviceByID($msg['id']); + // If device is not registered yet... + if($deviceData == null) { + echo '{"error_message": "Device by that ID not found."}'; + http_response_code(400); + return; + } + // Return stored device data so device may update its settings. + echo json_encode($deviceData); + // Update database entry based on post data received. + $db->updateDevice([ + 'mac_address' => $msg['mac_address'], + 'ip_address' => $msg['ip_address'], + 'ip_address_seen' => $_SERVER['REMOTE_ADDR'], + 'firmware_version' => $msg['firmware_version'], + 'last_seen' => date('Y-m-d H:i:s') + ]); http_response_code(200); return; } @@ -42,14 +60,13 @@ $router->post('/api/config', function($req) { // All fields are set and no ID was given. Register new device and return new ID... else { $config = [ - 'mac_address' => $msg['mac_address'], - 'ip_address' => $msg['ip_address'], - 'seen_ip_address' => $_SERVER['REMOTE_ADDR'], - 'firmware_version' => $msg['firmware_version'], + 'mac_address' => $msg['mac_address'], + 'ip_address' => $msg['ip_address'], + 'ip_address_seen' => $_SERVER['REMOTE_ADDR'], + 'firmware_version' => $msg['firmware_version'], 'temperature_offset' => $msg['temperature_offset'], - 'humidity_offset' => $msg['humidity_offset'], - 'last_updated' => date('Y-m-d H:i:s'), - 'last_seen' => date('Y-m-d H:i:s') + 'humidity_offset' => $msg['humidity_offset'], + 'last_seen' => date('Y-m-d H:i:s') ]; $deviceID = $db->addDevice($config); echo json_encode(['deviceID' => $deviceID]);