इसे चित्रित करें: आप एक कैफे में बैठे हैं, लैपटॉप खुला है, फोन टेबल पर, स्मार्टवॉच हर कुछ मिनट में बज रही है, और ब्लूटूथ इयरबड्स संगीत बजा रहे हैं। आपके दृष्टिकोण से, जीवन शांतिपूर्ण है। आपके फोन के दृष्टिकोण से, यह हर समय छोटे ब्लूटूथ पैकेट की एक हास्यास्पद संख्या को जॉगल कर रहा है।
हर बार जब आपकी घड़ी आपके कदम सिंक करती है, हर बार जब आपके इयरबड्स ऑडियो का एक और टुकड़ा प्राप्त करते हैं, हर बार जब एक बैकग्राउंड डिवाइस चेक इन करता है - आपके फोन के अंदर मुख्य एप्लिकेशन प्रोसेसर को जागने, डेटा को देखने, यह तय करने के लिए मजबूर किया जाता है कि इसके साथ क्या करना है, और फिर वापस सो जाना। ऐसा कुछ हजार बार करें, और अचानक वह अच्छी 5000 mAh बैटरी संदिग्ध रूप से छोटी महसूस होने लगती है।
एंड्रॉइड इंजीनियरों ने इस पैटर्न को देखा और मूल रूप से कहा, क्या होगा अगर हम हर छोटी ब्लूटूथ चीज के लिए बड़े CPU को नहीं जगाते? क्या होगा अगर हमारे पास एक छोटा सहायक मस्तिष्क होता जिसका पूरा काम उबाऊ दोहराव वाले ब्लूटूथ ट्रैफिक को संभालना होता जबकि मुख्य CPU आराम करता? यहीं लो पावर आइलैंड की अवधारणा आती है, जिसे आमतौर पर LPI कहा जाता है।
आधुनिक एंड्रॉइड ब्लूटूथ आर्किटेक्चर में, विशेष रूप से AOSP 16 पीढ़ी से आगे, ब्लूटूथ काम का एक अच्छा हिस्सा एक समर्पित लो पावर प्रोसेसर पर ऑफलोड किया जा सकता है जो ब्लूटूथ रेडियो के करीब बैठता है। यह छोटा प्रोसेसर ब्लूटूथ कंट्रोलर या SoC में एम्बेडेड होता है और बहुत कुशलता से चलने के लिए डिज़ाइन किया गया है। यह मुख्य CPU की तुलना में बहुत कम बिजली की खपत करता है और एक पूर्ण एप्लिकेशन प्रोसेसर की तरह आपकी बैटरी को खत्म किए बिना जागा रह सकता है। एंड्रॉइड का काम यह तय करना है कि कौन सा ट्रैफिक इस द्वीप पर रह सकता है और कौन सा ट्रैफिक अभी भी मुख्य CPU की आवश्यकता है।
लेकिन एंड्रॉइड व्यवहार में यह निर्णय कैसे लेता है? यहीं ब्लूटूथ सॉकेट और कुछ जिसे BluetoothSocketSettings कहा जाता है कहानी में प्रवेश करते हैं।
एक नियमित ऐप में, जब आप एक BluetoothSocket खोलते हैं, तो ऐसा लगता है जैसे आप केवल एक पाइप खोल रहे हैं ताकि आप बाइट्स भेज और प्राप्त कर सकें। हुड के नीचे हालांकि, फ्रेमवर्क एक बहुत गहरा सवाल पूछ रहा है: क्या यह पाइप मुख्य राजमार्ग से गुजरना चाहिए जो मुख्य CPU को जगाता है, या क्या इस पाइप को सीधे लो पावर आइलैंड के निजी सड़क नेटवर्क में जोड़ा जा सकता है?
नवीनतम AOSP ब्लूटूथ स्टैक में, उस प्रश्न का उत्तर एक छोटे कॉन्फ़िगरेशन ऑब्जेक्ट के माध्यम से व्यक्त किया जाता है: BluetoothSocketSettings। यह क्लास सिस्टम-लेवल कोड को यह वर्णन करने देती है कि एक सॉकेट को कैसे व्यवहार करना चाहिए। यह निर्दिष्ट कर सकता है कि डेटा को सामान्य होस्ट पथ पर रखा जाना चाहिए या हार्डवेयर डेटा पथ में ऑफलोड किया जाना चाहिए जो लो पावर प्रोसेसर पर समाप्त होता है।
अंदर, DATA_PATH_NO_OFFLOAD और DATA_PATH_HARDWARE_OFFLOAD जैसे फील्ड हैं, साथ ही अतिरिक्त जानकारी जैसे hubId, endpointId, और requestedMaximumPacketSize जो कंट्रोलर को LPI दुनिया में पैकेट को कैसे रूट करना है यह समझने में मदद करते हैं।
बाहर से, यह अभी भी लगता है जैसे आप एक सामान्य BluetoothSocket के साथ काम कर रहे हैं। ब्लूटूथ फ्रेमवर्क के अंदर हालांकि, उस सॉकेट को अब अतिरिक्त मेटाडेटा के साथ टैग किया गया है जो चुपचाप ब्लूटूथ स्टैक को बताता है: यह वाला खास है, इसे द्वीप पर भेजें।
होस्ट स्टैक तब ब्लूटूथ सिस्टम में कोड की एक नई लेयर से बात करता है जिसे LPP ऑफलोड मैनेजर और एक सॉकेट-विशिष्ट HAL (हार्डवेयर एब्स्ट्रैक्शन लेयर) कहा जाता है ताकि लो पावर प्रोसेसर को सूचित किया जा सके जब भी एक सॉकेट खोला या बंद किया जाता है, और डेटा को संभालने की जिम्मेदारी ले सके।
तो अगर हम कैफे की अनुमान को रखते हैं, तो पहले हर ब्लूटूथ ग्राहक अपना ऑर्डर सीधे मुख्य बरिस्ता पर चिल्लाता था। लो पावर आइलैंड और BluetoothSocketSettings के साथ, एंड्रॉइड कह सकता है, "ये नियमित एस्प्रेसो ऑर्डर साइड काउंटर पर जूनियर बरिस्ता के माध्यम से जा सकते हैं। केवल अजीब कस्टम ड्रिंक अभी भी मुख्य बरिस्ता के पास जाते हैं"। यूजर के लिए वही ब्लूटूथ अनुभव, लेकिन काउंटर के पीछे बहुत कम अराजकता और बहुत कम बर्बाद ऊर्जा।
इस लेख में, हम इस उच्च-स्तरीय कहानी से वास्तविक एंड्रॉइड API में ज़ूम इन करेंगे। हम देखेंगे कि BluetoothSocketSettings फ्रेमवर्क में कैसे परिभाषित है, आप हार्डवेयर ऑफलोड का अनुरोध कैसे करते हैं, और hubId और endpointId जैसे उन डरावने दिखने वाले फील्ड का वास्तव में सादे अंग्रेजी में क्या मतलब है।
विषय सूची
BluetoothSocketSettings की शारीरिक रचना
HAL के अंदर: ब्लूटूथ ऑफलोड वास्तव में कैसे काम करता है
जब CPU सोता है लेकिन ब्लूटूथ नहीं: एक्शन में पावर मैनेजमेंट
डेवलपर्स BluetoothSocketSettings का उपयोग कैसे कर सकते हैं
ग्रैंड फिनाले: स्मार्टली सोने की सुंदरता
BluetoothSocketSettings की शारीरिक रचना
अब तक हम BluetoothSocketSettings के बारे में बात कर रहे हैं जैसे कि यह कोई जादुई टिकट है जो आपके पैकेट को आपके फोन के अंदर कहीं एक धूप वाले लो-पावर द्वीप पर भेजता है। अब आइए वास्तव में देखें कि वह टिकट कोड में कैसा दिखता है।
यदि आप एंड्रॉइड ओपन सोर्स प्रोजेक्ट ट्री खोलते हैं और फ्रेमवर्क लेयर पर नेविगेट करते हैं, तो आपको frameworks/base/core/java/android/bluetooth/BluetoothSocketSettings.java के तहत छिपा एक क्लास परिभाषा मिलेगी। पहली नज़र में यह छोटा दिखता है, लगभग उस चीज़ के लिए बहुत सरल जो आपको इतनी बैटरी बचाती है। लेकिन यह छोटा क्लास उन गुप्त निर्देशों को ले जाता है जो ब्लूटूथ स्टैक को बताते हैं कि आपके सॉकेट का डेटा कहाँ प्रवाहित होना चाहिए।
यहाँ एक स्ट्रिप-डाउन संस्करण कैसा दिखता है:
public final class BluetoothSocketSettings implements Parcelable { public static final int DATA_PATH_NO_OFFLOAD = 0; public static final int DATA_PATH_HARDWARE_OFFLOAD = 1; private int mDataPath; private int mHubId; private int mEndpointId; private int mRequestedMaxPacketSize; public BluetoothSocketSettings(int dataPath, int hubId, int endpointId, int requestedMaxPacketSize) { mDataPath = dataPath; mHubId = hubId; mEndpointId = endpointId; mRequestedMaxPacketSize = requestedMaxPacketSize; } public int getDataPath() { return mDataPath; } public int getHubId() { return mHubId; } public int getEndpointId() { return mEndpointId; } public int getRequestedMaxPacketSize() { return mRequestedMaxPacketSize; } } जब एंड्रॉइड ब्लूटूथ में एक नया सॉकेट बनाया जाता है, तो सिस्टम या विशेषाधिकार प्राप्त सेवा इन सेटिंग्स ऑब्जेक्ट में से एक को स्टैक में पास कर सकती है। मुख्य लाइन DATA_PATH_HARDWARE_OFFLOAD है। वह स्विच है जो ब्लूटूथ सिस्टम को बताता है, अरे, इस ट्रैफिक को कंट्रोलर के माइक्रोप्रोसेसर पर रखने की कोशिश करो बजाय मुख्य CPU को जगाने के।
hubId और endpointId द्वीप पर पते की तरह हैं। वे फर्मवेयर को बताते हैं कि उस विशेष सॉकेट के लिए किस तार्किक पोर्ट या कतार का उपयोग करना है। requestedMaxPacketSize इसे बफर आवंटन को ट्यून करने में मदद करता है, ताकि यह थ्रूपुट और पावर दक्षता को संतुलित कर सके।
इस बिंदु पर आप सोच रहे होंगे, यह छोटा जावा ऑब्जेक्ट वास्तव में हार्डवेयर तक अपना रास्ता कैसे बनाता है? उत्तर HAL (हार्डवेयर एब्स्ट्रैक्शन लेयर) में निहित है। जब आप BluetoothSocket.connect() जैसा कुछ कॉल करते हैं, तो यह अंततः btif_sock.cc और btif_core.cc जैसी फ़ाइलों में नेटिव कोड के माध्यम से फ़नल करता है। वहां, आप निशान देखेंगे जैसे:
bt_status_t status = BTA_SockConnect(type, addr, channel, flags); if (settings.data_path == DATA_PATH_HARDWARE_OFFLOAD) { BTIF_TRACE_DEBUG("Configuring socket for hardware offload path"); BTA_SockSetOffloadParams(settings.hub_id, settings.endpoint_id); } यह स्निपेट सरल लग सकता है, लेकिन यह जिम्मेदारी में एक बड़े बदलाव का प्रतिनिधित्व करता है। हर पैकेट को होस्ट स्टैक तक भेजने के बजाय, ब्लूटूथ कंट्रोलर अब डेटा पथ का स्वामित्व दावा कर सकता है। SoC के अंदर ब्लूटूथ फर्मवेयर तब कार्यभार संभालेगा, पैकेट रीट्रांसमिशन, acknowledgments, और फ्लो कंट्रोल को लगातार मुख्य CPU को जगाए बिना संभालेगा।
यदि आप ऐसे कनेक्शन के दौरान अपने डिवाइस के कर्नेल लॉग की निगरानी करते हैं, तो आप कुछ ऐसा भी देख सकते हैं:
bt_vendor: enabling LPI offload for handle 0x0041 bt_controller: lpi path active, cpu wakelocks released वह लॉग लाइन आपकी शांत पुष्टि है कि डेटा पथ सफलतापूर्वक लो पावर आइलैंड पर चला गया है।
मानवीय शब्दों में, फोन ने अभी फैसला किया कि यह ब्लूटूथ बातचीत मिनी-प्रोसेसर द्वारा नियंत्रित होने के लिए पर्याप्त अनुमानित है, इसलिए इसने बड़े CPU को विनम्रता से कहा, "तुम अब झपकी ले सकते हो। मुझे यह मिल गया।"
अगले सेक्शन में हम इस यात्रा को एक स्तर और गहरा करेंगे, ठीक HAL और फर्मवेयर सीमा में, यह देखने के लिए कि ये सॉकेट सेटिंग्स कंट्रोलर चिप के अंदर वास्तविक लो-पावर डेटा रूटिंग में कैसे बदल जाती हैं। यहीं असली हार्डवेयर जादू होता है, और जहां बचत हर मिलीवाट एक समय में जुड़ना शुरू होती है।
HAL के अंदर: ब्लूटूथ ऑफलोड वास्तव में कैसे काम करता है
अब तक, हम ज्यादातर एंड्रॉइड के जावा और नेटिव लेयर में रहे हैं, वह आरामदायक अपार्टमेंट जहां फ्रेमवर्क और सिस्टम सेवाएं रहती हैं। लेकिन उसके नीचे चतुर मशीनरी से भरा एक बेसमेंट है: हार्डवेयर एब्स्ट्रैक्शन लेयर, या HAL। यह वह जगह है जहां एंड्रॉइड "ऑब्जेक्ट्स" में बात करना बंद कर देता है और ओपकोड और बफर में बोलना शुरू कर देता है, और यह सॉफ्टवेयर और सिलिकॉन के बीच का पुल है।
जब BluetoothSocketSettings फ्लैग सिस्टम को "कृपया हार्डवेयर ऑफलोड का उपयोग करें" बताता है, तो वह अनुरोध जादुई रूप से चिप पर टेलीपोर्ट नहीं होता। यह ब्लूटूथ स्टैक के माध्यम से चरण दर चरण नीचे चलता है, JNI (जावा नेटिव इंटरफेस) के माध्यम से C++ में, फिर HAL में, जिसे hardware/interfaces/bluetooth/ के अंदर परिभाषित किया गया है।
एंड्रॉइड 14 से शुरू होकर और विशेष रूप से AOSP 16 में, HAL होशियार हो गया है: यह अब LPI क्षमताओं को समझता है और कुछ सॉकेट ट्रैफिक को उन तक रूट कर सकता है।
आइए एक सरलीकृत HAL फ़ंक्शन के अंदर झांकें। यह कोई काल्पनिक स्निपेट नहीं है। यह उस चीज़ के करीब है जो आपको bluetooth_audio_hw.cc या bluetooth_socket_hal.cc में मिल सकती है:
Return<void> BluetoothHci::createSocketChannel( const hidl_string& device, const BluetoothSocketSettings& settings, createSocketChannel_cb _hidl_cb) { int fd = -1; if (settings.data_path == DATA_PATH_HARDWARE_OFFLOAD) { ALOGI("LPI offload requested for socket on hub %d endpoint %d", settings.hub_id, settings.endpoint_id); fd = controller->allocateLpiChannel(settings.hub_id, settings.endpoint_id); } else { fd = controller->allocateHostChannel(); } _hidl_cb(Status::SUCCESS, fd); return void(); } सादे अंग्रेजी में, यह मेथड ब्लूटूथ चौराहे पर ट्रैफिक अधिकारी की तरह है। यह आपकी सॉकेट सेटिंग्स को देखता है और तय करता है कि आपके डेटा को किस सड़क पर भेजा जाए। यदि DATA_PATH_HARDWARE_OFFLOAD सेट है, तो डेटा पथ कंट्रोलर के आंतरिक MCU से जुड़ा होता है बजाय नियमित होस्ट-साइड बफर के।
controller->allocateLpiChannel() पर कॉल वह जगह है जहां HAL कहता है, "ठीक है चिप, कृपया अपने लो-पावर प्रोसेसर के अंदर पूरी तरह से रहने वाली एक कतार बनाएं।" यह माइक्रोकंट्रोलर भौतिक रूप से ब्लूटूथ रेडियो के करीब है। यह acknowledgments, छोटे डेटा विस्फोट, और यहां तक कि कुछ प्रोटोकॉल टाइमिंग को अपने दम पर संभाल सकता है, ऐसी चीजें जो सामान्य रूप से मुख्य CPU को जगाने की आवश्यकता होगी।
एक बार यह चैनल बन जाने के बाद, एंड्रॉइड फ्रेमवर्क और ऐप्स अभी भी एक सामान्य फ़ाइल डिस्क्रिप्टर देखते हैं, जैसे कि सॉकेट पूरी तरह से स्थानीय हो। जादू इस तथ्य में निहित है कि यह डिस्क्रिप्टर फर्मवेयर-प्रबंधित मेमोरी और DMA पथों द्वारा समर्थित है न कि लिनक्स कर्नेल बफर द्वारा।
यदि आप कंट्रोलर से डिबगर संलग्न करते हैं या लॉग डंप करते हैं, तो आप कुछ ऐसा देख सकते हैं:
bt_lpi_mcu: channel 0x03 opened for handle 0x0041 bt_hci: diverting ACL packets to LPI path bt_lpi_mcu: sleeping host processor वह तीसरी लाइन, sleeping host processor, हर पावर इंजीनियर के लिए सपना सच होने जैसा है। फोन सचमुच CPU सबसिस्टम के बड़े हिस्से को बंद कर देता है जबकि ब्लूटूथ को जीवित रखता है।
यह वह जगह भी है जहां क्वालकॉम या ब्रॉडकॉम जैसे विक्रेता अपनी विशेष सॉस जोड़ते हैं। उनके HAL में अक्सर "कीप-अलाइव" टाइमर, "कोलेसिंग अंतराल," और "फर्मवेयर-चालित रीट्रांसमिशन" के लिए अतिरिक्त हुक शामिल होते हैं। ये सुनिश्चित करते हैं कि कनेक्शन स्मूथ महसूस हो भले ही मुख्य प्रोसेसर ऑफ-ड्यूटी हो।
उच्च-स्तरीय दृष्टिकोण से, पाइपलाइन अब इस तरह दिखती है:
App -> ब्लूटूथ फ्रेमवर्क -> JNI -> btif_sock -> HAL -> कंट्रोलर MCU (LPI) हर लेयर अगले को साफ़ रूप से बैटन पास करने के लिए पर्याप्त समझती है। HAL अनुवादक के रूप में कार्य करता है, उच्च-स्तरीय सेटिंग्स लेता है और उन्हें निम्न-स्तरीय कमांड में बदल देता है जिन्हें चिप फर्मवेयर निष्पादित कर सकता है।
जब तक आपकी स्मार्टवॉच एक पैकेट भेजती है या आपके इयरबड्स एक ऑडियो टुकड़ा अनुरोध करते हैं, मुख्य CPU पलक भी नहीं झपकाता। पूरा लेनदेन ब्लूटूथ कंट्रोलर के छोटे डोमेन के भीतर रहता है और मर जाता है, इसे गटकने के बजाय पावर की चुस्की लेता है।
अगले सेक्शन में, हम पता लगाएंगे कि यह ऑफलोड आर्किटेक्चर एंड्रॉइड के पावर मैनेजमेंट सिस्टम के साथ कैसे एकीकृत होता है, जिसमें वेकलॉक्स, डोज़ मोड, और कर्नेल समन्वय शामिल हैं, और यह कैसे सुनिश्चित करता है कि भले ही मुख्य CPU सो रहा हो, कनेक्शन कभी भी बीट मिस नहीं करता।
जब CPU सोता है लेकिन ब्लूटूथ नहीं: एक्शन में पावर मैनेजमेंट
ठीक है, हमने देखा है कि सॉकेट ऑफलोड ऐप लेयर से HAL के माध्यम से नीचे यात्रा करता है और अंत में उस छोटे MCU पर उतरता है जो ब्लूटूथ चिप के अंदर रहता है। लेकिन आगे क्या होता है? क्या होगा अगर आपका फोन का मुख्य CPU एक झपकी लेने का फैसला करता है जबकि एक फ़ाइल ट्रांसफर या ऑडियो स्ट्रीम अभी भी चल रहा है? क्या यह ब्लूटूथ कनेक्शन को तोड़ने का जोखिम नहीं उठाता?
यहीं एंड्रॉइड की पावर मैनेजमेंट कोरियोग्राफी कदम रखती है। यह तीन कलाकारों के बीच एक नृत्य है: पावर HAL, ब्लूटूथ स्टैक, और कर्नेल वेकलॉक सिस्टम।
जब एक ब्लूटूथ सॉकेट लो पावर आइलैंड के लिए कॉन्फ़िगर किया जाता है, तो एंड्रॉइड का ब्लूटूथ स्टैक कर्नेल को संकेत देता है कि इस कनेक्शन को मुख्य CPU की मदद के बिना बनाए रखा जा सकता है। आंतरिक रूप से, यह वेकलॉक टाइमर को साफ या डाउनस्केल करता है जो सामान्य रूप से ब्लूटूथ ट्रैफिक के दौरान प्रोसेसर को जगाए रखेगा। कर्नेल लॉग में, आप कुछ ऐसा देख सकते हैं:
wakelock: release "bt_wake" (LPI mode active) bt_controller: firmware handling link supervision locally यह संदेश सिस्टम इंजीनियरों के लिए सोना है। यह आपको बताता है कि कंट्रोलर ने कनेक्शन का पूर्ण स्वामित्व ले लिया है। ब्लूटूथ फर्मवेयर अब पर्यवेक्षण टाइमआउट की निगरानी कर रहा है, रीट्रांसमिशन को संभाल रहा है, और एन्क्रिप्शन काउंटर बनाए रख रहा है।
पावर मैनेजर के दृष्टिकोण से, ब्लूटूथ डिवाइस "आइडल" दिखता है क्योंकि मुख्य CPU की ओर कोई इंटरप्ट उत्पन्न नहीं हो रहे हैं। इस बीच, कंट्रोलर MCU आपके इयरबड्स या स्मार्टवॉच के साथ अपने स्वयं के लो-पावर क्लॉक डोमेन का उपयोग करके चुपचाप पैकेट का आदान-प्रदान करता है।
इसे समन्वयित करने के लिए, ब्लूटूथ HAL छोटे कॉलबैक उजागर करता है जो पावर HAL को सूचित करता है जब भी ट्रैफिक स्तर बदलते हैं। आपको bt_vendor_qcom.cc में ऐसा एक स्निपेट मिल सकता है:
void bt_lpi_activity_update(bool active) { if (active) power_hint(POWER_HINT_LPI_ACTIVITY, 1); else power_hint(POWER_HINT_LPI_ACTIVITY, 0); } जब active शून्य हो जाता है, तो पावर HAL जानता है कि यह गहरी सिस्टम स्लीप स्टेट (जैसे सस्पेंड-टू-RAM) की अनुमति दे सकता है, क्योंकि ब्लूटूथ चीजों को अपने दम पर जीवित रखेगा।
असली जादू यह है कि उपयोगकर्ता कभी भी इसमें से किसी को नोटिस नहीं करता। फोन "सोया हुआ" दिखाई दे सकता है, डिस्प्ले बंद, CPU कोर गेटेड, फिर भी आपका ब्लूटूथ ऑडियो अभी भी बजता है, आपकी स्मार्टवॉच अभी भी सिंक होती है, और आपका फोन खोजने योग्य रहता है।
यह लगभग काव्यात्मक है। मुख्य प्रोसेसर सपना देख रहा है, कंट्रोलर धीरे से गुनगुना रहा है, और आपकी प्लेलिस्ट ऐसे चलती रहती है जैसे कुछ हुआ ही न हो।
यदि आप इसे वास्तविक एंड्रॉइड डिवाइस पर सत्यापित करना चाहते हैं, तो आप कमांड का उपयोग कर सकते हैं:
adb shell cat /sys/kernel/debug/wakeup_sources | grep bt जब आप देखते हैं कि स्ट्रीमिंग के दौरान भी bt_wake काउंटर कम रहता है, बधाई हो! लो पावर आइलैंड ऑफलोड अपना काम खूबसूरती से कर रहा है।
अगले सेक्शन में, हम फर्मवेयर की गहराई से वापस चढ़ेंगे ताकि यह देख सकें कि यह सब रोजमर्रा के डेवलपर की दुनिया में कैसे फिट बैठता है। क्या आप, एक ऐप या सिस्टम डेवलपर के रूप में, वास्तव में इन सॉकेट सेटिंग्स को सीधे नियंत्रित या लाभ उठा सकते हैं? और उन्हें समझना आपको ब्लूटूथ ऐप बनाने में कैसे मदद कर सकता है जो पावर को गटकने के बजाय चुस्की लेते हैं?
डेवलपर्स BluetoothSocketSettings का उपयोग कैसे कर सकते हैं
अब जब हम ब्लूटूथ स्टैक के दिल में गहराई से झांक चुके हैं, तो आइए वापस वहां चढ़ें जहां आप और मैं वास्तव में रहते हैं: डेवलपर लेयर। आप सोच रहे होंगे, "ठीक है, वह सब हार्डवेयर विजार्ड्री कूल है, लेकिन मैं वास्तव में इसके साथ क्या कर सकता हूँ?"
यहाँ मजेदार हिस्सा है: भले ही लो पावर आइलैंड ज्यादातर एक सिस्टम-लेवल फीचर है, यह समझना कि यह कैसे काम करता है, फिर भी आपको ब्लूटूथ ऐप डिज़ाइन करने में मदद कर सकता है जो अधिक पावर-फ्रेंडली और अनुमानित हैं।
फ्रेमवर्क लेवल पर, आप अपने ऐप से सीधे LPI को चालू या बंद नहीं कर सकते। वे स्विच ब्लूटूथसर्विस और ब्लूटूथसॉकेटमैनेजरसर्विस जैसे सिस्टम कंपोनेंट्स में गहरे रहते हैं। लेकिन हर बार जब आप BluetoothSocket या BluetoothServerSocket का उपयोग करते हैं, तो आपका डेटा चुपचाप उन लेयर्स से होकर बहता है जो जांचते हैं कि LPI ऑफलोड उपलब्ध है या नहीं।
इसका मतलब है कि आपका ऐप स्वचालित रूप से लाभान्वित होता है, जब तक आप ऐसा कुछ नहीं करते जो CPU को अनावश्यक रूप से जगाए रखने के लिए मजबूर करता है। उदाहरण के लिए, उचित थ्रेड स्लीप का उपयोग करना, बिजी लूप से बचना, और एंड्रॉइड के अपने ब्लूटूथ I/O स्ट्रीम को बफरिंग संभालने देना आपको ऑफलोड तर्क की अच्छी कृपा में रखेगा।
यदि आप AOSP के सिस्टम सर्वर लॉग में गोता लगाते हैं जबकि एक ब्लूटूथ सॉकेट कनेक्ट हो रहा है, तो आप कुछ ऐसा नोटिस कर सकते हैं:
BluetoothSocketManager: Offload eligible socket detected, enabling LPI mode Bluetooth HAL: LPI channel activated for fd=42 वह छोटी लाइन आपको बताती है कि आपके सॉकेट को द्वीप के माध्यम से चुपचाप रीरूट किया गया है, बिना आपकी उंगली उठाए।
नीचे, फ्रेमवर्क ने एक BluetoothSocketSettings ऑब्जेक्ट बनाया और जब सॉकेट खोला गया तो इसे चेन में पास कर दिया। छद्म-जावा में, यह ऐसा दिखता है:
BluetoothSocketSettings settings = new BluetoothSocketSettings( BluetoothSocketSettings.DATA_PATH_HARDWARE_OFFLOAD, /* hubId */ 1, /* endpointId */ 2, /* maxPacketSize */ 512); BluetoothSocket socket = adapter.createSocket(device, settings); socket.connect(); बेशक, यह अभी तक पब्लिक SDK का हिस्सा नहीं है, लेकिन सिस्टम ऐप्स या विशेषाधिकार प्राप्त फ्रेमवर्क समान कॉल का उपयोग करते हैं यह वर्णन करने के लिए कि ट्रैफिक को कैसे संभाला जाना चाहिए।
तो आपको, डेवलपर को, क्यों परवाह करनी चाहिए? क्योंकि यह जानना कि ऐसा पथ मौजूद है, इसका मतलब है कि आप इसे ध्यान में रखकर डिज़ाइन कर सकते हैं। उदाहरण के लिए, आप कर सकते हैं:
छोटे BLE लिखने को एक-एक करके भेजने के बजाय बैच करें, जिससे कंट्रोलर को उन्हें ऑफलोड बफर के अंदर कुशलतापूर्वक प्रोसेस करने की अनुमति मिलती है।
लगातार कनेक्ट/डिस्कनेक्ट साइकिल से बचें, जो स्टैक को मुख्य CPU को बार-बार जगाने के लिए मजबूर करेगा।
अपने बैकग्राउंड ट्रांसफर को लो-पावर बफर की सीमाओं के अंदर बड़े करीने से फिट करने के लिए संरचित करें (छोटे टुकड़े और लंबे अंतराल सोचें)।
अनिवार्य रूप से, आपका डेटा पैटर्न जितना अधिक अनुमानित होगा, उतनी ही अधिक संभावना है कि यह होस्ट को जगाए बिना द्वीप में रहेगा।
यदि आप सिस्टम सॉफ्टवेयर बना रहे हैं, कहते हैं एक कस्टम एंड्रॉइड डिवाइस या एंबेडेड उत्पाद के लिए, तो आप और भी आगे जा सकते हैं। आप HAL व्यवहार को ट्वीक कर सकते हैं, कस्टम हब या एंडपॉइंट ID असाइन कर सकते हैं, और यहां तक कि अधिकतम पैकेट आकार को ट्यून कर सकते हैं जिसका फर्मवेयर DMA ट्रांसफर के लिए उपयोग करता है। यह आपको ब्लूटूथ सुविधाएँ बनाने की अनुमति देता है: जैसे कम-ऊर्जा टेलीमेट्री स्ट्रीमिंग या वियरेबल सेंसर सिंक, जो लगभग पूरी तरह से ऑफलोडेड चलते हैं।
उस बिंदु पर, आपका ब्लूटूथ चिप एक मिनी सर्वर बन जाता है जो मुख्य OS सोते समय काम करता रहता है, उल्लेखनीय बैटरी लाइफ और तेज़ पुनर्कनेक्शन प्रदान करता है।
अंतिम सेक्शन में, हम चीजों को समेटेंगे और बड़ी तस्वीर पर वापस देखेंगे, क्यों BluetoothSocketSettings और लो पावर आइलैंड एक साथ एंड्रॉइड के "अदृश्य इंजीनियरिंग" के सबसे सुंदर उदाहरणों में से एक का प्रतिनिधित्व करते हैं। यह उन शांत विजयों में से एक है जिन्हें आप शायद ही कभी कीनोट में देखेंगे लेकिन हर दिन महसूस करेंगे जब आपका फोन अभी भी आधी रात को जूस रखता है।
ग्रैंड फिनाले: स्मार्टली सोने की सुंदरता
आइए एक पल के लिए पीछे हटें। हम एक कॉफी शॉप में एक ओवरवर्क्ड बरिस्ता के साथ शुरू हुए। फिर हमने एक छिपे हुए सहायक, लो पावर आइलैंड की खोज की, जो मुख्य बरिस्ता के दूर जाने पर भी चुपचाप कैफे को चालू रखता है।
हमने एक विनम्र ब्लूटूथ सॉकेट का रास्ता अपनाया, देखा कि यह BluetoothSocketSettings में लपेटा गया, HAL के माध्यम से यात्रा की, और अंत में कंट्रोलर के अंदर एक लघु प्रोसेसर पर उतरा जो बड़े CPU के सपने देखते हुए गुनगुनाता है।
और यही इसकी सुंदरता है: एंड्रॉइड का ब्लूटूथ ऑफलोड तंत्र अदृश्य इंजीनियरिंग के सबसे सुंदर उदाहरणों में से एक है। यह एक नए API या फैंसी एनिमेशन के साथ खुद की घोषणा नहीं करता। यह बस चुपचाप आपकी बैटरी को लंबे समय तक चलाता है, आपके ब्लूटूथ को अधिक विश्वसनीय बनाता है, और आपके फोन को स्मूथ महसूस कराता है, सभी बिना आपको यह जाने कि यह वहां है।
तकनीकी दृष्टिकोण से, प्रतिभा संतुलन में निहित है। सिस्टम अभी भी पूर्ण-विशेषताओं वाले सॉकेट और समृद्ध प्रोटोकॉल हैंडलिंग की अनुमति देता है जब आपको इसकी आवश्यकता होती है, लेकिन सामान्य डेटा फ्लो के लिए, ऑडियो, टेलीमेट्री, नोटिफिकेशन, या हार्ट रेट स्ट्रीमिंग, यह लो-पावर कंट्रोलर को पहिया लेने देता है। यह ऐसा है जैसे एंड्रॉइड ने डेलीगेट करना सीख लिया।
हर बार जब आपकी स्मार्टवॉच आपके फोन की स्क्रीन बंद होने पर सिंक होती है, या आपके इयरबड्स लंबी उड़ान के दौरान कनेक्टेड रहते हैं बिना आपकी बैटरी को खत्म किए, आप BluetoothSocketSettings और लो पावर आइलैंड फ्रेमवर्क को काम करते हुए देख रहे हैं। वे आधुनिक एंड्रॉइड डिजाइन में एक बड़े दर्शन का हिस्सा हैं, बुद्धिमत्ता को हार्डवेयर के करीब ले जाना। जितना अधिक हम अपने चिप्स को स्वायत्त कार्यों को संभालना सिखाते हैं, उतना ही हम मुख्य प्रोसेसर को आराम करने दे सकते हैं।
यदि आप एक डेवलपर या सिस्टम इंजीनियर हैं, तो इस आर्किटेक्चर को समझना केवल अकादमिक नहीं है। यह प्रेरित कर सकता है कि आप अपनी सुविधाओं को कैसे डिज़ाइन करते हैं। चाहे आप कस्टम एंड्रॉइड ROM बना रहे हों, वियरेबल्स के लिए फर्मवेयर ऑप्टिमाइज़ कर रहे हों, या ब्लूटूथ चिप के साथ IoT डिवाइस बना रहे हों, सबक स्पष्ट है: अपने मुख्य CPU को हर पैकेट की देखभाल न करने दें। जब आप कर सकते हैं ऑफलोड करें, जब आप करना चाहिए सोएं, और आपके डिवाइस आपको घंटों अतिरिक्त अपटाइम के साथ धन्यवाद देंगे।
तो अगली बार जब आप अपने इयरबड्स प्लग इन करें और नोटिस करें कि आपका फोन ठंडा रहता है और आपका बैटरी प्रतिशत मुश्किल से चलता है, तो याद रखें: कहीं गहरे अंदर, एक छोटा ब्लूटूथ MCU मुख्य CPU के अपने लो-पावर हैमक में झपकी का आनंद लेते हुए सारा भारी उठाना कर रहा है।
यह एंड्रॉइड के लो पावर आइलैंड और BluetoothSocketSettings का शांत प्रतिभा है। यह केवल ब्लूटूथ के बारे में नहीं है। यह हमारे डिवाइस को व्यस्त नहीं, बल्कि होशियार होना सिखाने के बारे में है। और शायद, बस शायद, यह एक सबक है जिसे हमें अपने लिए भी याद रखने लायक है।
मुफ्त में कोड करना सीखें। freeCodeCamp के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी दिलाने में मदद की है। शुरू करें