SunSPOT: コマンドラインからの操作
Tagged:

この度、Sun SPOT を購入して遊び評価を始めたのですが、 個人的には IDE である NetBeans 経由での操作は隔靴掻痒の感が強いため、 まずは Sun SPOT デバイスのデモ実行の際に必要なレベルで、 コマンドライン実行に関してまとめてみました。

アプリケーションのインストール

以下、 SunSPOT SDK やデバイスドライバ等のインストールは済んでいるものと仮定します。

SunSPOT SDK のインストール先直下に移動して、 info ANT ターゲットを実施することで、 USB 接続されている SunSPOT デバイスの情報を取得することができます。

$ ant info
Buildfile: build.xml
             :
             :
             :
-run-spotclient-once:
     [java] SPOT Client starting...
     [java] (please reset SPOT on port COM4)
※ ここで SunSPOT の電源スイッチをワンプッシュ
   (一度 info を実行済みの場合は、USB 接続解除までは reset 不要の筈)
   "COM4" は USB 接続状況に応じて変化
     [java] [waiting for reset] 
     [java] [waiting for reset] 
     [java] [waiting for reset] ** VM stopped: exit code = 0 ** 
     [java] [waiting for reset] 

     [java] Sun SPOT bootloader (purple-071018) 
     [java] SPOT serial number = XXXX.XXXX.XXXX.XXXX
※ 各デバイス固有の識別情報
   ネットワーク連携の際に指定する
     [java] Application slot contents:
     [java]    ...\Demos\BounceDemo\BounceDemo-OnSPOT
※ その時点でインストールされているアプリケーション
     [java]    25218 bytes
     [java]    last modified Thu Feb 19 17:35:26 JST 2009

     [java] Startup:
     [java]    Squawk startup command line:
     [java]       -flashsuite:10900000
     [java]       -Xboot:268763136
     [java]       -Xmx:478000
     [java]       -Xmxnvm:128
     [java]       -isolateinit:com.sun.spot.peripheral.Spot
     [java]       -dma:1024
     [java]       -MIDlet-1
     [java]    OTA Command Server is enabled
※ これが enabled でないと、ネットワーク連携ができない
     [java]    Configured to run the current application

     [java] Library suite:
     [java]    hash=0xa2fb25
     [java]    Installed library matches current SDK library
     [java]    Installed library matches shipped SDK library
     [java]    Current SDK library matches shipped SDK library

     [java] Security:
     [java]    Owner key on device matches key on host
※ ここが "matches key on host" でない場合は、ネットワーク連携できない

     [java] Configuration properties:
     [java]    spot.external.0.firmware.version: 1.9
     [java]    spot.external.0.hardware.rev: 5.0
     [java]    spot.external.0.part.id: EDEMOBOARD_REV_0_2_0_0
     [java]    spot.hardware.rev: 6
     [java]    spot.ota.enable: true
     [java]    spot.powercontroller.firmware.version: PCTRL-1.79
     [java]    spot.sdk.version: purple-071018

     [java] Exiting
             :
             :
             :
BUILD SUCCESSFUL
Total time: 11 seconds
デバイスからの情報取得

例えば、SDK 添付のデモである AirText アプリケーションを SunSPOT デバイスにインストールするには、 アプリケーション実行用のデバイス (LED やスイッチを内蔵している、分厚いほうのデバイス)を 1 つだけ USB で接続した状態で、 deploy ANT ターゲットを実行します。

$ cd Demos/AirText
$ ant deploy
             :
             :
             :
-run-spotclient-once:
     [java] SPOT Client starting...
     [java] (please reset SPOT on port COM4)
     [java] [waiting for reset] 
     [java] [waiting for reset] 
     [java] [waiting for reset] ** VM stopped: exit code = 0 ** 
     [java] [waiting for reset] 

     [java] Sun SPOT bootloader (purple-071018) 
     [java] SPOT serial number = xxxx.xxxx.xxxx.xxxx
     [java] About to flash to ....\Demos\AirText/suite/image
     [java] Writing ....(8532 bytes) to local SPOT on port COM4
     [java] |===                                                         | 5%
     [java] |======                                                      | 11%
     [java] |=========                                                   | 16%
     [java] |============                                                | 20%
     [java] |===============                                             | 27%
     [java] |==================                                          | 30%
     [java] |=====================                                       | 35%
     [java] |========================                                    | 40%
     [java] |===========================                                 | 45%
     [java] |==============================                              | 50%
     [java] |=================================                           | 55%
     [java] |====================================                        | 60%

             :
             :

     [java] Exiting
             :
             :
             :
アプリケーションのインストール

インストール時には、 必要に応じて *.java ファイルのコンパイル等が実施されますので、 javac コマンドへのパスが通っている必要があります。

複数のデバイスが接続されている場合は、 プロパティとしてポート番号を指定することで、 インストール先デバイスを特定できます。

$ ant -Dspotport=COM5 deploy
デバイスの指定
ネットワーク連携設定

先述したのと同じ要領で、 info ターゲット実行で取得したデバイス固有の識別情報を、 インストール先特定用のプロパティとして指定することで、 ベースステーションを経由した、 リモート SunSPOT デバイスへのインストールも可能です。

$ ant -DremoteId=XXXX.XXXX.XXXX.XXXX deploy
リモートデバイスの指定

但し、 リモートインストールを行うまでに、 確認しておくべき項目が幾つかあります。

まずは、ベースステーションを USB 接続し、 info ANT ターゲットを実行することで、 ベースステーションの情報を取得します。

$ ant info
             :
             :
             :
     [java]    OTA Command Server is enabled
     [java]    Configured as a Basestation
             :
             :
             :
ベースステーションの情報

"Configured as a Basestation" となっていない場合は、 そのデバイスはベースステーションとしては機能しません。 また、"Configured as a Basestation" となっていても、 USB 接続したばかりの時点では、 ベースステーションとして機能していないため、 リモート連携は以下の様なエラーで失敗してしまいます。

     [java] No suitable SPOT is available
     [java] Java Result: -1
リモート連携の失敗

このような場合、 startbasestation ANT ターゲットの実行により、 当該デバイスをベースステーションとして稼動させます。

$ ant startbasestation
             :
             :
             :
-run-spotclient-once:
     [java] SPOT Client starting...
     [java] [waiting for reset] 

     [java] Local Monitor (purple-071018) 
     [java] SPOT serial number = XXXX.XXXX.XXXX.XXXX


     [java] ** VM stopped: exit code = 0 ** 


     [java] Exiting
             :
             :
             :
ベースステーションの起動

次は連携対象となるアプリケーション実行用デバイスの設定確認です。

OTA(Over The Air) Command Server が有効化

ネットワーク経由での連携を行うには、 OTA が enabled になっていなければいけません。

enabled になっていない場合は、 USB で有線接続した状態で enableota ANT ターゲットを実施してください。

デバイスの所有者鍵が "matches key on host"

異なる環境でアプリケーションをインストールされたことのあるデバイスは、 異なる所有者鍵を持っているため、 USB での有線接続の際には info 等に反応しますが、 ネットワーク連携の際には反応を返さなくなります。

デバイスの所有者鍵の変更に関しては、 SunSPOT SDK に同梱(doc ディレクトリ配下)されている "SunSPOT Developer’s Guide"(PDF ファイル) の "Changing the owner of a Sun SPOT" に詳細がありますが、 USB で有線接続した状態で flashlibrary ANT ターゲットを実施するのが簡単でしょう。

以上でデバイス間のネットワーク連携が可能になりました。

例えば電源の入ったアプリケーション実行デバイスが2つある場合、 以上の設定が出来ていれば、 hello ANT ターゲットの実施により、 以下の様なデバイス一覧が表示されます。

$ant hello
             :
             :
             :
-run-spotclient-once:
     [java] SPOT Client starting...
     [java] There are 2 Sun SPOTs in range
     [java] XXXX.XXXX.XXXX.XXXX
     [java]   Hello version:  2.0
     [java]   Hardware:       eSPOT 6
     [java]   Library hash:   0xa2fb25 matches desktop
     [java]   SDK version:    purple-071018 matches desktop
     [java]   SPOT time:      Mon Feb 23 14:02:41 JST 2009
     [java]                   matches [skew is ....
     [java]   vBatt:          4181mV
     [java]   External power: no
     [java]   Owner Id:       matches desktop

     [java] YYYY.YYYY.YYYY.YYYY
     [java]   Hello version:  2.0
     [java]   Hardware:       eSPOT 6
     [java]   Library hash:   0xa2fb25 matches desktop
     [java]   SDK version:    purple-071018 matches desktop
     [java]   SPOT time:      Mon Jan 05 05:38:36 JST 1970
     [java]                   doesn't match [skew is ....
     [java]   vBatt:          4101mV
     [java]   External power: no
     [java]   Owner Id:       matches desktop

     [java] SUMMARY
     [java]                SDK matches        : 2
     [java]                Library matches    : 2
     [java]                Owner Id matches   : 2
     [java]                Time skew OK       : 1
     [java]                Externally powered : 0

     [java]                SPOTs in range     : 2



     [java] Exiting
             :
             :
             :
hello 応答
SPOT World(Solarium) の使用

Web Start 経由で Sun SPOT Manager を実行する場合、 javac にパスが通っていないと強制的に JDK をインストールさせようとしてきます (場合によっては NetBeans も)。

私個人としては、複数のバージョン違いの JDK をインストールしておいて、 利用時に切り替えたりする必要性が(時々)あるので、 特定の JDK へ PATH を通すのは避けたいところです。

このような場合、SPOT World(現在は Solarium と言う模様)の使用だけで良く、 且つコマンドラインでの使用に抵抗が無ければ、 "ant spotworld" で起動する方が簡単です。