解説

フィールドサーバはhttpサーバを持っている。 フィールドサーバのCPUのアドレスにアクセスすると,次のような形でデータが出力される:

Field Server

この右側のフレームのアドレスは http://フィールドサーバのCPUのアドレス/ad_access.htm である。 このソースは次のようになっている。

……
<input type="text" name="ad1_0_0" value="775" maxlength="4" size="6">
……
<input type="text" name="ad1_1_0" value="630" maxlength="4" size="6">
……
……
<input type="text" name="ad1_7_0" value="11" maxlength="4" size="6">
……

この形式ではField Server対応Squeakでは読めないので,Squeak用に,おおよそ次のようなPHPプログラムで古い形式に変換している:

<?php
   $httpfile  = file_get_contents("http://フィールドサーバのCPUのアドレス/ad_access.htm");
?>
</head>
<body>
<table border="1">
<tr><td>Temperature</td><td><?php
   ereg("name=\"ad1_4_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1];
?></td></tr>
<tr><td>Humidity</td><td><?php
   ereg("name=\"ad1_5_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1];
?></td></tr>
<tr><td>Solar Radiation</td><td><?php
   ereg("name=\"ad1_6_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1];
?></td></tr>
<tr><td>Soil Wetness</td><td><?php
   ereg("name=\"ad1_2_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1];
?></td></tr>
<tr><td>CO2</td><td><?php
   ereg("name=\"ad1_1_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1];
?></td></tr>
</table>

私の研究室でお借りしているものは,ad1_2_0 から ad1_6_0 までがそれぞれ土壌水分,土壌温度,気温,湿度,日射量となっている。 これをそのまま公開しても,物理値に変換しないと意味がないし,それに同じアドレスの別ページでは設定まで変えられてしまう。 そこで,フィールドサーバ自体はプライベートアドレス空間に置き,必要なところ以外からアクセスできないようにした。

奥村研究室フィールドサーバのページでは次のようなPHPスクリプトで物理値を表示する(係数はモデルごとに違う)。

<p>気温:
<?php
   $httpfile  = file_get_contents("http://フィールドサーバのCPUのアドレス/ad_access.htm");
   ereg("name=\"ad1_4_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   printf("%.1f", 0.302808 * $regs[1] - 12.01);
?>
 ℃</p>
<p>湿度:
<?php
   ereg("name=\"ad1_5_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   printf("%.1f", 0.285846 * $regs[1] + 23.69);
?>
 %</p>
<p>日射量:
<?php
   ereg("name=\"ad1_6_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1] - 7;
?>
 mV</p>
<p>CO<sub>2</sub>:
<?php
   ereg("name=\"ad1_1_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   printf("%.1f", 2.133 * $regs[1] - 666.7);
?>
 ppm</p>
<p>土壌水分:
<?php
   ereg("name=\"ad1_2_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   echo $regs[1];
?>
 mV</p>
<p>土壌温度:
<?php
   ereg("name=\"ad1_3_0\" value=\"([0-9]*)\"", $httpfile, $regs);
   printf("%.1f", 0.302808 * $regs[1] - 11.72);
?>
 ℃</p>

また,MySQLに次のような表を作ってデータを格納することにした。

create table fieldserver(
  unixtime int,
  temperature float,
  humidity float,
  insolation float,
  CO2 float,
  soilmoisture float,
  soiltemperature float,
  primary key(unixtime));

MySQLのデータは次のようにして直接読める。

  mysql_connect('oku.edu.mie-u.ac.jp', 'hoge', 'hoge') or die(mysql_error());
  mysql_select_db('hoge') or die(mysql_error());
  $sql = 'select * from fieldserver order by unixtime desc limit 24';
  $result = mysql_query($sql) or die(mysql_error());
  echo "<pre>\n";
  echo "Date       Time      Temp  Hum  Insol CO2   SoilMois SoilTemp\n";
  while (($row = mysql_fetch_row($result)) != FALSE) {
    echo date("Y-m-d H:i:s", $row[0]);
    for ($i = 1; $i <= 6; $i++) printf(" %5.1f", $row[$i]);
    echo "\n";
  }
  echo "</pre>\n";
  mysql_close();

奥村晴彦

Last modified: 2008-01-17 14:28:12