【アキハバラIoTツアーズレポート@おてらver】ラズパイから出勤状況をツイートするぞい!

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは、初めて自分のラズパイを購入して色々やってみました、おてらです。

去る7月30日(土)に以前より告知しておりました「アキハバラIoTツアーズ」を開催しました!イェイ!

当日の秋葉原は灼熱の天気に見舞われ、熱中症になりそうなほどでしたがお集まり頂いた皆さんのおかげで非常に楽しいイベントとなりました。

おてらverとして、私が作成したものを中心に当日を振り返ります!

おてらのテーマ

と、その前に僕が今回作ったものとテーマについて説明しよう!!

 

僕が今回作るにあたって考えたテーマは「ザ・IoT入門」です。

小難しいIoTのイメージを出来るだけ払拭するため、中の仕組みはともかくその結果出来ることは「シンプルなこと」にしたかったのでこのテーマにしました。

 

何とな~くTwitterを使いたいな~と思っていて、何かいい案はないかと探していたらIoT NEWSさんの以下の記事がヒットしました。

AWS IoTのAmazon Lambdaをつかって、「ボタンを押すとツイートする」を実現してみた

これ面白そう!と思ったのでこちらを参考にさせていただきました。

出来上がるものは、ラズパイにタクトスイッチを取り付けて押したスイッチに応じて出勤と退勤を時刻を付けてツイートする、というものです。

構成図はこんな感じ。

diagram_otera

  1. ラズパイに取り付けたタクトスイッチを押す
  2. AWS IoTへデータを送信
  3. MQTTでAWS Lambdaへ通知
  4. AWS LambdaでTwitterにつぶやくスクリプトを実行、つぶやかれる!

といった流れです。

 

これを作るのに前日の金曜日から準備をしていたわけですが、micro SDのフォーマットが上手くいったのかよく分からなかったりOSインストールはがせさんにやって貰っちゃったり自分の未熟さに情けなさを感じました~。ぐにゃあ~。

 

そんなこんなでラズパイの環境は前日に用意できました。

それでは当日のレポートに戻ります。

 

 

ア゛ッ!遅刻したッ!!

当日は10時にJR秋葉原駅 電気街口に集合の予定だったのですが、思いっきり乗りたかった電車に間に合わず10分ほど遅れてしまいました!みなさま大変申し訳ありませんでした!m(_ _)m

決してポケモンGOで自宅近くにフシギバナが出現しててそれを捕まえに行ってたからとかそういうことじゃありません!(ホントにフシギバナが出現してましたがさすがに諦めました…。)

 

秋葉原まで残り2駅のところで上司から

上司「みんな着いてるよ~」

のメッセンジャー。

 

ヤベェ、ヤベェよ…。恐らく上司はこんな感じだったことでしょう。

hayakushiro

※イメージです。

会場到着

会場はJR秋葉原駅から徒歩1分のところにあるAssemblageさんです。

アクセス方法の通りに進んでお店に入ると、私以外のメンバーは既に全員揃っていて説明が始まっていました。ホントすみません!

 

一通り説明が終わるとみんなPCを用意したりラズパイを用意したり準備に取り掛かります。

いよいよアキハバラIoTツアーズ開始です!

アキハバラIoTツアーズスタート!

パーツの買出し

11時ごろから色々なお店が開店するので、必要なパーツ類をそれぞれ買出しに行きます。

僕が必要なものは

  • ブレッドボード×1
  • ジャンパワイヤー(オス-メス)
  • ジャンパワイヤー(オス-オス)
  • 4つ足のタクトスイッチ×2
  • 抵抗(10kΩ)×2

です。

なお、ラズパイはRaspberry Pi Model Bを使っています。Amazonで買いました。

Raspberry Pi3 Model B ボード&ケースセット (Element14版, White)

僕はPrime会員なのでポチった翌日に届きました。Prime会員オススメです。

 

 

秋葉原でパーツといえば秋月電子通商さんですね。みんなでそこへワイワイと買出しに行きました。

僕は初めて秋月電子通商さんに行ったんですが、人の多さに驚きました!

電子工作が好きな人がこんなにいっぱいいるんですね~!すごい!

 

ひとまず必要なパーツ類の場所を確認し、何とか上記のパーツを確保!合計で1400円ほどで揃いました。

 

そのあとはキッチンジロー外神田店さんでランチ。和風ハンバーグと魚フライのセットを頂きました。いと美味し。

 

製作開始!

お腹も満たされたところでAssemblageさんに戻っていざIoTデバイスの製作開始です。

 

前日にラズパイのセッティングをしていたのですが、ラズパイに固定IPを振るのを忘れていてSSHでログインするのに一苦労でした…。最終的に他の参加者のモバイルWi-Fiをお借りして、お店の方にモニターもお借りして、持参したBluetoothマウスとキーボードを使ってGUIから無線LANの設定を行い、ラズパイにローカルIPを振って何とかPCと通信できるようになりました。

 

そしていざSSHでログインしようとすると、なぜかラズパイから「接続を拒否」されてしまう!!何でだ!?

 

またもパニックになるおてら。

iptables?SELinux?とか諸々疑いましたが違う…。時折聞こえてくるググれカスの声…。ググっとるわ!

 

netstatコマンドで22番ポートリッスンしてるよな?と確認したところ、何と1022番ポートがリッスンしていた!!

そう、前日ラズパイをセッティングした時に自分でSSHのポートを22番から1022番に変更していたのだった!!何という愚かさ。愚の骨頂である!!

 

そんな愚かな行為で時間を大分無駄に使ってしまい、ようやくノートPCからラズパイを操作できるように。時間掛かりすぎた。

準備は整った!

ここからデバイス作成の説明に入ります!

 

Twitterの連携準備

ラズパイからTwitterにつぶやくためにTwitterのAPIを準備します。

Twitter Application Managementにアクセスします。

他にアプリケーションを作っていれば下記の画像のように作成したアプリケーションの一覧が表示されますが、何も作っていなければ「Create New App」のボタンだけです。

「Create New App」ボタンをクリックしてアプリケーションを作成しましょう。

createnewapp_twitter

入力必須項目があるので埋めていきます。

上から順に、

  • Name:アプリケーションの名前。一意である必要があります。
  • Description:アプリケーションの説明。日本語可。
  • Web site:必須となっていますが、注意書きにもあるようにURLを持っていなければ代わりのものを設定してよい。自分のTwitterのURLでいいでしょう。

こんな感じで入力していきましょう。

最後に利用規約に同意するチェックを入れ、「Create your Twitter application」をクリックします。

※Twiiterアカウントの認証で、電話番号を登録していないとここから先に進めないようなので、電話番号の登録を進めてください。

createapp

アプリケーションが作成されたら以下のような画面になります。

ここで、「Access level」が「Read and write」になっていることを確認します。外部からツイートを行うためRead and writeでないとツイートできません。Read and writeになっていなければ、modify app permissionsから変更します。

app_setting

続いて「Keys and Access Tokens」タブを選択します。

ここにはAPIを利用するためのキーが書かれていますのでこれをメモしましょう。

必要なのは以下の4つです。

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access Token Secret

この内、Access TokenとAccess Token Secretはデフォルトでは存在していないので「Create my access token」をクリックして作成します。

key_settings

するとこんな感じで作成されますのでこちらもメモしましょう。

access_token

 

これで外部からTwitterを利用するためのAPIが作成されましたので、これらのキーを使ってラズパイからツイートするプログラムを作ります。

プログラムの準備

Twitterライブラリをインストール

ラズパイにTwitterのJavascript用のライブラリをインストールします。

※事前にnpmコマンドなどが使えるように準備しておいてください。

npm install twitter

インストールすると「node_modules」というディレクトリが作成され、その中に「twitter」というディレクトリがあると思います。

ツイートするプログラム「tweet.js」を作成

先ほど取得したキーを使ってスクリプトを作成します。

***で示した箇所は取得したそれぞれの値を入れ込んでください。

var Twitter = require('twitter');

var client = new Twitter({
	consumer_key: '*********************',
	consumer_secret: '*********************',
	access_token_key: '*********************',
	access_token_secret: '*********************'
});

exports.handler = function(event, context) {
	var params = {status: event.message};
	client.post('statuses/update', params, function(error, tweet, response){
		if(error) throw error;
		context.succeed(params.status);
	});
}

※ソースコードをコピーする際は、「’」(シングルクォーテーション)などが全角になっている場合がありますので注意してください。

 

スクリプトを作成したら「Tweet」というディレクトリを作り、そこの中に以下のような階層構造にして「Tweet」をzip化します。

[Tweet] ⇒ このディレクトリをzip化
├ [node_modules]
| └ [Twitter]
└ tweet.js

zip化したものをAWSへアップロードしますので、アップロード出来るようにラズパイからPCへSCPなどで移しておくといいでしょう。

AWS Lambdaの準備

マネジメントコンソールからAWS Lambdaを選択し、functionを作成します。

create_lambda_function

以下のような画面が表示されますが、特に指定する必要はないので「Next」をクリックして次へ進みます。

create_lambda_function02

次に進むと以下のような画面が表示されます。

後ほどAWS IoTの設定が済んでからトリガーとして登録することになりますので今は空欄のまま次へ進みます。

 

詳細設定の画面に移りますので以下のように入力します。

Code entry typeは「Upload a .ZIP file」を選択し、先ほど作成したzipファイルをアップロードします。

Roleに関して、Lambda実行用にRoleを用意する必要がありますのでLambda用のRoleがない方は「Create a custome role」を選択して「lambda_basic_execution」というRoleを作成しましょう。

create_lambda_function04

確認画面になりますので、問題なければ「Create function」ボタンをクリックして作成します。

create_lambda_function05

以下のような表示が出れば無事Lambda functionの作成が完了しました。

create_lambda_function06

続いてAWS IoTの設定に移ります。

AWS IoTの準備

続いてAWS側の準備を進めていきます。AWSのマネジメントコンソールにログインし、AWS IoTを開きます。

management_console

ルールの作成

まずLambdaをキックするためのルールを作ります。

「Create a rule」をクリックし、以下のように入力していきます。

making_rule01

下半分もこんな感じで。

「Choose an action」では先ほど作成したLambda functionを選択するため、一番下にある「Insert this message into a code function and execute it (Lambda)」を選択します。

選択したら「Add action」ボタンをクリックして登録します。登録できるとLambdaのアイコンが表示されると思いますので、その状態になったら「Create」ボタンをクリックします。

これでルールが作成されました。

making_rule02

認証用の証明書、秘密鍵、公開鍵の作成

ラズパイからAWS IoTへ通信させるためにAWS IoTで認証用の証明書や鍵を作成し、それをラズパイにインストールします。

「Create a certificate」を選択し、「Activate」にチェックを入れてから「1-Click certificate create」をクリックします。これだけで証明書と鍵が作成されます!とっても簡単ですね!

なお、「Activate」にチェックを入れ忘れても後で設定を変えることが出来ますのでご安心を。

making_certificate

ボタンをクリックすると作成された証明書のリンクが表示されるのでこちらから証明書をダウロードします。

making_certificate02

証明書をダウンロードしたらSCPなどでラズパイに転送しましょう。

ポリシーの作成

先ほど作成した証明書や鍵とポリシーを関連付けることで、その証明書と鍵を使っている端末からAWS IoTにアクセスする許可を付与することが出来ます。

「Create a policy」を選択し、以下のように入力します。

今回は対象のラズパイからは何でも出来るような権限にしますが、必要に応じて適切なポリシーを設計してください。

  • Name:任意
  • Action:iot:*
  • Resource:*
  • Allow:チェックを入れる

「Add statement」をクリックし、ポリシー内容を登録してから「Create」ボタンをクリックします。

making_policy01

鍵とポリシーを関連付ける

作成した鍵とポリシーを関連付けます。

作成した鍵を選択し、画面右にある「Actions」のプルダウンから「Attach a policy」を選択します。

attach_policy

ポップアップが出てどのポリシーを適用するか聞かれますので先ほど作成したポリシーを選択して「Attach」をクリックします。

attach_policy02

これで関連付けは完了です。

シマンテック社のRoot CA証明書をダウンロード

以下のURLからシマンテック社の証明書をダウンロードして利用します。ファイル名は「aws-iot-rootCA.crt」とします。

https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem

ダウンロードしてSCPで転送するもよし、ラズパイから直接アクセスしてコピペするもよし。

IoTデバイス作り

最後にデバイス作りです。

ラズパイのGPIOとブレッドボードをジャンパワイヤでつなぎ、スイッチを押せるようにします。これはIoT NEWSさんの記事にある作り方をそのまま参考にさせていただきました。

一応以下のような感じになったのですが、ワイヤの色とか全然考えずに購入してしまったので青と緑の2色だけで構成されており、非常に分かりづらくなりました…。

device

続いてスイッチを押すとツイートさせるためのトリガーとなるスクリプトをラズパイに仕込みます。

PORT1=15
PORT2=25
START="今日も1日頑張るぞい!"
FINISH="今日も1日お疲れ様でした!"

gpio -g mode $PORT1 in
gpio -g mode $PORT2 in

echo "ボタンを押すんじゃよ"
while true ; do
	if [ `gpio -g read $PORT1` -eq 1 ]; then
		echo "出勤ボタンが押されたぞい!"
		TIME=`date +%H:%M`
		mosuquitto_pub -cafile keys/aws-iot-rootCA.crt -cert keys/**********.pem.crt -key keys/***********.pem.key -h 'AWS IoTのエンドポイント' -p 8883 -q 1 -d -t topic/myTweet -i clientid1 -m "{\message\": \"$START $TIME\"}"
	fi

	if [ `gpi0 -g read $PORT2` -eq  1 ]; then
		echo "退勤ボタンが押されたぞい!"
		TIME=`date +%H:%M`
		mosuquitto_pub -cafile keys/aws-iot-rootCA.crt -cert keys/**********.pem.crt -key keys/***********.pem.key -h 'AWS IoTのエンドポイント' -p 8883 -q 1 -d -t topic/myTweet -i clientid2 -m "{\message\": \"$FINISH $TIME\"}"	
	fi

	sleep 0.1
done

AWS IoTのエンドポイントは各AWSアカウントに存在しています。

確認するにはAWS CLIが必要なのでラズパイにAWS CLIをインストールするところから始めます。

AWS CLIのインストール及び設定

以下のコマンドでインストールします。

sudo apt-get install awscli

インストールできたら初期設定を行います。

aws configure
AWS Access Key ID [None]: #利用しているAWSアカウントのAccess Key ID
AWS Secret Access Key [None]: #利用しているAWSアカウントのSecret Access Key
Default region name [None]: ap-northeast-1
Default output format [None]: #jsonでいいと思います。

これで準備完了です。

AWS IoTのエンドポイントを確認するために以下のコマンドを実行します。

aws iot describe-endpoint
{
"endpointAddress": "***********.iot.ap-northeast-1.amazonaws.com"
}

これでエンドポイントが確認できたのでスクリプトに設定して準備完了です。

いざテスト!!

さぁ準備は整った!あとはラズパイ上でiot_button.shを実行させ、スイッチを押せばその内容がツイートされる(はず)!!

まずは上側のタクトスイッチを押す。出勤のツイートがなされるはず!

 

 

ぽちっとな。

 

ボタンを押すんじゃよ
Client clientid1 sending CONNECT
Client clientid1 received CONNACK
Client clientid1 sending PUBLISH (d0, q1, r0, m1, ‘topic/myTweet’, ... (45 bytes))
Client clientid1 received PUBACK (Mid: 1)
Client clientid1 sending DISCONNECT

コマンドライン上に上記のメッセージが流れました。おぉ、上手くいっとるやないか。

 

じゃあ退勤の方はっと…。

 

ぽちっとな。

 

ボタンを押すんじゃよ
Client clientid2 sending CONNECT
Client clientid2 received CONNACK
Client clientid2 sending PUBLISH (d0, q1, r0, m1, ‘topic/myTweet’, ... (60 bytes))
Client clientid2 received PUBACK (Mid: 1)
Client clientid2 sending DISCONNECT

 

おぉ、こっちも大丈夫そうだ~。

 

さぁTwitterは?

 



ツイートされない!!

 

なぜだー!?

 

何度やってもコマンドライン上は問題なさそうで、AWS IoTに通信は行っているようでした。

 

となると問題はLambdaだと思われるので確認。

するもどう確認していいかよく分からず(^^;

 

Cloudwatchにログが出力されているのでエラーが出ていないか確認すると、なにやら「モジュールが読み込めない」的なエラーが。

恐らくZip化してアップロードしたファイルがよろしくないのかもしれない。

 

ということで同じ手順を1からやり直して何度か挑戦してみましたが、結局ツイートすることは出来ず…。

 

上司「皆さん、残りも1時間になりました。そろそろ本気モードでお願いします。」

 

上司「だいたいエンジニアの人ってギリギリになってニュータイプになるから」

 

うおおおおおお!トランザム!!

transam

 

タイムアップ

僕はトランザムできませんでした。

無念…。

メイドカフェで発表会

今回のハッカソンで各々が作成したIoTデバイスは、メイドカフェにて他のお客さんもいる中で発表会を行い、メイドさんに優勝者を決めてもらいます。

会場となったのはめいどりーみん外神田一丁目店さんです。

僕はメイドカフェなるお店には人生で1回しか行ったことがなく、その1回でかなり精神(スピリチュアル)ポイントを持っていかれた過去を持ちます。

motteikareta

※イメージです。

 

今回も入り口からメイドさん特有の「~にゃん」とか「美味しくなる魔法を~」とか「ご用の際は”にゃんにゃん”って言わないと気づかないにゃん♪」とかもう僕のライフは0です。

天空の城出身の女の子がなぜか人間界でメイドさんになっていて、1時間に一度ライブということでアニソンやニコニコ動画で流れる曲を歌ったり踊ったりするという我々一般人が抱く疑問には突っ込んではいけないんだろうなぁ。

 

常にいてつくはどうを放つ上司常にアストロン状態の心を持ったメイドさんの奇跡の掛け合いが織り成されつつ、飲み食いしながら発表の準備を進めます。

 

結果、僕の作った(完成してない)ものはシンプルなのでメイドさんの心には割と響いたようですが、優勝することは出来ませんでした。無念。

 

終わりに

今回第1回目のアキハバラIoTツアーズということで初めてラズパイを触り、6年ぶりくらいにブレッドボードを触りました。

完成できなかったのが非常に悔やまれますので、後日ちゃんと完成させてこのブログで改めて報告させてください。

 

AWSと連携したりTwitterと連携したり、ラズパイの可能性の広さに改めて感動しましたね~。

また、Assemblageさんはお店がガラス張り、というかカーテンの無い窓なので道行く人が中で工作している人の様子を見ることが出来ます。夏休みということもあってかお父さんと一緒にやってきた小さな男の子が食い入るように見ていたのを見て自分の小さい頃を少しだけ思い出しました。

 

その他の参加者の方々も、僕にはない発想で色々なIoTデバイス、システムを作り上げていて非常に刺激的でした。

3月にもIDCフロンティアさんのハッカソンに参加しましたが、やはりみんなでワイワイ工作したり、エンジニアあるあるで盛り上がったり、ガン○ムやジョ○ョネタで笑ったり出来るのは非常に楽しいですね。

 

次回は秋にもまたやりますのでご興味のある方は是非ともご参加をお待ちしております!

SNSでもご購読できます。

コメントを残す