Open19

JVM が入っている指輪型デバイス「Java Ring」 を動かしてみる試み

ぺやんぐぺやんぐ

Java Ring を入手した

某日,闇市にて Java Ring が 3000 円ほどで売っているのを観測して購入した。
非常に備品で,動きそうな予感。

ぺやんぐぺやんぐ

Java Ring が使用するプロトコル

上記参考に挙げた URL の先にある画像を画像検索にかけたところ,iButton なるプロトコルが怪しい。
指輪をハメるデバイスとかなり酷似したものを発見した。

マクニカの記事(https://www.macnica.co.jp/business/semiconductor/articles/analog_devices/144642/ )によると,DS1402D-DR8+ という iButton <-> RJ11(1-Wire) アダプタがあり,これに DS9490R# という RJ11(1-Wire) <-> USB 変換器を挿すようだ。

なお, 1-Wire とは iButton が使用しているプロトコルで,主に産業用温度記録装置で使われるようだ。
GND と 1本の信号線のみで通信できるのが特徴である。

買っちゃった

Digikey という超巨大電子部品ディストリビュータにて,当該製品が流通していることを確認した。
今月は大変なのであるが,好奇心に負けたために購入してしまった。
日本円で 16,000 円ほどであった。


https://www.digikey.jp/ja/products/detail/analog-devices-inc-maxim-integrated/DS1402D-DR8/1768955


https://www.digikey.jp/ja/products/detail/analog-devices-inc-maxim-integrated/DS9490R/1306478

ぺやんぐぺやんぐ

疎通確認

とりあえずこのガイドに従い, 1-Wire Driver なるものをインストールした。
これには,One-Wire Viewer というツールが含まれており,これを用いて疎通を確認できる。

起動して,Java Ring を挿してみる。

よかった。とりあえず動いたので,無事一歩前進。

ぺやんぐぺやんぐ

とりあえず手詰まり

マクニカが公開している One-Wire Viewer のスクリーンショットには,モニタやコンソールなどの最低限のでバッグ情報があった。
一方で,私が撮ったものにはそれがなく,とりあえずつながることが分かった,という状態である。
つまるところ,手詰まりである。

調べる

どうしようもないので,Java Ring の当初の目的である「Java One 参加者の情報やコーヒーの嗜好を記録・提供する」を実現することを目的にする。
インプレスが公開している記事の画像に,「Java Developer Conferenec 98 Tokyo」のものが写っていたので,引用する:

https://internet.watch.impress.co.jp/www/article/980528/ring.htm より。)

このページをネットの海から探すべく,「"Personalize your JavaTM Ring by entering the information below."」などの厳格検索を試してみる。

ぺやんぐぺやんぐ

発見!


https://github.com/AriZuu/OneWire/blob/07030dd5ba04b17d55068682b624f802418c86e5/apps/jib/iButton/Examples/BusinessCard/BusinessCard.java

それっぽいものを見つけた。特に,コーヒーの嗜好に関する記述があるのがよい,
他のディレクトリを探索してみると,iButton や OneWire 等の記述があるので,十中八九これで間違いないだろう。

とりあえずローカルに落としてきて,色々試してみる…

ぺやんぐぺやんぐ

あらゆるファイルが破損していた。万事休す!!!

ぺやんぐぺやんぐ

知見まとめ

  1. Java Ring は「Java-powered iButton」という類のデバイスのようだ。
  2. iButton は 1-Wire プロトコルの上で動作する(= iButton over 1-Wire protocol)。
ぺやんぐぺやんぐ

iB-IDE なるソフトウェアがあり,これを使うと良いらしい。
しかしながら, iButon の当時のサイトは落ちている上に,Wayback machine を用いても,入手元URL が ftp:// のためにアーカイブが出来てない。

そこで, iB-IDE で検索をかけていると次のサイトを発見した。
https://bbs.kanxue.com/thread-19243-6.htm

どうやら http://www.ee.usyd.edu.au/~mattb/2003/project/ibutton/ に転がっているらしく,無事アーカイブからゲッツ。

ぺやんぐぺやんぐ

ここでは Java Communications API 2.0 と iB-IDE の両方を配布しているらしい。
後者を落として解凍してみたところ, Setup.jarSetup.bat が析出した。
試しに Setup.bat の方を走らせたところ,エラーが発生した:

 Syntax:  SETUP jdkPath
 Where jdkPath is the path to your Java executable.

 Example: SETUP c:\JDK1.2.2\bin\java.exe

Press any key to continue . . .

なるほど, Java 25 ではやはりダメなようだ。
では, .bat の正規系の動きを再現するべく java -cp Setup.jar Setup を試したところ,ウィザードが起動した。

どうやら Dallas の製品だったようだ。

進めてみたところ, Java Communications API なる API が必要ということがわかった。

ぺやんぐぺやんぐ

もう一方のファイルを解凍すると,以下のファイルとディレクトリが析出した。

Readme.md の指示に従って,マシンにすでにある JDK 1.8 にインストールしてみる。
その後,java -cp "<comm.jar のパス>;Setup.jar" Setup で強引に実行した。

ヨシ!

ぺやんぐぺやんぐ

CRC が通らない

iB-IDE には APDU を送信する機能があったため,とりあえず「Get Firmware Version ID」をしてみた。
しかしながら, CRC エラーが起きてしまっている事がわかった。

返答が以下のようなバイト列であった。

55 16 94 03 07 00 00 00 D0 E1 FE FF FF FF FF FF

なお,命令の開始が必ず 55 であることが仕様書には明記されており,実際に 55 から始まっているため,私の Java Ring が(回復不可能なほどに)壊れているということはなさそう。

これを Dallas 式の CRC に入れ,得られた結果が 45057 ではないといけないらしい。

なお,CRC の式は次の通りである:

ぺやんぐぺやんぐ

Java iButton

どうやら Java Ring が内蔵している iButton は,そのなかでも特別な Java(-Powered) iButton なるものらしい。
見つけた記事を共有しておく。

ぺやんぐぺやんぐ

Java Ring が使っているパスワードは 「1!J1」 らしい

ぺやんぐぺやんぐ

デバイス ID

Java Ring の 1-Wire デバイス ID は 16 である。このことは One-Wire Viewer からも読み取れることである。
'00 年代の 1-Wire Java API には,OneWireContainer16 という Java-Powered iButton に対応したハンドラがあったが,最新の API からは何故か削除されている。

このハンドラは, JibComm という専用のバックエンドを用いて通信をする。

ぺやんぐぺやんぐ

状況把握

  • CRC に失敗していたことから,CRC の計算 or Java Ring がぶっ壊れていると思っていた。
  • 標準出力を差し挟むなどしてデバッグをしたところ,実際は CRC には成功していることが分かった。
  • 実はCRC は計2回実行されており,2回目の CRC のみ失敗している。

CRC の計算は2回あった!

ここで注意しなければいけないことは,CRC シーケンスは2回行われるということだ。
問題を整理すると,現在直面している悪夢はデバイスのステータスを取得する checkStatus メソッドによって発生している.

このメソッドはデバイスのステータスを確認し,必要な処理(初期化やタイミング合わせ)等を行う。
ここで特筆すべき概念は,Power-On Reset という起動時の特別な処理だ。
これは,マイコンの電源が投入されていから安定するまでに発生した中途半端なデータを破棄して,まっさらな状態で動かすための処理である。

最初の電源投入からエラーまでの流れはこうだ。
まず,Java-Powered iButton(以下単に iButton という)を認識した 1-Wire API は,checkStatus -> getStatus を用いてステータスを取得する命令を(0x55 - MATCH ROM を用いて宛先を指定したうえで)発行する
このとき次のようなデータが返答され,これは CRC チェックにパスする。

0x55, 0x16, 0x94, 0x03, 0x07, 0x00, 0x00, 0x00, 0xD0, 0xE1, 0x08, 0x00, 0x40, 0x00, 0x70, 0x49

これは ROMコマンド | ROM ID(シリアル番号のようなもの) | 命令名 | 引数・応答 で構成されており,ステータス命令の応答として 08 00 40 00 が帰ってきている事がわかる。

ステータス 40 が意味することは,即ち「POR を正すためにデバイスをリセットしろ」ということである。
そのために corretPOR メソッドが呼ばれ,これは reset, setStatus(試行回数), run(試行回数)を呼び出す。

reset メソッドはデバイスに 0xDD, 0xBC, 0x92 を送りつけてリセットを要求する。
他2つのメソッドについては調査中である。

これを行った後に,再度 checkStatus 内のステータス取得&環境適合作業が行われる。
このとき,(なぜか)デバイスからは すべてが F になるような値が返ってくる。そうして CRC チェックに失敗する,というのが一連の流れだ。

詳しくはまだ分からないが,調査を続けることにする。

ぺやんぐぺやんぐ

送信・受信ログをすべて出すとこんな感じ:

 [22, -108, 3, 7, 0, 0, 0, -48]
TRANSFER JIB DATA:
06 89 00 d0 95 01 00 
Sending data to Java iButton.
STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]Attempting to correct the POR!
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -35, -68, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -46, 0, -1, -1, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -121, 115, 93, 95, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[96]STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]This exception occurred: com.dalsemi.onewire.OneWireException: POR of Device is set., Retrying to send the apdu after POR...
Sending data to Java iButton.
STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]Attempting to correct the POR!
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -35, -68, -110, 95, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -46, 1, -1, -1, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -121, 115, 93, -97, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[386]55 16 94 3 7 0 0 0 d0 e1 fe ff ff ff ff ff 
This exception occurred: com.dalsemi.onewire.adapter.OneWireIOException: Bad CRC on data returned in Read Status method., Retrying to send the apdu after POR...
Sending data to Java iButton.
STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]Attempting to correct the POR!
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -35, -68, -110, -97, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -46, 2, -1, -1, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -121, 115, 93, -98, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[676]55 16 94 3 7 0 0 0 d0 e1 fe ff ff ff ff ff 
This exception occurred: com.dalsemi.onewire.adapter.OneWireIOException: Bad CRC on data returned in Read Status method., Retrying to send the apdu after POR...
com.dalsemi.onewire.adapter.OneWireIOException: Bad CRC on data returned in Read Status method.
	at com.dalsemi.onewire.container.JibComm.getStatus(JibComm.java:578)
	at com.dalsemi.onewire.container.JibComm.checkStatus(JibComm.java:621)
	at com.dalsemi.onewire.container.JibComm.transferJibData(JibComm.java:426)
	at com.dalsemi.onewire.container.OneWireContainer16.sendAPDU(OneWireContainer16.java:2033)
	at com.dalsemi.onewire.container.OneWireContainer16.getFirmwareVersionString(OneWireContainer16.java:668)
	at com.ibutton.opt.ide.IDEFrame.oneWireArrival(IDEFrame.java:1260)
	at com.dalsemi.onewire.utils.OneWireMonitor.notifyOfArrival(OneWireMonitor.java:181)
	at com.dalsemi.onewire.utils.OneWireMonitor.pollDevices(OneWireMonitor.java:490)
	at com.dalsemi.onewire.utils.OneWireMonitor.run(OneWireMonitor.java:225)
ぺやんぐぺやんぐ

correctPOR の後に Thread.sleep を入れてみたら, CRC のエラーが無くなった!!

    public void correctPOR() {
        if (doDebugMessages) {
            System.out.println("Attempting to correct the POR!");
        }
        this.reset();
        this.setStatus(0 + this.POR_ADJUST);
        this.run(0 + this.POR_ADJUST);
        Thread.sleep(10000L);
    }

なお,依然として POR 関連のエラーが残っている模様。

 [22, -108, 3, 7, 0, 0, 0, -48]
TRANSFER JIB DATA:
06 89 00 d0 95 01 00 
Sending data to Java iButton.
STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]Attempting to correct the POR!
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -35, -68, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -46, 0, -1, -1, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -121, 115, 93, 95, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[96]STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]This exception occurred: com.dalsemi.onewire.OneWireException: POR of Device is set., Retrying to send the apdu after POR...
Sending data to Java iButton.
STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]Attempting to correct the POR!
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -35, -68, -110, 95, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -46, 1, -1, -1, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -121, 115, 93, -97, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[386]STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]This exception occurred: com.dalsemi.onewire.OneWireException: POR of Device is set., Retrying to send the apdu after POR...
Sending data to Java iButton.
STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]Attempting to correct the POR!
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -35, -68, -110, -97, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -46, 2, -1, -1, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Sent command:[85, 22, -108, 3, 7, 0, 0, 0, -48, -121, 115, 93, -98, 127, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[676]STAT:
[85, 22, -108, 3, 7, 0, 0, 0, -48, -31, 8, 0, 64, 0, 112, 73]
<8 0 40 0>[0]This exception occurred: com.dalsemi.onewire.OneWireException: POR of Device is set., Retrying to send the apdu after POR...
com.dalsemi.onewire.OneWireException: POR of Device is set.
	at com.dalsemi.onewire.container.JibComm.checkStatus(JibComm.java:644)
	at com.dalsemi.onewire.container.JibComm.transferJibData(JibComm.java:426)
	at com.dalsemi.onewire.container.OneWireContainer16.sendAPDU(OneWireContainer16.java:2033)
	at com.dalsemi.onewire.container.OneWireContainer16.getFirmwareVersionString(OneWireContainer16.java:668)
	at com.ibutton.opt.ide.IDEFrame.oneWireArrival(IDEFrame.java:1260)
	at com.dalsemi.onewire.utils.OneWireMonitor.notifyOfArrival(OneWireMonitor.java:181)
	at com.dalsemi.onewire.utils.OneWireMonitor.pollDevices(OneWireMonitor.java:490)
	at com.dalsemi.onewire.utils.OneWireMonitor.run(OneWireMonitor.java:225)

これを見た感じ,やはりデバイスが壊れている可能性を捨てきれない…ぐぬぬ