Greifen Sie über die Programmiersprache PHP auf die Datenbank zu
In diesem letzten Artikel der Serie zum Thema Verwendung eines Webservers zum Speichern von Daten von Geräten, die mit dem Internet der Dinge verbunden sind, erklärt, wie man in einer Datenbank aufzeichnet MySQL die Informationen, die IoT-Knoten über HTTP-POST-Anfragen an den Server senden. Leser dieses Artikels und des gesamten Blogs sind möglicherweise nicht besonders vertraut mit der Programmierung im PHP-Sprache aber sicherlich ja mit der Programmierung von Mikrocontroller in Sprachen C o C + + Abgesehen von einigen Details, wie z. B. dem Voranstellen des Dollarzeichens ($) vor den Variablen, können Sie den Beispielen ohne weitere Erklärungen folgen, da sie nach einem sehr neutralen Programmierstil erstellt wurden, der nicht spezifisch ist PHP.
Speichern Sie Informationen in der Datenbank
Wie im Artikel zum erklärt IoT-Datenspeicherung durch HTTP-POST-Anfragen an einen Webserver, am Ende der Header enthält der Hauptteil der POST-Anfrage die Daten, die an den Server gesendet werden. Diese Informationen werden am häufigsten im Klartextformat an den Server gesendet, da sie selbst „manuell“ einfacher zu analysieren sind. Wenn die an den Server gesendeten Daten komplex sind, ist es sicherlich praktisch, sie beispielsweise anhand des Formats zu strukturieren XML o JSON. Bei der üblichen Verwendung eines Webservers zur Verwaltung von Informationen von Geräten, die mit dem Internet der Dinge verbunden sind, ist es nicht üblich, eine Datenstruktur zu benötigen, daher ist es normal, sie im Klartextformat zu senden variable=valor
.
In der HTTP-POST-Anfrage des folgenden Beispiels wird die Ressource (normalerweise eine Webseite) /iot/grabar_temperatura vom polaridad.es-Server angefordert und drei Variablen gesendet: ne, tp und cr, die jeweils die Werte „ 12“, „10.26“ und „2.18“ Es ist auch wichtig zu beachten, dass es eine Leerzeile gibt, um die Kopfzeilen von den Daten zu trennen.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Das Endziel des folgenden Codes PHP wird an den Datenbankserver gesendet MySQL die Bestellung SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
INSERT
INTO `calefacciones`
(
numero_estancia,
temperatura,
corriente
)
VALUES
(
12,
10.26,
2.18
);
|
Womit ein neuer Datensatz erstellt wird (INSERT
)
in der Heizungsdatenbank (INTO
)calefacciones
Zuordnung zu Feldern (numero_estancia,temperatura,corriente)
die Werte, die der HTTP-POST-Anfrage entsprechen VALUES (12, 10.26, 2.18)
Die Verbindung zur Datenbank erfolgt über die Funktion mysqli_connect
je nach Format: mysqli_connect($servidor,$usuario,$clave,$base_datos)
das einen Zeiger auf das Verbindungsobjekt zurückgibt und die Variablen verwendet, die den Zugriff definieren (z. B. Benutzer, Passwort ...) und die zuvor für zukünftige hypothetische Verwendungen im Skript zugewiesen wurden.
Um zu erkennen, ob die Verbindung erfolgreich war, wird die Funktion verwendet mysqli_connect_errno()
Gibt die Fehlernummer zurück, die möglicherweise aufgetreten ist, oder Null (falsch), wenn die Verbindung korrekt hergestellt wurde. Um Fehler zu benachrichtigen, wird der Anwendung, die die HTTP-Anfrage stellt, mit dem Wert Null geantwortet, in diesem Fall dem Programm, das in ausgeführt wird µC des IoT-Knotens.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
$fin_linea=PHP_EOL;
$servidor=‘localhost’;
$usuario=‘pelaez’;
$clave=‘1234’;
$base_datos=‘base_datos_temperaturas’;
$conexion=mysqli_connect($servidor,$usuario,$clave,$base_datos);
if(mysqli_connect_errno())
{
echo 0; // Devolver el valor 0 para indicar que se ha producido un error
}
else
{
$numero_estancia=(int)$_POST[‘ne’];
$temperatura=(float)$_POST[‘tp’];
$corriente=(float)$_POST[‘cr’];
$consulta_sql =‘INSERT INTO calefacciones (numero_estancia,temperatura,corriente) ‘;
$consulta_sql.=‘VALUES (‘.$numero_estancia.‘,’.$temperatura.‘,’.$corriente.‘);’;
$resultado=mysqli_query($conexion,$consulta_sql);
if($resultado) // Si no se ha producido un error al realizar la consulta…
{
echo mysqli_insert_id($conexion); // Devolver el índice del nuevo registro (¡>0!)
}
else
{
echo 0; // Devolver el valor 0 para indicar que se ha producido un error
}
mysqli_close($conexion);
}
echo $fin_linea;
|
Vor dem Hinzufügen zu Text, der in gespeichert ist $consulta_sql
mit der die Bestellung zusammengestellt wird SQL Die an den Datenbankserver gesendeten Informationen werden in den POST-Anforderungsvariablen mindestens vorverarbeitet, um einen Angriff durch zu verhindern SQL-Injektion. Im vorherigen Beispiel wird die Konvertierung in den entsprechenden Datentyp erzwungen (int)
(Ganzzahl) oder (float)
(Gleitkomma-Dezimalzahl), was ausreichen würde, um möglichen Schadcode zu eliminieren, der den Anforderungsdaten hinzugefügt wurde Webserver.
Wie zu sehen ist, in der PHP-Sprache Das Punktsymbol (.) dient zur Verkettung der Texte, aus denen die Bestellung besteht SQL oder der Punkt- und Gleichheitszeichenoperator (.=), um Text rechts von dem hinzuzufügen, der bereits eine Variable speichert, und das einfache Anführungszeichen (‘) wird auch zum Einschließen von Textkonstanten und nicht nur von Zeichen verwendet. Obwohl in diesem Fall auch doppelte Anführungszeichen («) verwendet werden können, in PHP-Sprache dienen der Verarbeitung des Inhalts, beispielsweise der Einbindung von Variablen innerhalb des Textes in das Format $texto="Me llamo $nombre";
als Alternative zum Format $texto='Me llamo '.$nombre;
Außerdem können Sie Anführungszeichen eines Typs in einen anderen einfügen, ohne Escapezeichen verwenden zu müssen, wenn sich Doppelzeichen innerhalb von Einzelzeichen oder Einzelzeichen innerhalb von Doppelzeichen abwechseln, wie in der Aufgabe $texto='esto no hay que "escaparlo" en PHP';
.
Um die Abfrage an den Server auszuführen MySQL Funktion verwendet wird mysqli_query
mit dem Format mysqli_query($conexion,$consulta_sql)
welches als Parameter die Objektverbindung zur Datenbank und den Text mit der Bestellung übernimmt SQL das wurde komponiert.
Die Funktion mysqli_query($conexion,$consulta_sql)
gibt ein Cursor-Objekt zurück, das gegebenenfalls zum Durchlaufen der zurückgegebenen Daten oder, wie im obigen Beispiel, zum Abrufen von Informationen über die Operation verwendet werden kann, insbesondere um den Index zu kennen, der dem neuen Datensatz zugewiesen ist, den die Operation in der Tabelle erstellt hat. Heizungen“ mit der Funktion mysqli_insert_id($conexion)
Der von zurückgegebene Wert mysqli_query($conexion,$consulta_sql)
kann in einer booleschen Operation als falsch ausgewertet werden, um festzustellen, dass ein Fehler aufgetreten ist. Im vorherigen Beispiel wird es verwendet, um, wie im Fall des Verbindungsfehlers, eine Null an die Anwendung zurückzugeben, die die POST-Anfrage stellt. Auf diese Weise gibt das Programm eine Zahl größer als Null zurück, die den Index des neuen Datensatzes darstellt, wenn die Operation korrekt ist, oder eine Null, wenn die Operation einen Fehler erzeugt.
Um die der Datenbankverbindung zugewiesenen Ressourcen freizugeben, wird diese über die Funktion „geschlossen“. mysqli_close($conexion)
Informationen aus der Datenbank lesen
Außer in Architekturen für Nebel-Computing Die meisten IoT-Knoten beschränken sich darauf, die von ihren Sensoren erfassten Informationen an den Server zu senden, d Webserver Es kommuniziert nur mit ihnen, um die Informationen zu speichern, sodass mit dem vorherigen Beispiel ein Großteil der Fälle, die in dieser Anwendung auftreten werden, bereits gelöst wurde. Der nächste Schritt könnte darin bestehen, eine Website zu erstellen, die die Daten zeigt, die von Geräten überwacht werden, die mit dem Internet der Dinge verbunden sind, eine Arbeit von Frontend Dies liegt außerhalb des Inhalts dieser Tutorialreihe.
Was passieren kann, ist, dass ein IoT-Knoten über eine gewisse Interaktivität verfügt und sich basierend auf historischen Daten unterschiedlich verhält oder die Möglichkeit vorsieht, sein Verhalten entsprechend einer Konfiguration zu ändern, die ihm von einem Server übermittelt wird, oder dass der Knoten sogar ein Bildschirm ist, der ein Diagramm anzeigt mit den kürzlich überwachten Daten im Vergleich zu den zu früheren Zeitpunkten erfassten Daten. Für all diese Situationen ist es auch interessant, Daten vom Server auslesen zu können MySQL durch Webserver wie im folgenden Beispiel dargestellt, das simuliert, eine Liste der Daten der Alarmzustände zu erhalten, die durch die Zeitpunkte bestimmt werden, in denen die Temperatur 40 °C überstieg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
$fin_linea=PHP_EOL; // Fin de línea. Usar <br> para HTML si se va a mostrar la salida en algún tipo de pantalla o consola no es necesario
$servidor=‘localhost’;
$usuario=‘pelaez’;
$clave=‘1234’;
$base_datos=‘base_datos_temperaturas’;
$conexion=mysqli_connect($servidor,$usuario,$clave,$base_datos);
if(mysqli_connect_errno())
{
echo ‘Error al conectar a la base de datos: ‘ . mysqli_connect_error();
}
else
{
$consulta_sql=‘SELECT ‘;
$consulta_sql.=‘estancia, temperatura, DAY(fecha), MONTH(fecha), YEAR(fecha), TIME(fecha) ‘;
$consulta_sql.=‘FROM valor_temperaturas ‘;
$consulta_sql.=‘WHERE temperatura>40.0 ‘;
$consulta_sql.=‘ORDER BY fecha DESC;’;
$resultado=mysqli_query($conexion,$consulta_sql); // El tercer parámetro de mysqli_query, no usado, es el modo MYSQLI_STORE_RESULT por defecto o MYSQLI_USE_RESULT para grandes cantidades de datos
if($resultado) // Si no se ha producido un error al realizar la consulta
{
$total_resultado=mysqli_num_rows($resultado);
if($total_resultado) // Si se ha encontrado algún resultado
{
echo ‘Se han encontrado ‘.$total_resultado.‘ estados de alarma:’.$fin_linea;
for($numero_resultado=0;$numero_resultado<$total_resultado) // Recorrer los resultados
{
mysqli_data_seek($resultado,$numero_resultado); // Mover el cursor al registro correspondiente (no tendría por qué ser consecutivo)
$registro=mysqli_fetch_row($resultado); // Almacenar en un vector los datos del registro
echo ‘El ‘.$registro[2]; // Tercer campo de la consulta (día)
echo ‘ del ‘.$registro[3]; // Cuarto campo de la consulta (mes)
echo ‘ de ‘.$registro[4]; // Quinto campo de la consulta (año)
echo ‘ a las ‘.$registro[5]; // Sexto campo de la consulta (hora)
echo ‘ en la estancia “‘.$registro[0].‘”‘; // Primer campo de la consulta (estancia)
echo ‘ la temperatura superó el máximo de 40°C (‘.$registro[1].‘)’; // Segundo campo de la consulta (temperatura)
echo $fin_linea;
}
}
else
{
echo ‘No se ha encontrado ningún estado de alarma’.$fin_linea;
}
mysqli_free_result($resultado);
}
mysqli_close($conexion);
}
|
Im obigen Beispiel wird der Befehl zum Abfragen der Datenbank verwendet SQL SELECT
entsprechend dem Grundformat SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
mit der einzigen Besonderheit, dass die Funktionen zum Datumsfeld hinzugefügt werden DAY
, MONTH
, YEAR
y TIME
um den Tag, die Zahl des Monats, das Jahr und die Uhrzeit getrennt zu erhalten. Die auferlegte Bedingung besteht darin, dass die Temperatur über 40.0 liegt und anhand des Datumsfelds vom höchsten (aktuellsten) zum niedrigsten (ältesten) sortiert wird, wobei dies mit der Klausel angegeben wird DESC
Um die von der Abfrage zurückgegebenen Werte aus einer Schleife zu durchlaufen for
Bei bekannter Dimension wird die Funktion verwendet mysqli_num_rows($resultado)
Dies gibt die Anzahl der gefundenen Datensätze an. Mit der Funktion mysqli_data_seek($resultado,$numero_resultado)
Der Ergebniscursor kann an eine bestimmte Position bewegt werden, die durch den Schleifenzähler ausgedrückt wird for
, $numero_resultado
, im Beispiel.
Um die Felder des Datensatzes, auf den der Ergebniscursor zeigt, in einem Vektor zu speichern, wird die Funktion verwendet mysqli_fetch_row($resultado)
welches der Variablen zugeordnet ist $registro
die später verwendet werden, um eine Phrase mit den verschiedenen Werten zu bilden und über ihre Indizes auf sie zuzugreifen.
Sobald alle Werte durchlaufen wurden, werden die dem Abfrageergebnis zugewiesenen Ressourcen freigegeben SQL mit Funktion mysqli_free_result($resultado)
Verarbeiten Sie Informationen aus der Datenbank. Werte vergleichen.
In manchen Fällen ist es praktisch, die Informationsverarbeitung auf dem Server zu zentralisieren, selbst wenn dies in den IoT-Knoten in diesem Stil möglich wäre Nebel-Computing. Im folgenden Beispiel werden folgende Gründe simuliert: Sicherheit; Der Knoten verfügt über Informationen über seinen Schlüssel (Schloss) und über eine Anfrage (Schlüssel), weiß jedoch nicht, ob es angemessen ist, der Kombination beider nachzugeben, daher muss er den Server konsultieren, der die Entscheidung trifft und informiert den Knoten, indem er basierend auf dem Ergebnis einer Abfrage an Ihre Datenbank mit null (um einen fehlgeschlagenen Vergleich anzuzeigen) oder eins (um anzuzeigen, dass der Vergleich erfolgreich war) antwortet.
Mit dieser Ausrede können Sie ein Beispiel sehen, in dem Daten von dem mit dem Internet der Dinge verbundenen Gerät empfangen werden (ein Schlüsselcode und ein Sperrcode), ein Ergebnis zurückgegeben wird (eins oder null, je nachdem, ob das Ergebnis wahr oder falsch ist) und Es erfolgt eine kleine Verarbeitung der Informationen, die aus dem Vergleich der bei der Abfrage der Datenbank erhaltenen Ergebnisse mit den vom IoT-Knoten gesendeten Ergebnissen besteht.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
$fin_linea=PHP_EOL;
$servidor=‘localhost’;
$usuario=‘pelaez’;
$clave=‘1234’;
$base_datos=‘base_datos_puertas’;
$conexion=mysqli_connect($servidor,$usuario,$clave,$base_datos);
if(mysqli_connect_errno())
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida o que se ha producido un error (en este caso es un error)
}
else
{
$cerradura=hexdec($_POST[“c”]);
$llave=hexdec($_POST[“l”]);
$consulta_sql=‘SELECT llave FROM cerraduras WHERE cerradura=”.$cerradura.“;’;
$resultado=mysqli_query($conexion,$consulta_sql);
if($resultado) // Si no se ha producido un error al realizar la consulta
{
$total_resultado=mysqli_num_rows($resultado);
if($total_resultado) // Si se ha encontrado algún resultado
{
$numero_resultado=0;
$buscando_cerradura=TRUE;
while($buscando_cerradura&&$numero_resultado<$total_resultado)
{
mysqli_data_seek($resultado,$numero_resultado);
$registro=mysqli_fetch_row($resultado);
if($registro[0]==$llave)
{
$buscando_cerradura=FALSE;
}
else
{
$numero_resultado++;
}
}
// echo !$buscando_cerradura;
if($buscando_cerradura)
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida (o que se ha producido un error; y aquuí no es el caso)
}
else
{
echo 1; // Devolver el valor 1 para indicar que la comparación SÍ es válida
}
}
else
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida o que se ha producido un error
}
}
else
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida o que se ha producido un error
}
mysqli_close($conexion);
}
echo $fin_linea;
|
Im vorherigen Beispiel wird die Hexdec-Funktion verwendet, um eine Dezimalzahl aus einem Text zu erhalten, der eine Hexadezimalzahl darstellt und vom IoT-Gerät gesendet wird. Der zusätzliche Vorteil dieser Funktion besteht darin, wie bereits erläutert, einen Angriff durch das Hinzufügen von Code zu verhindern SQL schädlich für die Daten der POST-Anfrage.
Geben Sie Anmerkung