AWSとAndroidとDARTSLIVE-200s


はじめに

Food Tech Hackathonというハッカソン↓に参加しました。

https://cookpad.connpass.com/event/131371/

ダーツをして刺さった箇所の晩ご飯の作り方が表示されるAndroidアプリ↓を作りました。

https://youtu.be/g9nZOD5v4Z0

この記事では設計や実装方法を書いています。

ハッカソンのことはブログ↓を書いたので、よかったら読んでください。

https://yoppiex.hatenablog.com/entry/2019/06/12/002550


全体の構成とフロー


全体の構成

dartsdesign.png

こんな構成になっています。

スマホはダーツボードのDARTSLIVE-200s(以下、200s)をBluetoohキーボードとして認識していました。

楽天レシピAPIを叩いて取得した情報を元に、「晩ご飯-作り方URL」のセットを作り事前にDynamoDBに入れています。


全体のフロー


  1. AndroidアプリがAPI経由でランダムに生成された21個の「晩ご飯-作り方URL」セットを取得

  2. Androidアプリが1~20,50の番号と晩ご飯を表示

    sample.png


  3. 人が200sに矢をさす


  4. Androidアプリがささった箇所をBluetooth経由で取得して表示


  5. 画面遷移後、あらかじめAPI経由で取得していた作り方URLのページをAndroidアプリがWebViewで表示



API(AWS)


利用したAWSのサービス


  • APIGateway

  • Lambda

  • DynamoDB

API作成時の3点セットです。

ググったらいっぱい構築手順が出てくるので詳しくは書きません。


楽天レシピAPI

晩ご飯の名称と作り方を楽天レシピAPIで取得しました。

1回のアクセスで取得できる晩ご飯は4こです。

{

"result": [
{
"recipeId": 1760028309,
"recipeTitle": "ご飯がすすむ!鶏むね肉のねぎ塩焼き",
"recipeUrl": "https://recipe.rakuten.co.jp/recipe/1760028309/",
...
},
{
"recipeId": 1390015585,
"recipeTitle": "ご飯がすすむ♪ 豚肉となすの味噌炒め☆",
"recipeUrl": "https://recipe.rakuten.co.jp/recipe/1390015585/",
...
},
{
"recipeId": 1180006148,
"recipeTitle": "ささみときゅうりの中華風酢の物",
"recipeUrl": "https://recipe.rakuten.co.jp/recipe/1180006148/",
...
},
{
"recipeId": 1570002039,
"recipeTitle": "お酢で疲労回復☆手羽元のさっぱり煮",
"recipeUrl": "https://recipe.rakuten.co.jp/recipe/1570002039/",
...
}
]
}

Androidアプリに21こ(ダーツの性質上1~20,50)の晩ご飯を表示することになります。

しかし、詳しく調べられていないですが1秒以内に複数回叩くとアクセスできなくなりました。

よって、あらかじめ楽天レシピAPIを叩いて事前にDynamoDBにrecipeTitlerecipeUrlが対のレコードを複数作ることにしました。


API

DynamoDBにある全レコードを取得して、

ランダムにrecipeTitlerecipeUrlが対になってるデータを21こ生成し返します。


Androidアプリ


Androidアプリと200s

スマホは200sをBluetoohキーボードとして認識していたので、AndroidSDKにあるキーイベントを取得するdispatchKeyEventというメソッドを利用しました。

dispatchKeyEventは常にキー入力を監視していて、イベントが発生した際に呼び出されるメソッドです。

200sに矢がささる時もdispatchKeyEventが呼び出されました。


200sの調査

200sに矢が刺さった時に「外側Single」「内側Single」「Double」「Triple」「Bull」「InBull」それぞれで違う数字がキー入力されます。

どんな数字がキー入力されるかをログ出力して調査しました。

82箇所調査する必要があり、骨が折れる作業でした。

どこに矢が刺さるとどんな数字がスマホに送られてくるかがわかるとdispatchKeyEvent内で条件分岐をさせればOKです。


最後に

他にも200sを使っていろんなゲームが作れそうです。

何か良さそうなネタがあれば作るので教えてください!