- الغلايات ، والموازين ، ولعب الأطفال ، والمصابيح الكهربائية ، وماكينات صنع القهوة ... تم تضمين وحدات Bluetooth في هذه الأجهزة وغيرها.
- لماذا؟
- للسماح للمستخدم بإدارة أجهزتهم من خلال التطبيق. على سبيل المثال ، التحكم في الإضاءة في الغرفة.
- أوه ، هل من الممكن تجميع بعض الأجهزة البسيطة الخاصة بك وإدارتها مباشرة من خلال المتصفح؟
- نعم! وهذه المقالة تدور حول ذلك.
جزء من النظرية
هنا سأعطي بعض المصطلحات الأساسية التي نحتاجها لتنفيذ المهمة (سنتحدث عنها بعد ذلك بقليل) في الحياة.
البلوتوث
معيار لاسلكي لاسلكي يربط أنواع مختلفة من الأجهزة لمسافات قصيرة. للتحكم في الغدد من خلال Web Bluetooth API ، نحن بحاجة إلى Bluetooth v4.0.
جات
السمات العامة هي شجرة بث مستمر لقدرات جهاز بلوتوث.
الخدمات
هناك خدمات داخل جهاز البلوتوث. الخدمة نفسها هي مجموعة من الميزات والعلاقات مع الخدمات الأخرى. كل خدمة لها UID واسم خاص بها. غالبًا ما تظهر "الخدمات غير المعروفة". هذا يرجع إلى حقيقة أن عدد الأجهزة وحالات استخدامها كبير.
الخصائص
يوجد داخل كل خدمة خصائص يمكنك من خلالها كتابتها وقراءتها والاشتراك فيها أيضًا. تحتوي الميزة أيضًا على UID الخاص بها.
التحدي
كمهمة ، اخترت تنفيذ موقع يمكنه:
- قم بإضاءة مصابيح LED بألوان مختلفة وأطفئها.
- جعل المصابيح تلمع بألوان مختلفة.
وكما يمكنك أن تفهم من بيان المشكلة ، تحتاج إلى معرفة كيفية الاتصال وفصل جهاز بلوتوث.
مكونات
لإكمال المهمة ، اخترت القائمة التالية من الضروري:
- اردوينو
- وحدة بلوتوث v4.0 (HM-10 في حالتي).
- مصباحان من ثلاثة ألوان.
- اللوح.
- توصيل الأسلاك.
- المقاومات
هذه القائمة ليست صارمة للتنفيذ. أنا متأكد من أنه يمكنك استبدال Arduino بشيء آخر واختيار وحدة بلوتوث مختلفة. لكن المقالة ستأخذ في الاعتبار التفاعل مع هذه المكونات.
كيف يجب أن تعمل
باختصار ، الجوهر هو هذا: نقوم بالاتصال بوحدة البلوتوث ونرسل رمزًا معينًا (من 1 إلى 4 شاملاً). إذا كان الرمز صالحًا ، يضيء أحد الألوان الثلاثة ، أو تومض مؤشرات LED بجميع الألوان الممكنة (الأحمر والأخضر والأزرق) لبعض الوقت.
الطبخ
تحتاج أولاً إلى جمع مخطط عمل وتحميل رسم اردوينو. أدناه أعطي الدائرة (الشكل 1) ورمز الرسم الذي حصلت عليه.
التين. 1 (مخطط التجميع)
#include <SoftwareSerial.h> int green_pin = 2; int red_pin = 3; int blue_pin = 4; int BLINK_STEPS = 3; int BLINK_DELAY = 100; SoftwareSerial mySerial(7, 8); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); pinMode(green_pin, OUTPUT); pinMode(red_pin, OUTPUT); pinMode(blue_pin, OUTPUT); } int code; void loop() { if (mySerial.available()) { code = mySerial.read(); shutDownAll(); if (code > 0 && code < 5) { analogWrite(code, 200); } if (code == 1) { blinked(); } } } void shutDownAll() { analogWrite(green_pin, 0); analogWrite(red_pin, 0); analogWrite(blue_pin, 0); } void blinked() { int steps = 0; while(steps <= BLINK_STEPS) { analogWrite(green_pin, 200); delay(BLINK_DELAY); analogWrite(green_pin, 0); delay(BLINK_DELAY); analogWrite(red_pin, 200); delay(BLINK_DELAY); analogWrite(red_pin, 0); delay(BLINK_DELAY); analogWrite(blue_pin, 200); delay(BLINK_DELAY); analogWrite(blue_pin, 0); delay(BLINK_DELAY); steps += 1; } }
الطهي الأخير
لذا ، قمنا بتنزيل الرسم التخطيطي ، وقمنا بتوصيل الدائرة بالطاقة. ما هي الخطوة التالية؟ للعمل مع Web Bluetooth API ، نحتاج إلى معرفة اسم الجهاز الخاص بنا ، والخدمة التي نريد الوصول إليها. يمكنك استخدام تطبيق "nRF Connect" لهذا الغرض.
نقوم بتشغيل التطبيق ونرى قائمة بأجهزة البلوتوث القريبة منا (الشكل 2).
التين. 2 (قائمة الأجهزة التي وجدها التطبيق)
الجهاز الذي يحمل اسم "CC41-A" أثار اهتمامي وليس عبثا.
بعد الاتصال بالجهاز ، تتاح لنا قائمة بخدماته (الشكل 3). من غير المحتمل أن نجد شيئًا مثيرًا للاهتمام في "معلومات الجهاز" ، لذلك نضغط بجرأة على "خدمة غير معروفة".
التين. 3 (قائمة خدمات الجهاز)
في لقطة الشاشة أدناه (الشكل 4) ، يمكنك ملاحظة أهم شيء بالنسبة لنا: الكتابة إلى الخاصية وقراءتها.
عندما قمت بحل المشكلة الموضحة أعلاه ، حاولت إرسال القيمة "2" إلى الخاصية. ونتيجة لذلك ، بدأ زوجي من مصابيح LED يتحول إلى اللون الأخضر. يكاد يكون ناجحا. الآن نحن بحاجة إلى القيام بالشيء نفسه ، ولكن ليس من خلال تطبيق محمول ، ولكن من خلال متصفح.
التين. 4 (خاصية غير معروفة)
فيما يلي قائمة بالبيانات التي تلقيناها من التطبيق لمتابعة المهمة:
- اسم الجهاز.
- UID للخدمة.
- خصائص UID.
تنفيذ الويب
قبل البدء في كتابة كود JavaScript ، هناك بضع نقاط يجب ملاحظتها:
- واجهة برمجة التطبيقات (API) تجريبية.
- يعمل في Chrome و Samsung Internet.
- مطلوب اتصال عبر HTTPS.
- لن أعطي أمثلة على كود HTML و CSS ، لأنه في إطار هذه المقالة لا يوجد شيء مثير للاهتمام فيها ، لكني سأترك رابطًا إلى المستودع والموقع الإلكتروني في نهاية المقالة.
جافا سكريبت
العمل مع Web Bluetooth API مبني على Promise. أدناه سأعطي أمثلة كود مرحلية. يمكن العثور على كود المصدر الكامل في المستودع الذي سيتم ترك الرابط إليه.
نحتاج أولاً إلى الاتصال بالجهاز. نطلب الأجهزة وفي المرشح ننقل اسم الجهاز ومعرف الخدمة UID الذي سنعمل به. إذا لم تحدد الخدمة مقدمًا ، فلن يكون من الممكن في المستقبل التفاعل معها.
navigator.bluetooth.requestDevice({ filters: [ { name: MY_BLUETOOTH_NAME }, { services: [SEND_SERVICE] }, ] })
بعد النقر فوق الزر "اتصال" ، ستفتح نافذة (الشكل 5) ، حيث تحتاج إلى تحديد جهاز والنقر على زر الاتصال.
التين. 5 (نافذة مع جهاز يمكن الوصول إليه للاتصال)
عند الاتصال ، يتم إرجاع وعد يحتوي على "جهاز" ، والذي يمكنك الاتصال به. حسنًا ، لنكتبها في متغير وننشئ اتصالاً.
.then(device => { myDevice = device; return device.gatt.connect(); })
بعد ذلك ، يتم إرجاع وعد يحتوي على "خادم" إلينا. ثم نطلب "خدمة" من "الخادم" ، وننقل هناك معرف الخدمة (الذي تجسسنا عليه من خلال التطبيق). ثم نحصل على وعد يحتوي على "خدمة" ، نطلب منها "مميزة" ، ونمرره UID (الذي نظرنا إليه أيضًا من خلال التطبيق).
.then(server => server.getPrimaryService(SEND_SERVICE)) .then(service => service.getCharacteristic(SEND_SERVICE_CHARACTERISTIC))
والآن فقط يمكننا البدء في فعل شيء ما. على سبيل المثال ، أقوم بتخزين خاصية في متغير وأغلق معالجات النقر فوق الزر. في سمات البيانات الخاصة بهم تحتوي على رمز سيتم كتابته إلى السمة عند النقر عليه.
تحتوي معالجات النقر فوق الزر على التعليمات البرمجية التالية:
const code = Number(event.target.dataset.code); if (code === 1) { toggleLigthCharacteristic.writeValue(Uint8Array.of(code)); return; } toggleLigthCharacteristic.readValue() .then(currentCode => { const convertedCode = currentCode.getUint8(0); toggleLigthCharacteristic.writeValue( Uint8Array.of(convertedCode === code ? 0 : code) ); });
من الضروري تمرير صفيف uint8 إلى الصفة ، وبالتالي ، لتحويل الشفرة التي سيتم تمريرها إليها ، يجب عليك استخدام Uint8Array.
كما هو مخطط ، يتسبب الرمز 1 في وميض المصابيح بثلاثة ألوان ثم إيقاف تشغيلها. ولكن كيف يمكن إيقاف تشغيل LED إذا تم نقل الرمز 3 إليه ولا يزال LED قيد التشغيل؟ أو تشغيل لون مختلف؟
قرأت القيمة التي تكمن في الخاصية ، وقم بتحويلها باستخدام getUint8 ، وإذا كان الرمز مطابقًا ، فأرسل أي قيمة غير صالحة (على سبيل المثال ، 0). إذا كانت القيمة صالحة ، فسوف أحولها إلى وحدة الصفيف 8 وأكتبها إلى الصفة.
من أجل الحل النهائي للمهمة ، ما عليك سوى معرفة كيفية قطع الاتصال بالجهاز. لدينا بالفعل eventListener على زر "Disconnect" ، الذي يتم فيه فصل الجهاز عن جهاز البلوتوث ، وإزالة eventListeners ، وإخفاء أزرار التحكم ، وكتابة غير محدد إلى المتغيرات.
myDevice.gatt.disconnect(); toggleItemsEventListeners('removeEventListener'); toggleButtonsVisible(); toggleLigthCharacteristic = undefined; myDevice = undefined;
الملخص
لقد أنشأنا صفحة ويب بسيطة يمكنك من خلالها الاتصال بجهاز بلوتوث والتحكم فيه. كما ترون ، هذا بسيط جدًا. والأجهزة التي يمكنك تجميعها وإدارتها بهذه الطريقة مقيدة فقط بخيالك!
روابط مفيدة