この度、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 で有線接続した状態で
enableotaANT ターゲットを実施してください。- デバイスの所有者鍵が "matches key on host"
異なる環境でアプリケーションをインストールされたことのあるデバイスは、 異なる所有者鍵を持っているため、 USB での有線接続の際には
info等に反応しますが、 ネットワーク連携の際には反応を返さなくなります。デバイスの所有者鍵の変更に関しては、 SunSPOT SDK に同梱(doc ディレクトリ配下)されている "SunSPOT Developer’s Guide"(PDF ファイル) の "Changing the owner of a Sun SPOT" に詳細がありますが、 USB で有線接続した状態で
flashlibraryANT ターゲットを実施するのが簡単でしょう。
以上でデバイス間のネットワーク連携が可能になりました。
例えば電源の入ったアプリケーション実行デバイスが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
:
:
:
Web Start 経由で Sun SPOT Manager を実行する場合、 javac にパスが通っていないと強制的に JDK をインストールさせようとしてきます (場合によっては NetBeans も)。
私個人としては、複数のバージョン違いの JDK をインストールしておいて、 利用時に切り替えたりする必要性が(時々)あるので、 特定の JDK へ PATH を通すのは避けたいところです。
このような場合、SPOT World(現在は Solarium と言う模様)の使用だけで良く、
且つコマンドラインでの使用に抵抗が無ければ、
"ant spotworld" で起動する方が簡単です。