Veritabanına PHP programlama dilinden erişin
Serinin bu son makalesinde Nesnelerin İnterneti'ne bağlı cihazlardan veri depolamak için bir web sunucusu kullanma, bir veritabanına nasıl kayıt yapılacağını açıklar MySQL IoT düğümlerinin HTTP POST istekleri yaparak sunucuya gönderdiği bilgiler. Bu makalenin ve tüm blogun okuyucuları, programlamaya özellikle aşina olmayabilir. PHP dili ama kesinlikle evet programlamayla mikrodenetleyiciler dillerde C o C + + dolayısıyla, değişkenlerin başına dolar işareti ($) konulması gibi bazı ayrıntılar dışında, örnekler belirli bir konuya özgü olmayan, çok tarafsız bir programlama stili izlenerek yapıldıkları için daha fazla açıklamaya ihtiyaç duymadan takip edebileceksiniz. PHP.
Bilgileri veritabanında saklayın
Makalede açıklandığı gibi Bir web sunucusuna HTTP POST istekleri yaparak IoT veri depolamaBaşlıkların sonunda, POST isteğinin gövdesi sunucuya gönderilen verileri içerir. Bu bilgiyi sunucuya göndermenin en yaygın yolu düz metin biçimindedir çünkü "manuel olarak" bile analiz edilmesi daha kolaydır. Sunucuya gönderilen veriler karmaşık olduğunda, örneğin şu formatı kullanarak yapılandırmak kesinlikle uygun olacaktır: XML o JSON. Nesnelerin İnterneti'ne bağlı cihazlardan gelen bilgileri yönetmek için bir web sunucusunun olağan kullanımında, bir veri yapısına ihtiyaç duyulması yaygın değildir, bu nedenle bunları düz metin biçiminde aşağıdaki formatta göndermek normaldir: variable=valor
.
Aşağıdaki örnekteki HTTP POST isteğinde, polaridad.es sunucusundan kaynak (normalde bir web sayfası) /iot/grabar_temperatura istenir ve üç değişken gönderilir: sırasıyla değerleri içeren ne, tp ve cr" 12", "10.26 » ve «2.18» Başlıkları verilerden ayırmak için boş bir satırın bulunduğunu da unutmamak önemlidir.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Aşağıdaki kodun nihai hedefi PHP veritabanı sunucusuna gönderilecek MySQL sipariş 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
);
|
Yeni bir kaydın oluşturulacağı (INSERT
)
ısıtma veritabanında (INTO
)calefacciones
alanlara atama (numero_estancia,temperatura,corriente)
HTTP POST isteğine karşılık gelen değerler VALUES (12, 10.26, 2.18)
Veritabanına bağlantı fonksiyonla yapılır. mysqli_connect
formata göre: mysqli_connect($servidor,$usuario,$clave,$base_datos)
bağlantı nesnesine bir işaretçi döndüren ve erişimi tanımlayan değişkenleri (kullanıcı adı, parola... gibi) kullanan ve komut dosyasında gelecekteki varsayımsal kullanımlar için önceden atanmış olan değişkenleri kullanan.
Bağlantının başarılı olup olmadığını tespit etmek için fonksiyon kullanılır mysqli_connect_errno()
bu, oluşmuş olabilecek hata numarasını veya bağlantı doğru şekilde kurulmuşsa sıfırı (yanlış) döndürür. Hataları bildirmek için HTTP isteğinde bulunan uygulamaya, bu durumda HTTP'de çalıştırılan programa sıfır değeriyle yanıt verilir. uC IoT düğümünün.
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;
|
Saklanan metne eklemeden önce $consulta_sql
siparişin oluşturulduğu SQL Veritabanı sunucusuna gönderilen POST istek değişkenlerine gelen bilgiler, en azından bir saldırıyı önlemek için önceden işlenir. SQL enjeksiyonu. Önceki örnekte, karşılık gelen veri türüne dönüştürme zorunlu kılınmıştır. (int)
(tamsayı) veya (float)
(kayan noktalı ondalık sayı) bu, istek verilerine eklenen olası kötü amaçlı kodları ortadan kaldırmak için yeterli olacaktır. web sunucusu.
Görülebileceği gibi PHP dili Sırayı oluşturan metinleri birleştirmek için nokta simgesi (.) kullanılır. SQL veya zaten bir değişkeni saklayan metnin sağına metin eklemek için nokta ve eşittir işareti operatörü (.=) ve tek tırnak (') yalnızca karakterleri değil metin sabitlerini de içine almak için kullanılır. Bu durumda çift tırnak («) da kullanılabilmesine rağmen, PHP dili içeriği işlemek için kullanılır; örneğin metin içindeki değişkenler biçimindeki değişkenler dahil $texto="Me llamo $nombre";
formata alternatif olarak $texto='Me llamo '.$nombre;
ayrıca ödevde olduğu gibi çiftler tekler içinde veya tekler çiftler içinde değiştiğinde kaçış işaretlerini kullanmak zorunda kalmadan bir türden alıntıları diğerine eklemenize olanak tanır $texto='esto no hay que "escaparlo" en PHP';
.
Sorguyu sunucuya yürütmek için MySQL fonksiyon kullanıldı mysqli_query
format ile mysqli_query($conexion,$consulta_sql)
veritabanına nesne bağlantısını ve sipariş metnini parametre olarak alan SQL bu bestelenmiştir.
İşlevi mysqli_query($conexion,$consulta_sql)
Uygulanabilirse döndürülen verilerde geçiş yapmak için veya yukarıdaki örnekte olduğu gibi, özellikle işlemin tabloda oluşturduğu yeni kayda atanan dizini bilmek amacıyla işlem hakkında bilgi edinmek için kullanılabilecek bir imleç nesnesi döndürür " ısıtıcılar" işleviyle mysqli_insert_id($conexion)
tarafından döndürülen değer mysqli_query($conexion,$consulta_sql)
Bir hatanın oluştuğunu belirlemek için bir boole işleminde false olarak değerlendirilebilir. Önceki örnekte, bağlantı hatası durumunda olduğu gibi, POST isteğinde bulunan uygulamaya sıfır döndürmek için kullanıldı. Bu şekilde program, işlem doğruysa yeni kaydın indeksini temsil eden sıfırdan büyük bir sayıyı, işlem hata üretiyorsa sıfırı döndürecektir.
Veritabanı bağlantısına atanmış olan kaynakları serbest bırakmak için, bağlantı işlevi kullanılarak "kapatılır" mysqli_close($conexion)
Veritabanındaki bilgileri okuyun
mimariler hariç sis hesaplama Çoğu IoT düğümü, sensörleri tarafından yakalanan bilgileri sunucuya göndermekle kendilerini sınırlar. web sunucusu Onlarla yalnızca bilgiyi depolamak için iletişim kurar, dolayısıyla önceki örnekte bu uygulamada ortaya çıkacak durumların büyük bir kısmı zaten çözülmüştür. Bir sonraki adım, Nesnelerin İnterneti'ne bağlı cihazlar tarafından izlenen verileri gösteren bir web sitesi oluşturmak olabilir. önyüz bu, bu eğitim serisinde tartışılanların dışındadır.
Olabilecek şey, bir IoT düğümünün belirli bir etkileşime sahip olması ve geçmiş bir veriye göre farklı davranması veya kendisine bir sunucudan gelen bir konfigürasyona göre davranışının değiştirilme olasılığını öngörmesi veya hatta düğümün grafik gösteren bir ekran olmasıdır. yakın zamanda izlenen verilerle önceki tarihlerde elde edilen verilerle karşılaştırıldı. Tüm bu durumlar için sunucudan veri okuyabilmek de ilginçtir MySQL sayesinde web sunucusu sıcaklığın 40°C'yi aştığı anlara göre belirlenen alarm durumlarının tarihlerinin bir listesinin elde edilmesini simüle eden aşağıdaki örnekte gösterildiği gibi
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);
}
|
Yukarıdaki örnekte veritabanını sorgulamak için şu komut kullanılmıştır: SQL SELECT
temel formata göre SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
işlevleri tarih alanına eklemenin tek özelliği DAY
, MONTH
, YEAR
y TIME
günü, ay sayısını, yılı ve saati ayrı ayrı elde etmek için. Uygulanan koşul, sıcaklığın 40.0'dan büyük olması ve tarih alanı kullanılarak en yüksekten (en güncel) en düşüğe (en eskiye) kadar sıralanması ve bunu maddeyle birlikte belirtmesidir. DESC
Bir döngüden sorgunun döndürdüğü değerler arasında döngü yapmak için for
bilinen bir boyutla fonksiyon kullanılır mysqli_num_rows($resultado)
bulunan kayıtların sayısını gösterir. Fonksiyon ile mysqli_data_seek($resultado,$numero_resultado)
sonuç imleci döngü sayacı tarafından ifade edilen belirli bir konuma taşınabilir for
, $numero_resultado
, örnekte.
Sonuç imlecinin işaret ettiği kayıt alanlarını bir vektörde saklamak için fonksiyon kullanılır. mysqli_fetch_row($resultado)
değişkene atanan $registro
bunlar daha sonra farklı değerlere sahip bir ifade oluşturmak için kullanılacak ve bunlara dizinlerinden erişilecektir.
Tüm değerler geçildikten sonra sorgu sonucuna atanan kaynaklar serbest bırakılır SQL işlevi ile mysqli_free_result($resultado)
Veritabanındaki bilgileri işleyin. Değerleri karşılaştırın.
Bazı durumlarda, bu tarzdaki IoT düğümlerinde bunu yapmak mümkün olsa bile, bilgi işlemenin sunucuda merkezileştirilmesi uygundur. sis hesaplama. Aşağıdaki örnekte bunun için simüle edilen nedenler güvenliktir; Düğüm, anahtarı (kilit) ve bir istek (anahtar) hakkında bilgiye sahiptir ancak her ikisinin birleşimine yol vermenin uygun olup olmadığını bilmediğinden, kararı veren sunucuya danışmalıdır. Veritabanınıza yapılan bir sorgunun sonucuna göre sıfır (başarısız bir karşılaştırmayı belirtmek için) veya bir (karşılaştırmanın başarılı olduğunu belirtmek için) yanıtını vererek düğümü bilgilendirir.
Bu mazeretle, Nesnelerin İnterneti'ne bağlı cihazdan veri alındığı (bir anahtar kodu ve bir kilit kodu), bir sonuç döndürüldüğü (sonucun doğru veya yanlış olmasına bağlı olarak bir veya sıfır) ve Veritabanına danışıldığında elde edilen sonuçların IoT düğümü tarafından gönderilenlerle karşılaştırılmasını içeren küçük bir bilgi işleme gerçekleştirilir.
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;
|
Önceki örnekte, onaltılık sayıyı temsil eden ve IoT cihazı tarafından gönderilen metinden ondalık sayı elde etmek için hexdec işlevi kullanıldı. Bu işlevi kullanmanın ek avantajı, daha önce açıklandığı gibi, kod ekleyerek bir saldırıyı önlemektir. SQL POST isteğinin verileri için kötü amaçlıdır.
Yorum Ekle