xamarin.Android:获取局域网络

通过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}'}}";
        }
    }
复制代码

 

posted on   TanZhiWei  阅读(40)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示