chakokuのブログ(rev4)

日々のごった煮ブログです

ECHONET Lite用ライブラリ OpenECHOに新しい属性を追加ー>エラー応答(52(Get_SNA))になる。なぜか

やりたいこと:
OpenECHOのElectricStormWindowクラス(通称:電動窓シャッター)に対して属性を加えたい*1。ElectricStormWindowクラスでは開閉状態(OpenCloseStatus 0xEA)がサポートされていない(仕様上も必須属性ではないので)。だから、、setupPropertyMaps()メソッドをoverrideして、属性:0xEAも扱えるようにしたい。
発生した問題:
setupPropertyMapsメソッドをoverrideして、0xEAも扱えますと追加したけど、EchonetLiteのパケットを投げると、OpenECHOからは、エラー:GET_SNAで返される。

送信パケット 
|10|81|0001|0EF001|026301|62(Get)|01|ea(Open Close Status)_00_|
----------------------------------------
OpenECHOからの返却パケット
|10|81|0001|026301|0ef001|52(Get_SNA)|01|ea(Open Close Status)_00_|

なぜエラー:GET_SNA判断されるのか原因が分からなかった。
調査方法:
Processingではブレークができるけど、呼び出し側までトレースでもどれない。しょうがないので、サンプルソースjava版に書き直して、Java用デバッガ、jdbで一行ずつトレースしながら、52(GET_SNA)を返却する原因を調べた。
調査結果:
EchoObjectクラスで返却パケットを組み立てる際、Propertyの正当性をチェックしている。具体的には、ElectricStormWindowクラスのisValidPropertyメソッドを呼んで、正当性を確認している。このメソッドのswith文に、0xEAを加えていなかったため、正当性チェックでfalseとなっていた。
対策:
ElectricStormWindowクラスのisValidPropertyメソッドをoverrideして0xEAの場合の正当性チェックを加える

修正内容:
~疲れたので修正内容は後日追記~

修正結果:
以下の通り、正常に応答するようになった。

送信パケット
|10|81|0001|0EF001|026301|62(Get)|01|ea(Open Close Status)_00_|
----------------------------------------
OpenECHOからの返却パケット
|10|81|0001|026301|0ef001|72(Get_Res)|01|ea(Open Close Status)_01_42|

■ご参考
java版のビルド

#!/bin/sh
CLASS=Shutter

echo "javac -g -cp OpenECHO.jar  ${CLASS}.java"
javac -g -cp OpenECHO.jar  ${CLASS}.java

jdbの起動

#!/bin/sh
CLASS=Shutter

echo "jdb -classpath /<some_pass>/OpenECHO.jar:  ${CLASS}"
jdb -classpath /<some_pass>/OpenECHO.jar:  ${CLASS}

*1:制御したい対象の電動シャッター(文化シャッターとか)は開閉状態を取得する際、0xEAを使う