11
1

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 1 year has passed since last update.

この記事誰得? 私しか得しないニッチな技術で記事投稿!

【Unity】UnityアプリとGCFを連携させてデバッグ端末管理システムを作った話【GoogleCloudFunction】【GoogleCloudSQL】

Posted at

TL;DR

  • UnityからGCFを呼ぶ時はUnityWebRequestの設定を気をつけよう

  • NFCタグをスマホに貼る場合は金属対応シールを貼ったほうが読み取り精度が上がります
  • 非エンジニア向けにスプレッドシートで見せるのは有効
  • リマインダーBOTは端末棚卸しコストを減らせられるのでオススメ

概要

本記事は Qiita Engineer Festa 2023〜私しか得しないニッチな技術でLT〜 で登壇した内容の文字起こし+α版になります。

スライドはこちらから

自分の所属するGraffity(株)は社員15人満たない小さなスタートアップですが、ARアプリを中心とした開発を行っているため、デバッグ用の端末が数多くあります。

  • iPhone
  • Android (Galaxy, ASUS, HUAWEI...)
  • Nreal Air/Light
  • Google Glass Enterprise Edition 2
  • Meta Quest2/ Quest Pro
  • HTC XR Elite

上記のようにスマートフォンだけでなく、ARグラスやスタンドアローンVRデバイス(パススルーが可能なもの)など、種別も多いです。
このように種類も数も多いと いつ, 何の端末を借りている/所持している のか?という情報が無いと、「あの端末無い〜」 とか 「俺その端末持ってないよ」 みたいなコミュニケーションが多発し、無駄に労力を使ってしまいます。

また、コロナをきっかけにリモートワークも加速し、場合によっては端末を自宅に持ち帰って開発するようなケースもあるため、 デバッグ端末が必ずしもオフィスにはない ような状態もあります。

これを放置していると、端末を持って返ってると思っていたら紛失した等もあるため、所在をハッキリさせることで、無駄なコミュニケーションを減らし、端末の棚卸しのコストも下げることも可能です。

制作したデバッグ端末管理システム

DeviceManageSystem.drawio (2).png

今回作ったのは上記のようなシステムです。

まずは、管理用に全デバッグ端末にNFCタグを貼って管理しています。
そしてUnityで制作した端末貸し借りアプリでNFCタグと社員証を読み取ることでGCFのエンドポイントをコールすることで貸出情報を管理しています。

貸出情報は誰でも閲覧できるように、DB更新タイミングで一緒にスプレッドシートを自動更新して、そのスプレッドシートを全体に公開しています。

NFCタグを端末に貼る

スクリーンショット 2023-07-11 19.51.52.png

上記の写真にある通り、デバッグ端末に固有のIDを振るためにNFCシールを利用しています。
しかし金属のボディ等に直接貼ると、タグの読み取り精度が下がる問題があります。

そこで、金属製のものにNFCシールを貼る時は以下のような防護シールを噛ませると精度がかなり上がります。
https://nfctags.shop-pro.jp/?mode=cate&cbid=1427753&csid=0

Unity でNFCタグを読み取って貸し借りインターフェースを作成

Unity でNFCタグを読み取る機能を作成する場合、個人でNativePluginを作っても良いですが、今回は以下のアセットを利用しました。

残念ながら現在はAssetStoreで非公開になっているため、他の代替プラグインを利用するしかないようです。

上記プラグインでNFCタグを読み取ってGCFのエンドポイントを叩くのですが、叩く時に注意点があります。
注意点は以下の記事で解説しているので参考にしてください。

GCP 上の処理

メインの処理はGoogleCloundFunction 上で実行するPythonです。

レンタル処理はざっくり以下のような形で書いています。

rental_request.py

def rental_request(request: flask.Request):
    HEADERS = {'Content-Type': 'application/json'}

    request_json = request.get_json()

    # Connect DB
    db = database.Database()
    user = _get_user_by_id(db, request_json["user_tag"])
    device = _get_device_by_id(db, request_json["device_tag"])

    if user is None or device is None:
        json_response = {"message": "Invalid Send Data"}
        return json.dumps(json_response), 403, HEADERS

    is_success = device_db.rental_request(db, request_json["user_tag"], request_json["device_tag"])
    # DB 終了
    db.close()

    if is_success:
        result = _update_spread_sheet(user.get_name(), device.get_id() )
        json_response = {"message": "SQL is DONE"}
        return json.dumps(json_response), 200, HEADERS
    else:
        json_response = {"message": "Failed to Update SQL"}
        return json.dumps(json_response), 403, HEADERS

極々単純な処理で、 Unity側からPOSTしてきた社員証のIDと端末のNFCタグを利用してGCSql上に構築しているDBから社員情報と端末情報を引っ張ってきます。
両者が正常なデータであれば、貸出期限付きでDB上に情報を更新します。
DB更新が正常に行われた場合は、スプレッドシートも更新するという処理です。

DB操作はSQLAlchemy をベースとしたGraffity社内用のPythonライブラリを作成して利用しているため、これくらいのコード量で実現できています。

GCF上のPythonコードでスプレッドシートを操作する部分に関しては、公式ドキュメントと以下の技術ブログが参考になります。

https://developers.google.com/sheets/api/quickstart/python?hl=ja
https://zenn.dev/yamagishihrd/articles/2022-09_01-google-spreadsheet-with-python

返却催促リマインダーBOT

ただの貸し借りだけなら先ほどで十分なのですが、借りっぱなしを許容すると、端末を使いたい人に端末が回らなかったり、長期間借りていることから、本人も借りていることを忘れてたり、最悪紛失したりと悪いことが多く発生しがちです。
そのため、貸出期限を設けて、長期レンタルしたい場合は、一度返却してからの再貸出という手順をとらせます。
定期的に再貸出をすることで、少なくとも紛失したことに気づかないことや、端末の所在の更新につながるため非常に重要です。

しかしながら人間は忘れっぽいもので、1ヶ月程度貸出期間を設けると、返却タイミングを忘れてしまいます。
そのためリマインダーBOTの作成が必要になります。

システムは先ほどの図でいうと上半分のところです。

DeviceManageSystem_Reminder.drawio.png

定期実行はCloudSheduler を用いて設定。CloudSchedulerがGCFを起動してDBにアクセスして催促対象を選定。
通知自体はSlack BOTを通じてメンバーにメンションという流れになります。

実際にBOT通知が行われている風景はこのような形です。

deviceReturn.png

実際に作ってみて

まずは「端末どこ?」という会話が激減しました。
またスプレッドシートを用意したおかげでメンバー個人が確認できるようになったため、デバッグ端末管理人に都度聞くみたいな無駄な労力が減りました。

また 端末紛失疑惑紛失疑惑の端末捜索 する回数も圧倒的に減ったため、より開発に割ける時間が増えました。

まとめ

会社の規模やデバッグ端末の数が増えると、デバイス管理が非常に重要になります。
無駄な労力や開発時間を減らすような負の要因を減らすためにも、各企業それぞれが端末管理システムを作っておくと良いでしょう。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?