<पी> इसे चित्रित करें:आप एक कैफ़े में बैठे हैं और आपका लैपटॉप खुला है, फ़ोन मेज़ पर है, स्मार्टवॉच हर कुछ मिनटों में बज रही है, और ब्लूटूथ ईयरबड संगीत बजा रहे हैं। आपके दृष्टिकोण से, जीवन शांतिपूर्ण है। आपके फ़ोन के परिप्रेक्ष्य से, यह हर समय छोटे-छोटे ब्लूटूथ पैकेटों की एक हास्यास्पद संख्या को जोड़ रहा है। <पी> हर बार जब आपकी घड़ी आपके कदमों को सिंक करती है, हर बार जब आपके ईयरबड्स को ऑडियो का एक और हिस्सा मिलता है, हर बार जब कोई पृष्ठभूमि डिवाइस चेक करता है - तो आपके फोन के अंदर मुख्य एप्लिकेशन प्रोसेसर को जागने, डेटा को देखने, निर्णय लेने के लिए मजबूर किया जाता है कि इसके साथ क्या करना है, और फिर सो जाओ। ऐसा कुछ हज़ार बार करें, और अचानक वह अच्छी 5000 एमएएच की बैटरी संदेहास्पद रूप से छोटी लगने लगती है। <पी> एंड्रॉइड इंजीनियरों ने इस पैटर्न को देखा और मूल रूप से कहा, क्या होगा यदि हम हर छोटी ब्लूटूथ चीज़ के लिए बड़े सीपीयू को सक्रिय नहीं करते हैं? क्या होगा यदि हमारे पास एक छोटा सहायक मस्तिष्क हो जिसका पूरा काम उबाऊ दोहराव वाले ब्लूटूथ ट्रैफ़िक को संभालना है जबकि मुख्य सीपीयू आराम करता है? यहीं पर लो पावर आइलैंड की अवधारणा आती है, जिसे आमतौर पर एलपीआई में छोटा किया जाता है। <पी> आधुनिक एंड्रॉइड ब्लूटूथ आर्किटेक्चर में, विशेष रूप से एओएसपी 16 पीढ़ी के बाद से, ब्लूटूथ काम का एक अच्छा हिस्सा एक समर्पित कम पावर प्रोसेसर पर लोड किया जा सकता है जो ब्लूटूथ रेडियो के करीब बैठता है। यह छोटा प्रोसेसर ब्लूटूथ कंट्रोलर या SoC में एम्बेडेड है और इसे बहुत कुशलता से चलाने के लिए डिज़ाइन किया गया है। यह मुख्य सीपीयू की तुलना में बहुत कम बिजली की खपत करता है और एक पूर्ण एप्लिकेशन प्रोसेसर की तरह आपकी बैटरी खत्म किए बिना सक्रिय रह सकता है। एंड्रॉइड का काम यह तय करना है कि इस द्वीप पर कौन सा ट्रैफ़िक रह सकता है और किस ट्रैफ़िक को अभी भी मुख्य सीपीयू की आवश्यकता है। <पी> लेकिन एंड्रॉइड व्यवहार में यह निर्णय कैसे लेता है? यहीं पर ब्लूटूथ सॉकेट और BluetoothSocketSettings नाम की कोई चीज़ कहानी में प्रवेश करती है। <पी> एक नियमित ऐप में, जब आप ब्लूटूथ सॉकेट खोलते हैं, तो ऐसा लगता है जैसे आप बस एक पाइप खोल रहे हैं ताकि आप बाइट्स भेज और प्राप्त कर सकें। हालाँकि, हुड के नीचे, ढाँचा बहुत गहरा सवाल पूछ रहा है:क्या यह पाइप बड़े राजमार्ग से होकर गुजरना चाहिए जो मुख्य सीपीयू को जगाता है, या क्या इस पाइप को सीधे कम बिजली वाले द्वीप के निजी सड़क नेटवर्क से जोड़ा जा सकता है? <पी> नवीनतम AOSP ब्लूटूथ स्टैक में, उस प्रश्न का उत्तर एक छोटे कॉन्फ़िगरेशन ऑब्जेक्ट के माध्यम से व्यक्त किया गया है:BluetoothSocketSettings। यह वर्ग सिस्टम स्तर कोड को यह वर्णन करने देता है कि सॉकेट को कैसे व्यवहार करना चाहिए। यह निर्दिष्ट कर सकता है कि डेटा को सामान्य होस्ट पथ पर रखा जाना चाहिए या कम पावर प्रोसेसर पर समाप्त होने वाले हार्डवेयर डेटा पथ में ऑफलोड किया जाना चाहिए। <पी> अंदर, DATA_PATH_NO_OFFLOAD जैसे फ़ील्ड हैं और DATA_PATH_HARDWARE_OFFLOAD , साथ ही hubId जैसी अतिरिक्त जानकारी , endpointId , और requestedMaximumPacketSize जो नियंत्रक को यह समझने में मदद करता है कि एलपीआई दुनिया में पैकेटों को कैसे रूट किया जाए। <पी> बाहर से, ऐसा अभी भी लगता है कि आप एक सामान्य BluetoothSocket के साथ काम कर रहे हैं। हालाँकि ब्लूटूथ फ्रेमवर्क के अंदर, उस सॉकेट को अब अतिरिक्त मेटाडेटा के साथ टैग किया गया है जो चुपचाप ब्लूटूथ स्टैक को बताता है:यह विशेष है, इसे द्वीप पर भेजें। <पी> होस्ट स्टैक तब ब्लूटूथ सिस्टम में कोड की एक नई परत से बात करता है जिसे एलपीपी ऑफलोड मैनेजर और एक सॉकेट विशिष्ट एचएएल (हार्डवेयर एब्स्ट्रैक्शन लेयर) कहा जाता है ताकि जब भी सॉकेट खोला या बंद किया जाए तो कम पावर प्रोसेसर को सूचित किया जा सके, और डेटा को संभालने की जिम्मेदारी का दावा किया जा सके। <पी> इसलिए यदि हम कैफे सादृश्य रखें, तो पहले प्रत्येक ब्लूटूथ ग्राहक सीधे मुख्य बरिस्ता पर अपना ऑर्डर चिल्लाता था। लो पावर आइलैंड और ब्लूटूथसॉकेटसेटिंग्स के साथ, एंड्रॉइड कह सकता है, "ये नियमित एस्प्रेसो ऑर्डर साइड काउंटर पर जूनियर बरिस्ता के माध्यम से जा सकते हैं। केवल अजीब कस्टम पेय अभी भी मुख्य बरिस्ता तक जाते हैं"। उपयोगकर्ता के लिए समान ब्लूटूथ अनुभव, लेकिन काउंटर के पीछे बहुत कम अराजकता और बहुत कम बर्बाद ऊर्जा। <पी> इस लेख में, हम इस उच्च स्तरीय कहानी से वास्तविक एंड्रॉइड एपीआई पर ज़ूम इन करेंगे। हम देखेंगे कि फ्रेमवर्क में ब्लूटूथसॉकेटसेटिंग्स को कैसे परिभाषित किया गया है, आप हार्डवेयर ऑफलोड का अनुरोध कैसे करते हैं, और हबआईडी और एंडपॉइंटआईडी जैसे डरावने दिखने वाले फ़ील्ड का वास्तव में सादे अंग्रेजी में क्या मतलब है।पी> सामग्री तालिका
- <पी> 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 है . यह वह स्विच है जो ब्लूटूथ सिस्टम को बताता है, अरे, मुख्य सीपीयू को जगाने के बजाय इस ट्रैफ़िक को नियंत्रक के माइक्रोप्रोसेसर पर रखने का प्रयास करें। पी> <पी> hubId और endpointId द्वीप पर पतों की तरह हैं। वे फ़र्मवेयर को बताते हैं कि उस विशेष सॉकेट के लिए किस लॉजिकल पोर्ट या क्यू का उपयोग करना है। requestedMaxPacketSize यह बफर आवंटन को ट्यून करने में मदद करता है, ताकि यह थ्रूपुट और पावर दक्षता को संतुलित कर सके। <पी> इस बिंदु पर आप सोच रहे होंगे कि यह छोटा जावा ऑब्जेक्ट वास्तव में हार्डवेयर तक कैसे पहुंचता है? इसका उत्तर एचएएल (हार्डवेयर एब्स्ट्रैक्शन लेयर) में है। जब आप 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);
}
<पी> यह स्निपेट सरल लग सकता है, लेकिन यह जिम्मेदारी में एक बड़े बदलाव का प्रतिनिधित्व करता है। प्रत्येक पैकेट को होस्ट स्टैक तक भेजने के बजाय, ब्लूटूथ नियंत्रक अब डेटा पथ के स्वामित्व का दावा कर सकता है। एसओसी के अंदर ब्लूटूथ फर्मवेयर मुख्य सीपीयू को लगातार सक्रिय किए बिना पैकेट रीट्रांसमिशन, पावती और प्रवाह नियंत्रण को संभालेगा। <पी> यदि आप ऐसे कनेक्शन के दौरान अपने डिवाइस के कर्नेल लॉग की निगरानी करते हैं, तो आपको कुछ ऐसा भी दिखाई दे सकता है: bt_vendor: enabling LPI offload for handle 0x0041
bt_controller: lpi path active, cpu wakelocks released
<पी> वह लॉग लाइन आपकी शांत पुष्टि है कि डेटा पथ सफलतापूर्वक कम पावर द्वीप पर स्थानांतरित हो गया है। <पी> मानवीय संदर्भ में, फोन ने तय किया कि यह ब्लूटूथ वार्तालाप मिनी-प्रोसेसर द्वारा नियंत्रित किए जाने के लिए पर्याप्त रूप से अनुमानित है, इसलिए उसने विनम्रतापूर्वक बड़े सीपीयू से कहा, "अब आप झपकी ले सकते हैं। मुझे यह मिल गया।" <पी> अगले भाग में हम इस यात्रा को एचएएल और फ़र्मवेयर सीमा में एक स्तर गहराई तक ले जाएंगे, यह देखने के लिए कि ये सॉकेट सेटिंग्स नियंत्रक चिप के अंदर वास्तविक कम-शक्ति डेटा रूटिंग में कैसे बदल जाती हैं। यहीं पर वास्तविक हार्डवेयर जादू होता है, और जहां एक समय में प्रत्येक मिलीवाट में बचत जुड़ना शुरू हो जाती है। एचएएल के अंदर:ब्लूटूथ ऑफलोड वास्तव में कैसे काम करता है
<पी> अब तक, हम ज्यादातर एंड्रॉइड के जावा और देशी परतों में रहे हैं, आरामदायक अपार्टमेंट जहां फ्रेमवर्क और सिस्टम सेवाएं रहती हैं। लेकिन उसके नीचे चतुर मशीनरी से भरा एक तहखाना है:हार्डवेयर एब्स्ट्रैक्शन लेयर , या एचएएल। यह वह जगह है जहां एंड्रॉइड "ऑब्जेक्ट्स" में बात करना बंद कर देता है और ऑपकोड और बफ़र्स में बात करना शुरू कर देता है, और यह सॉफ्टवेयर और सिलिकॉन के बीच का पुल है। <पी> जब BluetoothSocketSettings ध्वज सिस्टम को बताता है "कृपया हार्डवेयर ऑफलोड का उपयोग करें", तो वह अनुरोध जादुई रूप से चिप पर टेलीपोर्ट नहीं होता है। यह ब्लूटूथ स्टैक पर कदम दर कदम नीचे चलता है, जेएनआई (जावा नेटिव इंटरफेस) से होते हुए सी++ में जाता है, फिर एचएएल में जाता है, जिसे hardware/interfaces/bluetooth/ के अंदर परिभाषित किया गया है। . <पी> एंड्रॉइड 14 से शुरू होकर और विशेष रूप से एओएसपी 16 में, एचएएल अधिक स्मार्ट हो गया है:अब यह एलपीआई क्षमताओं को समझता है और कुछ सॉकेट ट्रैफ़िक को उन तक रूट कर सकता है। <पी> आइए सरलीकृत एचएएल फ़ंक्शन के अंदर एक नज़र डालें। यह कोई काल्पनिक अंश नहीं है. यह आपको 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 सेट किया गया है, डेटा पथ नियमित होस्ट-साइड बफर के बजाय नियंत्रक के आंतरिक एमसीयू से जुड़ा हुआ है। <पी> controller->allocateLpiChannel() पर कॉल वह जगह है जहां एचएएल कहता है, "ठीक है चिप, कृपया एक कतार बनाएं जो पूरी तरह से आपके कम-शक्ति प्रोसेसर के अंदर हो।" यह माइक्रोकंट्रोलर भौतिक रूप से ब्लूटूथ रेडियो के करीब है। यह पावती, छोटे डेटा बर्स्ट और यहां तक कि कुछ प्रोटोकॉल टाइमिंग को अपने आप संभाल सकता है, ऐसी चीजें जिनके लिए आमतौर पर मुख्य सीपीयू को सक्रिय करने की आवश्यकता होती है। <पी> एक बार यह चैनल बन जाने के बाद, एंड्रॉइड फ्रेमवर्क और ऐप्स को अभी भी एक सामान्य फ़ाइल डिस्क्रिप्टर दिखाई देता है, जैसे कि सॉकेट पूरी तरह से स्थानीय था। जादू इस तथ्य में निहित है कि यह डिस्क्रिप्टर लिनक्स कर्नेल बफ़र्स के बजाय फ़र्मवेयर-प्रबंधित मेमोरी और डीएमए पथों द्वारा समर्थित है। <पी> यदि आप नियंत्रक से डिबगर या डंप लॉग संलग्न करते हैं, तो आपको कुछ ऐसा दिखाई दे सकता है: 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 , क्या हर बिजली इंजीनियर का सपना सच हो गया है। ब्लूटूथ को सक्रिय रखते हुए फोन वस्तुतः सीपीयू सबसिस्टम के बड़े हिस्से को बंद कर देता है। <पी> यहीं पर क्वालकॉम या ब्रॉडकॉम जैसे विक्रेता अपना विशेष सॉस भी जोड़ते हैं। उनके एचएएल में अक्सर "कीप-अलाइव" टाइमर, "कोलेसिंग अंतराल" और "फर्मवेयर-संचालित रीट्रांसमिशन" के लिए अतिरिक्त हुक शामिल होते हैं। ये सुनिश्चित करते हैं कि मुख्य प्रोसेसर ऑफ-ड्यूटी होने पर भी कनेक्शन सुचारू लगे। <पी> उच्च-स्तरीय दृश्य से, पाइपलाइन अब इस तरह दिखती है: App -> Bluetooth Framework -> JNI -> btif_sock -> HAL -> Controller MCU (LPI)
<पी> हर परत इतनी समझ रखती है कि वह बैटन को सफाई से अगली परत तक पहुंचा सके। एचएएल अनुवादक के रूप में कार्य करता है, उच्च-स्तरीय सेटिंग्स लेता है और उन्हें निम्न-स्तरीय कमांड में बदल देता है जिसे चिप फर्मवेयर निष्पादित कर सकता है। <पी> जब तक आपकी स्मार्टवॉच एक पैकेट भेजती है या आपका ईयरबड ऑडियो खंड का अनुरोध करता है, तब तक मुख्य सीपीयू झपकाता भी नहीं है। संपूर्ण लेन-देन ब्लूटूथ नियंत्रक के छोटे डोमेन के भीतर रहता है और समाप्त हो जाता है, जो बिजली को निगलने के बजाय चूसता है। <पी> अगले भाग में, हम यह पता लगाएंगे कि यह ऑफलोड आर्किटेक्चर एंड्रॉइड के पावर प्रबंधन सिस्टम के साथ कैसे एकीकृत होता है, जिसमें वेकलॉक, डोज़ मोड और कर्नेल समन्वय शामिल है, और यह कैसे सुनिश्चित करता है कि भले ही मुख्य सीपीयू सो रहा हो, लेकिन कनेक्शन कभी भी विफल नहीं होता है। जब सीपीयू निष्क्रिय हो जाता है लेकिन ब्लूटूथ नहीं चलता:पावर प्रबंधन सक्रिय होता है
<पी> ठीक है, हमने देखा है कि कैसे सॉकेट ऑफलोड ऐप लेयर से नीचे एचएएल में जाता है और अंत में उस छोटे एमसीयू पर उतरता है जो ब्लूटूथ चिप के अंदर रहता है। लेकिन आगे क्या होता है? यदि आपके फ़ोन का मुख्य सीपीयू फ़ाइल स्थानांतरण या ऑडियो स्ट्रीम जारी रहने के दौरान झपकी लेने का निर्णय लेता है तो क्या होगा? क्या इससे ब्लूटूथ कनेक्शन टूटने का जोखिम नहीं है? <पी> यहीं पर एंड्रॉइड की पावर मैनेजमेंट कोरियोग्राफी है यह तीन कलाकारों के बीच का नृत्य है:पावर एचएएल , ब्लूटूथ स्टैक , और कर्नेल वैकलॉक सिस्टम . <पी> जब एक ब्लूटूथ सॉकेट लो पावर आइलैंड के लिए कॉन्फ़िगर किया जाता है, तो एंड्रॉइड का ब्लूटूथ स्टैक कर्नेल को संकेत देता है कि यह कनेक्शन मुख्य सीपीयू की मदद के बिना बनाए रखा जा सकता है। आंतरिक रूप से, यह वैकलॉक टाइमर को साफ़ या डाउनस्केल करता है जो आमतौर पर ब्लूटूथ ट्रैफ़िक के दौरान प्रोसेसर को सक्रिय रखता है। कर्नेल लॉग में, आपको कुछ ऐसा दिखाई दे सकता है: wakelock: release "bt_wake" (LPI mode active)
bt_controller: firmware handling link supervision locally
<पी> यह संदेश सिस्टम इंजीनियरों के लिए स्वर्णिम है। यह आपको बताता है कि नियंत्रक ने कनेक्शन का पूर्ण स्वामित्व ले लिया है। ब्लूटूथ फ़र्मवेयर अब पर्यवेक्षण टाइमआउट की निगरानी कर रहा है, पुन:प्रसारण को संभाल रहा है, और एन्क्रिप्शन काउंटर बनाए रख रहा है। <पी> पावर मैनेजर के दृष्टिकोण से, ब्लूटूथ डिवाइस "निष्क्रिय" दिखता है क्योंकि मुख्य सीपीयू की ओर कोई व्यवधान उत्पन्न नहीं हो रहा है। इस बीच, नियंत्रक एमसीयू अपने स्वयं के कम-पावर क्लॉक डोमेन का उपयोग करके चुपचाप आपके ईयरबड या स्मार्टवॉच के साथ पैकेट का आदान-प्रदान करता है। <पी> इसे समन्वित करने के लिए, ब्लूटूथ एचएएल छोटे कॉलबैक को उजागर करता है जो ट्रैफ़िक स्तर में बदलाव होने पर पावर एचएएल को सूचित करता है। आपको 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 शून्य पर चला जाता है, पावर एचएएल जानता है कि यह गहरी सिस्टम स्लीप स्थिति (जैसे सस्पेंड-टू-रैम) की अनुमति दे सकता है, क्योंकि ब्लूटूथ चीजों को अपने आप जीवित रखेगा। <पी> असली जादू यह है कि उपयोगकर्ता को कभी भी इस पर ध्यान नहीं जाता। फ़ोन "सोया हुआ" दिखाई दे सकता है, डिस्प्ले बंद हो सकता है, सीपीयू कोर बंद हो सकता है, फिर भी आपका ब्लूटूथ ऑडियो अभी भी चल रहा है, आपकी स्मार्टवॉच अभी भी सिंक हो रही है, और आपका फ़ोन खोजने योग्य बना हुआ है। <पी> यह लगभग काव्यात्मक है. मुख्य प्रोसेसर सपना देख रहा है, नियंत्रक धीरे-धीरे गुनगुना रहा है, और आपकी प्लेलिस्ट ऐसे चलती रहती है जैसे कुछ हुआ ही नहीं। <पी> यदि आप इसे वास्तविक एंड्रॉइड डिवाइस पर सत्यापित करना चाहते हैं, तो आप कमांड का उपयोग कर सकते हैं: adb shell cat /sys/kernel/debug/wakeup_sources | grep bt
<पी> जब आप देखते हैं कि bt_wake स्ट्रीमिंग के दौरान भी काउंटर धीमा रहता है, बधाई हो! लो पावर आइलैंड ऑफलोड अपना काम खूबसूरती से कर रहा है। <पी> अगले भाग में, हम फ़र्मवेयर की गहराई से ऊपर जाकर देखेंगे कि यह सब रोजमर्रा के डेवलपर की दुनिया में कैसे फिट बैठता है। क्या आप, एक ऐप या सिस्टम डेवलपर के रूप में, वास्तव में इन सॉकेट सेटिंग्स को सीधे नियंत्रित या लाभान्वित कर सकते हैं? और उन्हें समझने से आपको ऐसे ब्लूटूथ ऐप्स बनाने में कैसे मदद मिल सकती है जो बिजली खींचने के बजाय चूसते हैं? डेवलपर्स ब्लूटूथसॉकेटसेटिंग्स का उपयोग कैसे कर सकते हैं
<पी> अब जब हमने ब्लूटूथ स्टैक के केंद्र में गहराई से झाँक लिया है, तो आइए उस स्थान पर वापस जाएँ जहाँ आप और मैं वास्तव में रहते हैं:डेवलपर परत। आप शायद सोच रहे होंगे, "ठीक है, वह सब हार्डवेयर जादूगरी अच्छी है, लेकिन मैं वास्तव में क्या कर सकता हूंक्या इसके साथ?" <पी> यहां मज़ेदार हिस्सा है:भले ही लो पावर आइलैंड ज्यादातर सिस्टम-स्तरीय सुविधा है, फिर भी यह समझना कि यह कैसे काम करता है, आपको ब्लूटूथ ऐप्स डिज़ाइन करने में मदद कर सकता है जो अधिक पावर-अनुकूल और पूर्वानुमान योग्य हैं। <पी> फ़्रेमवर्क स्तर पर, आप सीधे अपने ऐप से एलपीआई को चालू या बंद नहीं कर सकते। वे स्विच BluetoothService और BluetoothSocketManagerService जैसे सिस्टम घटकों में गहराई से रहते हैं। लेकिन हर बार जब आप BluetoothSocket का उपयोग करते हैं या BluetoothServerSocket , आपका डेटा चुपचाप उन परतों के माध्यम से प्रवाहित होता है जो जांच करती हैं कि एलपीआई ऑफलोड उपलब्ध है या नहीं। <पी> इसका मतलब है कि आपका ऐप स्वचालित रूप से लाभान्वित होता है, जब तक आप ऐसा कुछ नहीं करते हैं जो सीपीयू को अनावश्यक रूप से जागते रहने के लिए मजबूर करता है . उदाहरण के लिए, उचित थ्रेड स्लीप का उपयोग करना, व्यस्त लूप से बचना, और एंड्रॉइड के स्वयं के ब्लूटूथ 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();
<पी> बेशक, यह अभी तक सार्वजनिक एसडीके का हिस्सा नहीं है, लेकिन सिस्टम ऐप्स या विशेषाधिकार प्राप्त फ्रेमवर्क ट्रैफ़िक को कैसे प्रबंधित किया जाना चाहिए, यह बताने के लिए समान कॉल का उपयोग करते हैं। <पी> तो आपको, डेवलपर को, परवाह क्यों करनी चाहिए? क्योंकि यह जानने का मतलब है कि ऐसा कोई रास्ता मौजूद है, आप इसे ध्यान में रखकर डिज़ाइन कर सकते हैं . उदाहरण के लिए, आप यह कर सकते हैं: - <पी> बैच छोटे BLE उन्हें एक-एक करके भेजने के बजाय लिखते हैं, जिससे नियंत्रक उन्हें ऑफलोड बफर के अंदर कुशलतापूर्वक संसाधित करने की अनुमति देता है।
- <पी> बार-बार कनेक्ट/डिस्कनेक्ट चक्र से बचें, जो स्टैक को मुख्य सीपीयू को बार-बार जगाने के लिए मजबूर करेगा।
- <पी> अपने बैकग्राउंड ट्रांसफ़र को कम-पावर बफ़र्स की सीमा के भीतर अच्छी तरह फिट करने के लिए संरचना करें (छोटे हिस्सों और लंबे अंतराल के बारे में सोचें)।
<पी> अनिवार्य रूप से, आपका डेटा पैटर्न जितना अधिक पूर्वानुमानित होगा, मेजबान को जगाए बिना द्वीप में रहने की संभावना उतनी ही अधिक होगी। <पी> यदि आप सिस्टम सॉफ़्टवेयर बना रहे हैं, जैसे किसी कस्टम एंड्रॉइड डिवाइस या एम्बेडेड उत्पाद के लिए, तो आप और भी आगे जा सकते हैं। आप एचएएल व्यवहार में बदलाव कर सकते हैं, कस्टम हब या एंडपॉइंट आईडी निर्दिष्ट कर सकते हैं, और यहां तक कि डीएमए ट्रांसफर के लिए फर्मवेयर द्वारा उपयोग किए जाने वाले अधिकतम पैकेट आकार को भी ट्यून कर सकते हैं। यह आपको ब्लूटूथ सुविधाएँ बनाने की अनुमति देता है:जैसे कम-ऊर्जा टेलीमेट्री स्ट्रीमिंग या पहनने योग्य सेंसर सिंक, जो लगभग पूरी तरह से ऑफलोडेड चलते हैं। <पी> उस समय, आपकी ब्लूटूथ चिप एक मिनी सर्वर बन जाती है जो मुख्य ओएस के निष्क्रिय होने पर भी काम करती रहती है, जिससे उल्लेखनीय बैटरी जीवन और त्वरित पुन:कनेक्शन मिलता है। <पी> अंतिम खंड में, हम चीजों को समाप्त करेंगे और बड़ी तस्वीर पर नजर डालेंगे, क्यों ब्लूटूथसॉकेटसेटिंग्स और लो पावर आइलैंड एक साथ एंड्रॉइड की "अदृश्य इंजीनियरिंग" के सबसे शानदार उदाहरणों में से एक का प्रतिनिधित्व करते हैं। यह उन शांत विजयों में से एक है जिसे आप शायद ही किसी मुख्य वक्ता के रूप में देखेंगे लेकिन हर दिन महसूस करेंगे जब आपके फोन में आधी रात को भी रस आ रहा हो। द ग्रैंड फिनाले:द एलिगेंस ऑफ स्लीपिंग स्मार्ट
<पी> आइए एक पल के लिए एक कदम पीछे हटें। हमने अत्यधिक काम करने वाले बरिस्ता के साथ एक कॉफ़ी शॉप में शुरुआत की। फिर हमने एक छिपे हुए सहायक, लो पावर आइलैंड की खोज की, जो मुख्य बरिस्ता के दूर चले जाने पर भी चुपचाप कैफे को चालू रखता है। <पी> हमने एक साधारण ब्लूटूथ सॉकेट का मार्ग अपनाया, इसे BluetoothSocketSettings में लपेटते हुए देखा , एचएएल के माध्यम से यात्रा की, और अंत में नियंत्रक के अंदर एक लघु प्रोसेसर पर उतरा जो बड़े सीपीयू के सपने देखते समय गुनगुनाता है। <पी> और यही इसकी खूबसूरती है:एंड्रॉइड का ब्लूटूथ ऑफलोड तंत्र अदृश्य इंजीनियरिंग के सबसे शानदार उदाहरणों में से एक है। यह खुद को किसी नए एपीआई या फैंसी एनीमेशन के साथ घोषित नहीं करता है। यह चुपचाप आपकी बैटरी को लंबे समय तक चलने देता है, आपके ब्लूटूथ को अधिक विश्वसनीय बनाता है, और आपका फोन स्मूथ लगता है, यह सब आपको पता भी नहीं चलता कि यह वहां है। <पी> तकनीकी दृष्टिकोण से, प्रतिभा संतुलन में निहित है। जरूरत पड़ने पर सिस्टम अभी भी पूर्ण-विशेषताओं वाले सॉकेट और समृद्ध प्रोटोकॉल हैंडलिंग की अनुमति देता है, लेकिन सामान्य डेटा प्रवाह, ऑडियो, टेलीमेट्री, नोटिफिकेशन या हृदय गति स्ट्रीमिंग के लिए, यह कम-शक्ति नियंत्रक को पहिया लेने देता है। यह ऐसा है जैसे एंड्रॉइड ने प्रतिनिधि बनाना सीख लिया है। <पी> जब भी आपकी स्मार्टवॉच आपके फोन की स्क्रीन बंद होने पर सिंक होती है, या आपके ईयरबड लंबी उड़ान के दौरान आपकी बैटरी खत्म किए बिना कनेक्ट रहते हैं, तो आपको BluetoothSocketSettings दिखाई दे रहा है। और काम पर लो पावर आइलैंड ढांचा। वे आधुनिक एंड्रॉइड डिज़ाइन में एक बड़े दर्शन का हिस्सा हैं, जो बुद्धिमत्ता को हार्डवेयर के करीब ले जाता है। जितना अधिक हम अपने चिप्स को स्वायत्त कार्यों को संभालना सिखाते हैं, उतना अधिक हम मुख्य प्रोसेसर को आराम दे सकते हैं। <पी> यदि आप एक डेवलपर या सिस्टम इंजीनियर हैं, तो इस आर्किटेक्चर को समझना केवल अकादमिक नहीं है। यह प्रेरित कर सकता है कि आप अपनी स्वयं की सुविधाएँ कैसे डिज़ाइन करते हैं। चाहे आप एक कस्टम एंड्रॉइड ROM बना रहे हों, पहनने योग्य उपकरणों के लिए फर्मवेयर अनुकूलित कर रहे हों, या ब्लूटूथ चिप के साथ IoT डिवाइस बना रहे हों, सबक स्पष्ट है:अपने मुख्य सीपीयू को हर पैकेट के लिए तैयार न करें। जब आप कर सकते हैं तब ऑफलोड करें, जब आपको सोना चाहिए तब सोएं, और आपके उपकरण घंटों के अतिरिक्त अपटाइम के साथ आपको धन्यवाद देंगे। <पी> तो अगली बार जब आप अपने ईयरबड्स को प्लग इन करें और देखें कि आपका फोन ठंडा रहता है और आपकी बैटरी मुश्किल से चलती है, तो याद रखें:अंदर कहीं गहराई में, एक छोटा ब्लूटूथ एमसीयू सभी भारी सामान उठा रहा है, जबकि मुख्य सीपीयू अपने कम-शक्ति वाले झूले में झपकी का आनंद ले रहा है। <पी> यह एंड्रॉइड के लो पावर आइलैंड और ब्लूटूथसॉकेटसेटिंग्स की शांत प्रतिभा है। यह सिर्फ ब्लूटूथ के बारे में नहीं है। यह हमारे उपकरणों को अधिक व्यस्त नहीं बल्कि अधिक स्मार्ट बनना सिखाने के बारे में है। और शायद, शायद, यह हमारे लिए भी याद रखने लायक सबक है। <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें