1
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 3 years have passed since last update.

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

Last updated at Posted at 2021-06-23

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関数を以下のように変更しました
sample.js
// 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で送信してみる

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

udp_send.py
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側からレスポンスを受け取れることをまとめました。
参考になれば幸いです

1
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
1
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?