#author("2022-05-27T11:45:32+09:00","","") #contents *はじめに [#b27f1280] SKSTACK API for Javaは、SKSTACKを実装したデバイスをJavaで扱うためのライブラリです。~ SKSTACK IPv2.1及びSKSTACK IP for HAN Standard Editionに対応しています。~ シリアル通信処理には、RXTX for Javaを用いています。 *ライセンス [#a4adf92f] 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. *開発環境 [#kee597d5] 以下の環境で開発、動作確認しています。 - Windows 8.1 Pro(x64であれば、Windows7, 8/8.1無印でも可) - Eclipse 4.4 Luna(Javaバージョンは1.8) - [[RXTX for Java Windows-x64 binary:http://fizzed.com/oss/rxtx-for-java]] -SKSTACK実装機種:RL7023 Stick (2015.6.29追記)~ 以下の環境で、Linuxでの動作確認をしました。 - Ubuntu 14.04 64bit/32bit - Eclipse 4.4 - Oracle JDK 1.8 - [[RXTX 2.2 pre2:http://rxtx.qbang.org/wiki/index.php/Download]] -SKSTACK実装機種:RL7023 Stick *環境構築手順 [#ob379f63] **Eclipseのインストール [#ja9610a0] +http://mergedoc.osdn.jp/index.html#/pleiades_distros4.4.html にアクセス +[Eclipse 4.4 Luna Pleiades All in One]をクリック + Java 64bit Full Editionの[Download]をクリック +インストーラのダウンロードが完了したら、インストーラを起動 **GitHubからソースをクローン [#n6e88e73] https://github.com/SkyleyNetworks/SKSTACK_API.gitを、適当な場所にクローンします。~ (以下、C:¥Users¥<username>¥Documents¥GitHubにクローンしたものとします) GitHubを初めて使う場合は、以下の手順でセットアップしてください。 +https://windows.github.com/にアクセスし、GitHub for Winodwsをダウンロード→インストール +https://github.com/SkyleyNetworks/SKSTACK_APIにアクセス +画面右側 [Clone in Desktop]をクリック +ソースの保存先をC:¥Users¥<username>¥Documents¥GitHubに指定し、クローン実行 **Eclipse設定 [#p20035ef] +Eclipseを起動 +ワークスペースを、[C:¥Users¥<username>¥Documents¥GitHub]に変更 +[ファイル]→[インポート]をクリック +「インポートソースの選択」にて、[Git]→[Gitからプロジェクト]を選択し、[次へ]をクリック +[既存ローカル・リポジトリー]を選択し、[次へ]をクリック +[SKSTACK_IP_API_TEST]を選択し、[次へ]をクリック (表示されていない場合は、[追加]をクリックし、「ディレクトリー」覧に[C:¥Users¥<username>¥Documents¥GitHub]を指定してください) +[次へ]をクリック +[完了]をクリック(ウィンドウ左ペインにSKSTACK_IP_API_TESTのソースツリーが表示されていればOKです) **動作確認 [#l47a2499] +デバイスをUSBポートに接続 +[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 [#y3b6bfd9] (2015.6.29追記)~ Linuxでの構築手順は以下の通りです。 +https://eclipse.org/downloads/?osType=linuxからEclipseの「Eclipse IDE for Java Developers 64bit/32bit」をクリックし、Eclipseをダウンロードします。 +Gitをインストールします。 $ sudo apt-get install git +JDKをインストールします。 $ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install oracle-java8-installer +環境変数"JAVA_HOME"を設定します。 (/etc/profileに追記) export JAVA_HOME=/usr/lib/jvm/java-8-oracle $ source /etc/profile +SKSTACK API for Javaのソースを取得します。 $ cd ~/workspace(Eclipseのワークスペースを~/workspaceとした場合) $ git clone https://github.com/SkyleyNetworks/SKSTACK_API.git +http://rxtx.qbang.org/wiki/index.php/Downloadの「rxtx-2.2pre.zip」をクリックし、RXTX 2.2preのソースをダウンロードします。 +RXTXソースをコンパイルします。 $ unzip rxtx-2.2pre.zip $ cd rxtx-2.2pre $ ./configure $ make(librxtxParallel.soの生成に関するエラーが出ますが、librxtxSeria-2.2pre1.soは正常に生成されますので、そのまま進みます) +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 +デバイスをUSBポートに接続します。 +デバイスファイル、ロックファイルを扱うディレクトリのパーミッションを変更します。 $ sudo chmod 666 /dev/ttyUSB* $ sudo chmod 777 /var/run/lock *使い方 [#de018529] **基本構成 [#x6afa3e8] デバイス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(); **コマンド送信 [#wd600fe3] 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を参照してください。 **イベント受信 [#se696bc7] 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 **デバッグ [#w3a4ca81] インタフェース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); } } **列挙型 [#fb2f10ac] ***コマンド送信で用いる列挙型 [#x8485998] -SKScanMode: スキャンモード -SKSecOption: 送信データの暗号化オプション ***イベント受信で用いる列挙型 [#x8030979] -SKEventType: イベント種類 -SKEventNumber: イベント番号("EVENT"のパラメータ) 詳細は、ソースツリーの[doc]→index.html→[com.skyley.skstack-ip.api.skenums]を参照してください。 **2台使用のサンプル [#q3bcf529] ソースツリーに含まれているサンプルを用いて、以下のように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(); *ローム社製モジュールで使う場合 [#m8e208e5] BP35A1, 35C0などローム社製モジュールではシリアル通信でコマンドが送信できない現象があります。rxtx for javaによるシリアルポートオープン時のRTS/CTS初期状態がメーカーによって異なるためと思われます。 SKDevice#connecメソッドでフロー制御を設定している箇所を port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_OUT); port.setDTR(true); port.setRTS(false); のように変更してみてください。 (上記変更を行っても他モジュールは動作します)