はじめに

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.

開発環境

以下の環境で開発、動作確認しています。

  • Windows 8.1 Pro(x64であれば、Windows7, 8/8.1無印でも可)
  • Eclipse 4.4 Luna(Javaバージョンは1.8)
  • RXTX for Java Windows-x64 binary
  • SKSTACK実装機種:RL7023 Stick

(2015.6.29追記)
以下の環境で、Linuxでの動作確認をしました。

  • Ubuntu 14.04 64bit/32bit
  • Eclipse 4.4
  • Oracle JDK 1.8
  • RXTX 2.2 pre2
  • SKSTACK実装機種:RL7023 Stick

環境構築手順

Eclipseのインストール

  1. http://mergedoc.osdn.jp/index.html#/pleiades_distros4.4.html にアクセス
  2. [Eclipse 4.4 Luna Pleiades All in One]をクリック
  3. Java 64bit Full Editionの[Download]をクリック
  4. インストーラのダウンロードが完了したら、インストーラを起動

GitHubからソースをクローン

https://github.com/SkyleyNetworks/SKSTACK_API.gitを、適当な場所にクローンします。
(以下、C:¥Users¥<username>¥Documents¥GitHubにクローンしたものとします)

GitHubを初めて使う場合は、以下の手順でセットアップしてください。

  1. https://windows.github.com/にアクセスし、GitHub for Winodwsをダウンロード→インストール
  2. https://github.com/SkyleyNetworks/SKSTACK_APIにアクセス
  3. 画面右側 [Clone in Desktop]をクリック
  4. ソースの保存先をC:¥Users¥<username>¥Documents¥GitHubに指定し、クローン実行

Eclipse設定

  1. Eclipseを起動
  2. ワークスペースを、[C:¥Users¥<username>¥Documents¥GitHub]に変更
  3. [ファイル]→[インポート]をクリック
  4. 「インポートソースの選択」にて、[Git]→[Gitからプロジェクト]を選択し、[次へ]をクリック
  5. [既存ローカル・リポジトリー]を選択し、[次へ]をクリック
  6. [SKSTACK_IP_API_TEST]を選択し、[次へ]をクリック (表示されていない場合は、[追加]をクリックし、「ディレクトリー」覧に[C:¥Users¥<username>¥Documents¥GitHub]を指定してください)
  7. [次へ]をクリック
  8. [完了]をクリック(ウィンドウ左ペインにSKSTACK_IP_API_TESTのソースツリーが表示されていればOKです)

動作確認

  1. デバイスをUSBポートに接続
  2. [src]→[(デフォルトパッケージ)]→[Test.java]を開き、mainメソッドに以下を記述し、ビルド、実行
    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]をクリック、再度実行してください。

Linux

(2015.6.29追記)
Linuxでの構築手順は以下の通りです。

  1. https://eclipse.org/downloads/?osType=linuxからEclipseの「Eclipse IDE for Java Developers 64bit/32bit」をクリックし、Eclipseをダウンロードします。
  2. Gitをインストールします。
    $ sudo apt-get install git
  3. JDKをインストールします。
    $ sudo add-apt-repository ppa:webupd8team/java
    $ sudo apt-get update
    $ sudo apt-get install oracle-java8-installer
  4. 環境変数"JAVA_HOME"を設定します。
    (/etc/profileに追記)
    export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    $ source /etc/profile
  5. SKSTACK API for Javaのソースを取得します。
    $ cd ~/workspace(Eclipseのワークスペースを~/workspaceとした場合)
    $ git clone https://github.com/SkyleyNetworks/SKSTACK_API.git
  6. http://rxtx.qbang.org/wiki/index.php/Downloadの「rxtx-2.2pre.zip」をクリックし、RXTX 2.2preのソースをダウンロードします。
  7. RXTXソースをコンパイルします。
    $ unzip rxtx-2.2pre.zip
    $ cd rxtx-2.2pre
    $ ./configure
    $ make(librxtxParallel.soの生成に関するエラーが出ますが、librxtxSeria-2.2pre1.soは正常に生成されますので、そのまま進みます)
  8. RXTXcomm.jar, librxtxSerial-.soを、SKSTACK_API/libにコピーします。librxtxSerial-2.2pre1.soは、"librxtxSerial.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
  9. デバイスをUSBポートに接続します。
  10. デバイスファイル、ロックファイルを扱うディレクトリのパーミッションを変更します。
    $ sudo chmod 666 /dev/ttyUSB*
    $ sudo chmod 777 /var/run/lock

使い方

基本構成

デバイス1台につき1個のSKDeviceもしくはSKHanDeviceクラスのインスタンスを生成し、適宜メソッドを呼び出します。

  • SKSTACK IPv2.1実装機種を扱う場合
    // SKDeviceクラスのインスタンンスを生成
    SKDevice device = new SKDevice();
    // 接続
    device.connect(<接続ポート名>);
    ...
    ...
    (処理を記述)
    ...
    ...  
    //最後に切断
    device.close();
  • SKSTACK IP for HAN Standard Edition実装機種を扱う場合
    // 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);

メソッドの戻り値は、次の通りです。

  • レジスタ値の取得(getLongAddress, getPanIDなど): 取得に成功したらその値、失敗したら-1もしくは空文字("")
  • レジスタ値の設定(setLongAddress, setPanIDなど): 設定に成功したらtrue, 失敗したらfalse
  • テーブルの取得(getNeighborTable, getTcpHandleTableなど): 取得に成功したらテーブル要素の配列、失敗したらnull
  • その他のメソッド(sendUDP, resetStackなど): コマンド発行に成功したらtrue, 失敗したらfalse

メソッドの詳細は、ソースツリーの[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]を参照してください。イベントリスナーに通知されるイベントは次の通りです。

  • ERXUDP
  • ERXTCP
  • ETCP
  • EPANDESC
  • EEDSCAN
  • EVENT

デバッグ

インタフェース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);
	}
}

列挙型

コマンド送信で用いる列挙型

  • SKScanMode: スキャンモード
  • SKSecOption: 送信データの暗号化オプション

イベント受信で用いる列挙型

  • SKEventType: イベント種類
  • SKEventNumber: イベント番号("EVENT"のパラメータ)

詳細は、ソースツリーの[doc]→index.html→[com.skyley.skstack-ip.api.skenums]を参照してください。

2台使用のサンプル

ソースツリーに含まれているサンプルを用いて、以下のように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);

のように変更してみてください。 (上記変更を行っても他モジュールは動作します)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-12-14 (水) 18:59:31 (362d)