通过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}'}}";
}
}