XBee WiFiでPCとTCPなおしゃべりをしてみた

どうも、Ramencozoです(´ω`)ノ

某所でナニして手元にXBee WiFiを用意することができましたヾ(´ω`)ノシ


とりあえず下記項目を順にやってみることに(´ω`)

1. X-CTUファームウェア書き込み
2. XBee WiFi ⇔ PC の通信

1. X-CTUファームウェア書き込み
Xbeeは買った当初は接続設定等が記述されたファームウェアが書き込まれていないので、XBeeのメーカーであるDigi社が提供しているユーティリティソフト(X-CTU)を使って各種設定をして書き込みます。

設定は下記の項目だけいじりました(´ω`)っ
Networking
SSID:MYOK
・NetworkType:INFRASTRUCTURE (WiFiルータとかのアクセスポイントにつなぐ形式、AdHocじゃない方)
・IP Protocol:TCP
・IP Addressing Mode:DHCP

Addressing
Destination IP Address:192.168.100.1 (宛先、アクセスポイント自体 = PC本体)
Destination Port:8888 (16進数で22B8)
・Source Port:9750 (16進数で2616、XBee WiFiのデフォルトポート)

Security
・Encryption Enable:WPA (TKIP)
・Pass Phrase:ないしょ(´ω`)

XBee WiFi ⇔ PC の通信
X-CTUにてXBee WiFiにアクセスポイントのSSID等を書き込んだら、次は通信テストをやってみます。下図のようなネットワーク構成でPCとXBee WiFi間でTCPソケットの通信テストを行います。PCにUSBタイプのWiFiドングルを挿してアクセスポイントモードで動作させ、XBee WiFiの接続を待ち受けます。
PC - XBee WiFi間の通信はPC内でTCP Socketの送受信を行うアプリとシリアルコンソール(Tera Term)で確認します。

実際の環境写真はこちら(´ω`)っ

TCP Socketの送受信を行うJavaアプリケーションは下記コードのようにしました(´ω`)ノリでSwingなGUIアプリにしました

TestSocketServer.java / TestSocketServer

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TestSocketServer extends JFrame{
  static final String TITLE = "TestSocketServer";
  static final int WIDTH = 640;
  static final int HEIGHT = 480;
  
  static final String DEFAULT_URL = "192.168.100.4:9750";

  static final int SERVERSOCKET_PORT = 8888;
  
  JTextField urlTextField;  // XBee WiFiのIPアドレス:ポートの指定

  JTextField messageTextField;  // XBee WiFiに送信する文字列を記述
  JButton sendButton;           // 送信ボタン
  
  JTextArea logArea;    // ログ用のTextArea
  JScrollPane logPane;  // スクロールできるように
  
  public TestSocketServer() {
    setTitle(TITLE);
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    Container container = getContentPane();
    JPanel parentPanel = new JPanel(new BorderLayout());
    
    // 接続とデータ送信関係のJPanel
    JPanel sendPanel = new JPanel();
    
    urlTextField = new JTextField(20);
    urlTextField.setText(DEFAULT_URL);
    sendPanel.add(urlTextField);
    
    messageTextField = new JTextField(20);
    sendPanel.add(messageTextField);
    
    sendButton = new JButton("送信");
    sendButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        // IP Address:Port を分離
        final String[] url = urlTextField.getText().split(":");

        // 簡易的な書式チェック
        if(url.length > 1){
          String address = url[0];
          int port = Integer.parseInt(url[1]);
  
          try {
            String msg = messageTextField.getText();
            
            Socket socket = new Socket(address, port);
            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
            writer.write(msg + "\r\n");
            writer.flush();
            writer.close();
            socket.close();
            
            addLog("Send message \"" + msg + "\" to " + address + ":" + port);
          } catch (UnknownHostException e1) {
            e1.printStackTrace();
            addLog(e1.getMessage());
          } catch (IOException e1) {
            e1.printStackTrace();
            addLog(e1.getMessage());
          }
        }else {
          addLog("URLは[address:port]の形式で記述してください");
        }
      }
    });
    sendPanel.add(sendButton);

    parentPanel.add(sendPanel, BorderLayout.NORTH);    
    
    // ログ関係のJPanel
    JPanel logPanel = new JPanel(new BorderLayout());
    logArea = new JTextArea();
    logPane = new JScrollPane(logArea,
                              JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                              JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    logPanel.add(logPane, BorderLayout.CENTER);

    parentPanel.add(logPanel, BorderLayout.CENTER);
    
    container.add(parentPanel);
    addLog("------ TestSocketServer------");
    
    // Socket受信用Thread
    new Thread(){
      public void run() {
        try {
          ServerSocket serverSocket = new ServerSocket(SERVERSOCKET_PORT);

          while (true){
            addLog("+++ServerSocket Open+++");
            Socket socket = serverSocket.accept();  // 相手からデータが来るまでここでロック
            SocketAddress address = socket.getRemoteSocketAddress();
            addLog("Connection from " + address);
  
            InputStream inputStream = socket.getInputStream();
            
            byte[] dataArray = new byte[1024];
            
            int data = 0;
            int count = 0;
  
            boolean isOverFlow = false; // 一応バッファあふれ対策
            
            while ((data = inputStream.read()) != -1 && !isOverFlow) {
              dataArray[count] = (byte)data;
              count++;
              
              if(count > dataArray.length - 1){
                isOverFlow = true;
              }
            }
            
            String receiveString = new String(dataArray);
            
            addLog("Received: " + receiveString);
            
            inputStream.close();
            inputStream = null;
            socket.close();
            socket = null;
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }.start();
  }
  
  // JTextAreaにログを書き出すメソッド
  public void addLog(String msg){
    logArea.append(msg + "\n");
    logArea.setCaretPosition(logArea.getText().length());  // カーソル位置を一番下へ
  }
  
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        new TestSocketServer().setVisible(true);  // 起動と可視化
      }
    });
  }
}

送受信の結果は下記のような感じです(´ω`)っ

赤線でマークしている箇所がPC -> XBee WiFiの通信です。
オレンジの線でマークしている箇所が XBee WiFi -> PCの通信です。
Tera Termで文字入力すると入力の区切りごとに送信されるみたいです(´ω`)たぶん半角直接入力だったら一文字ずつ送信されます
あと3段目のReceiveの空白はTera Term内で改行したのが送信されますた(´ω`)ゞムフン

ともあれXBee WiFiとおしゃべりできました(´ω`)ノ 実際にコレを利用した製作物がみょっくんミニ(makebooth)です(*´ω`*)よかったら見てみてください
それでは今回はこのへんで(´ω`)ノシ