はじめに
Sakura IOのLETモジュールとArduinoシールドを知人が貸してくれた。こういうものが手元にあるとどこかに繋げたくなる。「sakura.ioとAlibaba Cloud が繋がった! enebular のおかげ!」で@eteraoさんがAlibaba CloudのIoT Gatewayに接続しているので、私はFunction computeに直結してみよう。Function computeとは乱暴に言えばFaaS、AWSでいうところのLambdaだ。任意のAlibaba Cloudのサービスにデータを転送できるが、とりあえず今日はsakura ioから飛んできた生データをログに書き込むところまで。
構成
ブツ
ドキュメント読む限りSoftBankのBand1(2Ghz)またはBand8(900Mhz)のLTE Cat1(Cat M1ではない)をつかむらしい。現段階ではBandやPLMN、Cell IDなどモバイルの生情報を生で見れるATコマンドやAPIは見つけられず。。。
Alibaba Cloudの準備
まずはfunction computeのログを保存するlog serviceを準備する。
log serviceの構成
logs erviceのプロジェクトを作成
ここではプロジェクト名は"makotakatest"、リージョンは東京を選択
logstoreを作成。 ここではlogstore名は"logstoretest"、ほかは全てデフォルト値。
これでlogを保存する場所が確保できました
function computeの構成
サービスを作成します。ここではサービス名sakura。詳細設定をオンに。
ログ設定のログプロジェクト、logstoreに先ほど作成した”makotakatest”,"testlogstore"を選択します。このままではこのfunction compute インスタンスはlogstoreにアクセスする権限がないので権限を付与するために「新しいロールを作成」を選択して「承認」へ。
Role nameをわかりやすい"sakura-role"に変更して「権限付与に同意」
トリガーの設定で、トリガータイプを"HTTP"、トリガー名をここでは"sakura"、承認を"anonymous"、メソッドにPOSTを入力
サービス名で"sakura"を選択、関数名をここではgetValueと入力。ランタイムはここではPython2.7を選択。インライン編集を選択してソースコード編集。
sakura ioのwebhookには”Secret”という設定項目があり、これをキーにPOSTされたテキストのSHA1のハッシュを取り、その値を"X-Sakura-Signature"というHTTPヘッダーで送信する。Alibaba Cloud側では受け取ったPOSTのbodyに同じSecret値のハッシュを計算してこの"X-Sakura-Signature"の値と比較することで正しいデータか評価可能。
コード中ではX-Sakura-Signature
の値はenviron['HTTP_X_SAKURA_SIGNATURE']
で参照可能。ほかのheaderも、HTTP_に続けてすべて大文字に変換し、"-"(ハイフン)を"_"(アンダースコア)に変換したheader名をキーにすれば値を取得可能。
ここでのsecretは"aliyun123"。sakura IOで設定するので控えておく。
# -*- coding: utf-8 -*-
import logging
import json
import hmac
import hashlib
def handler(environ, start_response):
logger = logging.getLogger()
# 以下でPOSTされたbodyの内容をテキストで取得
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
request_body = environ['wsgi.input'].read(request_body_size)
# ハッシュ値チェック
secret = "aliyun123"
signature = hmac.new(secret.encode("utf-8"), request_body.encode("utf-8"), hashlib.sha1).hexdigest()
# ハッシュ値が正しいときの処理
if(environ['HTTP_X_SAKURA_SIGNATURE'] == signature):
logger.info('signature check is OK: ' + environ['HTTP_X_SAKURA_SIGNATURE'])
bd = json.loads(request_body)
logger.info(bd['payload']['channels'][0]['value'])
# ハッシュ値が正しくないときの処理
else:
logger.info("signature check is NG: " + environ['HTTP_X_SAKURA_SIGNATURE'])
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return "api gateway"
これで関数が作成された。URLの値がsakura IO側で設定するWebhookのエンドポイントになるので控えておく
これでAlibaba Cloud側の準備は終わりだ。Sakura IO側でSecret(ここではaliyun123)とエンドポイントのURLの値が必要になるので控えておく。
sakura ioの準備
環境準備
下記に大変わかりやすくまとまっている。
https://sakura.io/docs/pages/guide/startup-guide/arduino.html
この手順に従って以下までを実施
- コントロールパネルへのログイン
- プロジェクト作成
- 通信モジュール登録
新しい連携サービスの作成
ここではoutgoing webhookを利用するので新規に連携サービスを作成する。
ここでは名前にAlibaba Cloud、Payloadに先ほどAlibaba Cloud側で作成したエンドポイントのURL、Secretに先ほどAlibaba Cloudで設定した同じ値(ここではaliyun123)を入力し、作成を押下。これでsakura io側も準備ができた。
デバイスの準備
デバイスの組み立て
以下を参考に「通信モジュールとArduinoシールドの組み立て」を実施。今日はセンサーは接続しません。
https://sakura.io/docs/pages/guide/startup-guide/arduino.html#id7
開発環境の準備
以下を参考に
https://sakura.io/docs/pages/guide/startup-guide/arduino.html#id9
- Arduino IDEのインストール
- Arduinoの接続
- SakuraIOライブラリの入手
まで実施
手入力送信用プログラムの書き込み
手入力によるデータ送信確認のため、予め用意されているスケッチをArduinoに書む。 [ファイル]>[スケッチ例]>[SakuraIO]から Shell を呼び出し、マイコンに書き込む。
これでシリアルコンソールからデータを送信できるようになった。以下はchannel 0でintegerの123を送信する、という意味
enqueue 0 i 123
send
テスト
地味だけどAlibaba Cloudのfunction computeで"123"という値が受信できたことをログで確認できた。
最後に
これは私の趣味の世界です。所属する団体の考え方は全く反映していません。