0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sakura ioのLTEモジュールからAlibaba Cloudへデータを転送してみる

Posted at

はじめに

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から飛んできた生データをログに書き込むところまで。

構成

image.png

ブツ

image.png

ドキュメント読む限りSoftBankのBand1(2Ghz)またはBand8(900Mhz)のLTE Cat1(Cat M1ではない)をつかむらしい。現段階ではBandやPLMN、Cell IDなどモバイルの生情報を生で見れるATコマンドやAPIは見つけられず。。。

https://sakura.io/product/
image.png

Alibaba Cloudの準備

まずはfunction computeのログを保存するlog serviceを準備する。

log serviceの構成

log service のコンソールへ遷移
image.png

logs erviceのプロジェクトを作成
ここではプロジェクト名は"makotakatest"、リージョンは東京を選択
image.png

作られたプロジェクト名のリンクへ遷移
image.png

logstoreを作成。 ここではlogstore名は"logstoretest"、ほかは全てデフォルト値。
image.png

これでlogを保存する場所が確保できました

function computeの構成

Function Computeのコンソールへ遷移します。
image.png

サービスを作成します。ここではサービス名sakura。詳細設定をオンに。
image.png

ログ設定のログプロジェクト、logstoreに先ほど作成した”makotakatest”,"testlogstore"を選択します。このままではこのfunction compute インスタンスはlogstoreにアクセスする権限がないので権限を付与するために「新しいロールを作成」を選択して「承認」へ。

image.png

Role nameをわかりやすい"sakura-role"に変更して「権限付与に同意」
image.png

権限が付与されたことを確認して「OK」
image.png

「関数」を追加
image.png

「空の関数」を選択。
image.png

トリガーの設定で、トリガータイプを"HTTP"、トリガー名をここでは"sakura"、承認を"anonymous"、メソッドにPOSTを入力
image.png

サービス名で"sakura"を選択、関数名をここではgetValueと入力。ランタイムはここではPython2.7を選択。インライン編集を選択してソースコード編集。
image.png

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"

アクセス権限の承認へ進み
image.png

権限付与に同意
image.png

内容を確認して同意
image.png

まだログが有効化されていないので、ログを有効化
image.png

「OK」を押下
image.png

これで関数が作成された。URLの値がsakura IO側で設定するWebhookのエンドポイントになるので控えておく
image.png

これでAlibaba Cloud側の準備は終わりだ。Sakura IO側でSecret(ここではaliyun123)とエンドポイントのURLの値が必要になるので控えておく。

image.png

sakura ioの準備

環境準備

下記に大変わかりやすくまとまっている。
https://sakura.io/docs/pages/guide/startup-guide/arduino.html

この手順に従って以下までを実施

  • コントロールパネルへのログイン
  • プロジェクト作成
  • 通信モジュール登録

新しい連携サービスの作成

ここではoutgoing webhookを利用するので新規に連携サービスを作成する。
image.png

Outgoing webhookを選択
image.png

ここでは名前にAlibaba Cloud、Payloadに先ほどAlibaba Cloud側で作成したエンドポイントのURL、Secretに先ほどAlibaba Cloudで設定した同じ値(ここではaliyun123)を入力し、作成を押下。これでsakura io側も準備ができた。

image.png

デバイスの準備

デバイスの組み立て

以下を参考に「通信モジュールと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

テスト

とりあえず送ってみる
image.png

地味だけどAlibaba Cloudのfunction computeで"123"という値が受信できたことをログで確認できた。
image.png

最後に

これは私の趣味の世界です。所属する団体の考え方は全く反映していません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?