কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডের শক্তি সঞ্চয় আনলক করা:AOSP-এর লো পাওয়ার আইল্যান্ডে ব্লুটুথ সকেট সেটিংসের ভূমিকা

অ্যান্ড্রয়েডের শক্তি সঞ্চয় আনলক করা:AOSP-এর লো পাওয়ার আইল্যান্ডে ব্লুটুথ সকেট সেটিংসের ভূমিকা

এটির চিত্র:আপনি আপনার ল্যাপটপ খোলা রেখে একটি ক্যাফেতে বসে আছেন, টেবিলে ফোন, প্রতি কয়েক মিনিটে স্মার্টওয়াচ বাজছে এবং ব্লুটুথ ইয়ারবাডগুলি মিউজিক বাজছে। আপনার দৃষ্টিকোণ থেকে, জীবন শান্তিপূর্ণ। আপনার ফোনের দৃষ্টিকোণ থেকে, এটি সব সময় হাস্যকর সংখ্যক ছোট ব্লুটুথ প্যাকেট নিয়ে কাজ করছে।

প্রতিবার আপনার ঘড়ি আপনার পদক্ষেপগুলি সিঙ্ক করে, প্রতিবার আপনার ইয়ারবাডগুলি আরও একটি অডিও গ্রহণ করে, প্রতিবার একটি ব্যাকগ্রাউন্ড ডিভাইস চেক ইন করার সময় – আপনার ফোনের ভিতরের প্রধান অ্যাপ্লিকেশন প্রসেসরকে জেগে উঠতে বাধ্য করা হয়, ডেটা দেখুন, এটির সাথে কী করবেন তা স্থির করুন এবং তারপরে আবার ঘুমাতে যান৷ এটি কয়েক হাজার বার করুন, এবং হঠাৎ সেই সুন্দর 5000 mAh ব্যাটারিটি সন্দেহজনকভাবে ছোট মনে হতে শুরু করে৷

অ্যান্ড্রয়েড ইঞ্জিনিয়াররা এই প্যাটার্নটি দেখেছিল এবং মূলত বলেছিল, আমরা যদি প্রতিটি ছোট ব্লুটুথ জিনিসের জন্য বড় সিপিইউ না জাগাই? আমাদের যদি একটি ছোট হেল্পার মস্তিষ্ক থাকে যার পুরো কাজ হল বিরক্তিকর পুনরাবৃত্তিমূলক ব্লুটুথ ট্র্যাফিক পরিচালনা করা যখন প্রধান CPU শিথিল হয়? এখানেই লো পাওয়ার আইল্যান্ডের ধারণা, সাধারণত LPI-তে সংক্ষিপ্ত করা হয়।

আধুনিক অ্যান্ড্রয়েড ব্লুটুথ আর্কিটেকচারে, বিশেষ করে AOSP 16 জেনারেশন থেকে, ব্লুটুথ কাজের একটি ভাল অংশ একটি ডেডিকেটেড লো পাওয়ার প্রসেসরে অফলোড করা যেতে পারে যা ব্লুটুথ রেডিওর কাছাকাছি বসে। এই ছোট্ট প্রসেসরটি ব্লুটুথ কন্ট্রোলার বা SoC-তে এমবেড করা হয়েছে এবং খুব দক্ষতার সাথে চালানোর জন্য ডিজাইন করা হয়েছে। এটি প্রধান CPU-র তুলনায় অনেক কম শক্তি খরচ করে এবং সম্পূর্ণ অ্যাপ্লিকেশন প্রসেসরের মতো আপনার ব্যাটারি নিষ্কাশন না করে জেগে থাকতে পারে। অ্যান্ড্রয়েডের কাজ হল এই দ্বীপে কোন ট্রাফিক থাকতে পারে এবং কোন ট্রাফিকের এখনও মূল CPU প্রয়োজন তা ঠিক করা।

কিন্তু কীভাবে অ্যান্ড্রয়েড অনুশীলনে সেই সিদ্ধান্ত নেয়? এখানেই ব্লুটুথ সকেট এবং ব্লুটুথসকেটসেটিংস নামক কিছু গল্পে প্রবেশ করে৷

একটি নিয়মিত অ্যাপে, আপনি যখন একটি ব্লুটুথসকেট খোলেন, তখন মনে হয় আপনি শুধু একটি পাইপ খুলছেন যাতে আপনি বাইট পাঠাতে এবং গ্রহণ করতে পারেন। যদিও হুডের নীচে, ফ্রেমওয়ার্কটি আরও গভীর প্রশ্ন জিজ্ঞাসা করছে:এই পাইপটি কি বড় হাইওয়ে দিয়ে যেতে হবে যা মূল CPU কে জাগিয়ে তোলে, নাকি এই পাইপটি কম শক্তি দ্বীপের ব্যক্তিগত সড়ক নেটওয়ার্কের সাথে সরাসরি সংযুক্ত হতে পারে?

সর্বশেষ AOSP ব্লুটুথ স্ট্যাকে, সেই প্রশ্নের উত্তরটি একটি ক্ষুদ্র কনফিগারেশন অবজেক্টের মাধ্যমে প্রকাশ করা হয়েছে:BluetoothSocketSettings। এই ক্লাসটি সিস্টেম স্তরের কোডকে বর্ণনা করতে দেয় যে একটি সকেট কীভাবে আচরণ করা উচিত। এটি নির্দিষ্ট করতে পারে যে ডেটা স্বাভাবিক হোস্ট পাথে রাখা উচিত নাকি একটি হার্ডওয়্যার ডেটা পাথে অফলোড করা উচিত যা কম পাওয়ার প্রসেসরে শেষ হয়৷

ভিতরে, DATA_PATH_NO_OFFLOAD এর মত ক্ষেত্র রয়েছে এবং DATA_PATH_HARDWARE_OFFLOAD , সাথে অতিরিক্ত তথ্য যেমন hubId , endpointId , এবং requestedMaximumPacketSize যা LPI বিশ্বে প্যাকেটগুলিকে কীভাবে রুট করতে হয় তা নিয়ামককে বুঝতে সাহায্য করে।

বাইরে থেকে, এটি এখনও মনে হচ্ছে আপনি একটি সাধারণ ব্লুটুথসকেটের সাথে কাজ করছেন। যদিও ব্লুটুথ ফ্রেমওয়ার্কের ভিতরে, সেই সকেটটি এখন অতিরিক্ত মেটাডেটা দিয়ে ট্যাগ করা হয়েছে যা শান্তভাবে ব্লুটুথ স্ট্যাককে বলে:এটি বিশেষ, এটিকে দ্বীপে পাঠান৷

হোস্ট স্ট্যাক তারপরে ব্লুটুথ সিস্টেমে কোডের একটি নতুন স্তরের সাথে কথা বলে যাকে বলা হয় এলপিপি অফলোড ম্যানেজার এবং একটি সকেট নির্দিষ্ট এইচএএল (হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার) যাতে সকেট খোলা বা বন্ধ হলে কম পাওয়ার প্রসেসরকে জানানো যায় এবং ডেটা পরিচালনার দায়িত্ব দাবি করতে পারে৷

তাই যদি আমরা ক্যাফে সাদৃশ্য রাখি, পূর্বে প্রতিটি ব্লুটুথ গ্রাহক সরাসরি প্রধান বারিস্তাতে তাদের অর্ডারটি চিৎকার করে বলতেন। লো পাওয়ার আইল্যান্ড এবং ব্লুটুথসকেট সেটিংসের সাহায্যে, অ্যান্ড্রয়েড বলতে পারে, "এই নিয়মিত এসপ্রেসো অর্ডারগুলি পাশের কাউন্টারে জুনিয়র বারিস্তার মাধ্যমে যেতে পারে৷ শুধুমাত্র অদ্ভুত কাস্টম পানীয়গুলি এখনও মূল বারিস্তাতে যায়"৷ ব্যবহারকারীর জন্য একই ব্লুটুথ অভিজ্ঞতা, তবে কাউন্টারের পিছনে অনেক কম বিশৃঙ্খলা এবং অনেক কম শক্তি অপচয় হয়৷

এই নিবন্ধে, আমরা এই উচ্চ স্তরের গল্প থেকে প্রকৃত অ্যান্ড্রয়েড APIগুলিতে জুম করব৷ আমরা দেখব কিভাবে BluetoothSocketSettings ফ্রেমওয়ার্কের মধ্যে সংজ্ঞায়িত করা হয়, আপনি কীভাবে হার্ডওয়্যার অফলোডের অনুরোধ করেন এবং hubId এবং endpointId এর মতো ভীতিকর চেহারার ক্ষেত্রগুলি আসলে সাধারণ ইংরেজিতে কী বোঝায়।

সূচিপত্র

  1. ব্লুটুথ সকেট সেটিংসের অ্যানাটমি

  2. HAL এর ভিতরে:কিভাবে ব্লুটুথ অফলোড সত্যিই কাজ করে

  3. যখন CPU ঘুমায় কিন্তু ব্লুটুথ করে না:পাওয়ার ম্যানেজমেন্ট ইন অ্যাকশন

  4. বিকাশকারীরা কীভাবে ব্লুটুথ সকেট সেটিংস ব্যবহার করতে পারে

  5. গ্র্যান্ড ফিনালে:দ্য এলিগেন্স অফ স্লিপিং স্মার্ট

ব্লুটুথসকেট সেটিংসের অ্যানাটমি

এখন পর্যন্ত আমরা 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-এর অভ্যন্তরে থাকা ব্লুটুথ ফার্মওয়্যারটি তখন প্রধান CPU-কে ক্রমাগত না জাগিয়ে প্যাকেট রিট্রান্সমিশন, স্বীকৃতি এবং প্রবাহ নিয়ন্ত্রণ পরিচালনা করবে।

আপনি যদি এই ধরনের সংযোগের সময় আপনার ডিভাইসের কার্নেল লগ নিরীক্ষণ করেন, তাহলে আপনি এমন কিছু খুঁজে পেতে পারেন:

bt_vendor: enabling LPI offload for handle 0x0041
bt_controller: lpi path active, cpu wakelocks released

সেই লগ লাইনটি আপনার শান্ত নিশ্চিতকরণ যে ডেটা পাথ সফলভাবে কম শক্তির দ্বীপে স্থানান্তরিত হয়েছে৷

মানুষের পরিপ্রেক্ষিতে, ফোনটি ঠিক করেছে যে এই ব্লুটুথ কথোপকথনটি মিনি-প্রসেসর দ্বারা পরিচালনা করার জন্য যথেষ্ট অনুমানযোগ্য, তাই এটি বিনয়ের সাথে বড় সিপিইউকে বলেছিল, "আপনি এখন ঘুমাতে পারেন। আমি এটি পেয়েছি।"

পরবর্তী বিভাগে আমরা এই সকেট সেটিংস কন্ট্রোলার চিপের ভিতরে প্রকৃত লো-পাওয়ার ডাটা রাউটিংয়ে কীভাবে পরিণত হয় তা দেখতে HAL এবং ফার্মওয়্যার সীমানার এক স্তর গভীরে এই যাত্রাটি অনুসরণ করব। এখানেই আসল হার্ডওয়্যার ম্যাজিক ঘটে এবং যেখানে সঞ্চয় একবারে প্রতি মিলিওয়াট যোগ করতে শুরু করে।

HAL এর ভিতরে:কিভাবে ব্লুটুথ অফলোড সত্যিই কাজ করে

এখন পর্যন্ত, আমরা বেশিরভাগই Android এর Java এবং নেটিভ লেয়ারে থেকেছি, আরামদায়ক অ্যাপার্টমেন্ট যেখানে ফ্রেমওয়ার্ক এবং সিস্টেম পরিষেবাগুলি বাস করে। কিন্তু এর নিচে রয়েছে চতুর যন্ত্রপাতি পূর্ণ একটি বেসমেন্ট:হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার , বা HAL. এখানেই Android "অবজেক্টে" কথা বলা বন্ধ করে এবং অপকোড এবং বাফারে কথা বলা শুরু করে এবং এটি সফ্টওয়্যার এবং সিলিকনের মধ্যে সেতু।

যখন 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 বলে, "ঠিক আছে চিপ, অনুগ্রহ করে একটি সারি তৈরি করুন যা সম্পূর্ণরূপে আপনার কম-পাওয়ার প্রসেসরের ভিতরে থাকে।" এই মাইক্রোকন্ট্রোলারটি শারীরিকভাবে ব্লুটুথ রেডিওর কাছাকাছি। এটি স্বীকারোক্তি, ছোট ডেটা বিস্ফোরণ এবং এমনকি কিছু প্রোটোকল টাইমিং নিজেই পরিচালনা করতে পারে, যেগুলি সাধারণত প্রধান CPU-কে জাগানোর প্রয়োজন হয়৷

একবার এই চ্যানেলটি তৈরি হয়ে গেলে, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এবং অ্যাপগুলি এখনও একটি সাধারণ ফাইল বর্ণনাকারী দেখতে পায়, যেন সকেটটি সম্পূর্ণ স্থানীয়। জাদুটি এই সত্যের মধ্যে রয়েছে যে এই বর্ণনাকারীটি লিনাক্স কার্নেল বাফারগুলির পরিবর্তে ফার্মওয়্যার-পরিচালিত মেমরি এবং ডিএমএ পাথ দ্বারা সমর্থিত৷

আপনি যদি কন্ট্রোলার থেকে একটি ডিবাগার বা ডাম্প লগ সংযুক্ত করতে চান তবে আপনি এরকম কিছু দেখতে পাবেন:

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 -> Bluetooth Framework -> JNI -> btif_sock -> HAL -> Controller MCU (LPI)

প্রতিটি স্তর পরের দিকে পরিষ্কারভাবে ব্যাটন পাস করার জন্য যথেষ্ট বোঝে। HAL অনুবাদক হিসেবে কাজ করে, উচ্চ-স্তরের সেটিংস গ্রহণ করে এবং সেগুলোকে নিম্ন-স্তরের কমান্ডে পরিণত করে যা চিপ ফার্মওয়্যার চালাতে পারে।

আপনার স্মার্টওয়াচ যখন একটি প্যাকেট পাঠায় বা আপনার ইয়ারবাডগুলি একটি অডিও খণ্ডের জন্য অনুরোধ করে, তখন মূল CPU এমনকি মিটমিট করে না। সম্পূর্ণ লেনদেনটি ব্লুটুথ কন্ট্রোলারের ক্ষুদ্র ডোমেনের মধ্যেই বেঁচে থাকে এবং মারা যায়, এটি গলানোর পরিবর্তে শক্তিতে চুমুক দেয়।

পরবর্তী বিভাগে, আমরা অন্বেষণ করব কীভাবে এই অফলোড আর্কিটেকচারটি অ্যান্ড্রয়েডের পাওয়ার ম্যানেজমেন্ট সিস্টেমের সাথে একীভূত হয়, যার মধ্যে রয়েছে ওয়েকলকস, ডোজ মোড এবং কার্নেল সমন্বয়, এবং কীভাবে এটি নিশ্চিত করে যে যদিও মূল CPU ঘুমিয়ে আছে, সংযোগটি কখনই মিস করে না।

যখন CPU ঘুমায় কিন্তু ব্লুটুথ করে না:কর্মে পাওয়ার ম্যানেজমেন্ট

ঠিক আছে, আমরা দেখেছি কিভাবে সকেট অফলোড অ্যাপ লেয়ার থেকে HAL-এ চলে যায় এবং অবশেষে সেই ক্ষুদ্র MCU-তে অবতরণ করে যা ব্লুটুথ চিপের ভিতরে থাকে। কিন্তু এরপর কি হবে? ফাইল ট্রান্সফার বা অডিও স্ট্রিম চলাকালীন আপনার ফোনের প্রধান CPU যদি ঘুমানোর সিদ্ধান্ত নেয়? এতে কি ব্লুটুথ সংযোগ বিচ্ছিন্ন হওয়ার ঝুঁকি নেই?

এখানেই Android এর পাওয়ার ম্যানেজমেন্ট কোরিওগ্রাফি স্টেপ ইন। এটি তিনজন অভিনয়শিল্পীর মধ্যে একটি নাচ:পাওয়ার 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 দেখতে পাবেন স্ট্রিমিংয়ের সময়ও কাউন্টার কম থাকে, অভিনন্দন! লো পাওয়ার আইল্যান্ড অফলোড সুন্দরভাবে তার কাজ করছে।

পরবর্তী বিভাগে, আমরা ফার্মওয়্যারের গভীরতা থেকে ফিরে আসব যাতে এই সমস্ত দৈনন্দিন বিকাশকারীর জগতে কীভাবে ফিট করে। আপনি কি একজন অ্যাপ বা সিস্টেম ডেভেলপার হিসেবে এই সকেট সেটিংস থেকে সরাসরি নিয়ন্ত্রণ বা উপকৃত হতে পারেন? এবং কীভাবে সেগুলি বোঝা আপনাকে ব্লুটুথ অ্যাপ তৈরি করতে সাহায্য করবে যা চুমুক পাওয়ার পরিবর্তে চুমুক দেয়?

বিকাশকারীরা কীভাবে ব্লুটুথ সকেট সেটিংস ব্যবহার করতে পারে

এখন যেহেতু আমরা ব্লুটুথ স্ট্যাকের হৃদয়ের গভীরে উঁকি দিয়েছি, আসুন আপনি এবং আমি আসলে যেখানে বাস করি সেখানে ফিরে যাই:বিকাশকারী স্তর৷ আপনি হয়তো ভাবছেন, "ঠিক আছে, সেই সব হার্ডওয়্যার উইজার্ডি দুর্দান্ত, কিন্তু আমি আসলে কি করতে পারি এটা দিয়ে?"

মজার অংশটি এখানে:যদিও লো পাওয়ার আইল্যান্ড বেশিরভাগই একটি সিস্টেম-স্তরের বৈশিষ্ট্য, এটি কীভাবে কাজ করে তা বোঝা এখনও আপনাকে ব্লুটুথ অ্যাপগুলি ডিজাইন করতে সহায়তা করতে পারে যা আরও শক্তি-বান্ধব এবং অনুমানযোগ্য৷

ফ্রেমওয়ার্ক লেভেলে, আপনি আপনার অ্যাপ থেকে সরাসরি LPI চালু বা বন্ধ করতে পারবেন না। এই সুইচগুলি BluetoothService এবং BluetoothSocketManagerService-এর মতো সিস্টেমের উপাদানগুলিতে গভীরভাবে বাস করে। কিন্তু প্রতিবার আপনি BluetoothSocket ব্যবহার করেন অথবা BluetoothServerSocket , আপনার ডেটা নিঃশব্দে সেই স্তরগুলির মধ্য দিয়ে প্রবাহিত হয় যা LPI অফলোড উপলব্ধ কিনা তা পরীক্ষা করে৷

তার মানে আপনার অ্যাপ স্বয়ংক্রিয়ভাবে উপকৃত হয়, যতক্ষণ আপনি এমন কিছু না করেন যা CPU কে অপ্রয়োজনীয়ভাবে জেগে থাকতে বাধ্য করে . উদাহরণস্বরূপ, সঠিক থ্রেড স্লিপ ব্যবহার করা, ব্যস্ত লুপগুলি এড়িয়ে যাওয়া এবং Android এর নিজস্ব ব্লুটুথ 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 আচরণ পরিবর্তন করতে পারেন, কাস্টম হাব বা এন্ডপয়েন্ট আইডি বরাদ্দ করতে পারেন, এবং এমনকি ফার্মওয়্যার DMA স্থানান্তরের জন্য ব্যবহার করে সর্বোচ্চ প্যাকেটের আকার টিউন করতে পারেন। এটি আপনাকে ব্লুটুথ বৈশিষ্ট্যগুলি তৈরি করতে দেয়:যেমন কম শক্তির টেলিমেট্রি স্ট্রিমিং বা পরিধানযোগ্য সেন্সর সিঙ্ক, যা প্রায় সম্পূর্ণরূপে অফলোড করা হয়৷

সেই মুহুর্তে, আপনার ব্লুটুথ চিপ একটি মিনি সার্ভারে পরিণত হয় যা মূল OS ঘুমানোর সময় কাজ করে, অসাধারণ ব্যাটারি লাইফ এবং দ্রুত পুনঃসংযোগ প্রদান করে৷

চূড়ান্ত বিভাগে, আমরা জিনিসগুলি গুটিয়ে নেব এবং বড় ছবির দিকে ফিরে তাকাব, কেন BluetoothSocketSettings এবং Low Power Island একসাথে Android এর "অদৃশ্য ইঞ্জিনিয়ারিং" এর সবচেয়ে মার্জিত উদাহরণগুলির একটি উপস্থাপন করে। এটি সেই শান্ত বিজয়গুলির মধ্যে একটি যা আপনি খুব কমই একটি মূল বক্তব্যে দেখতে পাবেন কিন্তু প্রতিদিন অনুভব করেন যখন আপনার ফোনে এখনও মধ্যরাতে রস থাকে।

দ্য গ্র্যান্ড ফিনালে:দ্য এলিগেন্স অফ স্লিপিং স্মার্ট

আসুন এক মুহুর্তের জন্য একধাপ পিছিয়ে যাই। আমরা একটি কফি শপে একটি অতিরিক্ত কাজ করা বারিস্তা নিয়ে শুরু করলাম। তারপরে আমরা একটি লুকানো সহকারী, লো পাওয়ার আইল্যান্ড আবিষ্কার করেছি, যেটি মূল বারিস্তা দূরে সরে গেলেও নীরবে ক্যাফে চালায়৷

আমরা একটি নম্র ব্লুটুথ সকেটের পথ অনুসরণ করেছি, এটি BluetoothSocketSettings-এ মোড়ানো দেখেছি , HAL এর মধ্য দিয়ে যাত্রা করে, এবং অবশেষে কন্ট্রোলারের ভিতরে একটি ক্ষুদ্র প্রসেসরে অবতরণ করে যা বড় CPU স্বপ্ন দেখার সময় গুনগুন করে।

এবং এটিই এর সৌন্দর্য:অ্যান্ড্রয়েডের ব্লুটুথ অফলোড প্রক্রিয়াটি অদৃশ্য প্রকৌশলের সবচেয়ে মার্জিত উদাহরণগুলির মধ্যে একটি। এটি একটি নতুন API বা অভিনব অ্যানিমেশনের সাথে নিজেকে ঘোষণা করে না। এটি নিঃশব্দে আপনার ব্যাটারিকে দীর্ঘস্থায়ী করে তোলে, আপনার ব্লুটুথকে আরও নির্ভরযোগ্য করে তোলে এবং আপনার ফোনটিকে মসৃণ মনে হয়, এমনকি আপনি না জেনেও এটি সেখানে আছে।

প্রযুক্তিগত দৃষ্টিকোণ থেকে, উজ্জ্বলতা ভারসাম্যের মধ্যে রয়েছে। সিস্টেমটি এখনও পূর্ণ-বৈশিষ্ট্যযুক্ত সকেট এবং সমৃদ্ধ প্রোটোকল পরিচালনার অনুমতি দেয় যখন আপনার প্রয়োজন হয়, তবে সাধারণ ডেটা প্রবাহ, অডিও, টেলিমেট্রি, বিজ্ঞপ্তি বা হার্ট রেট স্ট্রিমিংয়ের জন্য, এটি কম-পাওয়ার কন্ট্রোলারকে চাকা নিতে দেয়। এটা Android এর মতই অর্পণ করতে শিখেছে।

যখনই আপনার ফোনের স্ক্রিন বন্ধ থাকা অবস্থায় আপনার স্মার্টওয়াচ সিঙ্ক হয়, বা আপনার ইয়ারবাডগুলি আপনার ব্যাটারি নিষ্কাশন না করে দীর্ঘ ফ্লাইটের সময় সংযুক্ত থাকে, আপনি BluetoothSocketSettings দেখতে পাচ্ছেন এবং কর্মক্ষেত্রে নিম্ন শক্তি দ্বীপ কাঠামো। তারা আধুনিক অ্যান্ড্রয়েড ডিজাইনের একটি বৃহত্তর দর্শনের অংশ, বুদ্ধিমত্তাকে হার্ডওয়্যারের কাছাকাছি নিয়ে যায়। যত বেশি আমরা আমাদের চিপগুলিকে স্বায়ত্তশাসিত কাজগুলি পরিচালনা করতে শেখাই, তত বেশি আমরা মূল প্রসেসরকে বিশ্রাম দিতে পারি৷

আপনি যদি একজন বিকাশকারী বা সিস্টেম ইঞ্জিনিয়ার হন তবে এই আর্কিটেকচার বোঝা শুধু একাডেমিক নয়। এটা অনুপ্রাণিত করতে পারে আপনি কিভাবে আপনার নিজস্ব বৈশিষ্ট্য ডিজাইন. আপনি একটি কাস্টম অ্যান্ড্রয়েড রম তৈরি করছেন, পরিধানযোগ্যদের জন্য ফার্মওয়্যার অপ্টিমাইজ করছেন বা ব্লুটুথ চিপ দিয়ে IoT ডিভাইস তৈরি করছেন, পাঠটি পরিষ্কার:প্রতিটি প্যাকেটে আপনার প্রধান CPU বেবিসিট করবেন না। আপনি যখন পারেন অফলোড করুন, যখন আপনি ঘুমান, এবং আপনার ডিভাইসগুলি আপনাকে ঘন্টার অতিরিক্ত আপটাইম দিয়ে ধন্যবাদ জানাবে।

তাই পরের বার যখন আপনি আপনার ইয়ারবাডগুলিকে প্লাগ ইন করবেন এবং আপনার ফোনটি ঠাণ্ডা থাকার এবং আপনার ব্যাটারির শতাংশ খুব কমই চলছে তা লক্ষ্য করুন, মনে রাখবেন:ভিতরে কোথাও, একটি ক্ষুদ্র ব্লুটুথ MCU সমস্ত ভারী উত্তোলন করছে যখন প্রধান CPU তার লো-পাওয়ার হ্যামকটিতে ঘুমিয়ে আছে৷

এটি অ্যান্ড্রয়েডের লো পাওয়ার আইল্যান্ড এবং ব্লুটুথসকেট সেটিংসের শান্ত প্রতিভা। এটা শুধু ব্লুটুথ সম্পর্কে নয়। এটি আমাদের ডিভাইসগুলিকে আরও স্মার্ট হতে শেখানোর বিষয়ে, ব্যস্ত নয়। এবং হতে পারে, ঠিক হতে পারে, এটি আমাদের নিজেদের জন্যও মনে রাখার মতো একটি পাঠ।

বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন


  1. কোন হাইপারভাইজার পাওয়া যায়নি; ত্রুটি 0xc0351000 - উইন্ডোজ স্যান্ডবক্স

  2. আপনার উইন্ডোজ লাইভ অ্যাকাউন্টের জন্য কীভাবে একটি সিঙ্গেল সাইন অন কোড পাবেন

  3. Windows 11/10-এ পাঠ্য কার্সার সূচকের আকার, রঙ এবং বেধ পরিবর্তন করুন

  4. উইন্ডোজ আপডেট ত্রুটি 0x800f0831 ঠিক করুন