.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ネタ)でも、この機能を活用の予定です。そのあたりの詳細は、また後程。