Intel から発売された Edison を設定してみる

Intel から発売された Edison の設定

1.Yocto Linux の起動まで

最初に、ピッチ変換基板とEdison本体との合体がしかりできているか確認しましょう!
ネジを締めただけではゆるくてはまってない場合があります。(私がハマりました。(汗))

先ずはYocto Linuxのバイナリーファイルを転送します。

Windowsの場合は以下を参照します。
Flashing Edison (wired) – Windows
https://communities.intel.com/docs/DOC-23192

MACの場合は以下を参照します。
Flashing Edison (wired) – Mac
https://communities.intel.com/docs/DOC-23193

Windowsの場合の注意点
・Step 1 – Connecting Edison で認識したドライブをWindows Explorerで中身を確認しても空
Edison00(1)
・Step 3 – Remove old images の作業は不要
・Step 4 – Download the latest image で latest image をダウンロードした後の作業を以下に変更
先ず、ダウンロードしたZipファイルを解凍
解凍したフォルダに dfu-util.exe を入手 して置いておく
dfu-util.exe の入手は https://community.spark.io/t/latest-2014-dfu-util-for-windows-compiled/5264 を参照
コマンドプロンプトを管理者権限で開き、解凍したフォルダに移動
flashall.bat を実行
   C:\work\edison>flashall
   Using U-boot target: edison-blank
   Now waiting for dfu device 8087:0a99
   Please plug and reboot the board
(ここで一旦USB抜き差しで電源を再起動)
   Dfu device found
   Flashing IFWI
   Download [=========================] 100% 4194304 bytes
   (中略)
   Rebooting
   U-boot & Kernel System Flash Success…
   Your board needs to reboot twice to complete the flashing procedure, please do n
   ot unplug it for 2 minutes.
(以上で完了)
以上でインストールは完了です。
・Step 5 – Flashing Edison はPuTTYを使ってUSBシリアルを使ってコンソール操作画面を表示させています。
Edison(1)
TeraTermに慣れている方はそちらを利用されても良いでしょう。

MACの場合の注意点
・Step 1 – Connecting Edison で認識したデバイスをFinderで中身を確認しても空
・Step 2 – Remove old images の作業は不要
・Step 4 – Download the latest image で latest image をダウンロードした後の作業を以下に変更
事前に不足するツールを導入しておきます
GNU core utilities の設定
http://apple.stackexchange.com/questions/69223/how-to-replace-mac-os-x-utilities-with-gnu-core-utilities
dfu-util-0.7.mpkg の設定
https://code.google.com/p/companion9x/downloads/detail?name=dfu-util-0.7.mpkg
  MACのlsusbコマンド対応
http://takuyamamo.blog.fc2.com/blog-entry-11.html
続いて、ダウンロードしたZipファイルを解凍
  ターミナルを開き、解凍したフォルダに移動
flashall.sh を実行
後はWindowsの例と表示は違いますが、操作はほぼ同じです

.Yocto Linux の設定

スタートアップ Intel Edison(yonekenさん)が大変参考になります
http://qiita.com/yoneken/items/1b24f0dd8ae00579a0c2

シリアル接続してやる作業 以下を実行すると良いでしょう。

Wifi接続関連の補足

以下のコマンドを実行します。
root@edison:~# configure_edison –setup

Configure Edison: Device Name

Give this Edison a unique name.
This will be used for the access point SSID and mDNS address.
Make it at least five characters long (leave empty to skip):(空白のままスキップ)
Configure Edison: Device Password

Enter a new password (leave empty to abort)
This will be used to connect to the access point and login to the device.
Password: ********(パスワードは設定しておきましょう)
Please enter the password again: ********
The device password has been changed.

First-time root password setup complete. Enabling SSH on WiFi interface.
Do you want to set up wifi? [Y or N]: Y(いよいよwifiを設定します)

Configure Edison: WiFi Connection

Scanning: 1 seconds leftt(電波を探す間しばし待ちます)

0 : Rescan for networks
1 : Manually input a hidden SSID
2 : FON_FREE_INTERNET
3 : WARPSTAR-65C952-W
4 : 48FFCCED201E29FB7FC605502E39CB0C
5 : WARPSTAR-5D455F-W
6 : aterm-310062-gw
7 : WARPSTAR-2AA5EC-W
8 : aterm-f98a33-aw
9 : aterm-f98a33-gw
10 : WARPSTAR-5D455F
11 : 0024A5D9850D-1
12 : 0024A5D9850D
13 : FON_FREE_EAP
14 : WARPSTAR-2AA5EC
15 : MyPlace_178FDC
16 : aterm-f98a33-g
17 : aterm-f98a33-a
18 : myessid

Enter 0 to rescan for networks.
Enter 1 to input a hidden network SSID.
Enter a number between 2 to 18 to choose one of the listed network SSIDs: 18(上記該当する数字を入れます)
Is myessid correct? [Y or N]: Y(接続するのでYです)

Password must be between 8 and 63 characters.
What is the network password?: ****************************(パスワードを入力します)
Initiating connection to myessid. Please wait…
Attempting to enable network access, please check ‘wpa_cli status’ after a minute to confirm.
Done. Please connect your laptop or PC to the same network as this device and go to http://192.168.XX.XX or http://edison.local in your browser.

以上の設定が終わると、上記URLにアクセスすると以下が確認できます。
スクリーンショット 2014-10-31 0.51.23

また、ターミナルからsshでrootアカウントで接続できます。
スクリーンショット 2014-10-31 0.59.40

GCC(GNUのC言語他のコンパイラとライブラリィなど)関連の補足

最新のGCCのバージョンは以下で確認しましょう。
http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/
10/31時点では4.9.2が最新でしたので、以下でダウンロードしました。
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.2/gcc-4.9.2.tar.bz2

GCCのコンパイルは大変時間がかかります。
寝る前に仕込む事をお勧めします。

という事でGCCが終わりそうにないので、これで今日はおしまい。

Intel から発売された Edison を購入

Intel から発売された Edison を購入しました
http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html

1.入手方法

10月25日に日本でも発売開始されたIntelのEdisonを入手しました。
最初の10月20日頃の予約は早々に終了しましたが、10月24日に一部予約が再会された際に無事予約注文できました。
ですががこちらもすぐに売り切れ、現在(10/30)は予約もできない状態です。
そして、無事10月28日に届きました!!

購入先は、以下のスイッチサイエンスの通販サイトです。
http://www.switch-science.com/catalog/list/?keyword=Edison

どのモデルを購入するかですが、Edison本体のみでは別途Iピッチ変換基板を自作する必要があります。
さすがにこれはおいそれと出来ません。

私は本体とIntel Edison Breakout Board(ピッチ変換基板)のセットを購入しました。
Aduinoを使い慣れている方は、そちらの基盤でも良いでしょう。
いずれも最初の設定は同じ操作のようです。

2.開封の儀(10月28日)

箱を空けると、マッチ箱より小さいEdisoがお目見え!
EdisonOpen
箱書されている What will you make ? いいですね!

ピッチ変換基盤と合体させて、電源を入れてみた所です。
EdisonOn

 

ては、Yocto Linuxのインストール。

こちらは次の記事「Intel から発売された Edison を設定してみる」にて紹介します。

 

15.AWS の DynamoDB、S3に保管したデータをEC2のWebサーバで表示

前へ 目次

AWS の DynamoDB に保管したデータを EC2 の Webサーバから表示するPHPプログラム例です。

普段は PHP MVC Framework を使って、Json での Rest full Web API で実装しますが、デモなのでこの辺りのサンプルで。。。

試作システム

</code>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>塩ケンピ試食者一覧</title>
<style type="text/css">

table {
border-collapse:collapse;
border-spacing:0;
background-color:#ffffff;
empty-cells:show;
}

th {
border-right:1px solid #663300;
border-bottom:1px solid #663300;
color:#ffffff;
background-color:#006400;
padding: 5px 4px;
text-align:center;
}

td {
border-right:1px solid #006400;
border-left:1px solid #006400;
border-top:1px solid #006400;
border-bottom:1px solid #006400;
padding:0.1em 0.3em;
}

.tdback {
background-color:#008000;
color:#ffffff;
}

h2 {
position: relative;
color: #ffffff;
background: #008000;
font-size: 16px;
line-height: 1;
margin: 0px 0px 5px 5px;
padding: 5px 5px 5px 10px;
border-radius: 5px 5px 5px 5px;
}

p {
margin:0 0 15px 5px;
}

a {
text-decoration:underline;
}
a:hover {
color: #ffffff;
background: #008000;
text-decoration:underline;
}

</style>

</head>
<body>

<h2>塩ケンピ試食者検索条件</h2>

<?php

ini_set( 'display_errors', 1 );
ini_set('error_reporting', E_ALL);

require_once('/usr/share/pear/AWSSDKforPHP/aws.phar');
use Aws\Common\Aws;
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Exception\DynamoDbException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

$aws = Aws::factory("/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php");

$interval = "-1 hour";
if(isset($_REQUEST['r'])) $interval = $_REQUEST['r']."";

$r = array("","","","","","","","");
switch ($interval) {
case "-1 hour":
$r[0] = " selected";
break;
case "-2 hour":
$r[1] = " selected";
break;
case "-4 hour":
$r[2] = " selected";
break;
case "-6 hour":
$r[3] = " selected";
break;
case "-12 hour":
$r[4] = " selected";
break;
case "-1 day":
$r[5] = " selected";
break;
case "-2 day":
$r[6] = " selected";
break;
}

?>

<form name="frm01" action="splist.php" method="post" >
表示範囲:<select name="r">
<option value="-1 hour"<?php echo $r[0]; ?>>1時間</option>
<option value="-2 hour"<?php echo $r[1]; ?>>2時間</option>
<option value="-4 hour"<?php echo $r[2]; ?>>4時間</option>
<option value="-6 hour"<?php echo $r[3]; ?>>6時間</option>
<option value="-12 hour"<?php echo $r[4]; ?>>12時間</option>
<option value="-1 day"<?php echo $r[5]; ?>>1日</option>
<option value="-2 day"<?php echo $r[6]; ?>>2日</option>
</select>
<input type="submit" value="Do">
</form>

<?php

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$now        = new DateTime();
$eymdhims   = $now->format('YmdHis');
$now->modify($interval);
$symdhims   = $now->format('YmdHis');
//echo $symdhims."〜".$eymdhims."<br />\n";

?>

<br /><br />
<h2>塩ケンピ試食者一覧</h2>
<?php

// Image
try{
$iterator = $dynamo->getIterator('Query', array(
'TableName'     => $dynamoTbl,
'KeyConditions' => array(
'HashKey' => array(
'AttributeValueList' => array(
array('S' => 'D001-PIC-DIST')
),
'ComparisonOperator' => 'EQ'
),
'RangeKey' => array(
'AttributeValueList' => array(
array('S' => "".$symdhims),
array('S' => "".$eymdhims)
),
'ComparisonOperator' => 'BETWEEN'
)
),
'ScanIndexForward' => false,
)
);
$count = 1;
foreach ($iterator as $item) {
if($count == 1){
echo "<table>\n";
echo "<tr><th>No.</th><th>日付</th><th>距離</th><th>画像・情報</th>";
echo "<th>HashKey</th><th>RangeKey</th><th>HashKey01</th><th>RangeKey02</th><th>RangeKey03</th></tr>";
}
echo "<tr><td>".$count."</td><td>".$item['datetime']['S']."</td><td>".$item['distance']['S']." ".$item['unit']['S']."</td>";
echo "<td><a href=\"ImageData.php?b=".$item['s3backet']['S']."&k=".$item['s3key']['S']."\" target=\"_blank\">画像</a> ";
echo "<a href=\"DataGet.php?p=".$item['HashKey01']['S']."\" target=\"_blank\">情報</a></td>\n";
echo "<td>".$item['HashKey']['S']."</td><td>".$item['RangeKey']['S']."</td>";
echo "<td>".$item['HashKey01']['S']."</td><td>".$item['RangeKey02']['S']."</td><td>".$item['RangeKey03']['S']."</td></tr>";
$count++;
}
if($count > 1) echo "</table>\n";
if($count < 2) echo "<table><tr><td>該当するデータはありませんでした。</td></tr></table>\n";
} catch (DynamoDbException $exc) {
echo "<table><tr><td>エラーが発生しました : ".$exc->getMessage()."</td></tr></table>\n";
}
?>

<br /><br />
<h2>環境情報(温湿度情報)</h2>
<?php
// Data
try{
$iterator = $dynamo->getIterator('Query', array(
'TableName'     => $dynamoTbl,
'KeyConditions' => array(
'HashKey' => array(
'AttributeValueList' => array(
array('S' => 'D001-AIR-TEMP')
),
'ComparisonOperator' => 'EQ'
),
'RangeKey' => array(
'AttributeValueList' => array(
array('S' => "".$symdhims),
array('S' => "".$eymdhims)
),
'ComparisonOperator' => 'BETWEEN'
)
),
'ScanIndexForward' => false,
)
);
$count = 1;
foreach ($iterator as $item) {
if($count == 1){
echo "<table>\n";
echo "<tr><th>No.</th><th>日付</th><th>温度</th><th>湿度</th><th>情報</th>";
echo "<th>HashKey</th><th>RangeKey</th><th>HashKey01</th><th>RangeKey02</th><th>RangeKey03</th></tr>";
}
echo "<tr><td>".$count."</td><td>".$item['datetime']['S']."</td><td>".$item['air_temp']['S']." ".$item['temp_unit']['S']."</td>";
echo "<td>".$item['air_hum']['S']." ".$item['hum_unit']['S']."</td>";
echo "<td><a href=\"DataGet.php?p=".$item['HashKey01']['S']."\" target=\"_blank\">情報</a></td>\n";
echo "<td>".$item['HashKey']['S']."</td><td>".$item['RangeKey']['S']."</td>";
echo "<td>".$item['HashKey01']['S']."</td><td>".$item['RangeKey02']['S']."</td><td>".$item['RangeKey03']['S']."</td></tr>";
$count++;
}
if($count > 1) echo "</table>\n";
if($count < 2) echo "<table><tr><td>該当するデータはありませんでした。</td></tr></table>\n";
} catch (DynamoDbException $exc) {
echo "<table><tr><td>エラーが発生しました : ".$exc->getMessage()."</td></tr></table>\n";
}
?>

<br /><br />
<h2>環境情報(Raspberry Pi 情報)</h2>
<?php
// Data
try{
$iterator = $dynamo->getIterator('Query', array(
'TableName'        => $dynamoTbl,
'ScanIndexForward' => false,
'KeyConditions'    => array(
'HashKey' => array(
'AttributeValueList' => array(
array('S' => 'D001-CPU-TEMP')
),
'ComparisonOperator' => 'EQ'
),
'RangeKey' => array(
'AttributeValueList' => array(
array('S' => "".$symdhims),
array('S' => "".$eymdhims)
),
'ComparisonOperator' => 'BETWEEN'
)
),
'ScanIndexForward' => false,
)
);
$count = 1;
foreach ($iterator as $item) {
if($count == 1){
echo "<table>\n";
echo "<tr><th>No.</th><th>日付</th><th>CPU温度</th><th>CPU利用率</th><th>メモリ使用率</th><th>情報</th>";
echo "<th>HashKey</th><th>RangeKey</th><th>HashKey01</th><th>RangeKey02</th><th>RangeKey03</th></tr>";
}
echo "<tr><td>".$count."</td><td>".$item['datetime']['S']."</td><td>".$item['cpu_temp']['S']." ".$item['cpu_unit']['S']."</td>";
echo "<td>".$item['cpu_used']['S']." ".$item['cpu_unit2']['S']."</td><td>".$item['mem_used']['S']." ".$item['mem_unit']['S']."</td>";
echo "<td><a href=\"DataGet.php?p=".$item['HashKey01']['S']."\" target=\"_blank\">情報</a></td>\n";
echo "<td>".$item['HashKey']['S']."</td><td>".$item['RangeKey']['S']."</td>";
echo "<td>".$item['HashKey01']['S']."</td><td>".$item['RangeKey02']['S']."</td><td>".$item['RangeKey03']['S']."</td></tr>";
$count++;
}
if($count > 1) echo "</table>\n";
if($count < 2) echo "<table><tr><td>該当するデータはありませんでした。</td></tr></table>\n";
} catch (DynamoDbException $exc) {
echo "<table><tr><td>エラーが発生しました : ".$exc->getMessage()."</td></tr></table>\n";
}
?>
<br /><br />
<h2>定期画像一覧</h2>
<?php

// Image
try{
$iterator = $dynamo->getIterator('Query', array(
'TableName'     => $dynamoTbl,
'KeyConditions' => array(
'HashKey' => array(
'AttributeValueList' => array(
array('S' => 'D001-PIC-PERI')
),
'ComparisonOperator' => 'EQ'
),
'RangeKey' => array(
'AttributeValueList' => array(
array('S' => "".$symdhims),
array('S' => "".$eymdhims)
),
'ComparisonOperator' => 'BETWEEN'
)
),
'ScanIndexForward' => false,
)
);
$count = 1;
foreach ($iterator as $item) {
if($count == 1){
echo "<table>\n";
echo "<tr><th>No.</th><th>日付</th><th>画像・情報</th>";
echo "<th>HashKey</th><th>RangeKey</th><th>HashKey01</th><th>RangeKey02</th><th>RangeKey03</th></tr>";
}
echo "<tr><td>".$count."</td><td>".$item['datetime']['S']."</td>";
echo "<td><a href=\"ImageData.php?b=".$item['s3backet']['S']."&k=".$item['s3key']['S']."\" target=\"_blank\">画像</a> ";
echo "<a href=\"DataGet.php?p=".$item['HashKey01']['S']."\" target=\"_blank\">情報</a></td>\n";
echo "<td>".$item['HashKey']['S']."</td><td>".$item['RangeKey']['S']."</td>";
echo "<td>".$item['HashKey01']['S']."</td><td>".$item['RangeKey02']['S']."</td><td>".$item['RangeKey03']['S']."</td></tr>";
$count++;
}
if($count > 1) echo "</table>\n";
if($count < 2) echo "<table><tr><td>該当するデータはありませんでした。</td></tr></table>\n";
} catch (DynamoDbException $exc) {
echo "<table><tr><td>エラーが発生しました : ".$exc->getMessage()."</td></tr></table>\n";
}
?>
<br /><br />
<a href="#" onClick="window.close(); return false;">閉じる</a>
</body>
</html>
<code>

AWS の S3 に保管したデータを EC2 の Webサーバから表示するPHPプログラム例です。

試作システム

</code>
<html>
<head>
<title>S3の画像</title>
<style type="text/css">

table {
border-collapse:collapse;
border-spacing:0;
background-color:#ffffff;
empty-cells:show;
}

th {
border-right:1px solid #663300;
border-bottom:1px solid #663300;
color:#ffffff;
background-color:#006400;
padding: 5px 4px;
text-align:center;
}

td {
border-right:1px solid #006400;
border-left:1px solid #006400;
border-top:1px solid #006400;
border-bottom:1px solid #006400;
padding:0.1em 0.3em;
}

.tdback {
background-color:#008000;
color:#ffffff;
}

h2 {
position: relative;
color: #ffffff;
background: #008000;
font-size: 16px;
line-height: 1;
margin: 0px 0px 5px 5px;
padding: 5px 5px 5px 10px;
border-radius: 5px 5px 5px 5px;
}

p {
margin:0 0 15px 5px;
}

a {
text-decoration:underline;
}
a:hover {
color: #ffffff;
background: #008000;
text-decoration:underline;
}

</style>

</head>

<body>
<h2>S3の保管画像</h2>
<?php

ini_set( 'display_errors', 1 );
ini_set('error_reporting', E_ALL);

$bucket = "";
if(isset($_REQUEST['b'])) $bucket = $_REQUEST['b']."";
$key = "";
if(isset($_REQUEST['k'])) $key = $_REQUEST['k']."";

?>
<table>
<tr><th>S3保管先画像ファイル => <?php echo $key; ?></th></tr>
<tr><td>
<?php
echo "<image src=\"Image.php?b=".$bucket."&k=".$key."\" />"
?>
</td></tr>
</table>
<br />
<a href="#" onClick="window.close(); return false;">閉じる</a>
</body>
</html>
<code>

 

</code>
<?php

ini_set( 'display_errors', 1 );
ini_set('error_reporting', E_ALL);

require_once('/usr/share/pear/AWSSDKforPHP/aws.phar');

use Aws\Common\Aws;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

$aws    = Aws::factory("/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php");
$s3     = $aws->get('s3');
$bucket = "";
if(isset($_REQUEST['b'])) $bucket = $_REQUEST['b']."";

$key = "";
if(isset($_REQUEST['k'])) $key = $_REQUEST['k']."";

if($bucket != "" && $key != ""){
$result = $s3->getObject(array(
'Bucket' => $bucket,
'Key' => $key
));
header("Content-Type: {$result['ContentType']}");
echo $result['Body'];

/*
$length = $result['ContentLength'];
$result['Body']->rewind();
$data = $result['Body']->read($length);
$filename = end(explode('/', $key));

header('Content-Type: application/octet-stream');
$disposition = 'Content-Disposition: attachment; filename="' . $filename . '"';
header($disposition);
$contentlength = 'Content-Length: ' . $length;
header($contentlength);
echo $data;
*/
}else{
header('HTTP/1.0 404 Not Found');
}
?>
<code>

前へ 目次

14.EC2 に AWS PHP SDK 開発環境を構築

前へ 目次 次へ

EC2にAWS PHP SDK で開発環境を構築するのは Raspberry Pi ほとんどと変わりません。

EC2ではpearのインストールでもトラブルは発生しません。

$ sudo yum install php-pear
$ sudo pear config-set auto_discover 1
$ sudo pear channel-discover pear.amazonwebservices.com
$ sudo pear install aws/sdk
$ sudo nano /usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php

 

</code>
return array(
'class' => 'Aws\Common\Aws',
'services' => array(

'default_settings' => array(
'params' => array(
'key' => 'アクセスキー',
'secret' => 'シークレットキー',
'region' => 'ap-northeast-1' // リージョン
)
),
(後略)
<code>


前へ 目次 次へ

13.Web用LinuxサーバをEC2に構築

前へ 目次 次へ

DynamoDB、S3に保管した Raspberry Pi からのデータを公開するWebサーバをEC2に立ち上げます。

EC2(仮想サーバ)に Amazon Linux サーバ環境を構築します。
といっても至って簡単。

コンソール画面からEC2を選びます。

管理コンソール EC2

Lunchi Instance で新しい仮想サーバを構築します。

EC2

Amazon Linux を選びます。

EC2

無償でお試しできる t2.micro を選びます。

EC2

EC2

Webサーバですので、http の 80 番ポートにアクセスできるよう設定します。

EC2 Security

EC2 Security

EC2の仮想サーバにはデータを保管しないので、Disk は最低の5GBで設定します。

EC2 HD Size

サーバの管理コンソールで表示される名前を設定します。

EC2 Name

ssh(暗号化リモート接続し、コマンドライン処理のためのソフト)用の鍵を作成します。
鍵は必ず保管します。(保管し忘れるとアクセスできなくなります。)

EC2 ssh access key

以上のように構築すると良いでしょう。

EC2

EC2

固定グルーバルIPアドレスを取得します。(必要な場合)

EC2 Global Address

EC2 Grobal Address

EC2 Grobal Address

その他は、以下のリンクを参照すると良いでしょう。

AWSのEC2でのウェブサーバーを簡単に構築する方法(株式会社LIG さん)
http://liginc.co.jp/web/programming/server/110507

【AWS】入門 EC2で10分でサーバ作成&ログイン(shade さん)
http://fanblogs.jp/kagayakibito/archive/126/0
EC2でWebサーバの用の環境を設定します。

$ sudo yum update
$ sudo yum upgrade

スワップの設定(推奨)

$ free
             total       used       free     shared    buffers     cached
Mem:       1020044     314672     705372          0      13520     234808
-/+ buffers/cache:      66344     953700
Swap:            0          0          0

$ sudo nano /root/swap.sh
#!/bin/sh
SWAPFILENAME=/swap.img
SIZE=1200000k
fallocate -l $SIZE $SWAPFILENAME && mkswap $SWAPFILENAME && swapon $SWAPFILENAME

$ sudo chown root.root /root/swap.sh
$ sudo chmod 755 /root/swap.sh
$ sudo /root/swap.sh
$ sudo nano /etc/rc.local
/root/swap.sh

$ free
             total       used       free     shared    buffers     cached
Mem:       1020044     355220     664824          0      31984      91440
-/+ buffers/cache:     231796     788248
Swap:      1199996          0    1199996

WebサーバとPHP環境の構築

$ sudo yum install httpd php php-mcrypt

$ sudo nano /etc/php.ini
(変更部分のみ記載)
default_charset = “UTF-8”
date.timezone = Asia/Tokyo

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
mbstring.substitute_character = none

$ sudo service httpd start
$ sudo chkconfig httpd on

FTPでコンテンツを転送する環境を整備(必要な場合のみ)

$ sudo yum install vsftpd ftp

$ sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.back
$ sudo nano /etc/vsftpd/vsftpd.conf
(変更部分のみ記載)
anonymous_enable=NO

ascii_upload_enable=YES
ascii_download_enable=YES

tcp_wrappers=NO

pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=60001
pasv_max_port=60099
pasv_address=<グルーバルIP>
use_localtime=YES
force_dot_files=YES

$ sudo adduser <FTPアカウント>
$ sudo passwd <FTPアカウント>

$ sudo service vsftpd start
$ sudo chkconfig vsftpd on
$ ftp localhost
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (localhost:ec2-user): <FTPアカウント>
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> by
221 Goodbye.

上記FTP環境に接続できるよう、EC2のセキュリティ設定に以下を追加します。

EC2 Security

EC2 Security

以上で、Webサーバの基本的な設定が完了します。

さらに細かな設定が必要な場合は、Apache、vsftp などのキーワードで検索すると良いでしょう。

前へ 目次 次へ

12.Amazon AWS S3に画像ファイルを保管

前へ 目次 次へ

Raspberry Pi から Amazon AWS S3 に画像ファイル、DynamoDB に保管場所と条件を記録するPHPプログラムを作成します。

先の距離センサプログラム /home/pi/pgm/awsphp/distance で、撮影した画像 /var/www/distance.jpg を S3 にアップし、DynamoDB に距離と保管時間、S3 のパスを記録します。
距離センサプログラムで画像保管後、このプログラムを実行すると一連の作業を自動化できます。

$ nano /home/pi/pgm/awsphp/ImageUp.php

 

</code>
#!/usr/bin/php
<?php
// SDK読込み
require_once('/home/pi/aws/vendor/autoload.php');

use Aws\Common\Aws;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use Aws\Sqs\SqsClient;
use Aws\Sqs\Exception\SqsException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

// 距離
$distance = "0";
if(isset($argv[1])) $distance = $argv[1];

// 現在日時取得
$now        = new DateTime();
$datetime   = $now->format('Y/m/d H:i:s');
$y          = $now->format('Y');
$m          = $now->format('m');
$d          = $now->format('d');
$h          = $now->format('H');
$i          = $now->format('i');
$i2         = floor($i / 10) * 10;
$s          = $now->format('s');
$aws        = Aws::factory("/home/pi/aws/vendor/aws/aws-sdk-php/src/Aws/Common/Resources/aws-config.php");

// S3 の処理
$s3         = $aws->get('s3');
$s3backet   = "demo-distance";
$s3dir      = $now->format('Ymd');
$s3file     = "/var/www/distance.jpg";
$s3key      = $s3dir."/".$now->format('Ymd_His').".jpg";

// SQS の処理
$sqserr     = $aws->get('sqs');
$queueURL   = $sqserr->getQueueUrl(array('QueueName' => "test-hub_error"));

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$HashKey    = "D001-PIC-DIST";            // Hash Key(データID)
$RangeKey   = $y * 10000000000 + $m * 100000000 + $d * 1000000 + $h * 10000 + $i * 100 + $s;    // Range Key(日時)
$RangeKey01 = $h * 10000000000 + $i * 100000000 + $s * 1000000 + $y * 10000 + $m * 100 + $d;  // Range Key(時日)
$RangeKey02 = $now->format('Ymd_His').".jpg".$RangeKey;                                                                            // Range Key(結果値順)

$HashKey01  = $y * 100000000   + $m * 1000000   + $d * 10000 + $h * 100 + $i2;  // Hash Key(日時)
$RangeKey03 = $HashKey.strval($h * 10000 + $i * 100 + $s);                                         // Range Key(データID+時刻)

// カメラ画像?
if(file_exists($s3file)){

// Dynamo へのデータ保管処理
$data = array();
try{

// S3 の処理
if(!$s3->isValidBucketName($s3backet)){
$s3->createBucket(array( 'Bucket' => $s3backet, 'LocationConstraint' => 'ap-northeast-1' ));
}
$handle = fopen($s3file, "r");
$result = $s3->putObject(array(
'Bucket' => $s3backet,
'Key'    => $s3key,
'Body'   => EntityBody::factory($handle),
'ContentType' => image_type_to_mime_type(exif_imageType($s3file))
));

// Dynamo の処理
// Key
$data['HashKey']    = $HashKey;                           // Hash Key(データID)
$data['RangeKey']   = strval($RangeKey);           // Range Key(日時)
$data['RangeKey01'] = strval($RangeKey01);    // Range Key(時日)
$data['RangeKey02'] = strval($RangeKey02);   // Range Key(結果値順)

$data['HashKey01']  = strval($HashKey01);   // Hash Key(データID)
$data['RangeKey03'] = $RangeKey03;             // Range Key(日時)

// Data
$data['datetime']  = $datetime;
$data['s3backet']  = $s3backet;
$data['s3key']     = $s3key;
$data['localpath'] = $s3file;
$data['distance']  = $distance;
$data['unit']      = "cm";

// Save
$result = $dynamo->putItem(array(
'TableName'              => $dynamoTbl,
'Item'                   => $dynamo->formatAttributes($data),
'ReturnConsumedCapacity' => 'TOTAL'
));

// エラー発生時はSQSに保管
} catch (S3Exception $exc) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'S3 => '.$exc->getMessage()) );
} catch (DynamoDbException $exc2) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'Dynamo => '.$exc2->getMessage()) );
}

// 画像削除
//unlink($s3file);

}else{
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'No Photography ! ( '.$s3file.' )') );
}
?>
<code>


続いて、以下は定期的に画像を撮影・保管し、そのファイルを S3  にアップし、DynamoDB に保管時間と S3 のパスを記録します。

$ nano /home/pi/pgm/awsphp/ImageUp.php

 

</code>
#!/usr/bin/php
<?php

// SDK読込み
require_once('/home/pi/aws/vendor/autoload.php');

use Aws\Common\Aws;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use Aws\Sqs\SqsClient;
use Aws\Sqs\Exception\SqsException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

// 現在日時取得
$now        = new DateTime();
$datetime   = $now->format('Y/m/d H:i:s');
$y          = $now->format('Y');
$m          = $now->format('m');
$d          = $now->format('d');
$h          = $now->format('H');
$i          = $now->format('i');
$i2         = floor($i / 10) * 10;
$s          = $now->format('s');
$aws        = Aws::factory("/home/pi/aws/vendor/aws/aws-sdk-php/src/Aws/Common/Resources/aws-config.php");

// S3 の処理
$s3         = $aws->get('s3');
$s3backet   = "demo-distance";
$s3dir      = $now->format('Ymd');
$s3file     = "/home/pi/data/".$now->format('Ymd_Hi').".jpg";
$s3key      = $s3dir."/".$now->format('Ymd_Hi').".jpg";

// カメラ画像取得
$imagecom = "sudo /opt/vc/bin/raspistill -t 1 -w 640 -h 480 -n -o ".$s3file;
exec($imagecom, $res);

// SQS の処理
$sqserr     = $aws->get('sqs');
$queueURL   = $sqserr->getQueueUrl(array('QueueName' => "test-hub_error"));

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$HashKey    = "D001-PIC-PERI";            // Hash Key(データID)
$RangeKey   = $y * 10000000000 + $m * 100000000 + $d * 1000000 + $h * 10000 + $i * 100 + $s;    // Range Key(日時)
$RangeKey01 = $h * 10000000000 + $i * 100000000 + $s * 1000000 + $y * 10000 + $m * 100 + $d;  // Range Key(時日)
$RangeKey02 = $now->format('Ymd_Hi').".jpg".$RangeKey;                                                                              // Range Key(結果値順)

$HashKey01  = $y * 100000000   + $m * 1000000   + $d * 10000 + $h * 100 + $i2;  // Hash Key(日時)
$RangeKey03 = $HashKey.strval($h * 10000 + $i * 100 + $s);                                         // Range Key(データID+時刻)

// カメラ画像?
if(file_exists($s3file)){

// Dynamo へのデータ保管処理
$data = array();
try{

// S3 の処理
if(!$s3->isValidBucketName($s3backet)){
$s3->createBucket(array( 'Bucket' => $s3backet, 'LocationConstraint' => 'ap-northeast-1' ));
}
$handle = fopen($s3file, "r");
$result = $s3->putObject(array(
'Bucket' => $s3backet,
'Key'    => $s3key,
'Body'   => EntityBody::factory($handle),
'ContentType' => image_type_to_mime_type(exif_imageType($s3file))
));

// Dynamo の処理
// Key
$data['HashKey']    = $HashKey;                         // Hash Key(データID)
$data['RangeKey']   = strval($RangeKey);         // Range Key(日時)
$data['RangeKey01'] = strval($RangeKey01);  // Range Key(時日)
$data['RangeKey02'] = strval($RangeKey02);  // Range Key(結果値順)

$data['HashKey01']  = strval($HashKey01);     // Hash Key(データID)
$data['RangeKey03'] = $RangeKey03;               // Range Key(日時)

// Data
$data['datetime']  = $datetime;
$data['s3backet']  = $s3backet;
$data['s3key']     = $s3key;
$data['localpath'] = $s3file;
$data['command']   = $imagecom;

// Save
$result = $dynamo->putItem(array(
'TableName'              => $dynamoTbl,
'Item'                   => $dynamo->formatAttributes($data),
'ReturnConsumedCapacity' => 'TOTAL'
));

// エラー発生時はSQSに保管
} catch (S3Exception $exc) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'S3 => '.$exc->getMessage()) );
} catch (DynamoDbException $exc2) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'Dynamo => '.$exc2->getMessage()) );
}

// 画像削除
unlink($s3file);

}else{
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'No Photography ! ( '.$s3file.' )') );
}
?>
<code>


前へ 目次 次へ

11.Amazon AWS DynamoDB にセンサの計測値を記録

前へ 目次 次へ

Raspberry Pi から Amazon AWS DynamoDB にセンサの計測値を記録するPHPプログラムを作成します。

今回はセンサの値にプラスして、Raspberry Pi 機器の稼働環境情報も一緒に記録します。

CPUの使用率を計算するシェルプログラムを作成します。

$ nano /home/pi/pgm/awsphp/cpu.sh

</code>
#!/bin/bash
CUR=/proc/stat
USER=$(whoami)
PRE=/tmp/${USER}-prestat
if [ ! -f $PRE ]; then
  head -1 $CUR > $PRE
  exit 1
fi
awk '
  /cpu /{
        if (match(FILENAME,"prestat")) {
                pretotal = $2+$3+$4+$5; preidle = $5;
        } else {
                ctotal = $2+$3+$4+$5; cidle = $5;
        }
  }
  END {
        dtotal = ctotal - pretotal
        didle = cidle - preidle
        printf("%d",(((dtotal - didle) * 100) / dtotal),37)
  }
' $PRE $CUR
head -1 $CUR > $PRE
<code>


データを DynamoDB にアップするPHPプログラムを作成します。

$ nano /home/pi/pgm/awsphp/DataUp.php

</code>
#!/usr/bin/php
<?php

// SDK読込み
require_once('/home/pi/aws/vendor/autoload.php');
use Aws\Common\Aws;
use Aws\Sqs\SqsClient;
use Aws\Sqs\Exception\SqsException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

// 現在日時取得
$now        = new DateTime();
$datetime   = $now->format('Y/m/d H:i:s');
$y          = $now->format('Y');
$m          = $now->format('m');
$d          = $now->format('d');
$h          = $now->format('H');
$i          = $now->format('i');
$i2         = floor($i / 10) * 10;
$s          = $now->format('s');
$aws        = Aws::factory("/home/pi/aws/vendor/aws/aws-sdk-php/src/Aws/Common/Resources/aws-config.php");

// データ取得
$cputemp   = "999";        // CPU温度
$cputempky = "99999";
$com = "cat /sys/class/thermal/thermal_zone0/temp";
exec($com, $res1);
if(isset($res1[0])){
    $cputempky = trim($res1[0]);
    $cputemp = intval($cputempky) / 1000;
}

$cpuused = "0";        // CPU使用率
$com = "/home/pi/pgm/awsphp/cpu.sh";
exec($com, $res2);
if(isset($res2[0])) $cpuused = $res2[0];

$memused = "0";        // メモリ使用率
$com = "cat /proc/meminfo | awk '/MemTotal/ {printf($2)}'";
exec($com, $res3);
$com = "cat /proc/meminfo | awk '/MemFree/ {printf($2)}'";
exec($com, $res4);
if(isset($res3[0]) && isset($res4[0])) $memused = round((($res3[0] - $res4[0]) / $res3[0] * 100), 1);

$airtemp = "999";        // 温湿度
$airhum  = "999";
$res5    = array();
$com = "sudo /home/pi/pgm/awsphp/temp_hum2";
exec($com, $res5);
if(isset($res5[1])) $airhum  = trim($res5[1]);
if(isset($res5[3])) $airtemp = trim($res5[3]);

// SQS の処理
$sqserr     = $aws->get('sqs');
$queueURL   = $sqserr->getQueueUrl(array('QueueName' => "test-hub_error"));

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$HashKey    = "D001-CPU-TEMP";            // Hash Key(データID)
$RangeKey   = $y * 10000000000 + $m * 100000000 + $d * 1000000 + $h * 10000 + $i * 100 + $s;    // Range Key(日時)
$RangeKey01 = $h * 10000000000 + $i * 100000000 + $s * 1000000 + $y * 10000 + $m * 100 + $d;    // Range Key(時日)
$RangeKey02 = $cputempky.$RangeKey;                                                                // Range Key(結果値順)

$HashKey01  = $y * 100000000   + $m * 1000000   + $d * 10000 + $h * 100 + $i2;                    // Hash Key(日時)
$RangeKey03 = $HashKey.strval($h * 10000 + $i * 100 + $s);                                        // Range Key(データID+時刻)

// Dynamo へのデータ保管処理
$data = array();
try{
    
    // Key
    $data['HashKey']    = $HashKey;            // Hash Key(データID)
    $data['RangeKey']   = strval($RangeKey);   // Range Key(日時)
    $data['RangeKey01'] = strval($RangeKey01); // Range Key(時日)
    $data['RangeKey02'] = strval($RangeKey02); // Range Key(結果値順)
    
    $data['HashKey01']  = strval($HashKey01);  // Hash Key(データID)
    $data['RangeKey03'] = $RangeKey03;         // Range Key(日時)
    
    // Data
    $data['datetime']  = $datetime;
    $data['cpu_temp']  = "".$cputemp;
    $data['cpu_unit']  = "*C";
    $data['cpu_used']  = "".$cpuused;
    $data['cpu_unit2'] = "%";
    $data['mem_used']  = "".$memused;
    $data['mem_unit']  = "%";
    
    // Save
    $result = $dynamo->putItem(array(
        'TableName'              => $dynamoTbl,
        'Item'                   => $dynamo->formatAttributes($data),
        'ReturnConsumedCapacity' => 'TOTAL'
    ));
    
    if($airtemp != "999" || $airhum != "999"){
        $data = array();
        
        // Key
        $data['HashKey']    = "D001-AIR-TEMP";     // Hash Key(データID)
        $data['RangeKey']   = strval($RangeKey);   // Range Key(日時)
        $data['RangeKey01'] = strval($RangeKey01); // Range Key(時日)
        $data['RangeKey02'] = $airtemp.$RangeKey;  // Range Key(結果値順)
        
        $data['HashKey01']  = strval($HashKey01);                                  // Hash Key(データID)
        $data['RangeKey03'] = $data['HashKey'].strval($h * 10000 + $i * 100 + $s); // Range Key(日時)
        
        // Data
        $data['datetime']   = $datetime;
        $data['air_temp']   = "".$airtemp;
        $data['temp_unit']  = "*C";
        $data['air_hum']    = "".$airhum;
        $data['hum_unit']   = "%";
        
        // Save
        $result = $dynamo->putItem(array(
            'TableName'              => $dynamoTbl,
            'Item'                   => $dynamo->formatAttributes($data),
            'ReturnConsumedCapacity' => 'TOTAL'
        ));
    
    }
    
// エラー発生時はSQSに保管
} catch (DynamoDbException $exc2) {
    $sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'Dynamo => '.$exc2->getMessage()) );
}
?>
<code>


後は cron で実行するだけです。

前へ 目次 次へ