圧縮フォント

RTCを持たないデバイスで日時合わせ

2008/07/04 koga

開発ターゲットのデバイスが RTC を搭載していない場合、日時設定をどうするか、という問題が生じます。もちろん、画面表示を行わないデバイスであったり、あるいは、WinCE の標準シェルを使わず、現在日時の表示や取り扱いをしなくてよいデバイスであれば、日時設定の必要はありません。また、一度電源を入れたら、ずっと電源を切らず、リセットもしない、というデバイスであれば、起動時に日時設定を行えばよいでしょう。

しかし、ネットワークに接続するデバイスの場合には、他の機器と通信する関係上、現在日時の設定が必要なことが多いと思います。そのような場合、たとえばWeb端末であれば、接続した Web サーバが返す HTTP レスポンスメッセージを解析し、HTTP レスポンスの Date ヘッダに記述された日時を設定する、という方策もあるでしょう。もっと簡単に、ネットワークタイムサーバから日時を取得して設定することも可能です。

さいわいにして、WinCE では、SNTP(Simple NTP) クライアント機能が標準で付属しています。SNTP クライアント機能を OS イメージに組み込んで動かせば、デバイスの起動時にネットワークタイムサーバを参照し、自動的に現在日時設定を行わせることができます。もちろん、起動後は、設定した間隔でネットワークタイムサーバを参照して、自動的に時刻合わせを行います。

以下に、WinCE 付属の SNTP クライアント機能を組み込む手順を説明します。なお、WinCE 付属の SNTP 機能については、MSDN のリファレンスにも記載があります:
 http://msdn.microsoft.com/en-us/library/aa919019.aspx

ただし、そこでの説明には、SNTP クライアント機能を有効にするためのレジストリ設定で欠けているものがあります。以下の説明では、その点についても述べます。
 

■SNTP クライアント機能のカタログ項目
SNTP クライアント機能を OS イメージに組み込むためのカタログ項目は、次の二つです:

 コア OS
  CEBASE
   通信サービスおよびネットワーク
    Simple Network Time Protocol (SNTP)
     DST 付き SNTP クライアント
     SNTP 自動更新およびサーバー同期

「DST 付き SNTP クライアント」は、標準シェルが依存しており、標準シェルを OS イメージに含めると、自動的に選択されます。ただし、この項目だけでは SNTP クライアント機能が有効になりません。「SNTP 自動更新およびサーバー同期」も選択して下さい。

■SNTP クライアント機能のレジストリ設定
SNTP クライアント機能を動作させるためのレジストリ項目は、MSDN のリファレンスに記載されています:
 http://msdn.microsoft.com/en-us/library/aa924011.aspx

ただし、このページに記載されている項目は、不足しています。このページに記載されている以外に、AutoUpdate という DWORD 型のキー値を  1 に設定しなければいけません。このキー値が必要なことは、SNTP クライアントのソースを読めば分かります。SNTP クライアントのソースは、<WINCE600>/PRIVATE/SERVERS/TIMESVC2/SNTP/ にあります。このディレクトリにある sntp.cxx がソースファイルで、レジストリ設定の読み出し処理は、TimeState::RefreshConfig() で実装されています。

いきなりソースを読むというのは、少々乱暴かも知れませんね。その場合は、WinCE 付属のレジストリ設定ファイルを見て下さい。SNTP クライアント関連のレジストリ設定記述は、<WINCE600>/PUBLIC/SERVERS/OAK/FILES/ にある servers.reg にあります。このファイルをテキストエディタで開いて、’SERVERS_MODULES_TIMESVC’ で検索してみて下さい。SNTP 機能に関するレジストリ項目の説明を記したコメントと、実際のレジストリ記述があります。AutoUpdate の説明もあります。レジストリ記述を見ると、’TIMESVC_TSVC_AUTO_UPDATE’ という SYSGEN 変数が定義されていれば、AutoUpdate を含め、SNTP クライアント機能を動作させるためのレジストリ設定が有効になるようです。ただし、この SYSGEN 変数は、PlatformBuidler(Visual Studio) の「カタログ項目ビュー」に表示される、上で述べたカタログ項目には関連づけられていません。従って、この SYSGEN 変数を自分で設定するか、または、プロジェクト固有のレジストリ設定ファイル(project.reg)に、必要なレジストリ記述を追加しなければいけません。

以下は、SNTP クライアント用のレジストリ設定記述の例です。これを project.reg に追加して OS イメージをビルドすれば、SNTP クライアント機能が動作するはずです。

[HKEY_LOCAL_MACHINE\Services\Timesvc]
“server”=”time.windows.com”
“AutoUpdate”=dword:1
“refresh”=dword:36EE80
“recoveryrefresh”=dword:493E0
“threshold”=dword:5265C00
“ServerRole”=dword:0
“trustlocalclock”=dword:0

servers.reg ファイルでは、’ServerRole’ を 1 に設定していますが、SNTP クライアント機能だけを使う場合は、0 に設定して構いません。上の例では、’ServerRole’ を 0 に設定しています。

 
■ついでにタイムゾーン設定
SNTP クライアントとは関係ありませんが、タイムゾーン設定のレジストリ項目について、ついでに書きます。OS イメージを小さく抑えたいなどの理由で、日本語フォントを入れない場合、OS イメージのロケールを英語にすることになるでしょう。ロケールを日本語にした場合は、タイムゾーンも日本になるのですが、ロケールとは異なるタイムゾーンを設定したい場合には、[HKEY_LOCAL_MACHINE\Time Zones] というレジストリキーを使って設定します。以下が、タイムゾーンを Tokyo にする場合の記述です。

[HKEY_LOCAL_MACHINE\Time Zones]
“Default”=”Tokyo Standard Time”

この記述を project.reg に追加して OS イメージをビルドすれば、ロケール設定に関係なく、タイムゾーンが日本(Tokyo)になります。

Entry Filed under: 付属機能の使い方

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


Categories

Links

Posts by Authors

Recent Posts

Calendar

2008年7月
    9月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Posts by Month

Posts by Category

Meta