首页 > 其他分享 >xamarin.Android:获取局域网络

xamarin.Android:获取局域网络

时间:2023-08-18 12:00:20浏览次数:36  
标签:xamarin string StringBuilder networkInfoBean var networkInfoList Android 局域网络 pu

通过Java.Net 层,调用Java接口

/// <summary>
        /// 获取网络列表
        /// </summary>
        private Dictionary<string, NetworkInfoBean> GetNetworkInfoList()
        {
            Dictionary<string, NetworkInfoBean> result = new Dictionary<string, NetworkInfoBean>();
            var nis = Java.Net.NetworkInterface.NetworkInterfaces;
            if (nis == null) return result;
            while (nis.HasMoreElements)
            {
                var ni = nis.NextElement() as Java.Net.NetworkInterface;
                var macBuilder = new StringBuilder();
                byte[] bytes = ni?.GetHardwareAddress();
                if (bytes != null)
                {
                    int len = bytes.Length;
                    for (int i = 0; i < len; i++)
                    {
                        if (i != 0)
                        {
                            macBuilder.Append(":");
                        }
                        macBuilder.Append(HEX_DIGITS[bytes[i] >> 4 & 0x0f]).Append(HEX_DIGITS[bytes[i] & 0x0f]);
                    }
                }

                if(ni.InterfaceAddresses?.Count == 0) continue;
                string mac = macBuilder.ToString();
                foreach (var addr in ni.InterfaceAddresses)
                {
                    var hostAddress = addr.Address.HostAddress;
                    //Ipv4
                    if (hostAddress.IndexOf(":") < 0)
                    {
                        var mask = GetSubnetMaskFromPrefixLength(addr.NetworkPrefixLength);
                        result.Add(ni.Name, new NetworkInfoBean(ni.Name, mac, hostAddress, mask.ToString()));
                    }
                }
            }

            return result;
        }

        private bool AppendSpec(string name, Dictionary<string, NetworkInfoBean> networkInfoList, StringBuilder builder, Func<NetworkInfoBean, string> function)
        {
            networkInfoList.TryGetValue(name, out NetworkInfoBean infoBean);
            if (infoBean == null) return false;
            
            var value = function.Invoke(infoBean);

            if (builder.IndexOf(value) != -1) return true;
            if (builder.Length() != 0) builder.Append("\n");
            
            builder.Append(value);
            return true;
        }

        public  void  GetNetworkState()
        {
            Dictionary<string, NetworkInfoBean> networkInfoList = GetNetworkInfoList();

            Console.WriteLine("--------GetNetworkState-----------");
            foreach (var networkInfo in networkInfoList)
            {
                Console.WriteLine($"name: {networkInfo.Value.Name}  Ip: {networkInfo.Value.Ip}  mac:{networkInfo.Value.Mac} mask:{networkInfo.Value.Mask}");
            }

            StringBuilder ipBuilder = new StringBuilder();
            StringBuilder wifiMacBuilder = new StringBuilder();
            StringBuilder ethMacBuilder = new StringBuilder();
            AppendSpec("wlan0", networkInfoList, ipBuilder, networkInfoBean => networkInfoBean.Ip);  // Wifi
            AppendSpec("p2p0", networkInfoList, ipBuilder, networkInfoBean => networkInfoBean.Ip);   //热点
            AppendSpec("eth", networkInfoList, ipBuilder, networkInfoBean => networkInfoBean.Ip); //有线

            AppendSpec("wlan0", networkInfoList, wifiMacBuilder, networkInfoBean =>  networkInfoBean.Mac);
            AppendSpec("p2p0", networkInfoList, wifiMacBuilder, networkInfoBean =>  networkInfoBean.Mac);
            AppendSpec("eth", networkInfoList, ethMacBuilder, networkInfoBean => networkInfoBean.Mac);
        }

        private char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 /// <summary>
        /// 获取子网掩码
        /// </summary>
        /// <param name="prefixLength"></param>
        /// <returns></returns>
        private IPAddress GetSubnetMaskFromPrefixLength(int prefixLength)
        {
            var maskBytes = new byte[4];
            var remainingBits = prefixLength;
            for (var i = 0; i < 4; i++)
            {
                var bitsToSet = Math.Min(remainingBits, 8);
                maskBytes[i] = (byte) (((1 << bitsToSet) - 1) << (8 - bitsToSet));
                remainingBits -= bitsToSet;
            }

            return new IPAddress(maskBytes);
        }

自定义类

 public class NetworkInfoBean
    {
        /// <summary>
        ///类型名称
        /// </summary>
        public string Name { get; set; }
        public string Mac { get; set; }
        public string Ip { get; set; }
        /// <summary>
        /// 子网掩码
        /// </summary>
        public string Mask { get; set; }

        public NetworkInfoBean(string name, string mac, string ip,string mask)
        {
            Name = name;
            Mac = mac;
            Ip = ip;
            Mask = mask;
        }

        public override string ToString()
        {
            return $"NetworkInfoBean{{name='{Name}', mac='{Mac}', ip='{Ip}', mask='{Mask}'}}";
        }
    }

 

标签:xamarin,string,StringBuilder,networkInfoBean,var,networkInfoList,Android,局域网络,pu
From: https://www.cnblogs.com/terryK/p/17640137.html

相关文章

  • Android串口调试 libserial_port.so: has text relocations
    遇到问题:Android串口调试libserial_port.so:hastextrelocations解决方法1在Android.mk文件中加入:LOCAL_LDFLAGS+=-fPIC,重新编译Google开源库的源码,生成.so库LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)TARGET_PLATFORM:=android-3......
  • AndroidStudio SurfaceView SurfaceHolder关系
    电视机就像是屏幕,而SurfaceView则是你要在屏幕上显示的内容。然而,你不能直接在电视机上直接绘制内容,就像你不能直接在SurfaceView上绘制内容一样。这就是SurfaceHolder登场的地方。SurfaceHolder就像是遥控器,它是控制你如何在电视屏幕上显示内容的工具。你通过遥控器来切......
  • 在Android Studio中统计代码行数可以通过插件或者内置的工具来实现。以下是两种常用的
    在AndroidStudio中统计代码行数可以通过插件或者内置的工具来实现。以下是两种常用的方法:**方法一:使用插件:**1.打开AndroidStudio,点击顶部菜单中的"File"(文件)。2.选择"Settings"(设置)或"Preferences"(首选项),然后在弹出的窗口中选择"Plugins"(插件)。3.在搜索框中输入"Code......
  • Android 12 Tablet 任务栏及虚拟按键靠右问题
     其中左侧为 TASKBAR 右侧为 NavigationBarLauncher 中TaskBar的显示控制在 packages\apps\Launcher3\src\com\android\launcher3\config\FeatureFlags.javapublicstaticfinalBooleanFlagENABLE_TASKBAR=getDebugFlag("ENABLE_TASKBAR",false,&qu......
  • Android Java静态变量通信和反射的前提是须要在同一进程内
    静态变量通信:java类中的static变量是属于类的,即使new了两个对象访问的也是同一个内存地址的static变量,也就是说可以通过static变量通信,但前提必须是这两个对象必须是同一个进程中的。父进程通过fork来复制出一个子进程的副本,根据原理,子进程拥有父进程的一份完整数据拷贝。同时由......
  • Android系统6~8需要适配的点
    一、概述Android系统每出一个大版本总有一些适配的点。这些适配点如果不适配就有可能会造成app闪退、功能不能用,app上架审核不通过的问题。写这一篇不为别的,就为了以后app出问题时能够提供一个解决问题的思路。参考:内容1,内容2二、适配总结Android6Android实在6......
  • Android P 图形显示系统(一)硬件合成HWC2
    一、简介1.我们来看看SurfaceFlinger的类定义://frameworks/native/services/surfaceflinger/SurfaceFlinger.hclassSurfaceFlinger:publicBnSurfaceComposer,publicPriorityDumper,privateIBinder::DeathRecipient,......
  • 构建跨平台的移动应用程序:Xamarin入门
    介绍:在移动应用开发领域,跨平台的解决方案变得越来越受欢迎。Xamarin是一种流行的跨平台移动应用开发框架,它允许开发者使用C#语言来构建同时运行在iOS和Android平台上的应用程序。本篇博客将带您入门Xamarin开发,展示如何构建跨平台的移动应用程序。步骤1:安装和设置环境在开始之前,......
  • Android Rxjava :最简单&全面背压讲解 (Flowable)
    1.前言Rxjava背压:被观察者发送事件的速度大于观察者接收事件的速度时,观察者内会创建一个无限制大少的缓冲池存储未接收的事件,因此当存储的事件越来越多时就会导致OOM的出现。(注:当subscribeOn与observeOn不为同一个线程时,被观察者与观察者内存在不同时长耗时任务,就会使发送与接收速......
  • Android实战:APP换肤功能,并自动适配手机深色模式
    Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案。之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因:1、换肤功能的实现过程较简单、容易理解;2、能轻松适配Android10提供的DarkMode(深色模式);3、还能白嫖QMUI的各种组件、效果(这才是重要的,......