104 lines
3.8 KiB
PHP
104 lines
3.8 KiB
PHP
<?php
|
|
|
|
|
|
function valid($msg, $key, $regex) {
|
|
//if(!isset($msg[$key])) {
|
|
/*
|
|
if(!array_key_exists($key,$msg)) {
|
|
echo "{\"error_message\": \"Key " . $key . " does not exist in msg.\"}";
|
|
return false;
|
|
}
|
|
else if(!preg_match($regex,$msg[$key])) {
|
|
echo "{\"error_message\": \"" . $msg[$key] . " does not match regex " . $regex . "\"}";
|
|
return false;
|
|
}
|
|
else {
|
|
return true;
|
|
}
|
|
*/
|
|
return array_key_exists($key,$msg) && preg_match($regex,$msg[$key]);
|
|
}
|
|
|
|
// Update device configuration
|
|
$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]+$/') ||
|
|
!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) {
|
|
echo 'body:' . var_dump($req->getBody()) . "\n";
|
|
DumpHTTPRequestToFile::execute("/tmp/out.txt");
|
|
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);
|
|
});
|
|
|