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




