مرحبًا ، سيخبرك الزملاء في هذا الدليل بكيفية التحكم في مستشعرات المنزل الذكي باستخدام مساعد Google وبروتوكول mqtt ، باستخدام لوحة ESP8266 و LED كمثال. سنقوم أيضًا بإنشاء تطبيق المساعد الخاص بنا باستخدام مخطوطات البلاك جاك والـ php. أطلب من الجميع القط.للقيام بذلك ، نحتاج إلى وحدة تحكم ESP8266 ، أو وحدات تحكم أخرى متصلة بالإنترنت ، بالإضافة إلى خادم بشهادة SSL صالحة (بدلاً من SSL صالح ، يمكنك استخدام وكيل عكسي يحتوي بالفعل على واحد) وخادم MQTT (وسيط).للتكامل مع مساعد Google ، سنستخدم خدمة إجراءات Google و Dialogflow. لذا ، لنبدأ.
إنشاء وإنشاء مشروع
وحدة تحكم العمل من Google
تحتاج أولاً إلى تسجيل الدخول إلى الخدمة وإنشاء مشروع وتحديد اللغة والمنطقة.
بعد أن تحتاج إلى اختيار النطاق. لقد اخترت Kids & Family. من تجربة شخص آخر ، سأقول أن الفئة المطلوبة منطقيًا Smart Home تعمل بشكل صحيح فقط مع الأجهزة من Google ، للمشاريع التي تحتوي على أجهزة استشعار خاصة بها ، من الأفضل اختيار فئة مختلفة للتشغيل الصحيح.
نقرأ ونقبل الاتفاق. في فئة الإعداد السريع ، انتقل إلى تحديد كيفية استدعاء الإجراء الخاص بك. نخرج بما سيطلق عليه البوت الخاص بنا ونختار صوتًا من الأنواع المتاحة ، احفظه.
انتقل إلى علامة التبويب "الإجراءات" ، وأضف إجراء "غرض مخصص"
تدفق الحوار
بعد النقر على زر البناء ، تتم إعادة توجيهنا إلى مورد Dialogflow ، كما نقوم بتسجيل الدخول والمتابعة إلى إنشاء المشروع:- اختر اللغة الافتراضية والمنطقة الزمنية.
- Fulfillment Webhook. ( , ) Dialogflow POST .

- 3. .
intets . . + Intents. .
يمكن تقسيم الصفحة نفسها إلى ثلاث فئات:عبارات التدريب هي الكلمات التي يستجيب لها المساعد مع الفريق. يمكن أن تكون مختلفة لفريق واحد. على سبيل المثال ، قم بتلميع الكلمات ، وقطع الضوء ، وتشغيل المصباح ، وما إلى ذلك.
الإجراء - الإجراء نفسه ، أو الكلمة التي سيفهمها المستشعر ، هي كلمة واحدة وملموسة.الردود هي إجابات المساعد بعد تنفيذ الأمر. هنا مجرد مجال للإبداع.
إعداد الاستضافة
كخادم ، اشتريت أقل قطب (5 دولارات) وقمت بتثبيت دبيان 10.2 عليه. الاستضافة التي تختارها لا يهم.تكوين الوكيل العكسي و DNS
يمكنك تخطي هذا الجزء إذا كان لديك استضافة بشهادة صالحة.تقدم خدمة Cloudflare نفسها الكثير من الأسماء ذات المستوى الأدنى ، لذلك إذا كنت تواجه مشاكل في الخطوة 4 ، فقد تحتاج إلى الإشارة إلى عنوان IP الخاص بك بدلاً من العنوان الافتراضي في عمود المحتوى بجوار www *** ، https // www *** (*** هو مجالك) .للتفاعل مع Dialogflow ، تحتاج إلى شهادة SSL. لم أقم بتثبيته على الخادم ، وبدلاً من ذلك استخدمت وكيل DNS Cloudflare (مجاني - أساسي). للقيام بذلك ، عند تكوين Cloudflare ، أضفت اسم المجال الذي اشتريته سابقًا وأضفت عنوان IP لخادمي إليه (عمود المحتوى). تمت إضافة سجلي A أيضًا (في الصورة القيمة) في إعدادات موفر الاسم. وتجدر الإشارة إلى أن إضافة سجل ليست مسألة ثوان ويمكن أن تستغرق عدة أيام عمل.
تثبيت البرامج
1. أول شيء بعد بدء تشغيل الخادم لأول مرة ، لا تنس تحديث قاعدة بيانات الحزمةapt update
، ثم قم بتحديث الحزم المثبتةapt upgrade
2. بعد تثبيت LAMPApacheapt install apache2
فب / الخليةapt-get install php libapache2-mod-php php-mcrypt php-mysql
أضف عنوان الخادم في apache2.conf. يمكن القيام بذلك باستخدام الأمر nano /etc/apache2/apache2.conf من خلال التحديد في نهاية الملف ServerName *** في نهاية الملف ، حيث تحتاج بدلاً من العلامات النجمية إلى استبدال عنوان IP للخادم. تحقق من البنية وأعد تشغيل خدمة Apach تعرف على المزيد هنا .بعد إكمال الخطوات الموضحة أعلاه بنجاح عند إدخال اسم المجال الخاص بك في شريط المتصفح ، ستتلقى صفحة ترحيب Apache2.
إذا لم يحدث ذلك ، فتحقق مما إذا تم تنفيذ الأوامر بشكل صحيح ، وما إذا كانت الصفحة تعمل مع اتصال http غير آمن. إذا كان يعمل ، فمن المحتمل أن الخادم يستمع على المنفذ 80 ، وليس المنفذ 443. أو بعض الخدمات قيد التشغيل بالفعل. مزيد من التفاصيل هنا .4. تركيب مكتبة البعوض لـ PHPيمكن لأجهزة IoT استخدام بروتوكولات مختلفة للتشغيل المتبادل. أحد هذه MQTT يعمل على أساس الناشر-المشترك. في هذه الحالة ، يمكن للمشتركين تلقي معلومات من العديد من الناشرين. ولكن نظرًا لأن البروتوكول يفهم أنواعًا معينة فقط من الرسائل ، فإنه يحتاج إلى محول (وسيط). هنا قمنا بإعداده.5. إذا لم يكن PECL مثبتًا لديك ، فقم بتثبيتهapt install pecl
بعد أن أصبحنا وسيطpecl install Mosquitto-alpha
ثم أضف extension = mosquitto.so إلى php.ini الخاص بك. ولا تنس العميلapt install mosquitto mosquitto-clients
مزيد من التفاصيل هنا .إعداد سكربت php والاشتراك في الموضوع
في الواقع النصي نفسه. الغرض منه هو قبول طلب نشر من Dialogflow ، وعزل الإجراء عنه وإرساله كرسالة إلى الوسيط في الموضوع ، والذي يشار إلى اسمه في نهاية البرنامج النصي. ما تسمونه سيناريو لا يهم. بالمناسبة ، هذا هو النص الذي أشرنا إليه في علامة التبويب `` الوفاء ''. ضع النص في / var / www / htmlالمواضيع التي تم إنشاؤها من قبل المشتركين. لإنشاء موضوع ، استخدم الأمر:mosquitto_sub -h localhost - t /test/light
بدلاً من localhost ، يمكنك تحديد أي عنوان أو مجال آخر ، حيث تريد إنشاء ناشر (حانة).بدلاً من / test / light ، يمكنك تحديد أي موضوع. في حالتنا ، الشيء الرئيسي هو أن يشار إليه في البرنامج النصي.يتم إنشاء الرسائل من قبل الناشرين. لإنشاء رسالة ، يمكنك استخدام الأمر.mosquitto_pub -h localhost - t /test/light -m “light”
لكننا لن نحتاجها ، لأن ناشرنا (pub) سيكون تطبيقنا. المخطط هو هذا ، عندما يتلقى تطبيقنا أمرًا ، فإنه يرسل طلبًا إلى برنامجنا النصي. البرنامج النصي للوسيط ، والوسيط للمشترك (esp8266).سوف نتحقق من إرسال الرسائل من خلال علامة التبويب وحدة تحكم إجراء الاختبار.

نص PHP<?php
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
throw new Exception('Request method must be POST!');
}
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0){
throw new Exception('Content type must be: application/json');
}
$content = trim(file_get_contents("php://input"));
$decoded = json_decode($content);
var_dump($decoded);
echo $decoded->queryResult->action;
define('BROKER', 'localhost');
define('PORT', 1883);
define('CLIENT_ID', getmypid());
$client = new Mosquitto\Client(CLIENT_ID);
$client->connect(BROKER, PORT, 60);
$message = $decoded->queryResult->action;
$client->publish('/test/light', $message, 0, false);
$client->loop();
?>
البرامج الثابتة ESP8266
بالنسبة إلى البرامج الثابتة ، سنستخدم Arduino IDE. إذا قام شخص ما بتثبيت IDE للمرة الأولى ، فلا تنس برنامج التشغيل ch340. بشكل افتراضي ، لا يوجد مثل هذا الدفع في اردوينو. في ملف >> الإعدادات ، تحتاج إلى تحديد عنوان اللوحات الإضافية: arduino.esp8266.com/stable/package_esp8266com_index.json. في أدوات >> board >> board board تحتاج إلى تثبيت حزمة esp8266.في الرسم التخطيطي بعد const char * ssid ، يجب أن تشير إلى اسم شبكة wi-fi الخاصة بك. بعد كلمة مرور const char * ، كلمة المرور الخاصة بها. بعد const char * mqtt_server حدد عنوان IP لخادمك.رسم اردوينو IDE#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "***";
const char* password = "********";
const char* mqtt_server = "**.**.*.*";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
int led = D5;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
String msg="";
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
msg+=(char)payload[i];
}
Serial.println();
// Switch on the LED if an 1 was received as first character
// if ((char)payload[0] == '1') {
if (msg == "light") {
digitalWrite(led, HIGH); // Turn the LED on
} else {
digitalWrite(led, LOW); // Turn the LED off
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// ... and resubscribe
client.subscribe("/test/light");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(led, OUTPUT); // Initialize the led pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
نتيجة
نتيجة لذلك ، بعد تجميع الرسم التخطيطي ، نحصل على تطبيق مدمج في مساعد جوجل ويدير أجهزة الاستشعار. بدلاً من الهاتف الذكي ، استخدمت تطبيق ويب ، ولكن تم اختباره على Android - والنتيجة هي نفسها. الشيء الرئيسي هو إذا كنت تختبر من هاتف ذكي لا تنس أن تقول: "تحدث مع التطبيق ***".
