إعداد شبكات إيثرنت الداخلية

يحتوي الإصدار 13 من نظام التشغيل Android Auto والإصدارات الأحدث على ميزات تتيح لك تهيئة شبكات Ethernet وإدارتها. يوضح الشكل 1 مثالاً على شبكة رسم بياني لسيارة:

الاتصال بشبكة Android Auto

الشكل 1. الاتصال بشبكة Android Auto:

يوضح هذا الرسم طرق الاتصال بتطبيق الشبكات التابعة للمصنّع الأصلي للجهاز في فئة واحدة (EthernetManager) لضبط شبكات الإيثرنت المدمجة وإدارتها (eth0.1 وeth0.2 وeth0.3) باقي الشكل 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_ethernet_interfaces من config.xml

النقاط الرئيسية حول الرمز البرمجي

  • eth1 وeth2 وeth3 هي أسماء واجهة الشبكة التي يتم إعدادها.
  • تمثّل الأرقام المتتالية لـ 12, 13, 14, 15 الشبكة الإمكانات قيد التفعيل.
  • تُستخدم ip= وgateway= وdns لضبط عنوان IP الأولي والبوابة ونظام أسماء النطاقات للشبكة.

تفعيل واجهة شبكة أو إيقافها

لتفعيل واجهة شبكة، اتصل 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 أو شبكة Ethernet التلقائية في حال عدم توفر تراكب.

لإيقاف إحدى واجهات الشبكة، اتصِل 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() لإجراء إحالة ناجحة أسماء الحِزم التي يمكن للمستخدمين قراءتها لنظام التشغيل المعرّف الفريد (UID) على Linux. عادةً، لا أعرف المعرفات الفريدة مسبقًا للحزم المرتبطة بها. لذلك، إذا كنت تريد استخدام EthernetManager.updateConfiguration() لتقييد إمكانية الوصول إلى مجموعة فرعية من التطبيقات، يمكنك إلى استخدام المعرّفات الفريدة الخاصة بها.
  • request هو الضبط الذي سيتم استخدامه للشبكة الداخلية. تشير رسالة الأشكال البيانية قد يحتوي الطلب على إعدادات جديدة لتهيئة عنوان IP والشبكة والإمكانات. إذا كانت في مكدس الاتصال، فيتم تحديثها وفقًا التكوين. ولا تسري هذه الإعدادات على عمليات إعادة التشغيل.
  • تعرض getMainExecutor() منفذ التنفيذ الذي تم استدعاء المستمع إليه.
  • mCallback هو معاودة الاتصال المستخدمة للإبلاغ عن إكمال تم تعديل اسم الشبكة في وضع ناجح أو EthernetNetworkManagementException على خطأ.

قد يعدّل updateConfiguration() خصائص أي شبكة تُعتبر غير قابل للتغيير بواسطة حزمة الاتصال في Android. تشير رسالة الأشكال البيانية يتم إيقاف الشبكة وتحديثها والاحتفاظ بها مجددًا لهذه الشبكات غير القابلة للتغيير السمات التي سيتم تحديثها.

حصر الشبكة بمجموعة فرعية من التطبيقات

يمكنك استخدام EthernetManager#updateConfiguration لحصر الوصول على مجموعة فرعية من المعرفات الفريدة المسموح بها. استخدِم هذه الطريقة لتغطية حالات الاستخدام التي ينطبق فيها ذلك مطلوبة، مثل شبكات المركبات الداخلية التي لا يمكن استخدامها إلا من خلال مجموعة فرعية صغيرة لتطبيقات المصنّعين الأصليين للأجهزة.

يتتبّع نظام Android التطبيقات بشكل أساسي من خلال المعرّف الفريد الخاص بها. يُنشئ الكود التالي من 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 لاسترداد المعرّف الفريد لـ من اسم الحزمة.
  • 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 هي مجموعة من المعرفات الفريدة للتطبيقات المسموح لها باستخدام الشبكة.
  • يعدِّل updateConfiguration() الإعدادات لفرض قيود على الشبكة. المجموعة المقدمة من المعرفات الفريدة.