2016年5月25日
広島版IoT縛りの勉強会! IoTLT広島 vol.1
http://iotlt.connpass.com/event/29984/
- Raspberry Pi 3 (Raspbian)
- 電源 2.5A
- SORACOM Air SIM = Software Desgin 2016年5月号
- SIM 認証サービス SORACOM Endorse でクーポン取得 done (モバイルルーター使用)
SORACOM コンソール
https://console.soracom.io/#/login
https://dev.soracom.io/jp/tools/
https://github.com/soracom/soracom-cli/releases
$ soracom subscribers list
$ soracom orders list
2016年4月25日から4月28日までやっていた
https://soracom.jp/raspi_campaign/
ハンズオン資料と同じことをやってみるために 同じ型番の USB 3G ドングルと超音波センサーを入手した。
http://soracom-files.s3.amazonaws.com/handson20160427.pdf
コマンド入力用テキスト http://soracom-files.s3.amazonaws.com/handson20160427.txt
- 3G USB ドングル FS01BU (SORACOM キャンペーン 8,424円 送料込)
- Nano SIM から標準 SIM への変換アダプタ
- 超音波距離センサー HG-SR04(400円 送料別)
- ブレッドボード、ケーブルなど
- Raspberry Pi 3 は自宅 WiFi に接続設定して起動
- Mac のターミナルから Raspbian に ssh して作業
amazon.co.jp 3G USB ドングル (FS01BU)
https://twitter.com/24motz/status/727730908766318593
接続スクリプトのレポジトリ https://gist.github.com/j3tm0t0/65367f971c3d770557f3
下記を実行すると Setting up wvdial でハングアップする。
$ sudo apt-get install -y usb-modeswitch wvdial
USB 3G 未接続で下記を実行した。 Setting up wvdial でハングアップ。 やり直しながら資料を読み返す。 どちらにしても /etc/wvdial.conf はこの段階では作成失敗するらしい。
$ sudo apt-get install -y usb-modeswitch wvdial
待っても終了しないとはどこにも書かれていない。
別のコンソールで下記を実行して apt-get を強制終了する。 パッケージそのものはちゃんと入ったことになっている。
$ sudo su
# killall wvdialconf
参考記事:
http://www.1ft-seabass.jp/memo/2015/11/16/soracom-air-raspberry-pi-firststep/
スクリプトをダウンロードして実行。手順通り。
$ sudo /usr/local/sbin/connect_air.sh
AWS を経由していることの確認
pi@raspberrypi:~ $ curl ifconfig.io
52.xxx.53.xxx
pi@raspberrypi:~ $ host 52.xxx.53.xxx
xxx.53.xxx.52.in-addr.arpa domain name pointer ec2-52-xxx-53-xxx.ap-northeast1.compute.amazonaws.com.
速度クラス s1.minimum にしてある場合で、 1MB ダウンロードに4分37秒かかる。
$ wget http://soracom-files.s3.amazonaws.com/1MB
--2016-05-04 03:27:13-- http://soracom-files.s3.amazonaws.com/1MB
Resolving soracom-files.s3.amazonaws.com (soracom-files.s3.amazonaws.com)... 54.231.228.21
Connecting to soracom-files.s3.amazonaws.com (soracom-files.s3.amazonaws.com)|54.231.228.21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1048576 (1.0M) [binary/octet-stream]
Saving to: ‘1MB’
1MB 100%[==================================================================================>] 1.00M 3.76KB/s in 4m 37s
2016-05-04 03:31:51 (3.69 KB/s) - ‘1MB’ saved [1048576/1048576]
下記のメールを受信
SIMの日次通信量が1MiBを超えています
From [email protected]
対象SIM 4401xxxx002xxxx 利用状況を確認してください。
sudo /usr/local/sbin/connect_air.sh が実行中状態なので、 Ctrl+C で止めると通信終了。
念のため、AWS ではなく自宅プロバイダ経由になっていることの確認。
pi@raspberrypi:~ $ curl ifconfig.io
220.xxx.xxx.xxx
pi@raspberrypi:~ $ host 220.xxx.xxx.xxx
xxx.xxx.xxx.220.in-addr.arpa domain name pointer FL1-220-xxx-xxx-xxx.hrs.mesh.ad.jp.
$ python sensor_test.py
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 11.0 cm
距離: 18.7 cm
距離: 59.7 cm
距離: 60.2 cm
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 距離を読む関数
def read_distance():
# 必要なライブラリのインポート・設定
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
# 使用するピンの設定
GPIO.setmode(GPIO.BOARD)
TRIG = 11 # ボード上の11番ピン(GPIO17)
ECHO = 13 # ボード上の13番ピン(GPIO27)
# ピンのモードをそれぞれ出力用と入力用に設定
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG, GPIO.LOW)
time.sleep(0.3)
# TRIGに短いパルスを送る
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TRIG, GPIO.LOW)
# ECHO ピンがHIGHになるのを待つ
while GPIO.input(ECHO) == GPIO.LOW:
signaloff = time.time()
# ECHO ピンがLOWになるのを待つ
while GPIO.input(ECHO) == GPIO.HIGH:
signalon = time.time()
# 時刻の差から、物体までの往復の時間を求め、距離を計算する
timepassed = signalon - signaloff
distance = timepassed * 17000
return distance
GPIO.cleanup()
while True:
print "距離: %.1f cm" % (read_distance())
SORACOM Beam で認証された接続を使って物体検知イベントをアップロード
$ python send_to_cloud.py
- メタデータサービスにアクセスして IMSI を確認中 ... 4401xxxx002xxxx
- 条件設定
障害物を 10 cm 以内に 3 回検知したらクラウドにデータを送信します
センサーを手で遮ったり、何か物を置いてみたりしてみましょう
- 準備完了
距離(cm): 5.6 <= 10 , 回数: 1 / 3
距離(cm): 5.6 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.3 <= 10 , 回数: 1 / 3
距離(cm): 7.6 <= 10 , 回数: 1 / 3
距離(cm): 7.6 <= 10 , 回数: 2 / 3
距離(cm): 6.1 <= 10 , 回数: 3 / 3
- ステータスが 'in'(何か物体がある) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVR6ILa7IfRhQRmTxxxx', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 51.4 > 10 , 回数: 1 / 3
距離(cm): 49.9 > 10 , 回数: 2 / 3
距離(cm): 48.7 > 10 , 回数: 3 / 3
- ステータスが 'out'(何も物体がない) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVR6IMCQIfRhQRmTxxxx', u'created': True, u'_version': 1, u'_index': u'sensor'}
^CTraceback (most recent call last):
File "send_to_cloud.py", line 71, in <module>
distance = read_distance() # 距離の取得
File "send_to_cloud.py", line 20, in read_distance
time.sleep(0.3)
KeyboardInterrupt
アップロードされた情報は公開されている(いた):
ttps://search-handson-xxxxx.ap-northeast-1.es.amazonaws.com/_plugin/kibana/
IMSI 4401xxxx002xxxx のイベントが確認できた。
30分くらい前に他の人のイベントが上がっていた。
# IMSIの取得
import requests
import json
print "- メタデータサービスにアクセスして IMSI を確認中 ...",
subscriber=json.loads(requests.get('http://metadata.soracom.io/v1/subscriber').text)
imsi = subscriber['imsi']
print imsi
Amazon Elasticsearch は Google BigQuery みたいなサービスと理解。
from elasticsearch import Elasticsearch
es = Elasticsearch('beam.soracom.io:18080')
beam.soracom.io:18080 につなぐと SORACOM 側の設定により
ttps://search-handson-xxxxx.ap-northeast-1.es.amazonaws.com
に転送される:
if count >= threshold_count:
status = 'out' if status == 'in' else 'in'
duration = time.time() - status_changed_at
status_changed_at = time.time()
print "- ステータスが '%s'(%s) に変化しました" % (status, '何か物体がある' if status == 'in' else '何も物体がない')
print "- Beam 経由でデータを送信します"
print es.index(index="sensor", doc_type="event", body={"imsi":imsi, "status":status, "timestamp":datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'), "duration":duration})
Maker Channel
If Maker Event "sensor", then post a tweet to @24motz
https://ifttt.com/myrecipes/personal
https://twitter.com/search?f=tweets&vertical=default&q=%23soracomhandson%20%4024motz&src=typd
IFTTT で maker チャンネルを作ると API キーが生成される。 その API キーをデバイスに書き込まずに、 SORACOM Beam の設定の中に書けばよい。
なのでデバイスに鍵を持たせる必要がない、という理屈。
- デバイスに必要な認証情報は SIM だけ
- AWS や IFTTT のトークンは SORACOM のサーバーに
- HTTP で SORACOM まで通信、AWS や IFTTT には HTTPS で通信