.NET Gadgeteerで温度計 - Multicast Group通信でWindows Phoneに通知


昨日(2/8)のUX-TVで最後に失敗してしまったデモですが、原因判明です。このデモを作った後に、LCDを追加した際、コネクタの位置が変わったのに対応していなかったのが原因でした。申し訳ない。(実はこれで沖縄ITまつりでもデモを失敗してました。ごめんなさい)

ちょっと比較してみると

間違い 修正後

生成されたコード

private void InitializeModules()
{  
   // Initialize GTM.Modules and event handlers here.  
   usbClient =
       new GTM.GHIElectronics.UsbClientDP(1);
   wifi = new GTM.GHIElectronics.WiFi_RS21(9);
   eBlockExpansion =
       new GTM.GHIElectronics.EBlockExpansion(10);
}

生成されたコード

private void InitializeModules()
{   
    // Initialize GTM.Modules and event handlers here.  
   usbClient = new GTM.GHIElectronics.UsbClientDP(1);
   wifi =
     new GTM.GHIElectronics.WiFi_RS21(6);
   eBlockExpansion =
     new GTM.GHIElectronics.EBlockExpansion(9);
   display = new GTM.GHIElectronics.Display_T35(14, 13, 12, 10);
}

これじゃ間違いなく動きませんOTZ

前々回のポストhttp://blogs.msdn.com/b/hirosho/archive/2012/02/06/tipsofdotnetgadgeteerwiththermometersensor.aspxで紹介したプロジェクトに、Multicast Group通信を加えます。

Windows Phone側はMSDNのサンプルで公開されている、”マルチキャストソケットのサンプル”をそのまま使います。

.NET Micro Framework側のコードでは、Windows Phoneに用意されているような便利なソケットクラスはないので、Socketクラスを使います。以下の様なコードで、Multicast Groupに参加が可能です。

                var mySocket = new Socket(
                    AddressFamily.InterNetwork,
                    SocketType.Dgram,
                    ProtocolType.Udp);
                try
                {
                    IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(currentNetwork.IPAddress), multicastGroup);
                    IPAddress igmpAddr = IPAddress.Parse(multicastAddress);
                    IPEndPoint igmpEP = new IPEndPoint(igmpAddr, multicastGroup);

                    byte[] igmpAddrBytes = igmpAddr.GetAddressBytes();
                    byte[] localAddrBytes = localEP.Address.GetAddressBytes();

                    byte[] multicastOpt = new byte[]{
                        igmpAddrBytes[0], igmpAddrBytes[1],igmpAddrBytes[2],igmpAddrBytes[3],
                        localAddrBytes[0],localAddrBytes[1],localAddrBytes[2],localAddrBytes[3]};
                    mySocket.Bind(localEP);
                    mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, localAddrBytes);
                    mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, multicastOpt);
                    mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);
                }
                catch (SocketException ex)
                {
                    Debug.Print("Socket Setting Exception : " + ex.Message);
                }

青字で示した変数が、Multicast Groupで通信する為のSocketオブジェクトです。赤字で示した、multicastAddress(string型)とmulticastGroup(int型)の変数が、マルチキャストグループアドレスと、マルチキャストグループポートです。この値は、”マルチキャストソケットサンプルの値と同じものを使用します。同じ値にすることにより、このアプリがJoinしたグループに.NET GadgeteerもJoinが可能です。

次に、マルチキャストグループへのデータ送信ですが、上のコードでJoinした状態で、mySocketのSendTo()メソッドをコールすれば送信可能です。

            byte[] message = System.Text.UTF8Encoding.UTF8.GetBytes(degree.ToString());
            mySocket.SendTo(
                message,
                new IPEndPoint(
                    IPAddress.Parse(multicastAddress),
                    multicastGroup));
degreeは、温度センサーから取得した温度値(double型)です。タイマーのTickハンドラなどで、このコードを実行すれば、Windows Phone 7に、Wi-Fiで接続したローカルネットワークを介して(外のネットにデータが漏れずに)データ送信ができます。

実行時の写真はこんな感じ

 

以上で、.NET Gadgeteer+温度センサーのシリーズはおしまい。また何か新しいものを作ったら、ポストしますね。

Comments (0)

Skip to main content