(57)【特許請求の範囲】
【請求項１】
制御部と、
複数のファームウェアとブートローダとのそれぞれを複数のメモリバンクの中のいずれかのメモリバンクに記録する第１記憶装置と、
前記メモリバンクに記録したファームウェアごとの判定情報を記録する第２記憶装置と
を有し、
複数の前記ファームウェアの中の第１ファームウェアは、前記制御部に起動されることにより、制御対象を制御し、さらに、外部装置からダウンロードされた第２ファームウェアを前記第１記憶装置に記録して前記第２ファームウェアの起動を選択して前記ブートローダを起動し、
前記第２ファームウェアは、前記制御部に起動されることにより、前記制御対象を制御し、さらに、前記第２ファームウェアの良否を判定し、前記第２ファームウェアが不良であると判定されたときに、前記判定情報が第１値を示すように前記判定情報を更新して前記ブートローダを起動し、
前記ブートローダは、前記制御部に起動されることにより、前記第２ファームウェアの起動が選択されている場合、前記第２ファームウェアの前記判定情報が前記第１値と異なる第２値を示すときに前記第２ファームウェアを起動し、前記判定情報が前記第１値を示すときに複数の前記ファームウェアの中の前記判定情報が前記第２値を示すファームウェアを起動する
電子機器。
【請求項２】
前記第２ファームウェアは、
前記第２ファームウェアが正常であると判定されたときに、前記判定情報が前記第２値を示すように前記判定情報を更新し、前記ブートローダにより再度起動された場合で、前記判定情報が前記第２値を示すときに、前記第２ファームウェアの良否を判定しない
請求項１に記載の電子機器。
【請求項３】
前記第２ファームウェアは、複数の観点で前記第２ファームウェアの良否をそれぞれ判定し、前記複数の観点のいずれか１つで不良であると判定されたときに前記判定情報が前記第１値を示すように前記判定情報を更新し、前記複数の観点の全部が正常であると判定されたときに前記判定情報が前記第２値を示すように前記判定情報を更新する
請求項２に記載の電子機器。
【請求項４】
前記第２ファームウェアが起動されたときに設定されるウォッチドッグタイマをさらに備え、
前記ブートローダは、さらに、前記ウォッチドッグタイマがタイムアウトしたときに、前記制御部に起動される
請求項２または請求項３に記載の電子機器。
【請求項５】
前記第２ファームウェアは、前記第２ファームウェアが正常であると判定されたときに、前記ウォッチドッグタイマを解除する
請求項４に記載の電子機器。
【請求項６】
前記第２記憶装置は、試行情報をさらに記録し、
前記第１ファームウェアは、前記第２ファームウェアが起動される前に、前記判定情報が第３値を示すように前記判定情報を更新し、前記試行情報が第４値を示すように前記試行情報を更新し、
前記ブートローダは、
前記判定情報が前記第３値を示す場合で前記試行情報が前記第４値を示すときに、前記試行情報が第５値を示すように前記試行情報を更新して前記第２ファームウェアを起動し、
前記判定情報が前記第３値を示す場合で前記試行情報が前記第５値を示すときに、前記第１ファームウェアを起動する
請求項４または請求項５に記載の電子機器。
【請求項７】
カレンダータイマをさらに備え、
前記第２記憶装置は、起動回数をさらに記録し、
前記第２ファームウェアは、前記カレンダータイマを用いて導出される期間に前記第２ファームウェアが起動される回数を前記起動回数が示すように前記起動回数を更新し、前記起動回数が所定の値より大きいときに、前記判定情報が前記第１値を示すように前記判定情報を更新して前記ブートローダを起動する
請求項２〜請求項６のいずれか一項に記載の電子機器。
【請求項８】
前記第２ファームウェアは、前記期間が経過したときに前記判定情報が前記第２値を示すように前記判定情報を更新し、前記判定情報が前記第２値を示すときに前記起動回数を更新しない
請求項７に記載の電子機器。
【請求項９】
複数のファームウェアとブートローダとのそれぞれを第１記憶装置の複数のメモリバンクの中のいずれかのメモリバンクに記録し、
複数の前記ファームウェアの中の第１ファームウェアを起動することにより、制御対象を制御し、さらに、外部装置からダウンロードされた第２ファームウェアを前記第１記憶装置に記録して前記第２ファームウェアの起動を選択して前記ブートローダを起動し、
前記第２ファームウェアを起動することにより、前記制御対象を制御し、さらに、前記第２ファームウェアの良否を判定し、前記第２ファームウェアが不良であると判定されたときに、第２記憶装置に前記メモリバンクに記録したファームウェアごとに記録された前記第２ファームウェアの判定情報が第１値を示すように前記判定情報を更新して前記ブートローダを起動し、
前記ブートローダを起動することにより、前記第２ファームウェアの起動が選択されている場合、前記第２ファームウェアの前記判定情報が前記第１値と異なる、正常であると判定されたことを示す第２値を示すときに前記第２ファームウェアを起動し、前記判定情報が前記第１値を示すときに複数の前記ファームウェアの中の、前記判定情報が前記第２値を示すファームウェアを起動する
処理をコンピュータが実行することを特徴とするファームウェアアップデート方法。
【請求項１０】
複数のファームウェアの中の第１ファームウェアにより、制御対象を制御し、外部装置からダウンロードされた第２ファームウェアを第１記憶装置に記録して前記第２ファームウェアの起動を選択してブートローダを起動し、
前記第２ファームウェアにより、前記制御対象を制御し、前記第２ファームウェアの良否を判定し、前記第２ファームウェアが不良であると判定されたときに、前記第２ファームウェアの判定情報が第１値を示すように前記判定情報を更新して前記ブートローダを起動し、
前記第２ファームウェアの起動が選択されている場合、前記ブートローダにより、前記第２ファームウェアの前記判定情報が前記第１値と異なる、正常であると判定されたことを示す第２値を示すときに前記第２ファームウェアを起動し、前記判定情報が前記第１値を示すときに複数の前記ファームウェアの中の、前記判定情報が前記第２値を示すファームウェアを起動する
処理をコンピュータに実行させる
コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、電子機器、ファームウェアアップデート方法およびコンピュータプログラムに関する。
【背景技術】
【０００２】
従来、ワイヤレスセンサネットワークを構築するセンサノードは、人が立ち入り辛い場所に設置されることが多い。このため、このようなセンサノードのファームウェアのアップデートは、遠隔から無線経由で行われる。センサノードは、そのような状況下で、不良なファームウェアが送られると、動作を止めてしまうというトラブルを発生させることがあり、このようなトラブルの対応には多大なコストがかかってしまう。
【０００３】
ファームウェア更新時のトラブル対策として、ｅＭＭＣ（ｅｍｂｅｄｄｅｄ  Ｍｕｌｔｉ  Ｍｅｄｉａ  Ｃａｒｄ）等に複数のバンクを用意し、あるバンクのファームウェア更新時に、別のバンクに安定動作するファームウェアを残す仕組みが知られている。また、更新したファームウェアの起動に失敗した場合に、安定動作可能なファームウェアでの動作に戻る仕組みが知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１４−１４２７９９号公報
【特許文献２】特開２０１５−１０６８１３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、ファームウェアの起動自体は可能なものの、正常に動作しないという不具合が発生することがある。上記の従来技術では、更新されたファームウェアに不具合がある場合でも、このようにファームウェアが起動したときに、正常に動作する予備のファームウェアに巻き戻すことが困難であるという問題がある。このような問題は、センサノードに限らず、遠隔でファームウェアが更新される電子機器に発生することがある。
【０００６】
１つの側面では、アップデートされたファームウェアに不具合があるときに、予備のファームウェアに巻き戻す電子機器、ファームウェアアップデート方法およびコンピュータプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
第１の案では、電子機器は、制御部と、第１ファームウェアとブートローダとを記録する第１記憶装置と、判定情報を記録する第２記憶装置とを有する。第１ファームウェアは、制御部に起動されることにより、制御対象を制御し、さらに、外部装置からダウンロードされた第２ファームウェアを第１記憶装置に記録してブートローダを起動する。ブートローダは、制御部に起動されることにより、判定情報が第１値を示すときに第１ファームウェアを起動し、判定情報が第１値を示していないときに第２ファームウェアを起動する。第２ファームウェアは、制御部に起動されることにより、制御対象を制御し、さらに、第２ファームウェアの良否を判定する。第２ファームウェアは、第２ファームウェアが不良であると判定されたときに、判定情報が第１値を示すように判定情報を更新してブートローダを起動する。
【発明の効果】
【０００８】
本発明の１実施態様によれば、アップデートされたファームウェアに不具合があるときに、予備のファームウェアに適切に巻き戻すことができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施形態にかかる電子機器が利用される無線センサネットワークを示すブロック図である。
【図２】図２は、実施例１のセンサノードを示すブロック図である。
【図３】図３は、ｅＭＭＣに記録される情報を説明する説明図である。
【図４】図４は、ストレージに記録される情報を説明する説明図である。
【図５】図５は、ファームウェアを示すブロック図である。
【図６】図６は、複数のチェックポイント処理結果とＦＷ判定情報とを説明する説明図である。
【図７】図７は、実施例１のセンサノードの動作を示す動作シーケンス図である。
【図８】図８は、実施例１のセンサノードの動作を示すフローチャートである。
【図９】図９は、起動バンク情報とバンク試行情報とＦＷ判定情報と起動されるファームウェアの関係を説明する説明図である。
【図１０】図１０は、実施例２のセンサノードの動作を示す動作シーケンス図である。
【図１１】図１１は、実施例２のセンサノードの動作を示すフローチャートである。
【図１２】図１２は、実施例３のセンサノードの動作を示すフローチャートである。
【図１３】図１３は、実施例４のセンサノードの動作を示す動作シーケンス図である。
【図１４】図１４は、実施例４のセンサノードの動作を示すフローチャートである。
【図１５】図１５は、実施例５のセンサノードにサーバからダウンロードされるファームウェアを示す図である。
【図１６】図１６は、実施例５のセンサノードがファームウェアを受信する動作を示す動作シーケンス図である。
【図１７】図１７は、パケットの送受信が欠落することがあるときの動作を示す動作シーケンス図である。
【図１８】図１８は、１つのブロックの送信が完了した後の動作を示す動作シーケンス図である。
【図１９】図１９は、実施例６のセンサノードがファームウェアの１つのブロックを受信する動作を示す動作シーケンス図である。
【図２０】図２０は、実施例６のセンサノードがファームウェアの最終ブロックを受信する動作を示す動作シーケンス図である。
【発明を実施するための形態】
【００１０】
以下、図面を参照して、実施形態にかかる電子機器、ファームウェアアップデート方法およびコンピュータプログラムを説明する。実施形態において同一の機能を有する構成には同一の符号を付し、重複する説明は省略する。なお、以下の実施形態で説明する電子機器、ファームウェアアップデート方法およびコンピュータプログラムは、一例を示すに過ぎず、実施形態を限定するものではない。また、以下の各実施形態は、矛盾しない範囲内で適宜組みあわせてもよい。
【００１１】
＜実施例１＞
［無線センサネットワーク］
図１は、実施形態にかかる電子機器が利用される無線センサネットワークを示すブロック図である。無線センサネットワーク１は、図１に示されているように、サーバ２と、複数のセンサノード３−１〜３−Ｎ（Ｎ＝２，３，４，…）とを有する。無線センサネットワーク１は、互いに異なる複数の位置にそれぞれ配置される複数の設備を遠隔監視することに利用され、たとえば、多数の下水道管の水位等をそれぞれ遠隔監視することに利用される。複数のセンサノード３−１〜３−Ｎのうちの任意のセンサノード３−ｉ（ｉ＝１，２，３，…，Ｎ）は、実施形態にかかる電子機器から構成されている。複数のセンサノード３−１〜３−Ｎは、無線センサネットワーク１により遠隔監視される複数の監視対象にそれぞれ設置されている。サーバ２と複数のセンサノード３−１〜３−Ｎは、無線環境５を介して互いに通信可能に接続されている。すなわち、センサノード３−ｉは、サーバ２に十分に近い領域に配置されているときに、無線通信を介してサーバ２と直接に通信する。センサノード３−ｉは、サーバ２と直接に無線通信することが困難であるときに、複数のセンサノード３−１〜３−Ｎのうちのサーバ２と無線通信できるセンサノード３−ｊ（ｊ＝１，２，３，…，Ｎ；ｊ≠ｉ）と通信することにより、サーバ２と間接的に通信する。センサノード３−ｉは、さらに、サーバ２と直接に通信することが困難であるセンサノード３−ｋ（ｋ＝１，２，３，…，Ｎ；ｋ≠ｉ；ｋ≠ｊ）と無線通信することにより、センサノード３−ｋとサーバ２との通信を中継する。
【００１２】
［サーバ］
サーバ２は、センサノード３−ｉと無線通信することにより、センサノード３−ｉにより測定された複数の測定値をセンサノード３−ｉから収集する。サーバ２は、さらに、更新された新しいファームウェアを複数のセンサノード３−１〜３−Ｎにインストールするときに、制御情報であるファームウェア更新要求を複数のセンサノード３−１〜３−Ｎに配信する。サーバ２は、ＦＷ（ＦｉｒｍＷａｒｅ：ファームウェア）更新要求に対するＡＣＫ（ＡＣｋｎｏｗｌｅｄｇｅｍｅｎｔ：肯定応答）がセンサノード３−ｉから返信されたときに、無線通信を介して、センサノード３−ｉにその新しいファームウェアを送信する。なお、サーバ２は、同様に動作する他の外部装置に置換されてもよい。その外部装置としては、ゲートウェイ（ＧＷ：ＧａｔｅＷａｙ）が例示される。
【００１３】
［実施例１のセンサノード］
図２は、実施例１のセンサノードを示すブロック図である。センサノード３−ｉは、図２に示されているように、ＲＦ通信部１１（Ｒａｄｉｏ  Ｆｒｅｑｕｅｎｃｙ）と複数のセンサ１２−１〜１２−Ｍ（Ｍ＝２，３，４，…）とＭＣＵ１４（Ｍｉｃｒｏ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔ）とを備えている。ＲＦ通信部１１は、ＭＣＵ１４に情報伝達可能に接続されている。ＲＦ通信部１１は、ＭＣＵ１４に制御されることにより、電波を介してサーバ２と通信し、電波を介して複数のセンサノード３−１〜３−Ｎのうちのセンサノード３−ｉと異なる他のセンサノードと通信する。複数のセンサ１２−１〜１２−Ｍは、それぞれ、ＭＣＵ１４に情報伝達可能に接続されている。複数のセンサ１２−１〜１２−Ｍのうちの任意のセンサは、ＭＣＵ１４に制御されることにより、測定値を測定する。その測定される測定値としては、センサノード３−ｉが設置される設備に関するものであり、たとえば、下水道管の水位が例示される。
【００１４】
センサノード３−ｉは、さらに、ストレージ１５とウォッチドッグタイマ１６とカレンダータイマ１７とを備えている。ストレージ１５は、フラッシュメモリから形成されている。ストレージ１５は、ＭＣＵ１４に制御されることにより、ＭＣＵ１４により取り扱われる情報を記録する。なお、ストレージ１５は、フラッシュメモリと異なる他の記憶装置に置換されてもよい。その記憶装置としては、ハードディスク、光ディスク、データを書き換え可能な半導体メモリが例示される。半導体メモリとしては、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＮＶＳＲＡＭ（Ｎｏｎ  Ｖｏｌａｔｉｌｅ  Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などが例示される。
【００１５】
ウォッチドッグタイマ１６は、ＭＣＵ１４に情報伝達可能に接続されている。ウォッチドッグタイマ１６は、ＭＣＵ１４により設定された時刻から所定の期間経過した後にタイムアウトする。ウォッチドッグタイマ１６は、タイムアウトしたときに、タイムアウトしたことをＭＣＵ１４に伝達することにより、ＭＣＵ１４をリブートさせる。ウォッチドッグタイマ１６は、ＭＣＵ１４により解除されることにより、ＭＣＵ１４により設定された時刻から所定の期間経過した後にタイムアウトしないで、ＭＣＵ１４をリブートさせない。
【００１６】
カレンダータイマ１７は、ＭＣＵ１４に情報伝達可能に接続されている。カレンダータイマ１７は、ＭＣＵ１４に制御されることにより、現在時刻をＭＣＵ１４に伝達する。
【００１７】
ＭＣＵ１４は、ｅＭＭＣ１９を有している。ｅＭＭＣ１９は、フラッシュメモリから形成され、センサノード３−ｉにインストールされるコンピュータプログラムを記録している。ＭＣＵ１４は、そのコンピュータプログラムが起動されることにより、ＲＦ通信部１１と複数のセンサ１２−１〜１２−Ｍとストレージ１５とウォッチドッグタイマ１６とカレンダータイマ１７とを制御する。
【００１８】
センサノード３−ｉは、さらに、図示されていない電池を備えている。ＲＦ通信部１１と複数のセンサ１２−１〜１２−ＭとＭＣＵ１４とストレージ１５とウォッチドッグタイマ１６とカレンダータイマ１７とは、その電池から供給される電力を用いて動作する。
【００１９】
ＲＦ通信部１１とＭＣＵ１４とストレージ１５とウォッチドッグタイマ１６とカレンダータイマ１７とは、ワンチップで形成されている。なお、これらは、複数のチップから形成されてもよい。
【００２０】
なお、ｅＭＭＣ１９は、他の記憶装置に置換されてもよい。その記憶装置としては、データを書き換え可能な半導体メモリが例示され、ＳＳＤ、ＲＡＭ、ＮＶＳＲＡＭが例示される。さらに、ｅＭＭＣ１９は、ＭＣＵ１４の内部に設けられているが、ＭＣＵ１４と別個に設けられていてもよい。
【００２１】
なお、ＭＣＵ１４は、他の制御部に置換されてもよい。その制御部としては、電子回路や集積回路が例示される。その電子回路としては、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）が例示される。その集積回路としては、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）が例示される。
【００２２】
［ｅＭＭＣに記録される情報］
図３は、ｅＭＭＣに記録される情報を説明する説明図である。ｅＭＭＣ１９は、図３に示されているように、複数のメモリバンクに分割されている。ｅＭＭＣ１９は、複数のメモリバンクにブートローダ２１と複数のファームウェア２２−１〜２２−Ｋ（Ｋ＝２，３，４，…）とをそれぞれ記録している。たとえば、ブートローダ２１は、複数のメモリバンクのうちのアドレスが０から始まる１つのメモリバンクに記録されている。複数のファームウェア２２−１〜２２−Ｋのうちの１つのファームウェア２２−Ａ（Ａ＝１，２，３，…，Ｋ）は、複数のメモリバンクのうちのアドレスがａから始まる１つのメモリバンクに記録されている。複数のファームウェア２２−１〜２２−Ｋのうちの他のファームウェア２２−Ｂ（Ｂ＝１，２，３，…，Ｋ；Ａ≠Ｂ）は、複数のメモリバンクのうちのアドレスがｂから始まる１つのメモリバンクに記録されている。
【００２３】
［ストレージに記録される情報］
図４は、ストレージに記録される情報を説明する説明図である。ストレージ１５は、図４に示されているように、起動バンク情報２５とバンク試行情報２６と複数のチェックポイント処理結果２７−１〜２７−Ｘ（Ｘ＝２，３，４，…）とＦＷ判定情報２８とを記録している。起動バンク情報２５は、ｅＭＭＣ１９に記録される複数のファームウェア２２−１〜２２−Ｋから選択された１つのファームウェアを示している。具体的には、起動バンク情報２５は、ｅＭＭＣ１９の複数のメモリバンクのうちのその選択されたファームウェアが記録された１つのメモリバンクの識別子を示している。なお、起動バンク情報２５は、メモリバンクの識別子と異なる情報を示すことにより、その選択されたファームウェアを示してもよい。起動バンク情報２５が示す情報としては、選択されたファームウェアのプログラムカウンタ、選択されたファームウェアの更新時刻、選択されたファームウェアのリビジョン番号が例示される。
【００２４】
バンク試行情報２６は、起動バンク情報２５が示すファームウェアが１度起動しようとしたかどうかを示し、「○」または「×」を示している。すなわち、バンク試行情報２６は、「○」を示しているときに、起動バンク情報２５が示すファームウェアが１度起動されたことを示している。バンク試行情報２６は、「×」を示しているときに、起動バンク情報２５が示すファームウェアが１度も起動されていないことを示している。複数のチェックポイント処理結果２７−１〜２７−Ｘのうちの任意のチェックポイント処理結果２７−ｘ（ｘ＝１，２，３，…，Ｘ）は、「未定」または「正常」または「不良」を示している。ＦＷ判定情報２８は、「未定」または「正常」または「不良」を示している。
【００２５】
［ファームウェア］
図５は、ファームウェアを示すブロック図である。ファームウェア２２−Ａは、図５に示されているように、ＭＣＵ１４に複数の機能をそれぞれ実現させるための複数のコンピュータプログラムから形成されている。その複数の機能は、通常動作部３１とアップデート部３２と複数のチェックポイント処理部３３−１〜３３−ＸとＦＷ判定情報更新部３４とを含んでいる。
【００２６】
通常動作部３１は、複数のセンサ１２−１〜１２−Ｍを制御することにより、複数のセンサ１２−１〜１２−Ｍにより複数の測定値をそれぞれ測定する。通常動作部３１は、さらに、ＲＦ通信部１１を制御することにより、無線環境５を介して、複数のセンサ１２−１〜１２−Ｍによりそれぞれ測定された複数の測定値をサーバ２に送信する。
【００２７】
アップデート部３２は、ＲＦ通信部１１を介して、サーバ２からＦＷ更新要求を受信する。アップデート部３２は、サーバ２からＦＷ更新要求を受信したときに、ＲＦ通信部１１を介して、更新されたファームウェア２２−Ｂをサーバ２からダウンロードする。アップデート部３２は、さらに、ｅＭＭＣ１９を制御することにより、ダウンロードされたファームウェア２２−ＢをｅＭＭＣ１９の所定のバンクメモリに記録する。所定のバンクメモリは、ｅＭＭＣ１９の複数のバンクメモリのうちの起動されているファームウェア２２−Ａが記録されているバンクメモリと異なる他のバンクメモリである。
【００２８】
アップデート部３２は、ダウンロードされたファームウェア２２−ＢがｅＭＭＣ１９に記録された後に、ストレージ１５を制御することにより、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とを更新する。すなわち、アップデート部３２は、そのダウンロードされたファームウェア２２−Ｂを起動バンク情報２５が示すように、起動バンク情報２５を更新する。アップデート部３２は、バンク試行情報２６が「×」を示すように、バンク試行情報２６を更新する。アップデート部３２は、ＦＷ判定情報２８が「未定」を示すように、ＦＷ判定情報２８を更新する。アップデート部３２は、さらに、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とが更新された後に、リブートし、ブートローダ２１を起動し、制御をブートローダ２１に移す。
【００２９】
複数のチェックポイント処理部３３−１〜３３−Ｘは、ストレージ１５に記録される複数のチェックポイント処理結果２７−１〜２７−Ｘに対応している。複数のチェックポイント処理部３３−１〜３３−Ｘのうちの任意のチェックポイント処理部３３−ｘは、ストレージ１５を制御することにより、ＦＷ判定情報２８を取得する。チェックポイント処理部３３−ｘは、ＦＷ判定情報２８が「正常」を示していないときに、ファームウェア２２−Ａ（特に、通常動作部３１）の良否を判定する。このとき、複数のチェックポイント処理部３３−１〜３３−Ｘは、互いに異なる複数の観点からファームウェア２２−Ａの良否をそれぞれ判定する。
【００３０】
チェックポイント処理部３３−ｘは、ストレージ１５を制御することにより、判定された結果に基づいて複数のチェックポイント処理結果２７−１〜２７−Ｘのうちのチェックポイント処理部３３−ｘに対応するチェックポイント処理結果２７−ｘを更新する。すなわち、チェックポイント処理部３３−ｘは、ファームウェア２２−Ａが正常であると判定されたときに、チェックポイント処理結果２７−ｘが「正常」を示すようにチェックポイント処理結果２７−ｘを更新する。チェックポイント処理部３３−ｘは、ファームウェア２２−Ａが不良であると判定されたときに、チェックポイント処理結果２７−ｘが「不良」を示すようにチェックポイント処理結果２７−ｘを更新する。チェックポイント処理部３３−ｘは、ファームウェア２２−Ａが正常か不良かを判定していないときに、チェックポイント処理結果２７−ｘが「未定」を示すようにチェックポイント処理結果２７−ｘを更新する。
【００３１】
ＦＷ判定情報更新部３４は、ストレージ１５を制御することにより、複数のチェックポイント処理結果２７−１〜２７−Ｘに基づいてＦＷ判定情報２８を更新する。すなわち、ＦＷ判定情報更新部３４は、複数のチェックポイント処理結果２７−１〜２７−Ｘの全部が「正常」を示しているときに、ＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する。ＦＷ判定情報更新部３４は、複数のチェックポイント処理結果２７−１〜２７−Ｘのいずれかが「不良」を示しているときに、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新する。ＦＷ判定情報更新部３４は、複数のチェックポイント処理結果２７−１〜２７−Ｘの全部が「不良」を示していないで、いずれかが「未定」を示しているときに、ＦＷ判定情報２８が「未定」を示すようにＦＷ判定情報２８を更新する。ＦＷ判定情報更新部３４は、さらに、制御をブートローダ２１に移す。
【００３２】
図６は、複数のチェックポイント処理結果とＦＷ判定情報とを説明する説明図である。複数のチェックポイント処理部３３−１〜３３−ＸによりバンクＡのファームウェアの良否が判定された結果、バンクＡのファームウェアに対する複数のチェックポイント処理結果２７−１〜２７−Ｘは、図６に示されているように、全部が「正常」を示している。このとき、バンクＡのファームウェアに対するＦＷ判定情報２８は、バンクＡのファームウェアに対する複数のチェックポイント処理結果２７−１〜２７−Ｘの全部が「正常」を示しているために、「正常」を示すように更新される。
【００３３】
複数のチェックポイント処理部３３−１〜３３−ＸによりバンクＢのファームウェアの良否が判定された結果、バンクＢのファームウェアに対する複数のチェックポイント処理結果２７−１〜２７−Ｘは、「正常」「不良」「未定」をそれぞれ示している。このとき、バンクＢのファームウェアに対するＦＷ判定情報２８は、バンクＢのファームウェアに対する複数のチェックポイント処理結果２７−１〜２７−Ｘの１つが「不良」を示しているために、「不良」を示すように更新される。
【００３４】
複数のチェックポイント処理部３３−１〜３３−ＸによりバンクＣのファームウェアの良否が判定された結果、バンクＣのファームウェアに対する複数のチェックポイント処理結果２７−１〜２７−Ｘは、「正常」「未定」「正常」をそれぞれ示している。このとき、バンクＣのファームウェアに対するＦＷ判定情報２８は、バンクＣのファームウェアに対する複数のチェックポイント処理結果２７−１〜２７−Ｘの全部が「不良」を示さないで、１つが「未定」を示しているために、「未定」を示すように更新される。
【００３５】
［ブートローダ］
ブートローダ２１は、センサノード３−ｉが起動されることにより起動され、または、複数のファームウェア２２−１〜２２−ＫによりＭＣＵ１４がリブートされることにより起動される。ブートローダ２１は、起動されると、ストレージ１５に記録される起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とに基づいて複数のファームウェア２２−１〜２２−Ｋから１つのファームウェアを選択する。ブートローダ２１は、さらに、その選択されたファームウェアを起動する。さらに、ブートローダ２１は、起動バンク情報２５が示すファームウェアを起動する場合で、バンク試行情報２６が「×」を示すときに、ストレージ１５を制御することにより、「○」を示すようにバンク試行情報２６を更新する。
【００３６】
［実施例１のセンサノードの動作］
図７は、実施例１のセンサノードの動作を示す動作シーケンス図である。センサノード３−ｉのファームウェア２２−Ａは、図７に示されているように、センサノード３−ｉが新しいファームウェア２２−Ｂをサーバ２から受信すると（Ｓ１）、ファームウェア２２−ＢをｅＭＭＣ１９の所定のバンクメモリに記録する。ファームウェア２２−Ａは、新しいファームウェア２２−ＢがｅＭＭＣ１９に記録されると、ストレージ１５を制御することにより、起動バンク情報２５がファームウェア２２−Ｂを示すように、起動バンク情報２５を更新する。ファームウェア２２−Ａは、さらに、ストレージ１５を制御することにより、バンク試行情報２６が「×」を示すように、バンク試行情報２６を更新する。ファームウェア２２−Ａは、さらに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すように、ＦＷ判定情報２８を更新する（Ｓ２）。ファームウェア２２−Ａは、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とを更新した後に、リブートすることにより制御をブートローダ２１に移す（Ｓ３）。
【００３７】
ブートローダ２１は、起動されると、ストレージ１５を制御することにより、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とをストレージ１５から取得する（Ｓ４）。ブートローダ２１は、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とに基づいて複数のファームウェア２２−１〜２２−Ｋからファームウェア２２−Ｂを選択する（Ｓ５）。ブートローダ２１は、ストレージ１５を制御することにより、バンク試行情報２６が「○」を示すように、バンク試行情報２６を更新する（Ｓ６）。ブートローダ２１は、バンク試行情報２６が更新された後に、Ｓ５で選択されたファームウェア２２−Ｂを起動することにより、ファームウェア２２−Ｂに制御を移す（Ｓ７）。
【００３８】
ファームウェア２２−Ｂは、起動されると、通常の動作を実行し、すなわち、複数のセンサ１２−１〜１２−Ｍを制御することにより、複数の測定値を測定し、ＲＦ通信部１１を制御することにより、その測定された複数の測定値をサーバ２に送信する。ファームウェア２２−Ｂは、さらに、ファームウェア２２−Ｂ自身の良否を判定する（Ｓ８）。ファームウェア２２−Ｂは、ファームウェア２２−Ｂの良否を判定した後に、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」または「不良」を示すように、ＦＷ判定情報２８を更新する（Ｓ９）。
【００３９】
このように、センサノード３−ｉは、ブートローダ２１とファームウェア２２−Ａとファームウェア２２−Ｂとのうちの１つのコンピュータプログラムが実行され、これらのうちの２つのコンピュータプログラムが並行して実行されることがない。
【００４０】
図８は、実施例１のセンサノードの動作を示すフローチャートである。センサノード３−ｉは、図８に示されているように、まず、ブートローダ２１が起動される。センサノード３−ｉのＭＣＵ１４は、ブートローダ２１が起動されると、ストレージ１５を制御することにより、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とをストレージ１５から取得する（Ｓ１１）。ＭＣＵ１４は、ＦＷ判定情報２８が「正常」を示していないで（Ｓ１２、Ｎｏ）、ＦＷ判定情報２８が「不良」を示しているときに（Ｓ１３、Ｙｅｓ）、以前に正常に動作していたファームウェア２２−Ｂを選択する（Ｓ１４）。ＭＣＵ１４は、ＦＷ判定情報２８が「未定」を示している場合で（Ｓ１３、Ｎｏ）、バンク試行情報２６が「○」を示しているときに（Ｓ１５、Ｙｅｓ）、以前に正常に動作していたファームウェア２２−Ａを選択する（Ｓ１４）。Ｓ１４で選択されたファームウェア２２−Ｂは、起動バンク情報２５が示すファームウェア２２−Ａと異なっている。ＭＣＵ１４は、ＦＷ判定情報２８が「未定」を示している場合で（Ｓ１３、Ｎｏ）、バンク試行情報２６が「×」を示しているときに（Ｓ１５、Ｎｏ）、バンク試行情報２６が「○」を示すようにバンク試行情報２６を更新する（Ｓ１６）。ＭＣＵ１４は、Ｓ１６が実行されたときに、または、ＦＷ判定情報２８が「正常」を示しているときに（Ｓ１２、Ｙｅｓ）、起動バンク情報２５が示すファームウェア２２−Ａを起動する（Ｓ１７）。ＭＣＵ１４は、Ｓ１４が実行されたときに、Ｓ１４で選択されたファームウェア２２−Ｂを起動する（Ｓ１７）。
【００４１】
ＭＣＵ１４は、ファームウェア２２−Ａ、２２−Ｂが起動されると、まず、通常動作を実行する（Ｓ１８）。すなわち、ＭＣＵ１４は、複数のセンサ１２−１〜１２−Ｍを制御することにより、複数の測定値をそれぞれ測定する。ＭＣＵ１４は、さらに、ＲＦ通信部１１を制御することにより、その測定された複数の測定値をサーバ２に送信する。
【００４２】
ＭＣＵ１４は、通常動作が実行されると、複数のチェックポイント処理結果２７−１〜２７−Ｘに対応する複数のチェックポイント処理を実行する。その複数のチェックポイント処理のうちのチェックポイント処理結果２７−ｘに対応するチェックポイント処理では、ＭＣＵ１４は、まず、ＦＷ判定情報２８をストレージ１５から取得する（Ｓ１９）。ＭＣＵ１４は、ＦＷ判定情報２８が「正常」以外を示しているときに、すなわち、ＦＷ判定情報２８が「未定」を示しているときに（Ｓ１９、Ｎｏ）、起動されているファームウェアの良否を１つの観点から判定する（Ｓ２０）。ＭＣＵ１４は、ストレージ１５を制御することにより、その判定された良否をチェックポイント処理結果２７−ｘが示すように、チェックポイント処理結果２７−ｘを更新する。すなわち、ＭＣＵ１４は、ファームウェア２２−Ａが正常であると判定されたときに、チェックポイント処理結果２７−ｘが「正常」を示すようにチェックポイント処理結果２７−ｘを更新する。チェックポイント処理部３３−ｘは、ファームウェア２２−Ａが不良であると判定されたときに、チェックポイント処理結果２７−ｘが「不良」を示すようにチェックポイント処理結果２７−ｘを更新する。
【００４３】
ＭＣＵ１４は、複数のチェックポイント処理のいずれかで、起動されているファームウェアが不良であると判定されたときに（Ｓ２０、Ｎｏ）、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新する（Ｓ２１）。ＭＣＵ１４は、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８が更新された後に、リブートすることにより、ブートローダ２１を起動し、制御をブートローダ２１に移す。
【００４４】
ＭＣＵ１４は、複数のチェックポイント処理の全部で、起動されているファームウェアが正常であると判定されたときに（Ｓ２０、Ｙｅｓ）、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する（Ｓ２２）。
【００４５】
ＭＣＵ１４は、ＦＷ判定情報２８が「正常」を示しているときに（Ｓ１９、Ｙｅｓ）、または、Ｓ２２でＦＷ判定情報２８が更新されたときに、ＲＦ通信部１１を制御することにより、サーバ２からＦＷ更新要求を受信しているかどうかを検出する（Ｓ２３）。ＭＣＵ１４は、さらに、Ｓ２０で良否の判定が保留されたときにも（Ｓ２０、保留）、ＲＦ通信部１１を制御することにより、サーバ２からＦＷ更新要求を受信しているかどうかを検出する（Ｓ２３）。
【００４６】
ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信していないときに（Ｓ２３、Ｎｏ）、Ｓ１８〜Ｓ２３の処理を繰り返し実行する。
【００４７】
ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信しているときに（Ｓ２３、Ｙｅｓ）、ＲＦ通信部１１を制御することにより、サーバ２から更新されたファームウェアをダウンロードする。ＭＣＵ１４は、次いで、ｅＭＭＣ１９を制御することにより、そのダウンロードされたファームウェアを、ｅＭＭＣ１９の複数のメモリバンクのうちの起動されているファームウェアが記録されているメモリバンクと異なる他のメモリバンクに記録する（Ｓ２４）。
【００４８】
ＭＣＵ１４は、ストレージ１５を制御することにより、そのダウンロードされたファームウェアを起動バンク情報２５が示すように起動バンク情報２５を更新する。ＭＣＵ１４は、さらに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すようにＦＷ判定情報２８を更新し、バンク試行情報２６が「×」を示すようにバンク試行情報２６を更新する（Ｓ２５）。ＭＣＵ１４は、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とが更新された後に、リブートすることにより、ブートローダ２１を起動し、ブートローダ２１に制御を移す。
【００４９】
図９は、起動バンク情報とバンク試行情報とＦＷ判定情報と起動されるファームウェアの関係を説明する説明図である。図９では、ファームウェア２２−Ａが「Ａ」と記載され、ファームウェア２２−Ｂが「Ｂ」と記載され、ブートローダ２１により選択されるファームウェアが「選択バンク」と記載されている。ブートローダ２１は、図９に示されているように、起動バンク情報２５がファームウェア２２−Ａを示し、バンク試行情報２６が「×」を示し、ＦＷ判定情報２８が「未定」を示すときに、Ｓ１１〜Ｓ１７を実行することにより、ファームウェア２２−Ａを起動する。ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ａを示し、バンク試行情報２６が「○」を示し、ＦＷ判定情報２８が「未定」を示すときに、ファームウェア２２−Ｂを起動する。ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ａを示し、バンク試行情報２６が「○」または「×」を示し、ＦＷ判定情報２８が「正常」を示すときに、ファームウェア２２−Ａを起動する。ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ａを示し、バンク試行情報２６が「○」または「×」を示し、ＦＷ判定情報２８が「不良」を示すときに、ファームウェア２２−Ｂを起動する。
【００５０】
ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ｂを示し、バンク試行情報２６が「×」を示し、ＦＷ判定情報２８が「未定」を示すときに、ファームウェア２２−Ｂを起動する。ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ｂを示し、バンク試行情報２６が「○」を示し、ＦＷ判定情報２８が「未定」を示すときに、ファームウェア２２−Ａを起動する。ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ｂを示し、バンク試行情報２６が「○」または「×」を示し、ＦＷ判定情報２８が「正常」を示すときに、ファームウェア２２−Ｂを起動する。ブートローダ２１は、起動バンク情報２５がファームウェア２２−Ｂを示し、バンク試行情報２６が「○」または「×」を示し、ＦＷ判定情報２８が「不良」を示すときに、ファームウェア２２−Ａを起動する。
【００５１】
［実施例１のセンサノードの効果］
実施形態の電子機器としてのセンサノード３−ｉは、ＭＣＵ１４と、ファームウェア２２−Ａとブートローダ２１とを記録するｅＭＭＣ１９と、ＦＷ判定情報２８を記録するストレージ１５とを有している。ファームウェア２２−Ａは、ＭＣＵ１４に起動されることにより、複数のセンサ１２−１〜１２−Ｍを制御し、さらに、サーバ２からダウンロードされたファームウェア２２−ＢをｅＭＭＣ１９に記録してブートローダ２１を起動する。ブートローダ２１は、ＭＣＵ１４に起動されることにより、ＦＷ判定情報２８が「不良」を示すときにファームウェア２２−Ａを起動し、ＦＷ判定情報２８が「不良」を示していないときにファームウェア２２−Ｂを起動する。ファームウェア２２−Ｂは、ＭＣＵ１４に起動されることにより、複数のセンサ１２−１〜１２−Ｍを制御し、さらに、ファームウェア２２−Ｂの良否を判定する。ファームウェア２２−Ｂは、ファームウェア２２−Ｂが不良であると判定されたときに、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新してブートローダ２１を起動する。
【００５２】
このようなセンサノード３−ｉは、更新された新しいファームウェア２２−Ｂが起動することができる場合でも、ファームウェア２２−Ｂに不具合があるときに、正常であるファームウェア２２−Ａを自動的に起動させることができる。このため、このようなセンサノード３−ｉは、不具合がファームウェア２２−Ｂにある場合でも、作業者が出向いてセンサノード３−ｉを操作する必要がなく、メンテナンスコストを低減することができる。このようなセンサノード３−ｉは、さらに、ファームウェア２２−Ｂの良否の判定をファームウェア２２−Ｂにより実行されているために、ファームウェア２２−Ｂの良否を判定する条件または判定ルーチンを変更することができる。
【００５３】
また、ファームウェア２２−Ｂは、ファームウェア２２−Ｂが正常であると判定されたときに、ＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する。ファームウェア２２−Ｂは、ブートローダ２１により再度起動された場合で、ＦＷ判定情報２８が「正常」を示すときに、ファームウェア２２−Ｂの良否を判定しない。このようなセンサノード３−ｉは、ファームウェア２２−Ｂが正常であると１度判定されたときに、ファームウェア２２−Ｂの良否を判定しないことにより、ＭＣＵ１４の負担を軽減することができる。このようなセンサノード３−ｉは、ＭＣＵ１４の負担を軽減することにより、消費電力を低減し、電池の交換頻度を低減し、メンテナンスのコストを低減することができる。
【００５４】
ところで、実施例１では、ファームウェア２２−Ｂは、ファームウェア２２−Ｂが正常であると判定されたときに、ファームウェア２２−Ｂの良否を判定していないが、ファームウェア２２−Ｂの良否を判定してもよい。この場合も、センサノード３−ｉは、ファームウェア２２−Ｂに不具合があるときに、正常であるファームウェア２２−Ａに制御を巻き戻すことができる。
【００５５】
また、ファームウェア２２−Ｂは、複数の観点で良否をそれぞれ判定する。ファームウェア２２−Ｂは、その複数の観点のいずれか１つが不良であると判定されたときにＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新する。ファームウェア２２−Ｂは、その複数の観点の全部が正常であると判定されたときにＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する。このようなセンサノード３−ｉは、複数の観点でファームウェア２２−Ｂの良否を判定することにより、ファームウェア２２−Ｂの良否を適切に判定することができる。このようなセンサノード３−ｉは、ファームウェア２２−Ｂの良否を適切に判定することにより、不要にファームウェア２２−Ａが起動されることを防止し、ファームウェア２２−Ａに制御を適切に巻き戻すことができる。
【００５６】
ところで、実施例１では、ファームウェア２２−Ｂは、複数の観点でファームウェア２２−Ｂの良否をそれぞれ判定しているが、１つの観点でファームウェア２２−Ｂの良否を判定してもよい。この場合も、センサノード３−ｉは、ファームウェア２２−Ｂに不具合があるときに、正常であるファームウェア２２−Ａに制御を巻き戻すことができる。また、センサノード３−ｉは、１つの観点でファームウェア２２−Ｂの良否を判定することにより、その判定結果をそのままＦＷ判定情報２８に代入することができ、複数のチェックポイント処理結果２７−１〜２７−Ｘを記録することを省略することができる。
【００５７】
＜実施例２＞
センサノード３−ｉは、さらに、ウォッチドッグタイマ１６がタイムアウトするときに、ブートローダ２１を起動してもよい。このとき、ファームウェア２２−Ａのアップデート部３２は、新しいファームウェアをダウンロードしたときに、ウォッチドッグタイマ１６が設定されるように、ウォッチドッグタイマ１６を制御する。さらに、複数のチェックポイント処理部３３−１〜３３−Ｘは、ウォッチドッグタイマ１６に関する他のチェックポイント処理部が追加されている。そのチェックポイント処理部は、ウォッチドッグタイマ１６が解除されるように、ウォッチドッグタイマ１６を制御する。
【００５８】
［実施例２のセンサノードの動作］
図１０は、実施例２のセンサノードの動作を示す動作シーケンス図である。センサノード３−ｉのファームウェア２２−Ａは、図１０に示されているように、センサノード３−ｉが新しいファームウェア２２−Ｂをサーバ２から受信すると（Ｓ３１）、ファームウェア２２−ＢをｅＭＭＣ１９の所定のバンクメモリに記録する。ファームウェア２２−Ａは、ストレージ１５を制御することにより、起動バンク情報２５がファームウェア２２−Ｂを示すように、起動バンク情報２５を更新する。ファームウェア２２−Ａは、さらに、ストレージ１５を制御することにより、バンク試行情報２６が「×」を示すように、バンク試行情報２６を更新する。ファームウェア２２−Ａは、さらに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すように、ＦＷ判定情報２８を更新する（Ｓ３２）。ファームウェア２２−Ａは、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とを更新した後に、ウォッチドッグタイマ１６を制御することにより、ウォッチドッグタイマ１６を設定する（Ｓ３３）。ファームウェア２２−Ａは、ウォッチドッグタイマ１６が設定された後に、リブートすることにより制御をブートローダ２１に移す（Ｓ３４）。
【００５９】
ブートローダ２１は、起動されると、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とをストレージ１５から取得する（Ｓ３５）。ブートローダ２１は、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とに基づいて複数のファームウェア２２−１〜２２−Ｋからファームウェア２２−Ｂを選択する（Ｓ３６）。ブートローダ２１は、ストレージ１５を制御することにより、バンク試行情報２６が「○」を示すように、バンク試行情報２６を更新する（Ｓ３７）。ブートローダ２１は、バンク試行情報２６が更新された後に、その選択されたファームウェア２２−Ｂを起動することにより、ファームウェア２２−Ｂに制御を移す（Ｓ３８）。
【００６０】
ファームウェア２２−Ｂは、起動されると、通常の動作を実行し、さらに、ファームウェア２２−Ｂ自身の良否を判定する（Ｓ３９）。ファームウェア２２−Ｂは、ファームウェア２２−Ｂの良否を判定した後に、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」または「不良」を示すように、ＦＷ判定情報２８を更新する（Ｓ４０）。
【００６１】
ウォッチドッグタイマ１６は、設定された時刻から所定の期間経過した時刻までの期間に、ファームウェア２２−Ｂにより解除されなかったときに、タイムアウトする。ウォッチドッグタイマ１６は、タイムアウトしたときに、タイムアウトしたことをＭＣＵ１４に伝達することにより、ＭＣＵ１４をリブートさせる（Ｓ４１）。ブートローダ２１は、ＭＣＵ１４がリブートされることにより起動される。ブートローダ２１は、ウォッチドッグタイマ１６がＭＣＵ１４をリブートすることにより起動されたときに、再度Ｓ３５以降の処理を実行する。
【００６２】
図１１は、実施例２のセンサノードの動作を示すフローチャートである。センサノード３−ｉは、図１１に示されているように、ブートローダ２１が起動されると、既述の図８のフローと同様にして、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とに基づいて選択されたファームウェアを起動する。
【００６３】
ＭＣＵ１４は、ファームウェア２２−Ａまたはファームウェア２２−Ｂが起動されると、まず、通常動作を実行する（Ｓ１８）。ＭＣＵ１４は、通常動作が実行されると、既述の図８のフローと同様にして、複数のチェックポイント処理部３３−１〜３３−Ｘに対応する複数のチェックポイント処理を実行する。ウォッチドッグタイマ１６に関するチェックポイント処理では、ＭＣＵ１４は、まず、ＦＷ判定情報２８をストレージ１５から取得する（Ｓ５１）。ＭＣＵ１４は、ＦＷ判定情報２８が「未定」を示しているときに（Ｓ５１、Ｎｏ）、ウォッチドッグタイマ１６を制御することにより、ウォッチドッグタイマ１６を解除する（Ｓ５２）。ＭＣＵ１４は、ウォッチドッグタイマ１６を解除した後に、ストレージ１５を制御することにより、この追加されたチェックポイント処理に対応するチェックポイント処理結果が「正常」を示すように複数のチェックポイント処理結果２７−１〜２７−Ｘを更新する。ＭＣＵ１４は、複数のチェックポイント処理の全部で、起動されているファームウェアが正常であると判定されたときに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する（Ｓ５３）。
【００６４】
ＭＣＵ１４は、複数のチェックポイント処理が実行された後に、ＲＦ通信部１１を制御することにより、サーバ２からＦＷ更新要求を受信しているかどうかを判定する（Ｓ２３）。ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信していないときに（Ｓ２３、Ｎｏ）、Ｓ１８〜Ｓ２３の処理を繰り返し実行する。
【００６５】
ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信しているときに（Ｓ２３、Ｙｅｓ）、サーバ２から更新されたファームウェアをダウンロードし、そのダウンロードされたファームウェアを、ｅＭＭＣ１９の所定のメモリバンクに記録する（Ｓ２４）。ＭＣＵ１４は、ストレージ１５を制御することにより、そのダウンロードされたファームウェアを起動バンク情報２５が示すように起動バンク情報２５を更新する。ＭＣＵ１４は、さらに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すようにＦＷ判定情報２８を更新し、バンク試行情報２６が「×」を示すようにバンク試行情報２６を更新する（Ｓ２５）。
【００６６】
ＭＣＵ１４は、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とが更新された後に、ウォッチドッグタイマ１６を制御することにより、ウォッチドッグタイマ１６を設定する（Ｓ５４）。ＭＣＵ１４は、ウォッチドッグタイマ１６を設定した後に、リブートすることにより、ブートローダ２１を起動し、ブートローダ２１に制御を移す。
【００６７】
ウォッチドッグタイマ１６は、設定された時刻から所定の期間経過した時刻までの期間に、解除されなかったときに、タイムアウトする。ウォッチドッグタイマ１６は、タイムアウトしたときに、タイムアウトしたことをＭＣＵ１４に伝達することにより、ＭＣＵ１４をリブートさせ、ブートローダ２１を起動させる（Ｓ５５）。
【００６８】
［実施例２のセンサノードの効果］
実施例２のセンサノード３−ｉは、ファームウェア２２−Ｂが起動されるときに設定されるウォッチドッグタイマ１６をさらに備えている。ブートローダ２１は、さらに、ウォッチドッグタイマ１６がタイムアウトしたときに、ＭＣＵ１４に起動される。このようなセンサノード３−ｉは、ウォッチドッグタイマ１６を備えていることにより、ファームウェア２２−Ｂが起動しないなど、ＭＣＵ１４がフリーズした場合でも、そのトラブルから抜けることができる。このようなセンサノード３−ｉは、さらに、ファームウェア２２−Ｂがフリーズしてファームウェア２２−Ｂの良否を判定しない場合でも、正常であるファームウェア２２−Ａを自動的に起動させることができる。
【００６９】
また、実施例２では、ファームウェア２２−Ｂは、ファームウェア２２−Ｂが正常であると判定されたときに、ウォッチドッグタイマ１６を解除する。このようなセンサノード３−ｉは、ファームウェア２２−Ｂが正常であると判定されたときにウォッチドッグタイマ１６を解除することにより、不要にリブートされることを防止することができる。
【００７０】
また、実施例２では、ストレージ１５は、バンク試行情報２６をさらに記録している。ファームウェア２２−Ａは、ファームウェア２２−Ｂが起動される前に、ＦＷ判定情報２８が「未定」を示すようにＦＷ判定情報２８を更新し、バンク試行情報２６が「×」を示すようにバンク試行情報２６を更新する。ブートローダ２１は、ＦＷ判定情報２８が「未定」を示す場合でバンク試行情報２６が「×」を示すときに、バンク試行情報２６が「○」を示すようにバンク試行情報２６を更新してファームウェア２２−Ｂを起動する。ブートローダ２１は、さらに、ＦＷ判定情報２８が「未定」を示す場合でバンク試行情報２６が「○」を示すときに、ファームウェア２２−Ａを起動する。このようなセンサノード３−ｉは、バンク試行情報２６をストレージ１５に記録することにより、ウォッチドッグタイマ１６によりリブートされた場合でも、正常であるファームウェア２２−Ａを起動させることができる。
【００７１】
＜実施例３＞
ところで、実施例２では、センサノード３−ｉは、バンク試行情報２６をストレージ１５に記録しているが、バンク試行情報２６を記録することを省略してもよい。実施例３では、センサノード３−ｉは、バンク試行情報２６を記録更新することが省略されている。このとき、ブートローダ２１は、ＦＷ判定情報２８が「未定」を示すときに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８が「未定」を更新する。
【００７２】
［実施例３のセンサノードの動作］
図１２は、実施例３のセンサノードの動作を示すフローチャートである。センサノード３−ｉは、図１２に示されているように、まず、ブートローダ２１が起動される。センサノード３−ｉのＭＣＵ１４は、ブートローダ２１が起動されると、起動バンク情報２５とＦＷ判定情報２８とをストレージ１５から取得する（Ｓ６１）。ＭＣＵ１４は、ＦＷ判定情報２８が「正常」を示していないで（Ｓ６２、Ｎｏ）、ＦＷ判定情報２８が「不良」を示しているときに（Ｓ６３、Ｙｅｓ）、以前に正常に動作していたファームウェア２２−Ｂを選択する（Ｓ６４）。このとき、その選択されたファームウェア２２−Ｂは、起動バンク情報２５が示すファームウェア２２−Ａと異なっている。ＭＣＵ１４は、ＦＷ判定情報２８が「未定」を示しているときに（Ｓ６３、Ｎｏ）、ストレージ１５を制御することにより、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新する（Ｓ６５）。このとき、ＦＷ判定情報２８が「不良」を示しているが、起動バンク情報２５が示すファームウェアは良否が判定されておらず、すなわち、ＦＷ判定情報２８は、「不良」に仮決めされている。ＭＣＵ１４は、Ｓ６５が実行されたときに、または、ＦＷ判定情報２８が「正常」を示しているときに（Ｓ６２、Ｙｅｓ）、起動バンク情報２５が示すファームウェア２２−Ａを起動する（Ｓ６６）。
【００７３】
ＭＣＵ１４は、ファームウェア２２−Ａまたはファームウェア２２−Ｂが起動されると、既述の図１１のフローと同様にして、まず、通常動作を実行する（Ｓ１８）。ＭＣＵ１４は、通常動作が実行されると、複数のチェックポイント処理部３３−１〜３３−Ｘに対応する複数のチェックポイント処理を実行する。ウォッチドッグタイマ１６に関するチェックポイント処理では、ＭＣＵ１４は、まず、ＦＷ判定情報２８をストレージ１５から取得する（Ｓ５１）。ＭＣＵ１４は、ＦＷ判定情報２８が「不良」を示しているときに（Ｓ５１、Ｎｏ）、ウォッチドッグタイマ１６を制御することにより、ウォッチドッグタイマ１６を解除する（Ｓ５２）。ＭＣＵ１４は、ウォッチドッグタイマ１６を解除した後に、ストレージ１５を制御することにより、ウォッチドッグタイマ１６に関するチェックポイント処理結果が「正常」を示すようにチェックポイント処理結果を更新する。ＭＣＵ１４は、複数のチェックポイント処理の全部で、起動されているファームウェアが正常であると判定されたときに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する（Ｓ５３）。
【００７４】
ＭＣＵ１４は、複数のチェックポイント処理が実行された後に、ＲＦ通信部１１を制御することにより、サーバ２からＦＷ更新要求を受信しているかどうかを検出する（Ｓ２３）。ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信していないときに（Ｓ２３、Ｎｏ）、Ｓ１８〜Ｓ２３の処理を繰り返し実行する。
【００７５】
ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信しているときに（Ｓ２３、Ｙｅｓ）、サーバ２から更新されたファームウェアをダウンロードし、そのダウンロードされたファームウェアを、ｅＭＭＣ１９の所定のメモリバンクに記録する（Ｓ２４）。ＭＣＵ１４は、ストレージ１５を制御することにより、そのダウンロードされたファームウェアを起動バンク情報２５が示すように起動バンク情報２５を更新する。ＭＣＵ１４は、さらに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すようにＦＷ判定情報２８を更新する（Ｓ６７）。
【００７６】
ＭＣＵ１４は、起動バンク情報２５とＦＷ判定情報２８とが更新された後に、ウォッチドッグタイマ１６を制御することにより、ウォッチドッグタイマ１６を設定する（Ｓ５４）。ＭＣＵ１４は、ウォッチドッグタイマ１６を設定した後に、リブートすることにより、ブートローダ２１を起動し、ブートローダ２１に制御を移す。
【００７７】
ウォッチドッグタイマ１６は、設定された時刻から所定の期間経過した時刻までの期間に、解除されなかったときに、タイムアウトする。ウォッチドッグタイマ１６は、タイムアウトしたときに、タイムアウトしたことをＭＣＵ１４に伝達することにより、ＭＣＵ１４をリブートさせ、ブートローダ２１を起動させる（Ｓ５５）。
【００７８】
実施例３のセンサノード３−ｉは、実施例２のセンサノード３−ｉと同様にして、ファームウェア２２−Ｂがフリーズする場合でも、正常であるファームウェア２２−Ａを自動的に起動させることができる。
【００７９】
＜実施例４＞
センサノード３−ｉは、さらに、ファームウェア２２−Ａが頻繁に再起動するときに、ブートローダ２１を起動してもよい。このとき、ストレージ１５は、さらに、更新完了時刻と起動回数とを記録している。ファームウェア２２−Ａのアップデート部３２は、新しいファームウェアをダウンロードしたときに、その更新完了時刻と起動回数とを更新するように、ストレージ１５を制御する。複数のチェックポイント処理部３３−１〜３３−Ｘは、起動回数に関する他のチェックポイント処理部が追加されている。そのチェックポイント処理部は、起動回数を更新するようにストレージ１５を制御し、現在時刻を取得するようにカレンダータイマ１７を制御する。そのチェックポイント処理部は、その更新完了時刻と起動回数と現在時刻とに基づいて算出されたファームウェア２２−Ａの再起動の頻度が所定の値より大きいときに、リブートすることにより、ブートローダ２１を起動する。
【００８０】
［実施例４のセンサノードの動作］
図１３は、実施例４のセンサノードの動作を示す動作シーケンス図である。センサノード３−ｉのファームウェア２２−Ａは、図１３に示されているように、センサノード３−ｉが新しいファームウェア２２−Ｂをサーバ２から受信すると（Ｓ７１）、ファームウェア２２−ＢをｅＭＭＣ１９の所定のバンクメモリに記録する。ファームウェア２２−Ａは、ストレージ１５を制御することにより、起動バンク情報２５がファームウェア２２−Ｂを示すように、起動バンク情報２５を更新する。ファームウェア２２−Ａは、ストレージ１５を制御することにより、バンク試行情報２６が「×」を示すように、バンク試行情報２６を更新する。ファームウェア２２−Ａは、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すように、ＦＷ判定情報２８を更新する。ファームウェア２２−Ａは、さらに、ストレージ１５を制御することにより、起動回数が０を示すように起動回数を更新する（Ｓ７２）。ファームウェア２２−Ａは、さらに、カレンダータイマ１７を制御することにより、現在時刻を取得し、ストレージ１５を制御することにより、その取得された現在時刻を更新完了時刻が示すように更新完了時刻を更新する（Ｓ７３）。ファームウェア２２−Ａは、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８と起動回数と更新完了時刻とを更新した後に、リブートすることにより制御をブートローダ２１に移す（Ｓ７４）。
【００８１】
ブートローダ２１は、起動されると、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とをストレージ１５から取得する（Ｓ７５）。ブートローダ２１は、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とに基づいて複数のファームウェア２２−１〜２２−Ｋからファームウェア２２−Ｂを選択する（Ｓ７６）。ブートローダ２１は、ストレージ１５を制御することにより、バンク試行情報２６が「○」を示すように、バンク試行情報２６を更新する（Ｓ７７）。ブートローダ２１は、バンク試行情報２６が更新された後に、その選択されたファームウェア２２−Ｂを起動することにより、ファームウェア２２−Ｂに制御を移す（Ｓ７８）。
【００８２】
ファームウェア２２−Ｂは、起動されると、ストレージ１５を制御することにより、更新完了時刻と起動回数とを取得する（Ｓ７９）。ファームウェア２２−Ｂは、さらに、カレンダータイマ１７を制御することにより、現在時刻を取得する（Ｓ８０）。ファームウェア２２−Ｂは、ストレージ１５を制御することにより、バンク試行情報２６が「×」を示すようにバンク試行情報２６を更新する。ファームウェア２２−Ｂは、さらに、ストレージ１５を制御することにより、起動回数を取得し、その取得された起動回数が示す値に１と加算した和を起動回数が示すように起動回数をインクリメントする（Ｓ８１）。
【００８３】
ファームウェア２２−Ｂは、通常の動作を実行し、さらに、ファームウェア２２−Ｂ自身の良否を判定する（Ｓ８２）。ファームウェア２２−Ｂは、ファームウェア２２−Ｂの良否を判定した後に、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」または「不良」を示すように、ＦＷ判定情報２８を更新する（Ｓ８３）。
【００８４】
図１４は、実施例４のセンサノードの動作を示すフローチャートである。センサノード３−ｉは、図１４に示されているように、ブートローダ２１が起動されると、既述の図８のフローと同様にして、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とに基づいて選択されたファームウェアを起動する。
【００８５】
ＭＣＵ１４は、ファームウェア２２−Ａまたはファームウェア２２−Ｂが起動されると、まず、通常動作を実行する（Ｓ１８）。ＭＣＵ１４は、通常動作が実行されると、既述の図８のフローと同様にして、複数のチェックポイント処理部３３−１〜３３−Ｘに対応する複数のチェックポイント処理を実行する。起動回数に関するチェックポイント処理では、ＭＣＵ１４は、まず、ＦＷ判定情報２８をストレージ１５から取得する（Ｓ９１）。ＭＣＵ１４は、ＦＷ判定情報２８が「未定」を示しているときに（Ｓ９１、Ｎｏ）、ストレージ１５を制御することにより、起動回数と更新完了時刻とを取得する。ＭＣＵ１４は、ストレージ１５を制御することにより、その取得された起動回数が示す値に１を加算した和を起動回数が示すように、起動回数を更新する（Ｓ９２）。ＭＣＵ１４は、その更新された起動回数が示す値が所定の値を超過しているときに（Ｓ９３、Ｙｅｓ）、ストレージ１５を制御することにより、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新する（Ｓ９４）。ＭＣＵ１４は、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８が更新された後に、リブートすることにより、ブートローダ２１を起動し、制御をブートローダ２１に移す。
【００８６】
ＭＣＵ１４は、その更新された起動回数が示す値が所定の値を超過していないときに（Ｓ９３、Ｎｏ）、カレンダータイマ１７を制御することにより、現在時刻を取得する。ＭＣＵ１４は、Ｓ９２で取得した更新完了時刻から現在時刻までに所定の時間が経過しているときに（Ｓ９５、Ｙｅｓ）、ストレージ１５を制御することにより、対応するチェックポイント処理結果が「正常」を示すようにそのチェックポイント処理結果を更新する。ＭＣＵ１４は、複数のチェックポイント処理の全部で、起動されているファームウェアが正常であると判定されたときに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新する（Ｓ９６）。
【００８７】
ＭＣＵ１４は、Ｓ９６でＦＷ判定情報２８が更新された後で、または、所定の時間が経過していないときに（Ｓ９５、Ｎｏ）、ＲＦ通信部１１を制御することにより、サーバ２からＦＷ更新要求を受信しているかどうかを検出する（Ｓ２３）。ＭＣＵ１４は、さらに、ＦＷ判定情報２８が「正常」を示しているときに（Ｓ９１、Ｙｅｓ）、ＲＦ通信部１１を制御することにより、サーバ２からＦＷ更新要求を受信しているかどうかを検出する（Ｓ２３）。
【００８８】
ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信していないときに（Ｓ２３、Ｎｏ）、Ｓ１８〜Ｓ２３の処理を繰り返し実行する。
【００８９】
ＭＣＵ１４は、サーバ２からＦＷ更新要求を受信しているときに（Ｓ２３、Ｙｅｓ）、ＲＦ通信部１１を制御することにより、サーバ２から更新されたファームウェアをダウンロードする。ＭＣＵ１４は、次いで、ｅＭＭＣ１９を制御することにより、そのダウンロードされたファームウェアを、ｅＭＭＣ１９の複数のメモリバンクのうちの起動されているファームウェアが記録されているメモリバンクと異なる他のメモリバンクに記録する（Ｓ２４）。
【００９０】
ＭＣＵ１４は、ストレージ１５を制御することにより、そのダウンロードされたファームウェアを起動バンク情報２５が示すように起動バンク情報２５を更新する。ＭＣＵ１４は、さらに、ストレージ１５を制御することにより、ＦＷ判定情報２８が「未定」を示すようにＦＷ判定情報２８を更新し、バンク試行情報２６が「×」を示すようにバンク試行情報２６を更新する（Ｓ２５）。ＭＣＵ１４は、起動バンク情報２５とバンク試行情報２６とＦＷ判定情報２８とが更新された後に、カレンダータイマ１７を制御することにより、現在時刻を取得する。ＭＣＵ１４は、さらに、ストレージ１５を制御することにより、起動回数が０を示すように起動回数を更新し、その取得された現在時刻を更新完了時刻が示すように更新完了時刻を更新する（Ｓ９７）。ＭＣＵ１４は、起動回数と更新完了時刻とが更新された後に、リブートすることにより、ブートローダ２１を起動し、ブートローダ２１に制御を移す。
【００９１】
［実施例４のセンサノードの効果］
実施例４のセンサノード３−ｉは、カレンダータイマ１７をさらに備えている。ストレージ１５は、起動回数をさらに記録している。ファームウェア２２−Ｂは、カレンダータイマ１７を用いて導出される期間にファームウェア２２−Ｂが起動される回数を起動回数が示すように起動回数を更新する。ファームウェア２２−Ｂは、起動回数が所定の値より大きいときに、ＦＷ判定情報２８が「不良」を示すようにＦＷ判定情報２８を更新してブートローダ２１を起動する。このようなセンサノード３−ｉは、ファームウェア２２−Ｂが頻繁に再起動する場合でも、正常であるファームウェア２２−Ａを自動的に起動させることができる。
【００９２】
また、実施例４では、ファームウェア２２−Ｂは、その期間が経過したときにＦＷ判定情報２８が「正常」を示すようにＦＷ判定情報２８を更新し、ＦＷ判定情報２８が「正常」を示すときに起動回数を更新しない。このようなセンサノード３−ｉは、ファームウェア２２−Ｂが正常であると判定されたときに、起動回数を更新しないことにより、ＭＣＵ１４の負担を軽減することができる。
【００９３】
ところで、実施例４では、ファームウェア２２−Ｂは、ファームウェア２２−Ｂが再起動する頻度以外の観点についてもファームウェア２２−Ｂの良否を判定しているが、その頻度のみに基づいてファームウェア２２−Ｂの良否を判定してもよい。この場合も、センサノード３−ｉは、更新された新しいファームウェア２２−Ｂが起動することができる場合でも、ファームウェア２２−Ｂに不具合があるときに、正常であるファームウェア２２−Ａを自動的に起動させることができる。
【００９４】
＜実施例５＞
更新された新しいファームウェア２２−Ｂは、複数のフラグメントに分割されてサーバ２からセンサノード３−ｉに送信されてもよい。図１５は、実施例５のセンサノードにサーバからダウンロードされるファームウェアを示す図である。ファームウェア２２−Ｂは、複数のブロック５１−１〜５１−Ｃ（Ｃ＝２，３，４，…）から形成されている。複数のブロック５１−１〜５１−Ｃのうちの任意のブロック５１−ｃ（ｃ＝１，２，３，…，Ｃ）は、複数のフラグメント５２−１〜５２−Ｄ（Ｄ＝２，３，４，…）から形成されている。複数のフラグメント５２−１〜５２−Ｄのうちの任意のフラグメント５２−ｄ（ｄ＝１，２，３，…，Ｄ）は、情報量が所定の情報量以下になるように形成されている。その所定の情報量は、フラグメント５２−ｄが１パケットのペイロードに収まるように設計される。
【００９５】
［実施例５のセンサノードの動作］
図１６は、実施例５のセンサノードがファームウェアを受信する動作を示す動作シーケンス図である。サーバ２は、更新された新しいファームウェア２２−Ｂが入力されると、まず、ファームウェア２２−Ｂを複数のブロック５１−１〜５１−Ｃに分割する。サーバ２は、ファームウェア２２−Ｂを複数のブロック５１−１〜５１−Ｃに分割した後に、複数のブロック５１−１〜５１−Ｃの各々のブロック５１−ｃを複数のフラグメント５２−１〜５２−Ｄに分割する。サーバ２は、無線通信を介して、制御情報であるファームウェア更新要求６１を複数のセンサノード３−１〜３−Ｎに配信する。
【００９６】
複数のセンサノード３−１〜３−Ｎのうちのファームウェア更新要求６１を受信したセンサノード３−ｉは、ＡＣＫ６２をサーバ２に返信する。サーバ２は、ＡＣＫ６２をセンサノード３−ｉから受信すると、ファームウェア２２−Ｂを複数のブロック５１−１〜５１−Ｃ毎にセンサノード３−ｉに送信する。サーバ２は、複数のブロック５１−１〜５１−Ｃのうちの最初のブロック５１−１を送信するときに、最初のブロック５１−１が形成される複数のフラグメント５２−１〜５２−Ｄを１つずつセンサノード３−ｉに送信する。
【００９７】
センサノード３−ｉは、複数のフラグメント５２−１〜５２−Ｄのうちの最後の最終フラグメント５２−Ｄと異なるフラグメントを受信したときに、ＡＣＫをサーバ２に返信しないで、最終フラグメント５２−Ｄを受信したときにＡＣＫ６４をサーバ２に返信する。
【００９８】
図１７は、パケットの送受信が欠落することがあるときの動作を示す動作シーケンス図である。サーバ２は、最終フラグメント５２−Ｄを送信した時刻から所定の時間経過するまでにＡＣＫ６４を受信しなかったときに、最終フラグメント５２−Ｄを再送する。サーバ２は、最終フラグメント５２−Ｄを再送した時刻から所定の時間経過するまでにＡＣＫ６４を受信しなかった場合も、繰り返して最終フラグメント５２−Ｄを再送する。センサノード３−ｉは、最終フラグメント５２−Ｄを受信するごとに、ＡＣＫ６４をサーバ２に返信する。
【００９９】
センサノード３−ｉは、最終フラグメント５２−Ｄを受信した後で、複数のフラグメント５２−１〜５２−Ｄのうちの取得できなかった欠落フラグメントがあるときに、その欠落フラグメントのリストを作成する。センサノード３−ｉは、その欠落フラグメントがあるときに、そのリストをＡＣＫ６４に付随してサーバ２に送信する。
【０１００】
サーバ２は、ＡＣＫ６４を受信した場合で、ＡＣＫ６４にそのリストが付随されていたときに、そのリストが示す複数のフラグメント６５をセンサノード３−ｉに送信する。このとき、複数のフラグメント６５は、リスト中の最後のフラグメントを、最終フラグメント５２−Ｄと同様のものとして扱い、処理をするように実装している。
【０１０１】
センサノード３−ｉは、最終フラグメント５２−Ｄを受信した場合で、複数のフラグメント５２−１〜５２−Ｄの全部を取得しているときに、リストが付随されないＡＣＫ６４をサーバ２に送信する。サーバ２は、リストが付随されないＡＣＫ６４を受信することにより、最初のブロック５１−１の送信を完了する。
【０１０２】
図１８は、１つのブロックの送信が完了した後の動作を示す動作シーケンス図である。詳細には、ブロックｃまで送信が完了し、ブロックｃ＋１の送信が完了しないうちにアップデート処理が何らかの原因で停止してしまった場合にｃ＋１ブロック目からアップデートを再開するためのシーケンス図である。センサノード３−ｉのストレージ１５は、受信完了ブロック番号７１をさらに記録している。センサノード３−ｉは、ブロック５１−ｃの複数のフラグメント５２−１〜５２−Ｄの全部を取得したときに、ストレージ１５を制御することにより、受信完了ブロック番号７１が値ｃを示すように受信完了ブロック番号７１を更新する。サーバ２は、ブロック５１−ｃの送信が完了した後に、すなわち、リストが付随されないＡＣＫ６４を受信した後に、ファームアップデート再開要求７２をセンサノード３−ｉに送信する。「停止」の部分が入らない場合は、ファームアップデート再開要求７２は、不要であり、即ｃ＋１ブロック目のフラグメント送信を行う。センサノード３−ｉは、ファームアップデート再開要求７２を受信すると、ストレージ１５から受信完了ブロック番号７１を取得し、開始ブロック番号が付随されたＡＣＫ７３をサーバ２に返信する。その開始ブロック番号は、複数のブロック５１−１〜５１−Ｃのうちの最後に受信されたブロック５１−ｃの次のブロックの番号を示し、受信完了ブロック番号７１が示す値ｃに１を加算した和ｃ＋１を示している。サーバ２は、開始ブロック番号が付随されたＡＣＫ７３をセンサノード３−ｉから受信すると、複数のブロック５１−１〜５１−Ｃのうちの開始ブロック番号に対応するブロックを、最初のブロック５１−１と同様にして、センサノード３−ｉに送信する。
【０１０３】
［実施例５のセンサノードの効果］
実施例５では、ファームウェア２２−Ａは、複数のブロック５１−１〜５１−Ｃに分割されたファームウェア２２−Ｂをサーバ２から１つずつダウンロードすることにより、ファームウェア２２−Ｂをダウンロードする。このようなセンサノード３−ｉは、ファームウェア２２−Ｂを複数のブロック５１−１〜５１−Ｃ毎にダウンロードすることにより、ストレージ１５のうちのダウンロードするときに使用されるバッファ領域を小さくすることができる。このため、このようなセンサノード３−ｉは、ストレージ１５の規模が小さい場合でも、ファームウェア２２−Ｂを適切にダウンロードすることができる。また、このようなセンサノード３−ｉは、ストレージ１５のうちのダウンロードするときに使用されるバッファ領域を小さくすることにより、ストレージ１５の規模を小さくすることができる。このようなセンサノード３−ｉは、ストレージ１５の規模を小さくすることにより、製造コストを低減することができる。
【０１０４】
また、実施例５では、ファームウェア２２−Ａは、複数のブロック５１−１〜５１−Ｃの各ブロック５１−ｃが分割された複数のフラグメント５２−１〜５２−Ｄをサーバ２から１つずつダウンロードすることにより、各ブロック５１−ｃをダウンロードする。ファームウェア２２−Ａは、複数のフラグメント５２−１〜５２−Ｄのうちの最終フラグメント５２−Ｄと異なるフラグメントをダウンロードしたときにＡＣＫを返信しないで、最終フラグメント５２−ＤをダウンロードしたときにＡＣＫ６４を返信する。このようなセンサノード３−ｉは、複数のフラグメント５２−１〜５２−Ｄを受信する毎にＡＫＣをサーバ２に返信することに比較して、ファームウェア２２−Ｂの転送効率を向上させることができ、ファームウェア２２−Ｂを高速にダウンロードすることができる。
【０１０５】
また、実施例５では、ファームウェア２２−Ａは、最終フラグメント５２−Ｄをダウンロードしたときに、複数のフラグメント５２−１〜５２−Ｄのうちの欠落したフラグメントのリストをサーバ２に返信する。このとき、サーバ２は、欠落したフラグメントのリストを受信することにより、欠落したフラグメントをセンサノード３−ｉに再送することができる。センサノード３−ｉは、低電力で動作するため、無線出力が小さい。センサノード３−ｉは、さらに、奥まったスペースに設置されるため、その無線通信に利用される電波がサーバ２まで届き辛く、通信が途切れがちになる。このようなセンサノード３−ｉは、無線環境５が低品質であっても、欠落したフラグメントのリストをサーバ２に伝達することにより、欠落したフラグメントをサーバ２から取得することができ、ファームウェア２２−Ｂを適切にダウンロードすることができる。
【０１０６】
また、実施例５では、ストレージ１５は、受信完了ブロック番号７１をさらに記録している。ファームウェア２２−Ａは、複数のブロック５１−１〜５１−Ｃのうちのブロック５１−ｃをダウンロードしたときに、受信完了ブロック番号７１がブロック５１−ｃを示すように受信完了ブロック番号７１を更新する。ファームウェア２２−Ａは、サーバ２からファームアップデート再開要求７２を受信したときに、ブロック５１−ｃの次のブロックを示す情報をサーバ２に返信する。このとき、サーバ２は、ブロック５１−ｃの次のブロックを示す情報を受信することにより、ダウンロードされていないブロックをセンサノード３−ｉに送信することができる。このようなセンサノード３−ｉは、ファームウェア２２−Ｂのダウンロードが途中で中断された場合でも、ダウンロードされていないブロックをサーバ２から取得することができ、ファームウェア２２−Ｂを適切にダウンロードすることができる。
【０１０７】
＜実施例６＞
ＡＣＫ６４は、さらに他の情報が付随される他のＡＣＫに置換されてもよい。図１９は、実施例６のセンサノードがファームウェアの１つのブロックを受信する動作を示す動作シーケンス図である。センサノード３−ｉは、図１９に示されているように、ブロック５１−ｃの複数のフラグメント５２−１〜５２−Ｄの全部を取得したときに、ブロック５１−ｃのデータに基づいてハッシュ値を算出する。センサノード３−ｉは、ブロック５１−ｃの複数のフラグメント５２−１〜５２−Ｄの全部を取得したときに、さらに、その算出されたハッシュ値が付随されるＡＣＫ８１をサーバ２に返信する。
【０１０８】
サーバ２は、ＡＣＫ８１をセンサノード３−ｉから受信したときに、センサノード３−ｉに送信したブロック５１−ｃのデータに基づいてハッシュ値を算出する（Ｓ１０１）。サーバ２は、その算出されたハッシュ値を、ＡＣＫ８１に付随されるハッシュ値と比較する（Ｓ１０２）。サーバ２は、その算出されたハッシュ値が、ＡＣＫ８１に付随されるハッシュ値と異なっているときに（Ｓ１０２、Ｎｏ）、再度、ブロック５１−ｃの複数のフラグメント５２−１〜５２−Ｄを１つずつセンサノード３−ｉに送信する。
【０１０９】
サーバ２は、その算出されたハッシュ値が、ＡＣＫ８１に付随されるハッシュ値と一致しているときに（Ｓ１０２、Ｙｅｓ）、複数のブロック５１−１〜５１−Ｃのうちのブロック５１−ｃの次のブロックをセンサノード３−ｉに送信する。
【０１１０】
図２０は、実施例６のセンサノードがファームウェアの最終ブロックを受信する動作を示す動作シーケンス図である。センサノード３−ｉは、図２０に示されているように、複数のブロック５１−１〜５１−Ｃのうちの最後の最終ブロック５１−Ｃの複数のフラグメント５２−１〜５２−Ｄを取得する。センサノード３−ｉは、複数のフラグメント５２−１〜５２−Ｄの最後の最終フラグメント５２−Ｄを取得したときに、複数のブロック５１−１〜５１−Ｃの全部のデータに基づいてハッシュ値を算出する。センサノード３−ｉは、最終ブロック５１−Ｃの複数のフラグメント５２−１〜５２−Ｄの全部を取得したときに、その算出されたハッシュ値が付随されるＡＣＫ８２をサーバ２に返信する。
【０１１１】
サーバ２は、ＡＣＫ８２をセンサノード３−ｉから受信したときに、センサノード３−ｉに送信した複数のブロック５１−１〜５１−Ｃの全部のデータに基づいてハッシュ値を算出する（Ｓ１０３）。サーバ２は、その算出されたハッシュ値を、ＡＣＫ８２に付随されるハッシュ値と比較する（Ｓ１０４）。サーバ２は、その算出されたハッシュ値が、ＡＣＫ８２に付随されるハッシュ値と異なっているときに（Ｓ１０４、Ｎｏ）、再度、複数のブロック５１−１〜５１−Ｃを最初のブロック５１−１から１つずつセンサノード３−ｉに送信する。サーバ２は、その算出されたハッシュ値が、ＡＣＫ８２に付随されるハッシュ値と一致しているときに（Ｓ１０４、Ｙｅｓ）、複数のブロック５１−１〜５１−Ｃの送信を完了する。
【０１１２】
［実施例６のセンサノードの効果］
実施例６では、ファームウェア２２−Ａは、複数のブロック５１−１〜５１−Ｃのうちの１つのブロック５１−ｃをサーバ２からダウンロードしたときに、１つのブロック５１−ｃに基づいて算出された誤り検出符号値をサーバ２に返信する。このとき、サーバ２は、センサノード３−ｉから受信した誤り検出符号値が、サーバ２によりブロック５１−ｃのデータに基づいて算出された誤り検出符号値と異なるときに、ブロック５１−ｃが正確に伝送されなかったことを認識することができる。サーバ２は、ブロック５１−ｃが正確に伝送されなかったことを認識することにより、ブロック５１−ｃをセンサノード３−ｉに再送することができる。このようなセンサノード３−ｉは、誤り検出符号値をサーバ２に返信することにより、正確に送信されなかったブロック５１−ｃをサーバ２から取得することができ、ファームウェア２２−Ｂを適切にダウンロードすることができる。
【０１１３】
また、実施例６では、ファームウェア２２−Ａは、複数のブロック５１−１〜５１−Ｃの全部をサーバ２からダウンロードしたときに、複数のブロック５１−１〜５１−Ｃの全部に基づいて算出された他の誤り検出符号値をサーバ２に返信する。このとき、サーバ２は、センサノード３−ｉから受信した誤り検出符号値が、サーバ２により算出された誤り検出符号値と異なるときに、複数のブロック５１−１〜５１−Ｃが正確に伝送されなかったことを認識することができる。サーバ２は、複数のブロック５１−１〜５１−Ｃが正確に伝送されなかったことを認識することにより、ファームウェア２２−Ｂをセンサノード３−ｉに再送することができる。このため、このようなセンサノード３−ｉは、誤り検出符号値をサーバ２に返信することにより、ファームウェア２２−Ｂを正確に受信しかったときに、ファームウェア２２−Ｂを再度ダウンロードすることができる。このため、このようなセンサノード３−ｉは、ファームウェア２２−Ｂを正確に受信しなかったときに、ファームウェア２２−Ｂを再度ダウンロードすることにより、ファームウェア２２−Ｂを適切にダウンロードすることができる。
【０１１４】
ところで、実施例６では、誤り検出符号値としてハッシュ値が利用されているが、誤り検出に利用される他の関数により算出される値に置換されてもよい。その関数としては、チェックサムが例示される。このような関数が利用された場合でも、センサノード３−ｉは、ファームウェア２２−Ｂを適切にダウンロードすることができる。
【０１１５】
以上の実施例１〜６を含む実施形態に関し、更に以下の付記を開示する。
【０１１６】
（付記１）制御部と、
第１ファームウェアとブートローダとを記録する第１記憶装置と、
判定情報を記録する第２記憶装置とを有し、
前記第１ファームウェアは、前記制御部に起動されることにより、制御対象を制御し、さらに、外部装置からダウンロードされた第２ファームウェアを前記第１記憶装置に記録して前記ブートローダを起動し、
前記ブートローダは、前記制御部に起動されることにより、前記判定情報が第１値を示すときに前記第１ファームウェアを起動し、前記判定情報が前記第１値と異なる第２値を示すときに前記第２ファームウェアを起動し、
前記第２ファームウェアは、前記制御部に起動されることにより、前記制御対象を制御し、さらに、前記第２ファームウェアの良否を判定し、前記第２ファームウェアが不良であると判定されたときに、前記判定情報が前記第１値を示すように前記判定情報を更新して前記ブートローダを起動する
電子機器。
【０１１７】
（付記２）前記第２ファームウェアは、前記第２ファームウェアが正常であると判定されたときに、前記判定情報が前記第２値を示すように前記判定情報を更新し、前記ブートローダにより再度起動された場合で、前記判定情報が前記第２値を示すときに、前記第２ファームウェアの良否を判定しない
付記１に記載の電子機器。
【０１１８】
（付記３）前記第２ファームウェアは、複数の観点で前記第２ファームウェアの良否をそれぞれ判定し、前記複数の観点のいずれか１つで不良であると判定されたときに前記判定情報が前記第１値を示すように前記判定情報を更新し、前記複数の観点の全部が正常であると判定されたときに前記判定情報が前記第２値を示すように前記判定情報を更新する
付記２に記載の電子機器。
【０１１９】
（付記４）前記第２ファームウェアが起動されたときに設定されるウォッチドッグタイマをさらに備え、
前記ブートローダは、さらに、前記ウォッチドッグタイマがタイムアウトしたときに、前記制御部に起動される
付記２または付記３に記載の電子機器。
【０１２０】
（付記５）前記第２ファームウェアは、前記第２ファームウェアが正常であると判定されたときに、前記ウォッチドッグタイマを解除する
付記４に記載の電子機器。
【０１２１】
（付記６）前記第２記憶装置は、試行情報をさらに記録し、
前記第１ファームウェアは、前記第２ファームウェアが起動される前に、前記判定情報が第３値を示すように前記判定情報を更新し、前記試行情報が第４値を示すように前記試行情報を更新し、
前記ブートローダは、
前記判定情報が前記第３値を示す場合で前記試行情報が前記第４値を示すときに、前記試行情報が第５値を示すように前記試行情報を更新して前記第２ファームウェアを起動し、
前記判定情報が前記第３値を示す場合で前記試行情報が前記第５値を示すときに、前記第１ファームウェアを起動する
付記４または付記５に記載の電子機器。
【０１２２】
（付記７）カレンダータイマをさらに備え、
前記第２記憶装置は、起動回数をさらに記録し、
前記第２ファームウェアは、前記カレンダータイマを用いて導出される期間に前記第２ファームウェアが起動される回数を前記起動回数が示すように前記起動回数を更新し、前記起動回数が所定の値より大きいときに、前記判定情報が前記第１値を示すように前記判定情報を更新して前記ブートローダを起動する
付記２〜付記６のいずれか一項に記載の電子機器。
【０１２３】
（付記８）前記第２ファームウェアは、前記期間が経過したときに前記判定情報が前記第２値を示すように前記判定情報を更新し、前記判定情報が前記第２値を示すときに前記起動回数を更新しない
付記７に記載の電子機器。
【０１２４】
（付記９）前記第１ファームウェアは、前記第２ファームウェアが分割された複数のブロックを前記外部装置から１つずつダウンロードすることにより、前記第２ファームウェアをダウンロードする
付記１〜付記８のいずれか一項に記載の電子機器。
【０１２５】
（付記１０）前記第１ファームウェアは、
前記複数のブロックの各ブロックが分割された複数のフラグメントを前記外部装置から１つずつダウンロードすることにより、前記各ブロックをダウンロードし、
前記複数のフラグメントのうちの最後の最終フラグメントと異なる他のフラグメントをダウンロードしたときにＡＣＫを返信しないで、前記最終フラグメントをダウンロードしたときにＡＣＫを返信する
付記９に記載の電子機器。
【０１２６】
（付記１１）前記第１ファームウェアは、前記最終フラグメントをダウンロードしたときに、前記複数のフラグメントのうちの欠落したフラグメントのリストを前記外部装置に返信する
付記１０に記載の電子機器。
【０１２７】
（付記１２）前記第２記憶装置は、受信完了ブロック番号をさらに記録し、
前記第１ファームウェアは、
前記複数のブロックのうちのブロックをダウンロードしたときに、前記受信完了ブロック番号が前記ブロックを示すように前記受信完了ブロック番号を更新し、
前記外部装置からファームアップデート再開要求を受信したときに、前記ブロックの次のブロックを示す情報を前記外部装置に返信する
付記９〜付記１１のいずれか一項に記載の電子機器。
【０１２８】
（付記１３）前記第１ファームウェアは、前記複数のブロックのうちの１つのブロックを前記外部装置からダウンロードしたときに、前記１つのブロックに基づいて算出された誤り検出符号値を前記外部装置に返信する
付記９〜付記１２のいずれか一項に記載の電子機器。
【０１２９】
（付記１４）前記第１ファームウェアは、前記複数のブロックの全部を前記外部装置からダウンロードしたときに、前記複数のブロックの全部に基づいて算出された他の誤り検出符号値を前記外部装置に返信する
付記９〜付記１３のいずれか一項に記載の電子機器。
【０１３０】
（付記１５）第１ファームウェアとブートローダとを第１記憶装置に記録し、
前記第１ファームウェアを起動することにより、制御対象を制御し、さらに、外部装置からダウンロードされた第２ファームウェアを前記第１記憶装置に記録して前記ブートローダを起動し、
前記ブートローダを起動することにより、第２記憶装置に記録された判定情報が第１値を示すときに前記第１ファームウェアを起動し、前記判定情報が前記第１値を示していないときに前記第２ファームウェアを起動し、
前記第２ファームウェアを起動することにより、前記制御対象を制御し、さらに、前記第２ファームウェアの良否を判定し、前記第２ファームウェアが不良であると判定されたときに、前記判定情報が前記第１値を示すように前記判定情報を更新して前記ブートローダを起動する
処理をコンピュータが実行することを特徴とするファームウェアアップデート方法。
【０１３１】
（付記１６）第１ファームウェアと、
ブートローダとを有し、
前記第１ファームウェアは、
制御対象を制御し、
外部装置からダウンロードされた第２ファームウェアを第１記憶装置に記録して前記ブートローダを起動する
処理をコンピュータに実行させ、
前記ブートローダは、
第２記憶装置に記録される判定情報が第１値を示すときに前記第１ファームウェアを起動し、
前記判定情報が前記第１値を示していないときに前記第２ファームウェアを起動する
処理を前記コンピュータに実行させ、
前記第２ファームウェアは、
前記制御対象を制御し、
前記第２ファームウェアの良否を判定し、
前記第２ファームウェアが不良であると判定されたときに、前記判定情報が前記第１値を示すように前記判定情報を更新して前記ブートローダを起動する
処理を前記コンピュータに実行させる
コンピュータプログラム。
【符号の説明】
【０１３２】
１  ：無線センサネットワーク
３−１〜３−Ｎ：複数のセンサノード
５  ：無線環境
１１：ＲＦ通信部
１２−１〜１２−Ｍ：複数のセンサ
１４：ＭＣＵ
１５：ストレージ
１６：ウォッチドッグタイマ
１７：カレンダータイマ
１９：ｅＭＭＣ
２１：ブートローダ
２２−１〜２２−Ｋ：複数のファームウェア
２５：起動バンク情報
２６：バンク試行情報
２７−１〜２７−Ｘ：複数のチェックポイント処理結果
２８：ＦＷ判定情報
３１：通常動作部
３２：アップデート部
３３−１〜３３−Ｘ：複数のチェックポイント処理部
３４：ＦＷ判定情報更新部
５１−１〜５１−Ｃ：複数のブロック
５２−１〜５２−Ｄ：複数のフラグメント
【図１】
0006750340.tif 000002
【図２】
0006750340.tif 000003
【図３】
0006750340.tif 000004
【図４】
0006750340.tif 000005
【図５】
0006750340.tif 000006
【図６】
0006750340.tif 000007
【図７】
0006750340.tif 000008
【図８】
0006750340.tif 000009
【図９】
0006750340.tif 000010
【図１０】
0006750340.tif 000011
【図１１】
0006750340.tif 000012
【図１２】
0006750340.tif 000013
【図１３】
0006750340.tif 000014
【図１４】
0006750340.tif 000015
【図１５】
0006750340.tif 000016
【図１６】
0006750340.tif 000017
【図１７】
0006750340.tif 000018
【図１８】
0006750340.tif 000019
【図１９】
0006750340.tif 000020
【図２０】
0006750340.tif 000021