ウェザーボードのパソコン側アプリ(UDP)


【ウェザーボードのシステムの概要】

ウェザーボードというPICマイコンにWi-Fiモジュールを接続したボードを製作し、
無線LANでパソコンと接続して温湿度や気圧などの情報をUDP通信により
送受信するシステムを製作します。
製作するシステムの構成は下図のようにするものとします。
ウェザーボードにWi-Fiモジュールを実装し、PICマイコンで制御してUDP通信で
動作させます。
パソコン側はアクセスポイントとLANケーブルの有線かWi-Fiで接続します。
パソコンのアプリケーションプログラムはVisual Basic 2010で製作します。
このとき、「UDPクライアントクラス」を使ってUDP通信で製作します。


システムの機能は次のようにするものとします。

 @ウェザーボードは常時計測を繰り返していて、パソコン側からの接続要求を待つ
 Aパソコンのアプリから接続要求することで、無線LAN経由でウェザーボードと接続し、
   UDP通信により次の機能を実行する

   ・デジタル状態の表示 ―― 4点のデジタル入出力点のオンオフ状態を表示
   ・デジタルのオンオフ制御を行う ―― 2点のデジタル出力のオンオフ制御を行う
   ・計測値の表示 ―― 温度、湿度、気圧、照度、汎用計測4点の計測値を表示する

 B計測表示は3秒周期で繰り返し表示を更新する
 Cパソコンのアプリケーションからの終了要求で通信を終了する


【アプリケーションの全体構成と仕様】
製作するプログラムは、まずFormを下図のようにして、それぞれのボタンごとに
機能を割り付けることにしました。
状態表示はボタンとテキストボックスの色で表現し、計測データは数値で
テキストボックスに表示します。
メッセージ欄にはネットワークの接続状態や送受信エラーの表示をします。
Button1とかTextBox1とか記入されているのが各コンポーネントのプロパティ名です。



アプリケーション機能は大部分がボタンで実行開始されますが、UDPの受信と
計測の繰り返し要求はタイマで行います。
Timer1を3秒周期として計測要求するために使い、Timer3は10msec周期として
UDP受信をチェックするために使っています。
こうしてアプリケーションの全体フローは下図のようにしました。




【UDPクライアントクラスの使い方】

UDP通信でパソコンとウェザーボード間の通信を行いますが、そのときの
通信データのフォーマットは下表のようにしました。
 機能 パソコン → PICマイコン パソコン ← PICマイコン 
デジタル出力 ボタンクリック時に送信する
「SCncE」 (ASCII文字)
 n:アドレス 1か2 (ASCII文字)
 c:制御 On=1 Off=0(ASCII文字)
《例》
  SC11E :出力1をオンとする
制御実行後応答
「MCnc」 (ASCII文字)
 n:送信データと同じ値
 c:状態 On=1  Off=0 (ASCII文字)
《例》
   MC11 :出力1がオン
デジタル状態 「SBE」 (ASCII文字) 出力ピンと入力ピン一括で送信する
「MBabcd」
 a:DO1の状態  b:DI1の状態
 c:DI2の状態  d:DO2の状態
  On=1  Off=0 (ASCII文字)
計測応答 「SAE」 (ASCII文字)

いったん計測要求すると停止されるまで3秒間隔で繰り返し送信する
全計測データを一括返信する
「MAtthhbbllaabbccdd」
 tt:温度 hh:湿度 bb:気圧 ll:照度
 aa:CH0 bb:CH1  cc:CH2  dd:CH3
値は16ビットバイナリで上位、下位の順
切り離し アプリ終了時に送信
 「SNE」
 応答なし

Visual BasicでUDP通信を行うためには、特別なAPI関数を使う必要があります。
マイクロソフトから提供されているAPI関数は、「UDP Clientクラス」と呼ばれるもので、
UDP通信のクライアントを作成するとき使います。
この中で用意されているクラス内のメンバ(プロパティやメソッド)は下表のようになっています。

(1) コンストラクタ
 コンストラクタ  書式 と 機能
 UdpClient  UdpClientクラスの新しいインスタンスを生成する
《書式》 いくつかの書式がある
  UdpClient(Int32)     :ローカルポート指定でインスタンスを生成
  UdpClient(IPEndPoint)   :ローカルエンドポイント指定でインスタンス生成
  UdpClient(String, Int32) :リモートホストとリモートポート指定でインスタンス生成
                (リモートホストが確定されるのでSendで相手指定不要)
《使用例》
  Dim udpClientA As New UdpClient(3000)  ‘ローカルポート3000でインスタンス生成

(2) プロパティ
 プロパティ  書式 と 機能
 Available  読み取り可能なネットワークから受信したデータの量を取得する
《使用例》
  Dim value As Integer
  value = ClientA.Available
 IPEndPoint  IPアドレスとポート番号で特定の相手を表す情報を格納している(独立クラス)
《使用例》
  Dim Remote As New IPEndPoint(IPAddress.Any, 0)  ‘任意の相手を指定
 特定の相手とする場合の例
 Dim HostA As New IPEndPoint("192.168.1.105", 10002)

(3) メソッド
 メソッド名 書式と機能 
 Connect  IPアドレスまたは名称とポート番号で指定されたリモートホストと接続する
以降はこの特定のリモートとのみの通信に限定される
《書式》複数書式がある
  UdpClient.Connect(IPEndPoint)     ‘指定エンドポイント
  UdpClient.Connect(IPAddress, Int32)  ‘IPアドレス、ポート番号
  UdpClient.Connect(String, Int32)   ‘ホスト名、ポート番号
《使用例》
 Dim ClientA As New UdpClient()
 ホスト名を使う場合
   ClientA.Connect("PIC-UIO", 10002)
 IPアドレスを使う場合
  ClientA.Connect("192.168.1.24", 2000)
 Close  ConnectしたUDPを終了する、ソケットを無効としリソースを解放
《書式》 UdpClient.Close()
《使用例》
  ClientA.Close()
 Receive  Connectしたホストから受信したデータを返す
《書式》
   UdpClient.Receive(Byref remote AS IPEndPoint) As Byte()
     remote:リモートのエンドポイント
      戻り値:受信したデータのバイト配列
《使用例》Connectで指定された相手から受信しBufferに格納
   Dim Remote As IPEndPoint = Nothing
   Dim Buffer As Byte()
   Buffer = ClientA.Receive(Remote)
 Send  ホストにUDPで送信する
《書式》複数ある
  UdpClient.Send(Byte[], Int32)  ‘Connectしたホストにデータをバイト数だけ送る
  UdpClient.Send(Byte[] dgram, Int32, IPEndPoint)
    ‘データを指定リモートに指定バイト数だけ送る
  UdpClient.Send(Byte[], Int32, String, Int32) ‘データ、サイズ、ホスト名、ポート番号
   ホスト名とポート番号で指定された相手にデータの指定バイト数を送信する
  戻り値:送信されたバイト数
《使用例》
  SendMessage = Encoding.ASCII.GetBytes(TextBox8.Text)
 ClientA.Send(SendMessage, SendMessage.Length)

このUDP ClientクラスのAPIをVisual Basicで使うときの基本的な使い方は、
下記リストのようにします。


 最初にSocketクラスをつかうことを宣言部で宣言し、クラスを呼び出します。

@ UDPクライアントのインスタンスをUdpClient()コンストラクタを使って生成します。
  例ではローカルポート番号を3000として生成しています。
  続いてリモートホストのIPEndPointを指定なしとして宣言定義しています。

A Connect()メソッドで相手を指定して接続する
  例ではIPアドレスとポート番号を指定していますので、一意に相手が決定します。
  以降はこの相手を特定して送受信することになります。

B データの送信はSend()メソッドで行います
  ここでの送信相手はConnect()で接続した相手に限定されます。

C 受信の場合には、Receive()メソッドを使いますが、このメソッドはブロックするので、
  受信ができるまで戻って来ませんから、先にAvailableプロパティで受信データが
  あるかどうかを確認してから受信メソッドを実行します。
  受信するデータはBYTE型の配列ですから、文字列で扱うときには変換が必要です。
  ここでの受信相手もConnect()で接続した相手に限定されます。

D 終了にはUDPクライアントをクローズすればすべてのリソースを解放します。


【アプリケーションのダウンロード】

ウェザーボードのパソコン側のアプリケーションプログラムは、下記から
ダウンロードできます。
Visual Basic 2010のプロジェクト1式です。Expressでもコンパイル可能です。
binフォルダの中にexeファイルがありますので、直接実行も可能です。

  ★★★ ウェザーボードのパソコン側アプリ ダウンロード ★★★

 



   目次ページへ