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)です(*´ω`*)よかったら見てみてください
それでは今回はこのへんで(´ω`)ノシ