অভ্যন্তরীণ ইথারনেট নেটওয়ার্ক কনফিগার করুন

Android Auto OS 13 এবং উচ্চতর বৈশিষ্ট্যগুলি আপনাকে ইথারনেট নেটওয়ার্কগুলি কনফিগার এবং পরিচালনা করার অনুমতি দেয়৷ চিত্র 1 একটি অটোমোবাইলের জন্য একটি উদাহরণ নেটওয়ার্ক ডায়াগ্রাম দেখায়:

অ্যান্ড্রয়েড অটো নেটওয়ার্কিং

চিত্র 1. অ্যান্ড্রয়েড অটো নেটওয়ার্কিং।

এই চিত্রটি অনবোর্ড ইথারনেট নেটওয়ার্ক (eth0.1, eth0.2, এবং eth0.3) কনফিগার এবং পরিচালনা করতে EthernetManager ক্লাসে আপনার OEM নেটওয়ার্কিং অ্যাপ কলিং পদ্ধতিগুলি দেখায়। চিত্র 1 এর অবশিষ্টাংশ এই নথির সুযোগের বাইরে।

ডিফল্ট ইথারনেট নেটওয়ার্ক সেটিংস সেট করুন

ডিফল্ট নেটওয়ার্ক সেটিংস সেট করতে, রিসোর্স ওভারলে config_ethernet_interfaces ব্যবহার করুন:

<string-array translatable="false" name="config_ethernet_interfaces">
        <!--
        <item>eth1;12,13,14,15;ip=192.168.0.10/24 gateway=192.168.0.1 dns=4.4.4.4,8.8.8.8</item>
        <item>eth2;;ip=192.168.0.11/24</item>
        <item>eth3;12,13,14,15;ip=192.168.0.12/24;1</item>
        -->
    </string-array>

এই উদাহরণটি config.xml থেকে config_ethernet_interfaces রিসোর্স ওভারলে দেখায়।

কোড সম্পর্কে মূল পয়েন্ট

  • eth1 , eth2 , এবং eth3 হল কনফিগার করা নেটওয়ার্ক ইন্টারফেসের নাম।
  • 12, 13, 14, 15 এর ধারাবাহিক সংখ্যাগুলি সক্রিয় করা নেটওয়ার্ক ক্ষমতাগুলিকে উপস্থাপন করে৷
  • ip= , gateway= , এবং dns নেটওয়ার্কের জন্য প্রাথমিক IP ঠিকানা, গেটওয়ে এবং DNS সেট করতে ব্যবহৃত হয়।

একটি নেটওয়ার্ক ইন্টারফেস সক্ষম বা অক্ষম করুন

একটি নেটওয়ার্ক ইন্টারফেস সক্ষম করতে, EthernetManager.enableInterface() কল করুন :

public final class InterfaceEnabler {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mOutcomeReceiver;

    public InterfaceEnabler(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> outcomeReceiver) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mOutcomeReceiver = outcomeReceiver;
    }

    public void enableInterface(String ifaceName) {
        mEthernetManager.enableInterface(ifaceName,
                mApplicationContext.getMainExecutor(),
                mOutcomeReceiver);
    }
}

কোড সম্পর্কে মূল পয়েন্ট

  • ifaceName সক্রিয় করার জন্য নেটওয়ার্ক ইন্টারফেসের নাম।
  • getMainExecutor() অ্যাপের প্রসঙ্গ ফিরিয়ে দেয়।
  • OutcomeReceiver হল একটি কলব্যাক যা সফলতার উপর আপডেট করা নেটওয়ার্ক নাম অথবা ত্রুটির ক্ষেত্রে EthernetNetworkManagementException ফেরত দিয়ে যোগাযোগের জন্য ব্যবহৃত হয়।

যখন একটি নেটওয়ার্ক ইন্টারফেস সক্রিয় করা হয়, এটি EthernetManager.updateConfiguration() দ্বারা সেট করা কনফিগারেশন ব্যবহার করে। EthernetManager.updateConfiguration() দ্বারা একটি কনফিগারেশন সেট করা না থাকলে, নেটওয়ার্ক ইন্টারফেস রিসোর্স ওভারলে config_ethernet_interfaces বা ডিফল্ট ইথারনেট নেটওয়ার্ক কনফিগারেশন ব্যবহার করে যদি একটি ওভারলে উপলব্ধ না হয়।

একটি নেটওয়ার্ক ইন্টারফেস নিষ্ক্রিয় করতে, EthernetManager.disableInterface() কল করুন :

public final class InterfaceEnabler {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mOutcomeReceiver;

    public InterfaceEnabler(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> outcomeReceiver) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mOutcomeReceiver = outcomeReceiver;
    }

    public void disableInterface(String ifaceName) {
        mEthernetManager.disableInterface(ifaceName,
                mApplicationContext.getMainExecutor(),
                mOutcomeReceiver);
    }
}

কোড সম্পর্কে মূল পয়েন্ট

  • ifaceName নিষ্ক্রিয় করার জন্য নেটওয়ার্ক ইন্টারফেসের নাম।
  • getMainExecutor() অ্যাপের প্রসঙ্গ ফিরিয়ে দেয়।
  • OutcomeReceiver হল একটি কলব্যাক যা সফলতার উপর আপডেট করা নেটওয়ার্ক নাম অথবা ত্রুটির ক্ষেত্রে EthernetNetworkManagementException ফেরত দিয়ে যোগাযোগের জন্য ব্যবহৃত হয়।

নেটওয়ার্ক কনফিগারেশন আপডেট করুন

ইথারনেট নেটওয়ার্ক কনফিগারেশন আপডেট করতে, EthernetManager.updateConfiguration() কল করুন :

public final class ConfigurationUpdater {
    private final Context mApplicationContext;
    private final EthernetManager mEthernetManager;
    private final OutcomeReceiver<String, EthernetNetworkManagementException> mCallback;

    public ConfigurationUpdater(Context applicationContext,
            OutcomeReceiver<String, EthernetNetworkManagementException> callback) {
        mApplicationContext = applicationContext;
        mEthernetManager = applicationContext.getSystemService(EthernetManager.class);
        mCallback = callback;
    }

    public void updateNetworkConfiguration(String packageNames,
            String ipConfigurationText,
            String networkCapabilitiesText,
            String interfaceName)
            throws IllegalArgumentException, PackageManager.NameNotFoundException {

        EthernetNetworkUpdateRequest request = new EthernetNetworkUpdateRequest.Builder()
                .setIpConfiguration(getIpConfiguration(ipConfigurationText))
                .setNetworkCapabilities(getCapabilities(
                        interfaceName, networkCapabilitiesText, packageNames))
                .build();

        mEthernetManager.updateConfiguration(interfaceName, request,
                mApplicationContext.getMainExecutor(), mCallback);

    }
}

কোড সম্পর্কে মূল পয়েন্ট

  • getCapabilities() হল একটি সহায়ক পদ্ধতি যা বর্তমান নেটওয়ার্ক ক্ষমতাগুলি পায় এবং মানব-পাঠযোগ্য প্যাকেজ নামগুলিকে Linux অনন্য শনাক্তকারী (UID) এ রূপান্তর করতে convertToUIDs() কল করে। সাধারণত, আপনি তাদের সংশ্লিষ্ট প্যাকেজের জন্য UID গুলি আগে থেকে জানেন না। তাই, যদি আপনি EthernetManager.updateConfiguration() অ্যাপের উপসেটে অ্যাক্সেস সীমিত করতে ব্যবহার করতে চান, তাহলে আপনাকে তাদের UID ব্যবহার করতে হবে।
  • request হল অভ্যন্তরীণ নেটওয়ার্কের জন্য ব্যবহার করা কনফিগারেশন। অনুরোধে IP কনফিগারেশন এবং নেটওয়ার্ক ক্ষমতাগুলির জন্য একটি নতুন সেটিংস থাকতে পারে। নেটওয়ার্কটি সংযোগ স্ট্যাকের সাথে নিবন্ধিত হলে, এটি কনফিগারেশন অনুযায়ী আপডেট করা হয়। এই কনফিগারেশনটি রিবুট জুড়ে টিকে থাকে না।
  • getMainExecutor() নির্বাহক ফেরত দেয় যার উপর শ্রোতাকে আহ্বান করা হয়।
  • mCallback হল সফলতার আপডেট করা নেটওয়ার্ক নাম বা ত্রুটির ক্ষেত্রে EthernetNetworkManagementException ফেরত দিয়ে যোগাযোগের জন্য ব্যবহৃত কলব্যাক।

updateConfiguration() Android কানেক্টিভিটি স্ট্যাকের দ্বারা অপরিবর্তনীয় বলে বিবেচিত একটি নেটওয়ার্কের বৈশিষ্ট্য আপডেট করতে পারে। এই অপরিবর্তনীয় বৈশিষ্ট্যগুলিকে আপডেট করার জন্য নেটওয়ার্কটি নিচে আনা, আপডেট করা এবং ব্যাক আপ করা হয়েছে।

অ্যাপের উপসেটে একটি নেটওয়ার্ক সীমাবদ্ধ করুন

আপনি EthernetManager#updateConfiguration ব্যবহার করতে পারেন শুধুমাত্র অনুমোদিত UID-এর একটি উপসেটে অ্যাক্সেস সীমিত করতে। যেখানে এটি প্রয়োজনীয়, যেমন অভ্যন্তরীণ যানবাহন নেটওয়ার্কের জন্য শুধুমাত্র OEM অ্যাপের একটি ছোট উপসেট দ্বারা ব্যবহার করা যায় এমন ক্ষেত্রে ব্যবহার করার জন্য এই পদ্ধতিটি ব্যবহার করুন।

অ্যান্ড্রয়েড প্রাথমিকভাবে তাদের UID দ্বারা অ্যাপগুলিকে ট্র্যাক করে৷ UIDToPackageNameConverter.java থেকে নিম্নলিখিত কোডটি দেখায় কিভাবে প্যাকেজ নামের একটি স্ট্রিং থেকে UID-এর একটি সিরিজ পাওয়া যায়:

public static Set<Integer> convertToUids(Context applicationContext, String packageNames)
            throws PackageManager.NameNotFoundException {
        final PackageManager packageManager = applicationContext.getPackageManager();
        final UserManager userManager = applicationContext.getSystemService(UserManager.class);

        final Set<Integer> uids = new ArraySet<>();
        final List<UserHandle> users = userManager.getUserHandles(true);

        String[] packageNamesArray = packageNames.split(",");
        for (String packageName : packageNamesArray) {
            boolean nameNotFound = true;
            packageName = packageName.trim();
            for (final UserHandle user : users) {
                try {
                    final int uid =
                            packageManager.getApplicationInfoAsUser(packageName, 0, user).uid;
                    uids.add(uid);
                    nameNotFound = false;
                } catch (PackageManager.NameNotFoundException e) {
                    // Although this may seem like an error scenario, it is OK as all packages are
                    // not expected to be installed for all users.
                    continue;
                }
            }

            if (nameNotFound) {
                throw new PackageManager.NameNotFoundException("Not installed: " + packageName);
            }
        }
        return uids;

কোড সম্পর্কে মূল পয়েন্ট

  • getApplicationInfoAsuser().uid প্যাকেজের নাম থেকে UID পুনরুদ্ধার করতে ব্যবহৃত হয়।
  • uids হল পূর্ণসংখ্যার তৈরি করা অ্যারে।

EthernetManagerTest.kt এ নিম্নলিখিত কোডটি দেখায় যে কীভাবে নেটওয়ার্ক ব্যবহার করার জন্য অনুমোদিত অ্যাপগুলির একটি UID দিয়ে আপনার নেটওয়ার্ক ইন্টারফেস কনফিগারেশন আপডেট করবেন:

val allowedUids = setOf(Process.myUid())
        val nc = NetworkCapabilities.Builder(request.networkCapabilities)
                .setAllowedUids(allowedUids).build()
        updateConfiguration(iface, capabilities = nc).expectResult(iface.name)

কোথায়:

  • allowUids হল নেটওয়ার্ক ব্যবহার করার জন্য অনুমোদিত অ্যাপ UID-এর সেট।
  • updateConfiguration() নেটওয়ার্কটিকে UID-এর প্রদত্ত সেটে সীমাবদ্ধ করতে কনফিগারেশন আপডেট করে।