📌

SoracomBeamのUDP → HTTP/HTTPS エントリポイントを経由してAWS API Gatewayからレスポンスを取得する

2021/09/06に公開

SoracomBeamのUDP → HTTP/HTTPS エントリポイント + Raspberry Piを使用してAWS API Gatewayからレスポンスを取得する方法をまとめました

はじめに

SoracomBeam UDP → HTTP/HTTPS エントリポイントとは?

SoracomBeamのエンドポイントにUDPリクエストを送るとSoracomBeam側でHttpのPOSTリクエストに変換してくれる機能
この機能では嬉しいことにレスポンスを返してくれるため、UDPを使用しているにも関わらずHTTPのレスポンスを受け取ることができる
詳細は
https://users.soracom.io/ja-jp/docs/beam/udp-http/
に記載されています。

なお、ポイントとしては

リクエストBeam は送信されたメッセージを Base64 エンコードしたうえで以下のような JSON にし、HTTP POST リクエストのボディに設定します。

の2点

  • SoracomからはPOSTでメッセージは送られる
  • メッセージはBase64にエンコードされる

SoracomBeam とRaspberry Piのセットアップについて

Soracom初期セットアップ

https://soracom.jp/recipes_index/4171/#SORACOM_Air
を参照してセットアップします

API側の用意

以下の記事を参考にAPIGatewayのサンプル環境を作成
https://users.soracom.io/ja-jp/docs/beam/aws/
ただし

  • 今回はUDP → HTTP/HTTPS エントリポイントを使用するのでメソッドはPOSTを設定
  • メッセージはBase64に変換されてSoracomからAWSに送信されてくるためLambda側でBase64をデコードする必要がある
    があるためLambda関数を以下のように変更しました
// initialize SDK and document client
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
  // insert imsi and timestamp into item object

  console.log(event);
  event.item.imsi = event.imsi;
  event.item.timestamp = event.timestamp;
  const payload = Buffer.from(event.item.payload, 'base64').toString('ascii');
  const obj = JSON.parse(payload);
  event.item.a = obj.a;
  event.item.b = obj.b;
  event.item.c = obj.c;

  // build API parameter
  var params = {
    Item: event.item,
    TableName: 'BeamDemo'
  };
  
  // call PutItem operation
  docClient.put(params, function(err, data){
    if (err)
      context.fail(err);
    else
      context.succeed({Item:params, Result:'success'});
  });
};

実際にUDPで送信してみる

以下のサンプルプログラムを作成して送信してみます

from datetime import datetime
import socket


print('The client started at', datetime.now())

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b'{\"a\":100,\"b\":200,\"c\":30}', ('beam.soracom.io', 23080))
data, addr = client.recvfrom(1024)
print("at", datetime.now(), "data: ", data, "addr: ", addr)
client.close()

レスポンスについて

pi@raspberrypi:~/Downloads $ python3 udp_send.py 
The client started at 2021-06-24 00:52:02.142770
at 2021-06-24 00:52:03.846639 data:  b'{"Item":{"Item":{"payload":"eyJhIjoxMDAsImIiOjIwMCwiYyI6jjjlkg","imsi":"12345678","timestamp":1624463522314,"a":100,"b":200,"c":30},"TableName":"BeamDemo"},"Result":"success"}'

上記のようにUDPの送信に対してAWSからのレスポンスを受け取れました。
実際にDynamoDB側にも送信した値が保存されています
image.png

まとめ

SoracomBeamのUDP → HTTP/HTTPS エントリポイントを使用してRaspberry Pi経由でAWS側からレスポンスを受け取れることをまとめました。
参考になれば幸いです

Discussion