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]+$/') || !valid($msg,'temperature_offset', '/^[0-9]+\.*[0-9]*$/') || !valid($msg,'humidity_offset', '/^[0-9]+\.*[0-9]*$/') || !valid($msg,'id','/^[0-9]+$/') ) { echo '{"error_message": "Field verification failed."}'; http_response_code(400); return; } $deviceData = $msg['id'] == 0 ? null : $db->getDeviceByID($msg['id']); // If device is not registered yet, register... if($deviceData == null) { // All fields are set and no ID was given. Register new device and return new ID... $config = [ '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_seen' => date('Y-m-d H:i:s') ]; $deviceID = $db->addDevice($config); $config['deviceID'] = $deviceID; echo json_encode($config); http_response_code(200); return; } // If device is registered... // Update database entry based on post data received. $db->updateDevice($deviceData['id'], [ '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') ]); // Return stored device data so device may update its settings. echo json_encode($deviceData); http_response_code(200); return; }); // Device reports temperature back on this endpoint. $router->post('/api/report', function($req) use($db) { $msg = $req->getJSONBody(); if(!valid($msg,'id', '/^[0-9]+$/') || !valid($msg,'temperature', '/^[0-9]+\.*[0-9]*$/') || !valid($msg,'humidity', '/^[0-9]+\.*[0-9]*$/') ) { echo '{"error_message": "Field verification failed."}'; http_response_code(400); } else if($db->getDeviceByID($msg['id']) == null) { echo '{"error_message": "ID '.$msg['id'].' not found"}'; http_response_code(400); } else { $data = [ "temperature" => $msg['temperature'], "humidity" => $msg['humidity'], "read_at" => date('Y-m-d H:i:s') ]; $db->updateDevice($msg['id'], $data); http_response_code(200); } }); $router->get('/api/update', function() { if ( $_SERVER['HTTP_USER_AGENT'] == 'ESP8266-http-Update' && isset($_SERVER['HTTP_X_ESP8266_SKETCH_MD5']) ) { $user_agent = $_SERVER['HTTP_USER_AGENT']; $curr_firmware_md5 = $_SERVER['HTTP_X_ESP8266_SKETCH_MD5']; $firmware_file = __DIR__ . '/firmware.bin'; $firmware_md5 = md5_file($firmware_file); echo "USER_AGENT -> ESP8266-http-Update\n"; echo 'X_ESP8266_SKETCH_MD5 -> ' . $_SERVER['HTTP_X_ESP8266_SKETCH_MD5'] . "\n"; echo 'MD5 file hash of ' . $firmware_file . ': ' . $firmware_md5; if ( $curr_firmware_md5 == $firmware_md5 ) { http_response_code(204); } else { $fwdata = file_get_contents($firmware_file); header('Content-Length:' . strlen($fwdata)); echo $fwdata; http_response_code(200); } return; } http_response_code(400); });