- BLE (ब्लूटूथ कम ऊर्जा) से संबंधित शब्दावली
- हार्डवेयर तैयार करना
- गैट सेवा का उपयोग करते हुए बैटरी स्तर संकेत के लिए प्रोग्रामिंग ईएसपी 32
- ESP32 BLE पर अपनी GATT सेवा का परीक्षण करना
वायरलेस हेडफ़ोन, फिटनेस बैंड, ब्लूटूथ स्पीकर, इन-ईयर हेडफ़ोन, मोबाइल फोन, लैपटॉप… हमारे आस-पास बहुत सारे ब्लूटूथ डिवाइस हैं और इनमें से अधिकांश डिवाइस बैटरी संचालित हैं। क्या आपने कभी सोचा है कि, जब आप अपने मोबाइल फोन के लिए ब्लूटूथ डिवाइस को कनेक्ट करते हैं, तो यह कैसे स्वचालित रूप से समझता है कि कनेक्टेड डिवाइस कंप्यूटर या ऑडियो डिवाइस या मोबाइल फोन है? कुछ उपकरणों के लिए हमारा फोन अपने आप नोटिफिकेशन बार पर कनेक्टेड डिवाइस की बैटरी प्रतिशत को स्वचालित रूप से दिखाता है। यह सब अपने आप कैसे होता है? फ़ोन और ब्लूटूथ डिवाइस के बीच कुछ सामान्य प्रोटोकॉल साझा होने चाहिए!
जिज्ञासु बने रहें, आपको इन सवालों के जवाब मिल जाएंगे क्योंकि हम लोकप्रिय ES332 मॉड्यूल के साथ ब्लूटूथ लो एनर्जी (BLE फॉर शॉर्ट) को समझने की कोशिश करते हैं । ESP32 में क्लासिक ब्लूटूथ के विपरीत, BLE केवल तभी संचालित होता है जब कोई संचार सक्रिय होता है और स्लीप मोड में रहता है, अन्यथा यह बैटरी संचालित अनुप्रयोगों के लिए सही विकल्प बनाता है। बीएलई जाल नेटवर्क भी बना सकते हैं और बीकन के रूप में कार्य कर सकते हैं। आम तौर पर एक BLE मॉड्यूल सर्वर या क्लाइंट के रूप में काम करता है, यहाँ हम सर्वर के रूप में ESP32 BLE का उपयोग करेंगे।
यहां हमने आसानी से समझने के लिए पूर्ण ESP32 ब्लूटूथ को तीन खंडों में विभाजित किया है ।
1. मोबाइल फोन से ईएसपी 32 टॉगल एलईडी पर सीरियल ब्लूटूथ
२ । GATT सेवा का उपयोग करके मोबाइल फोन को बैटरी स्तर डेटा भेजने के लिए BLE सर्वर
3. बीएलई ग्राहक बीएलई उपकरणों के लिए स्कैन करने और बीकन के रूप में कार्य करने के लिए।
हमने पहले लेख को पहले ही कवर कर लिया है; इस लेख में हम जानेंगे कि सर्वर के रूप में काम करने के लिए ESP32 BLE कैसे बनाते हैं और बैटरी स्तर की जानकारी भेजने के लिए GATT सेवा का उपयोग करते हैं । परीक्षण के उद्देश्य से हम BLE GATT सेवा के माध्यम से अपने मोबाइल फोन को बैटरी प्रतिशत के रूप में ESP32 से हार्डकोडेड मान भेजेंगे, इस तरह हमारा मोबाइल यह मान लेगा कि ESP32 एक बैटरी चालित ब्लूटूथ डिवाइस है जो इसकी बैटरी प्रतिशत में भेजने का प्रयास कर रहा है। विस्तार में जाने से पहले हम ब्लूटूथ लो एनर्जी से संबंधित कुछ शब्दावली को समझेंगे।
BLE (ब्लूटूथ कम ऊर्जा) से संबंधित शब्दावली
BLE सर्वर: जैसा कि पहले बताया गया है कि BLE को सर्वर या क्लाइंट के रूप में काम करने के लिए प्रोग्राम किया जा सकता है। जब सर्वर के रूप में काम कर रहे BLE केवल डेटा प्रदान कर सकता है तो वह कनेक्शन शुरू नहीं कर सकता। उदाहरण एक फिटनेस बैंड होगा। यदि ग्राहक इसके लिए अनुरोध करता है तो ही सर्वर जानकारी भेज सकता है।
आमतौर पर ESP32 का BLE एक सर्वर का उपयोग करता है। प्रत्येक सर्वर के भीतर एक या एक से अधिक सेवा होगी और इसी तरह प्रत्येक सेवा में एक या एक से अधिक विशेषताएँ होंगी। एक विशेषता के अंदर शून्य, एक या एक से अधिक डिस्क्रिप्टर हो सकते हैं। हर सेवा, विशेषता या विवरणिका की अपनी पूर्व निर्धारित यूनिक आईडी होगी जिसे यूयूआईडी कहा जाता है।
BLE Client: क्लाइंट कनेक्ट और अन्य ब्लूटूथ डिवाइसों को सुन सकता है। एक उदाहरण आपका मोबाइल फोन होगा। ध्यान दें कि अधिकांश BLE हार्डवेयर डिवाइस सर्वर और क्लाइंट के रूप में काम कर सकते हैं, यह सॉफ्टवेयर है जो डिवाइस की भूमिका तय करता है।
परिधीय उपकरण / केंद्रीय उपकरण: BLE नेटवर्क में केवल एक केंद्रीय उपकरण हो सकता है, लेकिन आवश्यकता के अनुसार कई परिधीय उपकरण हो सकते हैं। सेंट्रल डिवाइस एक ही समय में सभी परिधीय उपकरणों से जुड़ सकता है, लेकिन परिधीय उपकरण केवल केंद्रीय डिवाइस से जुड़ सकता है, इस तरह से कोई भी दो परिधीय उपकरण एक दूसरे के बीच डेटा साझा नहीं कर सकते हैं। सेंट्रल डिवाइस के लिए एक सबसे अच्छा उदाहरण हमारे स्मार्ट फोन होंगे और पेरिफेरल डिवाइस के लिए हमारा ब्लूटूथ ईयरफोन या फिटनेस बैंड होगा।
BLE विज्ञापन: एक BLE विज्ञापन ब्लूटूथ डिवाइस को सभी को दिखाई देने का निर्देश देने के लिए geeky शब्द है ताकि यह एक कनेक्शन को जोड़ और स्थापित कर सके। इसे एक तरह से संचार माना जा सकता है। यहां सर्वर विज्ञापन डेटा को प्राप्त करने के लिए सर्वर से अपेक्षा करता रहता है। BLE बीकन BLE का एक प्रकार है।
UUID (यूनिवर्सल यूनिक आइडेंटिफ़ायर): प्रोग्रामर द्वारा प्रोग्राम किए जाने पर हर BLE ब्लूटूथ डिवाइस को यूनिवर्सल यूनीक आइडेंटिफ़ायर नंबर दिया जाता है। आप इस पहचानकर्ता को संख्याओं के अनुक्रम के रूप में सोच सकते हैं जो BLE डिवाइस की कार्यक्षमता / भूमिका का प्रतिनिधित्व करता है। फिर से दो प्रकार के यूयूआईडी हैं। एक सेवा यूयूआईडी है और दूसरी विशेषता यूयूआईडी है ।
GATT सेवा: GATT का मतलब जेनेरिक एट्रीब्यूट प्रोफाइल है; यह कुछ मानक तरीकों को परिभाषित करता है जिनके उपयोग से दो बीएलई उपकरणों को हमेशा संवाद करना चाहिए। यह विशेषता (एटीटी) प्रोटोकॉल पूर्व-परिभाषित है और सभी बीएलई उपकरणों के लिए सामान्य है, इसलिए इस तरह से कोई भी दो बीएलई उपकरण एक दूसरे की पहचान कर सकते हैं। तो GATT हमारे पिछले प्रश्न का उत्तर था।
जिस तकनीक का उपयोग करके दो बीएलई डिवाइस को डेटा भेजना चाहिए, उसे सेवा और विशेषताओं नामक अवधारणा द्वारा परिभाषित किया गया है।
BLE सेवा / BLE विशेषता: सेवा UUID हमें बताती है कि BLE डिवाइस किस प्रकार की सेवा करने जा रही है और विशेषता UUID बताती है कि उस सेवा द्वारा किए जाने वाले पैरामीटर या फ़ंक्शन क्या हैं। इसलिए हर सेवा में उनके अधीन एक या अधिक विशेषताएं होंगी। ठीक है! प्रोग्रामर को यह UUID कहां से मिलता है? प्रत्येक यूयूआईडी को पहले से ही गैट (जेनेरिक एट्रीब्यूट प्रोफाइल) द्वारा परिभाषित किया गया है आप उनकी वेबसाइट पर जा सकते हैं और परियोजना के लिए आवश्यकतानुसार यूयूआईडी का चयन कर सकते हैं। मुझे पता है कि यह हमारे सिर पर थोड़ा उछल गया है; आइए इसे एक उदाहरण से समझने की कोशिश करें।
मान लें कि एक ऑडियो प्लेयर का BLE डिवाइस है। प्रारंभ में जब आप इसे अपने फ़ोन से जोड़ते हैं, तो आपका फ़ोन इसे एक ऑडियो डिवाइस के रूप में पहचानता है और स्टेटस बार पर बैटरी स्तर को भी प्रदर्शित करता है। तो, ऐसा होने के लिए ऑडियो प्लेयर को किसी तरह अपने फोन को बताना होगा कि यह बैटरी स्तर और बैटरी में इसके चार्ज का प्रतिशत साझा करने के लिए तैयार है। यह यूयूआईडी का उपयोग करके किया जाता है, एक विशिष्ट यूयूआईडी है जो बताता है कि बीएलई पासा बैटरी स्तर के बारे में विवरण प्रदान करने जा रहा है यह यूयूआईडी जो सेवा के प्रकार को सेवा यूयूआईडी कहा जाता है , फिर से इतने सारे हो सकते हैं एक सेवा को पूरा करने के लिए आदान-प्रदान किया जा सकता है जैसे कि बैटरी का मूल्य ऐसे पैरामीटर पर है, प्रत्येक पैरामीटर का अपना यूयूआईडी होगा और इन्हें विशेषता यूयूआईडी कहा जाता है ।एक विशेषता द्वारा किया जाने वाला सामान्य कार्य है Read, Write, Notify और Indicate।
BLE Descriptor: Descriptor एक वैकल्पिक विशेषता है जो विशेषता के अंदर मौजूद है। एक वर्णनात्मकता सामान्य रूप से निर्दिष्ट करती है कि किस तरह से एक विशेषता का उपयोग किया जाए।
BLE बीकन: एक ब्लूटूथ बीकन एक निकटता स्विच की तरह है जो उपयोगकर्ता को एक सीमा (करीब निकटता) में ले जाने पर कुछ पूर्व-परिभाषित क्रिया करता है। यह हर समय अपनी पहचान का विज्ञापन करता है और इसलिए हमेशा जोड़ी बनाने के लिए तैयार है।
BLE2902: मैं अभी भी इस चीज़ के बारे में उलझन में हूँ, लेकिन आप इसे क्लाइंट साइड पर सॉफ़्टवेयर के एक टुकड़े के रूप में सोच सकते हैं जो सर्वर को सूचना को चालू या बंद करने की सूचना देता है, इससे हमें बिजली बचाने में मदद मिलेगी
आशा है कि आपको एक अच्छा विचार मिला, अच्छा यह है कि हमें ज्यादा जानकारी की आवश्यकता नहीं है क्योंकि सभी हैंडवर्क पहले से ही हमारे लिए किया गया है, हालांकि पुस्तकालयों।
हार्डवेयर तैयार करना
प्रोजेक्ट को किसी हार्डवेयर सेट-अप की आवश्यकता नहीं है, लेकिन सुनिश्चित करें कि आपने अपने Arduino IDE पर ESP32 बोर्ड विवरण जोड़ा है और यह जांचने के लिए न्यूनतम नमूना ब्लिंक प्रोग्राम की कोशिश की है कि क्या सब कुछ अपेक्षित है। आपको यह करने में संदेह है कि आप ऐसा कैसे कर सकते हैं कि ESP32 के साथ आरंभ करने के लिए Arduino ट्यूटोरियल के साथ भी ऐसा ही कर सकते हैं।
इसके अलावा BLE सेवाओं का परीक्षण करने के लिए हम अपने मोबाइल पर nRF Android एप्लिकेशन का उपयोग करेंगे, जिसे सीधे PlayStore से डाउनलोड किया जा सकता है। यह आईफोन यूजर्स के लिए Itunes Store में भी उपलब्ध है। यदि आप BLE के साथ लंबे समय तक काम करने की योजना बना रहे हैं, तो यह एप्लिकेशन डिबगिंग उद्देश्यों के लिए वास्तव में काम आएगा।
गैट सेवा का उपयोग करते हुए बैटरी स्तर संकेत के लिए प्रोग्रामिंग ईएसपी 32
इस समय तक मैं मान लेता हूं कि आपके पास GATT सेवा और सेवा और विशिष्ट मॉडलों का उपयोग करके इसे कैसे लागू किया जाता है, इस बारे में एक उचित विचार है। अब, हम यह जानने के लिए कार्यक्रम में गोता लगाएँ कि यह Arduino IDE का उपयोग करके ESP32 में कैसे लागू किया जाता है। इससे पहले कि हम जारी रखें मैं अपने वीडियो BLE के लिए एंड्रियास स्पीस को धन्यवाद देने के लिए इस स्थान का उपयोग करना चाहूंगा, जिसने चीजों को मेरी तरफ बहुत स्पष्ट कर दिया।
हम अपने स्केच में आवश्यक पुस्तकालयों को आयात करके कार्यक्रम शुरू करते हैं। ईएसपी 32 की बीएलई कार्यक्षमता का उपयोग करने के लिए कॉन्फ़िगर करने के लिए बहुत सी चीजें हैं, हालांकि उम्मीद है कि नील कोलबन के लिए धन्यवाद जिन्होंने पहले ही हमारे लिए कड़ी मेहनत की है और पुस्तकालयों को प्रदान किया है। यदि आप पुस्तकालयों की कार्यक्षमता को समझना चाहते हैं तो आप जीथब पृष्ठ पर उनके प्रलेखन का उल्लेख कर सकते हैं।
#शामिल
अगला हमें अपने ब्लूटूथ डिवाइस के लिए सर्वर कॉल-बैक फ़ंक्शन को परिभाषित करना होगा। इससे पहले कि यह समझने दें कि BLE में कॉलबैक फ़ंक्शन क्या है।
BLE में कॉलबैक फ़ंक्शन क्या है?
जब BLE सर्वर के रूप में काम कर रहा है तो सर्वर कॉलबैक फ़ंक्शन को परिभाषित करना महत्वपूर्ण है। BLE के साथ कई प्रकार के कॉलबैक जुड़े हैं, लेकिन इसे सरल बनाने के लिए आप इन पर विचार करें क्योंकि कार्रवाई पूरी हो गई है, यह सुनिश्चित करने के लिए एक पावती के रूप में प्रदर्शन किया जा रहा है। सर्वर कॉलबैक का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि क्लाइंट और सर्वर के बीच कनेक्शन सफलतापूर्वक स्थापित हो ।
हम सर्वर कॉलबैक करने के लिए कोड की निम्न पंक्तियों का उपयोग करते हैं।
bool _BLEClientConnected = false; वर्ग MyServerCallbacks : सार्वजनिक BLEServerCallbacks { शून्य onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; शून्य onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
शून्य सेटअप फ़ंक्शन के अंदर, हम डीबगिंग के लिए 115200 पर सीरियल संचार आरंभ करते हैं और फिर ब्लूटूथ डिवाइस को InitBLE फ़ंक्शन के माध्यम से आरंभ करते हैं।
शून्य सेटअप () { Serial.begin (115200); Serial.println ("बैटरी स्तर संकेतक - BLE"); InitBLE (); }
InitBLE जगह है जहाँ सब जादू होता है। हमें एक ब्लूटूथ सर्वर बनाना होगा और यहां बैटरी स्तर सेवा का उपयोग करना होगा । लेकिन इससे पहले हमें बैटरी स्तर को पढ़ने के लिए UUID for Service, Characteristic और Descriptor को परिभाषित करना होगा। सभी यूयूआईडी ब्लूटूथ गैट सेवा वेबसाइट से प्राप्त किए जा सकते हैं। हमारे मामले के लिए हम बैटरी सेवा का उपयोग करने की कोशिश कर रहे हैं और इसके लिए UUID को 0X180F के रूप में परिभाषित किया गया है जैसा कि नीचे दिखाया गया है।
इसके बाद, हमें इस सेवा से जुड़ी विशेषता को जानना होगा । यह जानने के लिए कि बस बैटरी सेवा पर क्लिक करें और आपको सेवा विशेषताओं पृष्ठ पर ले जाया जाएगा, जहाँ यह उल्लेख किया गया है कि बैटरी स्तर विशेषताओं का नाम है और यह 0 से 100 तक के मूल्य में लेता है। यह भी ध्यान दें कि हम केवल दो प्रदर्शन कर सकते हैं इस विशेषता के साथ, एक को पढ़ना है जो करना अनिवार्य है और दूसरा सूचित करना है जो वैकल्पिक है। इसलिए हमें ग्राहक (फोन) को बैटरी मूल्य भेजना होगा जो अनिवार्य है और यदि आवश्यक हो तो हम फोन को सूचित कर सकते हैं जो वैकल्पिक है।
लेकिन रुकिए हमें अभी भी विशेषता बैटरी स्तर के लिए UUID मान नहीं मिला है । ऐसा करने के लिए बैटरी विशेषता पृष्ठ पर जाएं और बैटरी स्तर नाम की खोज करें, आपको इसका UUID 0X2A19 के रूप में मिलेगा, उसी का स्नैपशॉट नीचे दिखाया गया है।
अब जब हमारे पास सभी मान हैं, तो हम इसे नीचे दिखाए अनुसार कार्यक्रम डाल सकते हैं। नाम BatterySerivce , BatteryLevelCharacteristic और BatteryLevelDescriptor उपयोगकर्ता परिभाषित चर सेवा, चरित्र और वर्णनकर्ता का उल्लेख करते हैं जो हम प्रोग्राम में उपयोग कर रहे हैं। Descriptor 0X2901 के मान का उपयोग तब किया जाता है जब मूल्य का आकार 8-बिट होता है, अधिक जानकारी Descriptor विवरण पृष्ठ पर पाई जा सकती है।
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19)), BLECharacteristic :: PROPERTY_READ - BLECharacteristic (PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
InitBLE फ़ंक्शन को वापस मिल रहा है । हमें पहले BLE सर्वर शुरू करना है और इसे एक नाम के साथ विज्ञापन देना है। निम्नलिखित लाइनों सर्वर के रूप में BLE शुरू करने के लिए उपयोग किया जाता है । मैंने अपने बीएलई सर्वर को जो नाम दिया है वह "बीएलई बैटरी" है, लेकिन आप अपना खुद का चयन कर सकते हैं।
BLEDevice:: init ("BLE Battery"); // BLE सर्वर BLEServer * pServer = BLEDevice:: createServer () बनाएँ; pServer-> setCallbacks (नई MyServerCallbacks ());
आगे हमें गैट सेवा शुरू करनी होगी क्योंकि हमने पहले से ही यूयूआईडी को परिभाषित कर लिया है हम नीचे दी गई लाइन का उपयोग करके सेवा शुरू कर सकते हैं।
// BLE सेवा BLEService * pBattery = pServer-> createService (BatteryService) बनाएँ;
एक बार सेवा शुरू होने के बाद हम विवरणक को विशेषताओं के साथ जोड़ सकते हैं , और मान सेट कर सकते हैं । BLE2902 सेवा को यहाँ भी जोड़ा गया है जैसा कि नीचे दिखाया गया है।
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("प्रतिशत 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (नया BLE2902 ());
अंत में सब कुछ सेट हो गया है, अब जो कुछ बचा है वह ईएसपी 32 को विज्ञापन देने के लिए कहना है ताकि हमारे फोन जैसे अन्य डिवाइस इसे खोज सकें और इसे कनेक्ट कर सकें, और क्लाइंट से कनेक्ट होने पर इसे बैटरी सेवा शुरू करनी चाहिए जो हालांकि की जा सकती है निम्नलिखित पंक्तियों।
pServer-> getAdolars () -> addServiceUUID (BatteryService); pBattery-> start (); // प्रारंभ विज्ञापन pServer-> getAdolars () -> start ();
यह इतना अच्छा है कि अंतिम चरण, डिस्क्रिप्टर को यह बताने के लिए है कि प्रतिशत में बैटरी का मूल्य क्या है जो क्लाइंट (फोन) को भेजा जाना चाहिए । यह मान 0 -100 से हो सकता है जैसा कि हम पहले पढ़ चुके हैं, चीजों को सरल रखने के लिए, मेरे पास साधारण हार्ड कोडेड बैटरी का मूल्य 57 है और फिर इसे हर 5 सेकंड में बढ़ाएँ और 0 से शुरू होकर 100 तक पहुँचने के बाद कोड करें। वह नीचे दिखाया गया है। ध्यान दें कि जो मूल्य भेजा जा रहा है, वह प्रारूप unit8_t में है।
uint8_t स्तर = 57; शून्य लूप () { BatteryLevelCharacteristic.setValue (& स्तर, 1); BatteryLevelCharacteristic.notify (); देरी (5000); स्तर ++; सीरीयल.प्रिंट (इंट (स्तर)); if (int (level) == 100) level = 0; }
ESP32 BLE पर अपनी GATT सेवा का परीक्षण करना
ऊपर बताया गया पूरा कोड पृष्ठ के अंत में दिया जाता है । अपने ESP32 बोर्ड को कोड अपलोड करें। एक बार अपने फोन को अपलोड करने के बाद इसके साथ "BLE बैटरी" जोड़ी नामक एक ब्लूटूथ डिवाइस की खोज करनी चाहिए।
फिर एनआरएफ एंड्रॉइड एप्लिकेशन इंस्टॉल करें और इसे खोलें और बीएलई बैटरी बीएलई डिवाइस से कनेक्ट करें। बैटरी सेवा अनुभाग का विस्तार करें और आपको निम्न स्क्रीन मिलनी चाहिए।
जैसा कि आप देख सकते हैं कि एप्लिकेशन ने स्वचालित रूप से पहचान की है कि बीएलई बैटरी सेवा प्रदान करता है और यूयूआईडी के कारण बैटरी स्तर की विशेषताएं हैं जो हमने कार्यक्रम में उपयोग की थीं। आप यह भी देख सकते हैं कि वर्तमान बैटरी मूल्य जो कि 5 सेकंड के लिए 67% प्रतीक्षा है और आप इसे बढ़ा हुआ होने की सूचना भी दे सकते हैं।
BLE का उपयोग करने के बारे में अच्छी बात यह है कि अब कोई भी एप्लिकेशन जो BLE के साथ काम करता है, वह सोचेगा कि आपका ESP32 BLE डिवाइस है जो बैटरी स्तर को नोट कर रहा है। इसे आज़माने के लिए मैंने बैटन नामक एक एप्लिकेशन का उपयोग किया और एप्लिकेशन ने ESP32 को बैटरी चालित ब्लूटूथ डिवाइस के रूप में पहचाना और इस तरह अपने फोन पर प्रतिशत सूचना दी
ठंडा!! सही? मैंने नीचे दिए गए वीडियो में पूरा काम भी दिखाया है । अब, जब आपने ईएसपी 32 के साथ बीएलई बैटरी सेवाओं का उपयोग करना सीख लिया है, तो आप अन्य जीएटीटी सेवाओं की कोशिश कर सकते हैं जो पल्स रेट, छिपाई, हृदय गति आदि की तरह बहुत दिलचस्प हैं। मज़े करें…।