.NET Micro Framework(Gadgeteer)のSocketクラスでUDP Multicast Group通信を行う
さて、.NET Micro FrameworkのSocketでMulticast Group通信を使ってデータを受信する方法を解説します。前にも同様なポストをしていますが、こちらはWP7やWindows PC、その他がMulticast Groupに送信したデータを受信する方法にスポットを当てます。
一つ前のポストで.NET FrameworkのSocketでこのトピックスを扱いました。.NET Micro Frameworkも基本の流れはまったく一緒です。しかし、.NET Micro FrameworkのAPIセットは.NET Frameworkのサブセットのため、MulticastOptionクラスが用意されていないので、そこだけ、.NET Micro Framework特有のコードになります。Multicast GroupへのJoinは、以下のコードになります。
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, GroupPort);
mySocket.Bind(ipep);
byte[] groupAddressBytes = GroupAddress.GetAddressBytes();
byte[] addressAnyBytes = IPAddress.Any.GetAddressBytes();
byte[] multicastOpt = new byte[]{
groupAddressBytes[0],groupAddressBytes[1],groupAddressBytes[2],groupAddressBytes[3],
addressAnyBytes[0],addressAnyBytes[1],addressAnyBytes[2],addressAnyBytes[3]
};
mySocket.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
multicastOpt
);
太字で示したところが、.NET Frameworkと異なる部分です。MulticastOptionクラスは、上のコードに示したように、最初の4バイトがMulticastOptionコンストラクターの第一引数、続く4バイトが同コンストラクターの第二引数のIPアドレスをバイト表現した値の計8バイトを変わりに使います。
データ受信のコードは、.NET Framework(Windows PC)のSocketクラスとまったく同じコードです。送信も同様です。
Multicast Groupから抜けるDropは、以下のコードです。
byte[] groupAddressBytes = GroupAddress.GetAddressBytes();
byte[] addressAnyBytes = IPAddress.Any.GetAddressBytes();
byte[] multicastOpt = new byte[]{
groupAddressBytes[0],groupAddressBytes[1],groupAddressBytes[2],groupAddressBytes[3],
addressAnyBytes[0],addressAnyBytes[1],addressAnyBytes[2],addressAnyBytes[3]
};
mySocket.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.DropMembership,
multicastOpt);
mySocket.Close();
コードを見て分かるとおり、SocketOptionNameがDropMembershipに変わっているだけです。ほかはJoinと同じ。
一連のコードを書いて実行し、ReceiveFrom()メソッドでブロックされた状態で、Windows Phone 7のマルチキャストグループ通信のサンプルから文字列を送付すると、送付されたバイト列と送信元のIPアドレスを受信可能です。
以上、.NET Micro Frameworkの場合のMulticast Group送信方法を解説してきました。例えば.NET Micro Frameworkの制御対象としてモータやソレノイド、ヒーターなどがついている場合、この機能を使ってWi-FiのローカルネットでAd-Hocにつないで、WP7やWindows PCをリモコン的に使って、デバイスを制御することが可能になります。
ちなみに、以前のポストでお知らせした、.NET Micro Frameworkで電動モーターカーを制御するプロジェクト(3/22のUX-TVネタ)でも、この機能を活用の予定です。そのあたりの詳細は、また後程。