はじめに
Food Tech Hackathonというハッカソン↓に参加しました。
https://cookpad.connpass.com/event/131371/
ダーツをして刺さった箇所の晩ご飯の作り方が表示されるAndroidアプリ↓を作りました。
https://youtu.be/g9nZOD5v4Z0
この記事では設計や実装方法を書いています。
ハッカソンのことはブログ↓を書いたので、よかったら読んでください。
https://yoppiex.hatenablog.com/entry/2019/06/12/002550
全体の構成とフロー
全体の構成
こんな構成になっています。
スマホはダーツボードのDARTSLIVE-200s(以下、200s)をBluetoohキーボードとして認識していました。
楽天レシピAPIを叩いて取得した情報を元に、「晩ご飯-作り方URL」のセットを作り事前にDynamoDBに入れています。
全体のフロー
-
AndroidアプリがAPI経由でランダムに生成された21個の「晩ご飯-作り方URL」セットを取得
-
人が200sに矢をさす
-
Androidアプリがささった箇所をBluetooth経由で取得して表示
-
画面遷移後、あらかじめ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にrecipeTitle
とrecipeUrl
が対のレコードを複数作ることにしました。
API
DynamoDBにある全レコードを取得して、
ランダムにrecipeTitle
とrecipeUrl
が対になってるデータを21こ生成し返します。
Androidアプリ
Androidアプリと200s
スマホは200sをBluetoohキーボードとして認識していたので、AndroidSDKにあるキーイベントを取得するdispatchKeyEvent
というメソッドを利用しました。
dispatchKeyEventは常にキー入力を監視していて、イベントが発生した際に呼び出されるメソッドです。
200sに矢がささる時もdispatchKeyEventが呼び出されました。
200sの調査
200sに矢が刺さった時に「外側Single」「内側Single」「Double」「Triple」「Bull」「InBull」それぞれで違う数字がキー入力されます。
どんな数字がキー入力されるかをログ出力して調査しました。
82箇所調査する必要があり、骨が折れる作業でした。
どこに矢が刺さるとどんな数字がスマホに送られてくるかがわかるとdispatchKeyEvent内で条件分岐をさせればOKです。
最後に
他にも200sを使っていろんなゲームが作れそうです。
何か良さそうなネタがあれば作るので教えてください!