PHP प्रोग्रामिंग भाषा से डेटाबेस तक पहुंचें
श्रृंखला के इस अंतिम लेख में इंटरनेट ऑफ थिंग्स से जुड़े उपकरणों से डेटा संग्रहीत करने के लिए वेब सर्वर का उपयोग करना, डेटाबेस में रिकॉर्ड करने का तरीका बताता है MySQL वह जानकारी जो IoT नोड्स HTTP POST अनुरोध करने वाले सर्वर को भेजते हैं। इस लेख के पाठक, पूरे ब्लॉग के, प्रोग्रामिंग से विशेष रूप से परिचित नहीं हो सकते हैं पीएचपी भाषा लेकिन प्रोग्रामिंग के साथ निश्चित रूप से हाँ माइक्रोकंट्रोलर्स भाषाओं में C o सी + + इसलिए, कुछ विवरणों को छोड़कर, जैसे कि चर से पहले डॉलर चिह्न ($) से पहले, आप आगे स्पष्टीकरण की आवश्यकता के बिना उदाहरणों का पालन करने में सक्षम होंगे क्योंकि वे एक बहुत ही तटस्थ प्रोग्रामिंग शैली का पालन करके किए गए हैं, विशिष्ट नहीं PHP.
डेटाबेस में जानकारी संग्रहीत करें
जैसा कि लेख में बताया गया है वेब सर्वर पर HTTP POST अनुरोध करके IoT डेटा भंडारणहेडर के अंत में, POST अनुरोध के मुख्य भाग में वह डेटा होता है जो सर्वर को भेजा जाता है। इस जानकारी को सर्वर पर भेजने का सबसे आम तरीका सादे पाठ प्रारूप में है क्योंकि इसका "मैन्युअल रूप से" विश्लेषण करना भी आसान है। जब सर्वर पर भेजा गया डेटा जटिल होता है, तो उदाहरण के लिए, प्रारूप का उपयोग करके इसे संरचित करना निश्चित रूप से सुविधाजनक होगा एक्सएमएल o JSON. इंटरनेट ऑफ थिंग्स से जुड़े उपकरणों से जानकारी प्रबंधित करने के लिए वेब सर्वर के सामान्य उपयोग में, डेटा संरचना की आवश्यकता आम नहीं है, इसलिए उन्हें प्रारूप में सादे पाठ में भेजना सामान्य है variable=valor
.
निम्नलिखित उदाहरण के HTTP POST अनुरोध में, पोलारिडैड.ईएस सर्वर से संसाधन (आमतौर पर एक वेब पेज) /iot/grabar_temperatura का अनुरोध किया जाता है और तीन चर भेजे जाते हैं: ne, tp और cr, जिनमें क्रमशः मान शामिल होते हैं। 12", "10.26 » और «2.18» यह याद रखना भी महत्वपूर्ण है कि हेडर को डेटा से अलग करने के लिए एक खाली लाइन है।
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
निम्नलिखित कोड का अंतिम लक्ष्य PHP डेटाबेस सर्वर को भेज देगा MySQL आदेश एसक्यूएल:
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
);
|
जिससे एक नया रिकॉर्ड बनेगा (INSERT
)
हीटिंग डेटाबेस में (INTO
)calefacciones
फ़ील्ड्स को असाइन करना (numero_estancia,temperatura,corriente)
HTTP POST अनुरोध के अनुरूप मान VALUES (12, 10.26, 2.18)
डेटाबेस से कनेक्शन फ़ंक्शन के साथ किया जाता है mysqli_connect
प्रारूप के अनुसार: mysqli_connect($servidor,$usuario,$clave,$base_datos)
यह कनेक्शन-ऑब्जेक्ट पर एक पॉइंटर लौटाता है और यह उन वेरिएबल्स का उपयोग करता है जो एक्सेस को परिभाषित करते हैं (जैसे उपयोगकर्ता नाम, पासवर्ड ...) और जिन्हें पहले स्क्रिप्ट में भविष्य के काल्पनिक उपयोगों के लिए असाइन किया गया है।
यह पता लगाने के लिए कि कनेक्शन सफल हुआ है या नहीं, फ़ंक्शन का उपयोग किया जाता है mysqli_connect_errno()
जो त्रुटि संख्या लौटाता है जो उत्पन्न हो सकती है या कनेक्शन सही ढंग से स्थापित होने पर शून्य (गलत) हो सकता है। त्रुटियों को सूचित करने के लिए, HTTP अनुरोध करने वाले एप्लिकेशन को शून्य के मान के साथ जवाब दिया जाता है, इस मामले में जो प्रोग्राम निष्पादित होता है μC IoT नोड का.
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;
|
संग्रहीत पाठ में जोड़ने से पहले $consulta_sql
जिसके साथ आदेश बना है एसक्यूएल जो जानकारी डेटाबेस सर्वर पर भेजी जाती है, POST अनुरोध वेरिएबल्स में जो जानकारी आती है, उसे किसी हमले से बचने के लिए कम से कम पूर्व-संसाधित किया जाता है। एसक्यूएल इंजेक्षन. पिछले उदाहरण में, संबंधित डेटा प्रकार में रूपांतरण को बाध्य किया गया है (int)
(पूर्णांक) या (float)
(फ़्लोटिंग पॉइंट दशमलव) जो अनुरोध डेटा में जोड़े गए संभावित दुर्भावनापूर्ण कोड को खत्म करने के लिए पर्याप्त होगा वेब सर्वर.
जैसा कि देखा जा सकता है, में पीएचपी भाषा अवधि चिह्न (.) का उपयोग क्रम बनाने वाले पाठों को संयोजित करने के लिए किया जाता है एसक्यूएल या उस पाठ के दाईं ओर पाठ जोड़ने के लिए अवधि और समान चिह्न ऑपरेटर (.=) जो पहले से ही एक चर को संग्रहीत करता है और एकल उद्धरण (') का उपयोग केवल वर्णों को ही नहीं, बल्कि पाठ स्थिरांक को संलग्न करने के लिए भी किया जाता है। हालाँकि इस मामले में दोहरे उद्धरण चिन्ह (``) का भी उपयोग किया जा सकता है पीएचपी भाषा सामग्री को संसाधित करने के लिए उपयोग किया जाता है, उदाहरण के लिए, प्रारूप में पाठ के भीतर चर शामिल करना $texto="Me llamo $nombre";
प्रारूप के विकल्प के रूप में $texto='Me llamo '.$nombre;
यह आपको एक प्रकार के उद्धरणों को दूसरे में शामिल करने की अनुमति भी देता है, जब भी असाइनमेंट में डबल्स एकल के भीतर या एकल डबल्स के भीतर वैकल्पिक होते हैं, तो एस्केप संकेतों का उपयोग किए बिना $texto='esto no hay que "escaparlo" en PHP';
.
सर्वर पर क्वेरी निष्पादित करने के लिए MySQL फ़ंक्शन का उपयोग किया जाता है mysqli_query
प्रारूप के साथ mysqli_query($conexion,$consulta_sql)
जो डेटाबेस से ऑब्जेक्ट-कनेक्शन और ऑर्डर के साथ टेक्स्ट को पैरामीटर के रूप में लेता है एसक्यूएल जिसकी रचना की गई है.
समारोह mysqli_query($conexion,$consulta_sql)
एक कर्सर-ऑब्जेक्ट लौटाता है जिसका उपयोग लौटाए गए डेटा को पार करने के लिए किया जा सकता है यदि लागू हो या, जैसा कि उपरोक्त उदाहरण में, ऑपरेशन के बारे में जानकारी प्राप्त करने के लिए किया जा सकता है, विशेष रूप से नए रिकॉर्ड को सौंपे गए इंडेक्स को जानने के लिए जिसे ऑपरेशन ने तालिका में बनाया है। हीटर" फ़ंक्शन के साथ mysqli_insert_id($conexion)
द्वारा लौटाया गया मान mysqli_query($conexion,$consulta_sql)
यह निर्धारित करने के लिए कि कोई त्रुटि हुई है, बूलियन ऑपरेशन में गलत का मूल्यांकन कर सकता है। पिछले उदाहरण में इसका उपयोग कनेक्शन त्रुटि के मामले में, POST अनुरोध करने वाले एप्लिकेशन को शून्य वापस करने के लिए किया जाता है। इस तरह, प्रोग्राम शून्य से अधिक संख्या लौटाएगा जो कि यदि ऑपरेशन सही है तो नए रिकॉर्ड के सूचकांक का प्रतिनिधित्व करता है या यदि ऑपरेशन कोई त्रुटि उत्पन्न करता है तो शून्य लौटाएगा।
डेटाबेस कनेक्शन को सौंपे गए संसाधनों को मुक्त करने के लिए, फ़ंक्शन का उपयोग करके इसे "बंद" किया जाता है mysqli_close($conexion)
डेटाबेस से जानकारी पढ़ें
आर्किटेक्चर को छोड़कर कोहरे की गणना अधिकांश IoT नोड्स अपने सेंसर द्वारा कैप्चर की गई जानकारी को सर्वर तक भेजने तक ही सीमित रहते हैं, अर्थात वेब सर्वर यह केवल जानकारी संग्रहीत करने के लिए उनके साथ संचार करता है, इसलिए पिछले उदाहरण के साथ इस एप्लिकेशन में उत्पन्न होने वाले मामलों का एक बड़ा हिस्सा पहले ही हल हो चुका है। अगला कदम एक ऐसी वेबसाइट बनाना हो सकता है जो इंटरनेट ऑफ थिंग्स से जुड़े उपकरणों द्वारा मॉनिटर किए गए डेटा को दिखाए दृश्यपटल जो ट्यूटोरियल की इस श्रृंखला में शामिल की गई बातों से बाहर है।
क्या हो सकता है कि एक IoT नोड में एक निश्चित अन्तरक्रियाशीलता होती है और ऐतिहासिक डेटा के आधार पर अलग-अलग व्यवहार करता है या किसी सर्वर से आने वाले कॉन्फ़िगरेशन के अनुसार अपने व्यवहार को बदलने की संभावना का अनुमान लगाता है या यहां तक कि नोड एक स्क्रीन है जो एक ग्राफ दिखाता है पिछली तिथियों पर प्राप्त डेटा की तुलना में हाल ही में मॉनिटर किए गए डेटा के साथ। इन सभी स्थितियों के लिए सर्वर से डेटा पढ़ने में सक्षम होना भी दिलचस्प है MySQL के माध्यम से वेब सर्वर जैसा कि निम्नलिखित उदाहरण में दिखाया गया है, जो उन क्षणों द्वारा निर्धारित अलार्म राज्यों की तारीखों की एक सूची प्राप्त करने का अनुकरण करता है जिनमें तापमान 40 डिग्री सेल्सियस से अधिक हो गया था
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);
}
|
उपरोक्त उदाहरण में, डेटाबेस को क्वेरी करने के लिए कमांड का उपयोग किया जाता है एसक्यूएल SELECT
मूल प्रारूप के अनुसार SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
दिनांक फ़ील्ड में फ़ंक्शंस जोड़ने की एकमात्र विशेषता के साथ DAY
, MONTH
, YEAR
y TIME
दिन, महीने की संख्या, वर्ष और समय को अलग-अलग प्राप्त करने के लिए। लगाई गई शर्त यह है कि तापमान 40.0 से अधिक है और इसे दिनांक फ़ील्ड का उपयोग करके उच्चतम (सबसे वर्तमान) से सबसे कम (सबसे पुराना) तक क्लॉज के साथ इंगित करने का आदेश दिया गया है। DESC
एक लूप से क्वेरी द्वारा लौटाए गए मानों के माध्यम से लूप करना for
ज्ञात आयाम के साथ फ़ंक्शन का उपयोग किया जाता है mysqli_num_rows($resultado)
जो पाए गए अभिलेखों की संख्या को इंगित करता है। समारोह के साथ mysqli_data_seek($resultado,$numero_resultado)
परिणाम कर्सर को लूप काउंटर द्वारा व्यक्त एक विशिष्ट स्थिति में ले जाया जा सकता है for
, $numero_resultado
, उदाहरण में।
परिणाम कर्सर द्वारा इंगित रिकॉर्ड के फ़ील्ड को वेक्टर में संग्रहीत करने के लिए, फ़ंक्शन का उपयोग किया जाता है mysqli_fetch_row($resultado)
जो वेरिएबल को सौंपा गया है $registro
जिसे बाद में विभिन्न मूल्यों के साथ एक वाक्यांश बनाने के लिए उपयोग किया जाएगा, उन तक उनकी अनुक्रमणिका द्वारा पहुंच बनाई जाएगी।
एक बार जब सभी मानों का पता लगा लिया जाता है, तो क्वेरी परिणाम के लिए निर्दिष्ट संसाधन जारी कर दिए जाते हैं एसक्यूएल समारोह के साथ mysqli_free_result($resultado)
डेटाबेस से जानकारी संसाधित करें. मूल्यों की तुलना करें.
कुछ अवसरों पर सूचना प्रसंस्करण को सर्वर पर केंद्रीकृत करना सुविधाजनक होता है, भले ही इसे IoT नोड्स में शैली में करना संभव हो। कोहरे की गणना. निम्नलिखित उदाहरण में ऐसा करने के लिए जो कारण बताए गए हैं वे सुरक्षा हैं; नोड के पास इसकी कुंजी (लॉक) और अनुरोध (कुंजी) के बारे में जानकारी है, लेकिन यह नहीं पता है कि क्या दोनों के संयोजन को रास्ता देना उचित है, इसलिए इसे सर्वर से परामर्श करना होगा, जो निर्णय लेता है और आपके डेटाबेस में एक क्वेरी के परिणाम के आधार पर शून्य (असफल तुलना को इंगित करने के लिए) या एक (यह इंगित करने के लिए कि तुलना सफल थी) का जवाब देकर नोड को सूचित करता है।
इस बहाने से आप एक उदाहरण देख सकते हैं जिसमें इंटरनेट ऑफ थिंग्स (एक कुंजी कोड और एक लॉक कोड) से जुड़े डिवाइस से डेटा प्राप्त होता है, एक परिणाम लौटाया जाता है (परिणाम सही या गलत होने के आधार पर एक या शून्य) और जानकारी का एक छोटा सा प्रसंस्करण किया जाता है जिसमें डेटाबेस से परामर्श करते समय प्राप्त परिणामों की तुलना IoT नोड द्वारा भेजे गए परिणामों से की जाती है।
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;
|
पिछले उदाहरण में, हेक्सडेक फ़ंक्शन का उपयोग किसी टेक्स्ट से दशमलव संख्या प्राप्त करने के लिए किया जाता है जो हेक्साडेसिमल संख्या का प्रतिनिधित्व करता है और IoT डिवाइस द्वारा भेजा गया है। इस फ़ंक्शन का उपयोग करने का अतिरिक्त लाभ, जैसा कि पहले बताया गया है, कोड जोड़कर किसी हमले से बचना है एसक्यूएल POST अनुरोध के डेटा के लिए दुर्भावनापूर्ण।
टिप्पणी पोस्ट