SKSTACK API for Javaは、SKSTACKを実装したデバイスをJavaで扱うためのライブラリです。
SKSTACK IPv2.1及びSKSTACK IP for HAN Standard Editionに対応しています。
シリアル通信処理には、RXTX for Javaを用いています。
SKSTACK API for Javaは、3条項BSDライセンスで配布しています。
RXTX for JavaはMfizz Inc.のバイナリを使っています。
RXTX binary builds provided as a courtesy of Mfizz Inc. (http://mfizz.com/). Please see http://mfizz.com/oss/rxtx-for-java for more information.
以下の環境で開発、動作確認しています。
(2015.6.29追記)
以下の環境で、Linuxでの動作確認をしました。
https://github.com/SkyleyNetworks/SKSTACK_API.gitを、適当な場所にクローンします。
(以下、C:¥Users¥<username>¥Documents¥GitHubにクローンしたものとします)
GitHubを初めて使う場合は、以下の手順でセットアップしてください。
SKDevice device = new SKDevice();
device.connect("COM3"); // "COM3"は実際の接続ポート名に置き換えてください
System.out.println("IPv6 Address: " + device.getIP6Address()); // デバイスのIPv6アドレスを取得
System.out.println("Stack Version: " + device.getVersion()); // SKSTACKのバージョンを取得
device.close();以下のように出力されればOKです。
IPv6 Address: FE80:0000:0000:0000:1034:5678:ABCD:EF01 Stack Version: 1.4.0
[Configure gnu.io.rxtx.properties]というポップアップが表示された場合は、使用するポート名をチェックして[Ssve]をクリック、再度実行してください。
(2015.6.29追記)
Linuxでの構築手順は以下の通りです。
$ sudo apt-get install git
$ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install oracle-java8-installer
(/etc/profileに追記) export JAVA_HOME=/usr/lib/jvm/java-8-oracle $ source /etc/profile
$ cd ~/workspace(Eclipseのワークスペースを~/workspaceとした場合) $ git clone https://github.com/SkyleyNetworks/SKSTACK_API.git
$ unzip rxtx-2.2pre.zip $ cd rxtx-2.2pre $ ./configure $ make(librxtxParallel.soの生成に関するエラーが出ますが、librxtxSeria-2.2pre1.soは正常に生成されますので、そのまま進みます)
$ cp RXTXcomm.jar ~/workspace/SKSTACK_API/lib $ cp x86_64-unknown-gnu/.libs/librxtxSerial-2.2pre1.so ~/workspace/SKSTACK_API/lib $ cd ~/workspace/SKSTACK_API_lib $ mv librxtxSerial-2.2pre1.so librxtxSerial.so
$ sudo chmod 666 /dev/ttyUSB* $ sudo chmod 777 /var/run/lock
デバイス1台につき1個のSKDeviceもしくはSKHanDeviceクラスのインスタンスを生成し、適宜メソッドを呼び出します。
// SKDeviceクラスのインスタンンスを生成 SKDevice device = new SKDevice(); // 接続 device.connect(<接続ポート名>); ... ... (処理を記述) ... ... //最後に切断 device.close();
// SKHanDeviceクラスのインスタンンスを生成 SKHanDevice device = new SKHanDevice(); // 接続 device.connect(<接続ポート名>); ... ... (処理を記述) ... ... // 最後に切断 device.close();
SKSENDTO, SKSCANなどのSKコマンドをデバイスに送信するには、各コマンドに対応するSKDevice/SKHanDeviceクラスのメソッドを呼び出します。
例)FE80:0000:0000:0000:1034:5678:ABCD:EF02に0x1234をUDPで送信、ポート番号は送受信とも3610
SKDevice device = new SKDevice();
device.connect("COM3");
byte[] data = { 0x12, 0x34 };
device.sendUDP((byte)1, "FE80:0000:0000:0000:1034:5678:ABCD:EF02", 3610, SKSecOption.PLAIN, data);
メソッドの戻り値は、次の通りです。
メソッドの詳細は、ソースツリーの[doc]→index.html→[com.skyley.skstack-ip.api]→SKDevice/SKHanDeviceを参照してください。
ERXUDP, ETCP, EPANDESCなどのイベントを受信するには、インタフェースSKEventListenerを実装したクラス(イベントリスナー)を、SKDevice/SKHanDeviceに登録します。
SKDevice device = new SKDevice();
device.connect("COM3");
Listener listener = new Listener();
device.setSKEventListener(listener); // イベントリスナーを登録
...
...
class Listener implements SKEventListener {
...
...
@Override
public void eventNotified(String port, SKEventType type, SKEvent event) {
// TODO 自動生成されたメソッド・スタブ
// イベントが発生すると呼び出される
// port: デバイスの接続ポート名
// type: イベントの種類(ERXUDP, ETCPなど)
// event: イベントのパラメータを格納したクラス(getXXXX()で値を取得)
switch (type) {
case ERXUDP:
System.out.println("ERXUDP");
System.out.println("Port: " + port);
SKERxUdp erxudp = (SKERxUdp)event;
System.out.println("senderIP=" + erxudp.getSenderIP6Address()); // 送信元IPv6アドレス
System.out.println("sec=" + erxudp.isSecured()); // セキュリティ有効/無効フラグ
System.out.println("dataLength=" + erxudp.getDataLength()); // 受信データ長
System.out.println("data=" + erxudp.getData()); // 受信データ
break;
case EVENT:
SKGeneralEvent gevent = (SKGeneralEvent)event;
short number = gevent.getEventNumber(); // イベント番号
System.out.println("Event: " + SKEventNumber.getEventName(number)); // イベント番号からイベント名を取得
System.out.println("Port: " + port);
System.out.println("number=" + number);
System.out.println("sender=" + gevent.getSenderAddress()); // イベント送信元アドレス
if (number == SKEventNumber.UDP_TX_DONE.getNumber()) {
System.out.println("Param=" + gevent.getParam());
}
break;
default:
break;
}
}
}
詳細は、ソースツリーの[doc]→index.html→[com.skyley.skstack-ip.api.skevents]を参照してください。イベントリスナーに通知されるイベントは次の通りです。
インタフェースSKDebugListenerを実装したクラス(デバッグリスナー)をSKDevice/SKHanDeviceに登録すると、デバイスと送受信した文字列をトレースできます。
SKDevice device = new SKDevice();
device.connect("COM3");
Debug debug = new Debug();
device.setSKDebugListener(debug); // デバッグリスナーを登録
...
...
class Debug implements SKDebugListener {
...
...
@Override
public void debugOut(String port, String raw) {
// TODO 自動生成されたメソッド・スタブ
// port: デバイスの接続ポート名
// raw: 送受信した文字列
System.err.println(port + ":" + raw);
}
}
詳細は、ソースツリーの[doc]→index.html→[com.skyley.skstack-ip.api.skenums]を参照してください。
ソースツリーに含まれているサンプルを用いて、以下のように2台間での送受信をテストできます。
SKDevice device1 = new SKDevice();
device1.connect("COM3");
SKDevice device2 = new SKDevice();
device2.connect("COM4");
// レジスタ値の取得・設定
RegisterTest rt = new RegisterTest(device1);
rt.doTest();
// テーブルの取得
TableTest tt = new TableTest(device1);
tt.doTest();
// スキャン
ScanTest st = new ScanTest(device1, device2);
st.doTest();
// PANA認証
PanaTest pt = new PanaTest(device1, device2);
pt.doTest();
//UDP送受信
UdpTest udptest = new UdpTest(device1, device2);
byte[] data = {0x12, 0x34, 0x56, 0x78};
udptest.doTest(data, 10, 10); // (送信データ, 送信試行回数, 送信間隔[msec])
//TCP送受信
TcpTest tcptest = new TcpTest(device1, device2);
tcptest.doTest(data, 10); // (送信データ, 送信回数)
device1.close();
device2.close();
BP35A1, 35C0などローム社製モジュールではシリアル通信でコマンドが送信できない現象があります。rxtx for javaによるシリアルポートオープン時のRTS/CTS初期状態がメーカーによって異なるためと思われます。
SKDevice#connecメソッドでフロー制御を設定している箇所を
port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_OUT); port.setDTR(true); port.setRTS(false);
のように変更してみてください。 (上記変更を行っても他モジュールは動作します)