Blog

ブログ

ラズパイ で電子ロッカーを作る!(IoTネットワーク構成編)

今回の記事を担当するエンジニアの榎本です。
これまでの記事

電子ロッカー開発始めます → 電子ロッカー開発に至った経緯など
ラズパイ で電子ロッカーを作る!(物理構成編)→ 機器や配線など物理的な構成に関する記事

ラズパイ で電子ロッカーを作る!(ソフトウェア編)→プログラムについて

ここでは、AWSのEC2インスタンス上(EC-CUBE)で動いている「ご近所マルシェ Joolen」がどのようにして「電子ロッカーを開ける」という制御を行っているのかを説明していきます。

ネットワーク構成

IoT構成図

このようになっています。AWSとラズパイ 間の通信のプロトコルにはMQTTを採用しました。

MQTTは簡単にいうと、データを配信するためのプロトコルです。
「非力なデバイスやネットワークが不安定な場所でも動作しやすいように、メッセージ通信電文が軽量に設計されていることが特徴(Wikipediaより抜粋)」で、ラズパイ のような小さなコンピュータでも難なく扱えます。
Web socketにも似ていて、メッセージがPublish(送信)されると簡単に受けてはそのメッセージを拾うことができます。

AWSからラズパイ へのメッセージングに Web APIを使うことも検討しましたが、IoT機器にはセキュリテイ上、固定IPを持たせたくないという思いもありましたので今回の構成になりました。

今回のマルシェではEC2インスタンス上で、EC-CUBEは動いていますが「ロッカーの鍵を開けて!」というタイミングで メッセージを 送信(Publish)しています。流れとしては下記の通りで、仕組みとしては非常にシンプルなものです。
・解錠用のメッセージをMQTT Broker に対して 送信 (Publish)
・ロッカー(ラズパイ)は、MQTT Brokerのメッセージを監視(Subscribe)。MQTT BrokerへのPublishを検知したら後続の処理を行う。

AWSからラズパイ への通信

さて、ここからが本題です。
MQTTのやりとりをするためのサーバ(MQTT Broker)はAWS IoT Coreを採用しました。このIoT Coreへの接続は証明書を使う必要があります(ドキュメント)。
ラズパイ に 証明書を保存して接続、ということも当然可能ですが、小さなIoT機器にセキュリティ情報となる証明書を入れておくのは最善手とは言えません。

ということでIoT 専用のデータ転送サービスSORACOM Beamを使っての接続を行うことにしました。(SORACOM を使った双方向通信のデザインパターンはSORACOMさんによってまとまっています。)
このサービスは証明書の管理や脆弱性への対応等の煩雑な処理をクラウドにオフロードすることができるので、ラズパイ に証明書を保存する必要はありません。

 

下記の通り、ラズパイ 側ではAWS IoT Coreの認証情報を意識することなく接続することが可能です。

SORACOM Beamは非常に安価(1 リクエスト(*) あたり 0.00099 円)かつ、 1アカウントあたり月間 100,000 リクエストまでの無料枠もあるのでとても使いやすいサービスだと思います!

IoTは特にセキュアな接続を心がけていきたいですね。

ご近所マルシェ Joolen稼働中です!

※現在、アトレ松戸 3Fでご近所マルシェ ジョーレン で購入したものを受け取り可能です!(アトレ松戸での2021/5/23まで)

ありがとうございました。

ラズパイ で電子ロッカーを作る!(ソフトウェア編)

今回の記事を担当するエンジニアの榎本です。

これまでの記事

電子ロッカー開発始めます → 電子ロッカー開発に至った経緯など

ラズパイ で電子ロッカーを作る!(物理構成編)→ 機器や配線など物理的な構成に関する記事

ここからは Raspberry Pi上で動くプログラムについて書いていきます。

今回Raspberry Pi側で採用したプログラム言語について

Node-REDというビジュアルプログラミングツールを採用しました。Node-REDとは何かというと。。。

Node-REDはハードウェアデバイス、APIおよびオンラインサービスを新しく興味深い方法で接続するためのツールです。ブラウザベースのエディタによってパレットに並ぶ多種多様なノードを結びつけて用意にフローを作成でき、さらにシングルクリックで実行環境にデプロイすることができます。

Node-RED日本ユーザー会トップページより引用

とのこと。
つまり、ブラウザからノードと呼ばれるブロックを線でつなげて思い通りにデバイスを動かせる素敵な言語になります。名前から推察できる様に、Node.js上で構築されてますので、必要に応じて Javascriptでのコーディングまでできるので、編集が容易かつ柔軟性が高い言語となっています。

コードエディタはこんな感じ

画面上で「再起動」などと書かれているかボックスがノードとなります。各処理をつなげてやりたいことを実現できます。

電子ロッカーを構成する各種ノードの紹介

Injectノード
上記コードエディタ左側の「timestamp」と書かれているノードです。時間を指定して処理を起動することができます。

Execノード
上記コードエディタで「再起動」と書かれているノードです。このノードでコマンドの実行を行うことができます。この場合は下記のコマンドを実行することで再起動を実現しています。

sudo shutdown -r now

つまり上述2つのノードの組み合わせで、「毎朝7時に再起動をする」という命令が組み立てられます。非常に分かりやすくて便利ですね。

MQTTノード
今回の電子ロッカーは

ECサイトからの命令をAWS IoT CoreのMQTTへPublish

ラズパイ 側で該当のTopicをSubscribeしメッセージの受信をきっかけに鍵を操作

することで解錠・施錠の実行を実現しています。Node-REDはMQTT処理に必要なノードが用意されているので非常に簡単にこの処理を実行することができます。
入力側のmqttが Subscribeで 出力側がPublishになります。
ノードには MQTT Broker となるサーバの情報・トピック・QOS(=Quality Of Service)を設定することで簡単にPublish/Subscribeを実現できます。(見落としがちですが、QOSはPublish側と合わせる様にしましょう!私はここの数値が食い違っていたために数時間ハマりました。。。)

ノードの設定画面
↑↑MQTT Brokerの設定画面↑↑

余談ですがMQTT Brokerは AWS IoT Coreを SORACOM Beam経由で使っています。AWS IoT Coreの認証を肩代わりしてくれるので ラズパイ 側に証明書などを持つ必要がないことがメリットになります。(これはまた後日記事にします)

PCA9685ノード

こちらは標準のノードではないので、パレットの管理から自分で追加する必要があります。Node-REDのホームページにサンプルを含め説明が載っています。

ノードの追加はこの画面から可能です。
PCA9685ノードの編集画面

基本的には
1. PCA9685 Deviceで対象のデバイスを選択(デバイスの設定方法は下記に記述)
2. Channelはターゲットになる PCA 9685 の チャネルを選択 (直接指定でも良いし、msg.channel という変数に設定した数値でも良い)
3. Unitはサーボモータを動かしたいときは、「microseconds」 LEDを点灯させたりしたいときは「Percent」を選択しましょう。

デバイスの設定画面

PCA9685を指定する画面です。ラズパイ 側で下記の通りになっていれば特に変更する必要はありません。
※Addressは下記の画面で 0x40(=64)であることが確認できます。

例) 15個の扉の解錠を行い、操作がされた時にLEDを点滅させるためのフローは下記の様になります。
1. open_1_all へのメッセージの Publishをトリガーにしてフローが起動
2-1. サーボモータを動かす
  2-1-1. サーボモータを140度回転した位置にするためmsg.payloadに値を設定
  2-1-2. PCA9685 ノードを経由して1〜15チャネルに命令を出す
2-2. LEDを点滅させる
  2-2-1. 0番のチャネルに接続されたLEDを点滅させる
2-3. MQTTメッセージを受け取ったことを送信元のプログラムへ返却するため、受け取ったランダムな文字列をそのまま返却用のMQTTトピックにPublishする

他に大きなポイントとして、ラズパイ の死活監視に使っているlwm2ノードがあるのですが、これは監視についての記事で触れたいと思います。

次回は電子ロッカーのネットワークや、利用しているSORACOMのサービスについて触れていきたいと思います!

ラズパイ で電子ロッカーを作る!(物理構成編)

新規事業を担当している榎本です。
前回の記事で、私たちがなぜ電子ロッカーを作るという決定をしたのか記載しました。では早速、ロッカーを動かすための物理的な構成を書いていきます!

全体図

まずは全体図の写真です。かなりシンプルな構成ですね。基本的にECサイトから受け取った「ロッカーの解錠・施錠」に関する命令をラズパイ が受け取って複数のサーボモータに伝達する形で実現しています。

※見やすくするためにサーボモータ などは外した状態で撮影しています。

機器について一つずつ解説していきます。

機器名称役割
Raspberry Pi Zero WH電子ロッカーの心臓部。
内部のソフトウェアは誰でも扱いやすいようにビジュアルプログラミング言語である
Node-REDを採用しました。美味しいものマルシェ(ECサイト)からのロッカー解錠の
命令に従って周辺危機の操作を行っています。
あまり重たい処理は無いためスペックは重視せず、小さくて安価な Zero WHを採用。
AK-020 (Soracom Air)通信は Soracom Air for セルラーを使っています。通信に必要なモデムとしてAK-020を
利用しています。(このモデムの中に SIMが入っています)
Amazonで販売しているSORACOMスターターキットは通信量1,000円分のクーポンも
ついていてお得でした
PCA9685購入者1人につき、1つずつロッカーの扉を割り当てています。それぞれのロッカーの
扉を個別に操作するためにPCA9685を使ってサーボモータを制御しています。
電池ボックスサーボモータを動かすための電源です。プロトタイプでは電池ボックスを
使っていますが、USBからの給電になる予定です。
TowerPro
SG92R
ロッカーを実際に解錠するためのモーターです。扉1つにつき、1つのモーターが
使われます。写真には載せていませんが、PCA9685につなげています。
高輝度
赤色LEDランプ
ロッカーが実際に施錠・解錠されたことをユーザーが認識できるように、操作された
タイミングでLEDを点滅させます。これも写真には載せていませんが、PCA9685に
つなげてます。

配線について

ラズパイ とPCA 9685の配線図です。GPIOは 1,3,5,6 (青枠で囲った部分)を使っています。

ラズパイ のPIN番号ラズパイ側の名称PCA9685側のピンの名称
15V PowerVCC
3SDASDA
5SCLSCL
6GroundGND

実物の写真はこのようなイメージです。PCA9685は基盤にPINの役割が書いてあるので間違えにくいですね。

PCA9685

ちなみに、PCA9685を使うときにはラズパイ 側のコンフィグを変更してI2Cを有効にする必要があります。こちらの手順についての記事は多いので調べればすぐに分かると思いますが、こちらにも掲載しておきます。

sudo raspi-config

こちらを実行すると表示される画面がこちら。ここで5番の Interfacing Optionsを選択して

I2Cを選択

「はい」を選択して I2C interfaceを有効にしておきましょう!

これでラズパイ を通して複数のサーボモータの制御をするための準備は完了です。サーボモーター はこの様な形で扉に取り付けられています。サーボモータが約140°動くことでギアを経由して鍵が閉まり、ロッカーが施錠されている様子がご覧いただけます。

次回はラズパイ の操作に利用しているプログラム言語、Node-REDについてご紹介していきます!

電子ロッカー開発はじめます

今回の記事を担当するエンジニアの榎本です。
トップページにも記載されていますが、松戸の美味しいものマルシェを開催中です!(2021/3/31まで)
ありがたいことに多くのお客様にご利用いただき、めでたく4/23より第2回目の開催も決定しました。

さて、第1回目ではお客様への商品受け渡しを人の手で行っていました。しかし、下記の理由により次回のイベント以降の受け渡しは無人で行うことになっています。理由としては。。。

  1. 1. 購入いただいたお客様にできるだけ幅広い時間でのお受取りをしてもらうため
  2. 2. 受け渡しにかかるコストを削減するため
  3. 3. 受け渡し担当が長時間座ることにより発生する腰痛への対策

3つ目は冗談として…お客様の利便性と当社としての収益性を保つためにロッカーを使った受け渡しを行うことにしたのです。このロッカーの実現にあたっては下記の4案が検討されました。
大雑把に分けると、

  • ・アナログにダイヤル錠を使った運用をするか、電子キーを実装するか。
  • ・扉を共通化するか、受取人毎に別々にするか

です。これらのメリット・デメリットを大きく下記の様に分類しました。

方式メリットデメリット
1. ダイアル錠(共通扉)開発コストが小さい
運用が最も簡単
運用の負荷が大きい
セキュリティの不安が大きい
2. ダイアル錠(個別扉)開発コストが小さい
共有扉よりセキュリティが保たれ易い
運用負荷が大きい
ミスが発生しやすい
3. 電子キー(共通扉)後述の個別扉よりメンテナンスは容易開発コストが発生する
セキュリティの不安が大きい
4. 電子キー(個別扉)運用の
セキュリティ面で安全性が高い
物理面を含めると開発コストが最も大きい。
システムのメンテナンスコストも高い

私たちは上記を検討した結果、セキュリティ面での安全性と確実にお客様が商品を受け取れることを重視して案四の電子キー(個別扉)を採用することに決めました。
まぁ、開発者としては茨の道っぽいのですが… IoTは弊社としては初挑戦で、楽しそうなので良しとしましょう!構成はざっくりとこんな感じ。
ラズパイ 、SORACOM 、AWSを組み合わせた構成でラズパイ 上の言語は Node-REDを使っています。

次回からは、システム的な観点からどの様に私たちがこの電子ロッカーを構築しているのかを公開していきます!

リモート作業報告用ガジェットが誕生していましたw

以前、投稿しましたが弊社も完全リモートワークに切り替わっております。リモートで作業する際には、席にいるかどうかを把握するためにも勤務開始時や離席時、作業終了時にこの様な感じでSlackへ連絡する様な運用になっています。

大した手間ではないのですが、先日、投稿された社員の動画が話題となりました。

名前が秀逸ですねw 面倒臭がりは、エンジニアとしての美徳です!技術としては、WAWS IoT → AWS Lambda 経由でSlackのAPIを実行してます。ハードウェアはM5StickCというスグレモノです。

ちょっとした作業でも、技術を学ぶきっかけになる良い例でした!リモートワークでも工夫して楽しんでいきましょう!

ECサイトへの一時的なアクセス増をしのいだ話

はじめに

弊社にて担当させて頂いているお客様がテレビ番組にて紹介される!という事で、どうやってアクセスを捌くかどうかが話題となりました。 結果的に、アクセス数は平常時の120倍くらいでしたが無事に乗り切ることができました!やはり、テレビの影響力というものは相当なものですね。

お客様の要望

  • 取り扱われる番組はtoB向けだが、対象のECサイトはtoC向けなので機会損失はあまりない。
  • だが、正確なテレビの特集効果を測定をするために、サーバへの過負荷によって、落ちないように可能な限りの対応を検討したい。
  • よってなるべく安いコスト・少ない工数でできることをやる、

という形でした。

対応内容

小規模サイトということもあり、スケールアウトしづらい構成でした。
(DBもWebサーバも画像もセッションも1インスタンスに全部入り!)

そのため、オートスケール等ではなく、TV放映前に一旦サービスを落としてインスタンスの入れ替えをしています。具体的には、vCPU数48倍、メモリ容量48倍にAWSのインスタンスを変更しただけですが、最大アクセス時にも動作サクサクのまま乗り切れました。小規模なサイトならスケールアップだけでもある程度なんとかなる、という事例となりました!

まとめ

弊社でも、現状のクラウドサービスには多くの便利なサービスがあり、お客様に貢献できる効果が見込めるサービスはどしどし使っていきます。一方でこの様に簡単かつ大きなコストをかけずに対応する柔軟性も大切ですね!

AWSでWordPressの管理画面にログインできない

AWSでWordPressを構築する場合に行ったHTTPSのトラブルシュート

初めまして。Joolenで修行中の修行僧 おおたに です。修行のために頭を丸めました。

突然ですが、AWSでWordPressを構築する場合に行ったHTTPSのトラブルシュートについて、全世界に向けて絶賛公開いたします!!
(もったいぶらないで、回答からいくスタイルです)

[現象]

・Amazon EC2にWordPressをインストールすると管理画面でログインできない。
または、管理画面自体が表示されない。

[環境]

・サーバー:Amazon EC2

・外部からはELB(ロードバランサー)へHTTPSでアクセス

・ELBからEC2へはHTTPでアクセス

[解決策]

次の2点(1.と2.)を実施します。
セキュリティに関する設定になりますので、ご使用は自己責任でよろしくお願いいたしますm(_ _)m

1. WordPressの URL設定を変更する

<①ELBのHTTPS制限を一時的に無効にしても構わない場合>

HTTPS制限を解除すれば、WordPress管理画面へHTTPアクセスできます。管理画面へログインし、[設定]で次の2点を変更します(「WordPressのURL」は各自の環境に合わせて変更してください)

  • WordPress アドレス(URL):https://WordPressのURL
  • サイトアドレス(URL):https://WordPressのURL

変更が終わったら、解除していたHTTPS制限を元に戻すのをお忘れなく

<②ELBのHTTPS制限を無効にできない場合>

HTTPS制限があると、WordPress管理画面にログインできないので、DBを直接操作して、次の2文を実行します(「DB名」と「WordPressのURL」は各自の環境に合わせて変更してください)

  • 「UPDATE DB名.wp_options set option_value=’https://WordPressのURL’ where option_name=’siteurl’;」
  • 「UPDATE DB名.wp_options set option_value=’https://WordPressのURL’ where option_name=’home’;」

2. HTTPアクセスをHTTPSアクセスと認識させる

 WordPressのPHPファイルを編集します。

[wordpressインストールフォルダ/wp-config.php]の下の方に書いてある[require_once]文より上に、
次のif文を追記します。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
          $_SERVER['HTTPS'] = 'on';

これで、解決できます。お疲れサマでした。南無阿弥陀仏♪

[参考ページ]

https://codex.wordpress.org/Function_Reference/is_ssl

[原因の解説]

ELBでHTTPS制限している場合は、外部からのアクセスはHTTPSに制限されますが、内部アクセスはHTTPに変わります。このため、WordPressへの内部アクセスはHTTPになります(ここがポイントです!)

WordPressがHTTP設定の場合、外部からのアクセスはHTTPSなのに、WordPressが生成するアドレスはHTTPになるため、ブラウザがセキュリティエラーを出して、[管理画面にログインできない]状態になります。

また、WordPressがHTTPS設定の場合、HTTPアクセスが来るとHTTPSアクセスへ変更してリダイレクトする仕様のため、リダイレクト無限ループが発生して、[管理画面自体が表示されない]状態になります。

■リダイレクト無限ループ

①WordPressがHTTP(内部のアクセス)をHTTPSへ変更してリダイレクト

②リダイレクトされたHTTPSを、ELBがWordPressへHTTPとして渡す(->①へ戻る)

WordPressがリダイレクトするコードはwp-login.phpファイルの先頭あたりに書いてあるので、見てみると面白いと思います。

それではまた。次回の投稿にご期待ください。南無阿弥陀仏♪

EC2のmysqlが落ちた

ブログを書こうと思ってアクセスしたら「データベース接続確立エラー」でサイトを開けず。

mysqlが落ちてたので起動したがまたすぐに落ちてしまった。

EC2のスワップ領域を設定すると良い、という記事を見つけたのでそれを参考に設定してみるものの、またすぐに落ちる。

アクセスログを見たところ、xmlrpc.phpへの大量アクセスがあることが判明。

下記サイトを参考に不正なアクセスを拒否してとりあえず解決。

サーバーが高負荷の原因はWordPressのxmlrpc.phpを狙った攻撃だった

何かしら監視ツールをいれやう。