Xamarin.AndroidでNICを列挙してみた
1 Java.Net.NetworkInterfaceXamarinによるAndroidプロジェクトでネットワークインターフェースの列挙を書いてみました。
Xamarinは、UIのみJavaSDKの薄いラッパー(C#)で記述し、その他は「共通」という事で、もしかして・・・?とちょっと思ってしまったのですが・・・NICはJavaSDKからでした。
ネットワークインターフェースの一覧は、Windowsであれば、System.Net.NetworkInformationのGetAllNetworkInterfaces()や、iphlpapi.dll(DllImport)のGetInterfaceInfo()ですが、残念ながら、これらは使用できませんでした。
結論から言えば、java.net.NetworkInterfaceのgetNetworkInterfaces()であり、これをC#でラップしたJava.Net.NetworkInterface.NetworkInterfacesを使用することになります。
UI周りの説明と同様、JavaSDKの作法に従えば、そのまま記述できます。
能書きはさておき、せっかく動作したので、覚書として記録しておく事にします。
2 NIC一覧
void Refresh(){
var sb = new StringBuilder(); //出力用バッファ
var networkInterfaces = NetworkInterface.NetworkInterfaces; // Java.Net.NetworkInterface
while (networkInterfaces.HasMoreElements){
var nic = (NetworkInterface) networkInterfaces.NextElement(); //各インターフェースの情報
if (!nic.IsUp){
//インターフェースUPのものだけを対象とする
continue;
}
sb.Append(String.Format("[{0}]{1}\r\n", nic.Index, nic.Name)); //インデックス・名前
sb.Append(String.Format("IsLoopback={0}\r\n", nic.IsLoopback)); //ループバック
sb.Append(String.Format("IsVirtual={0}\r\n", nic.IsVirtual)); //仮想
sb.Append(String.Format("MTU={0}\r\n", nic.MTU)); //MTU
var buf = nic.GetHardwareAddress(); //MAC
if (buf != null){
var tmp = new StringBuilder();
foreach (var b in buf){
if (tmp.Length != 0){
tmp.Append(":");
}
tmp.Append(String.Format("{0:X}", b));
}
sb.Append(String.Format("HardwareAddress={0}\r\n", tmp));
}
//IPアドレス列挙
var no = 0;
var addrList = nic.InetAddresses;
while (addrList.HasMoreElements){
var next = addrList.NextElement();
var addrv6 = next as Inet6Address;
if (addrv6 != null) {//IPv6
sb.Append(String.Format(" ({0}){1}\r\n", no++, addrv6.HostName));
sb.Append(String.Format(" HostAddress={0}\r\n", addrv6.HostAddress));//IPアドレス addr.GetAddress()でも可能
sb.Append(String.Format(" IsMulticastAddress={0}\r\n", addrv6.IsMulticastAddress));//マルチキャスト
sb.Append(String.Format(" IsLinkLocalAddress={0}\r\n", addrv6.IsLinkLocalAddress));//リンクローカル
sb.Append(String.Format(" IsSiteLocalAddress={0}\r\n", addrv6.IsSiteLocalAddress));//サイトローカル
sb.Append(String.Format(" IsAnyLocalAddress={0}\r\n", addrv6.IsAnyLocalAddress)); //エニーローカル
sb.Append(String.Format(" ScopeId={0}\r\n", addrv6.ScopeId)); //スコープID
} else{
var addrV4 = next as Inet4Address;
if (addrV4 != null) { //IPv4
sb.Append(String.Format(" ({0}){1}\r\n", no++, addrV4.HostName));
sb.Append(String.Format(" HostAddress={0}\r\n", addrV4.HostAddress));//IPアドレス addr.GetAddress()でも可能
sb.Append(String.Format(" IsMulticastAddress={0}\r\n", addrV4.IsMulticastAddress));//マルチキャスト
}
}
}
sb.Append("\r\n");
}
//結果出力
FindViewById<EditText>(Resource.Id.text).Text = sb.ToString();
}
個人的には、NetworkInterface.NetworkInterfacesや、InetAddressesは、そのままforeachで回せるようにIListなどで返して欲しいところなのですが、律儀にJava.Util.IEnumerationです。
Java.Util.IEnumerationを(HasMoreElements/NextElementを使わずに)簡単にforeachできる方法をご存知の方がおられましたら、是非教えてください m(_._)m
3 実機での出力エミュレータでは見れなかったIPv6の列挙などが見れます。(1) Wi-Fi接続時
[1]lo
IsLoopback=True
IsVirtual=False
MTU=16436
(0)localhost
HostAddress=::1%1
IsMulticastAddress=False
IsLinkLocalAddress=False
IsSiteLocalAddress=False
IsAnyLocalAddress=False
ScopeId=1
(1)localhost
HostAddress=127.0.0.1
IsMulticastAddress=False
[29]wimax0
IsLoopback=False
IsVirtual=False
MTU=1400
HardwareAddress=xx:xx:xx:xx:xx:xx
(0)fe80::xxxx:88ff:fec1:xxxx%wimax0
HostAddress=fe80::xxxx:88ff:xxxx:xxxx%wimax0
IsMulticastAddress=False
IsLinkLocalAddress=True
IsSiteLocalAddress=False
IsAnyLocalAddress=False
ScopeId=29
[30]wlan0
IsLoopback=False
IsVirtual=False
MTU=1500
HardwareAddress=xx:xx:xx:88:xx:xx
(0)fe80::xxxx:88ff:fe88:xxxx%wlan0
HostAddress=fe80::xxxx:88ff:fe88:xxxx%wlan0
IsMulticastAddress=False
IsLinkLocalAddress=True
IsSiteLocalAddress=False
IsAnyLocalAddress=False
ScopeId=30
(1)192.168.0.102
HostAddress=192.168.0.102
IsMulticastAddress=False
(2) 3G接続時
[1]lo IsLoopback=True IsVirtual=False MTU=16436 (0)localhost HostAddress=::1%1 IsMulticastAddress=False IsLinkLocalAddress=False IsSiteLocalAddress=False IsAnyLocalAddress=False ScopeId=1 (1)localhost HostAddress=127.0.0.1 IsMulticastAddress=False [29]wimax0 IsLoopback=False IsVirtual=False MTU=1400 HardwareAddress=FF:7A:FF:FF:76:FF (0)fe80::867a:88ff:fec1:7608%wimax0 HostAddress=fe80::xxxx:xxxx:fec1:xxxx%wimax0 IsMulticastAddress=False IsLinkLocalAddress=True IsSiteLocalAddress=False IsAnyLocalAddress=False ScopeId=29 (1)10.48.60.119 HostAddress=10.xx.xx.xx IsMulticastAddress=False
※一部編集してます
それにしても、C#で書けるのは、超気持ちイーです。
なんといっても、弱者な私には、VisualStudioで書けることと、Reshaperなどが、そのまま使えているところが一番恩恵を受けているように感じています。
BlackJumboDog Ver6.0.7 公開しました
2014.04.29 Ver6.0.7
(1)「オプション」ー「ログ表示」において「ログを生成しない」の設定が正常動作していないバグを修正
http://blackjumbodog.codeplex.com/releases/view/121525
ソースコードはGitHubからも取得可能です。
https://github.com