अंदरूनी ईथरनेट नेटवर्क कॉन्फ़िगर करें

Android Auto OS 13 और उसके बाद के वर्शन में ऐसी सुविधाएं हैं जिनसे ईथरनेट नेटवर्क कॉन्फ़िगर और मैनेज करें. पहली इमेज में, नेटवर्क का उदाहरण दिखाया गया है ऑटोमोबाइल का डायग्राम:

Android Auto नेटवर्किंग

पहला डायग्राम. Android Auto नेटवर्किंग.

इस इमेज में, OEM नेटवर्किंग ऐप्लिकेशन से कॉल करने के तरीके ईथरनेट नेटवर्क को कॉन्फ़िगर और मैनेज करने के लिए, EthernetManager क्लास (एथ0.1, एथ0.2, और एथ0.3). पहली इमेज का बाकी हिस्सा, करें.

डिफ़ॉल्ट ईथरनेट नेटवर्क सेटिंग सेट करें

डिफ़ॉल्ट नेटवर्क सेटिंग सेट करने के लिए, रिसॉर्स ओवरले 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_ethernet_interfaces रिसॉर्स ओवरले को दिखाया गया है config.xml.

कोड के बारे में खास जानकारी

  • eth1, eth2, और eth3 कॉन्फ़िगर किए जा रहे नेटवर्क इंटरफ़ेस के नाम हैं.
  • 12, 13, 14, 15 की क्रमागत संख्या से पता चलता है कि नेटवर्क सुविधाएं चालू किया जा रहा है.
  • ip=, gateway=, और 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() एक हेल्पर तरीका है, जिसे मौजूदा नेटवर्क से कनेक्ट किया जाता है क्षमताओं और कॉल convertToUIDs() को बदलने के लिए Linux यूनीक आइडेंटिफ़ायर (यूआईडी) के लिए, पैकेज के ऐसे नाम जिन्हें कोई भी व्यक्ति आसानी से पढ़ सके. आम तौर पर, आप यूआईडी के बारे में नहीं पता पहले ही सबमिट कर सकते हैं. इसलिए, अगर आपको ऐप्लिकेशन के किसी सबसेट के ऐक्सेस को सीमित करने के लिए, EthernetManager.updateConfiguration() को अपने यूआईडी का इस्तेमाल करना होगा.
  • request अंदरूनी नेटवर्क के लिए इस्तेमाल किया जाने वाला कॉन्फ़िगरेशन है. कॉन्टेंट बनाने अनुरोध में आईपी कॉन्फ़िगरेशन और नेटवर्क के लिए नई सेटिंग शामिल हो सकती हैं सुविधाएं. अगर नेटवर्क को कनेक्टिविटी स्टैक के साथ रजिस्टर किया गया है. यह कॉन्फ़िगरेशन. यह कॉन्फ़िगरेशन सभी रीबूट में लागू नहीं होता है.
  • getMainExecutor() उस एक्ज़ीक्यूटर को लौटाता है जिस पर लिसनर को शुरू किया गया है.
  • mCallback एक कॉलबैक है, जो पूरा होने पर यह बताने के लिए इस्तेमाल किया जाता है कि अपडेट होने पर नेटवर्क का नाम या EthernetNetworkManagementException चालू होने पर गड़बड़ी.

updateConfiguration(), नेटवर्क की विशेषताओं को अपडेट कर सकता है Android कनेक्टिविटी स्टैक के ज़रिए नहीं बदला जा सकता. कॉन्टेंट बनाने इन अनम्यूट किए जा सकने वाले नेटवर्क को नीचे लाया जाता है, अपडेट किया जाता है, और वापस लाया जाता है एट्रिब्यूट को अपडेट करना होगा.

कुछ ऐप्लिकेशन के लिए नेटवर्क को सीमित करना

EthernetManager#updateConfiguration का इस्तेमाल करके, अनुमति वाले यूआईडी का सबसेट. जिन मामलों में यह ज़रूरी है उनके लिए इस तरीके का इस्तेमाल करें जैसे, सिर्फ़ उन वाहनों के नेटवर्क जिनके इस्तेमाल की ज़रूरत सिर्फ़ कुछ छोटे सबसेट के लिए होती है सबसे ज़्यादा स्टोर हैं.

Android मुख्य रूप से ऐप्लिकेशन को अपने यूआईडी के हिसाब से ट्रैक करता है. यहां से लिया गया कोड: UIDToPackageNameConverter.java पैकेज के नामों की स्ट्रिंग से यूआईडी की सीरीज़ पाने का तरीका दिखाता है:

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 का इस्तेमाल पैकेज का नाम.
  • uids, पूर्णांकों का जनरेट किया गया अरे होता है.

इसमें नीचे दिया गया कोड EthernetManagerTest.kt दिखाता है कि ऐप्लिकेशन के यूआईडी के साथ, अपने नेटवर्क इंटरफ़ेस कॉन्फ़िगरेशन को कैसे अपडेट करें को नेटवर्क का इस्तेमाल करने की अनुमति है:

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

कहाँ:

  • allowUids, ऐप्लिकेशन के यूआईडी का सेट है, जिसे नेटवर्क का इस्तेमाल करने की अनुमति है.
  • updateConfiguration(), नेटवर्क को सीमित करने के लिए कॉन्फ़िगरेशन को अपडेट करता है यूआईडी का दिया गया सेट.