Google Cloud IoT Coreに登録されている端末の一覧をC#で取得する
概要
Google Cloud IoT Coreに登録されている端末の一覧をC#で取得する方法をまとめます。
Cloud IoT Coreに端末を登録する
Quickstart を参考にClout IoT Coreを作成して、端末を作成します。この記事の範囲では以下を行えばよいです。
- Before you begin
- Create a device registry
- Add a device to the registry
- Clean up
今回はTestDevice1
とTestDevice2
という2つの端末を作成しました。
また、それぞれの端末のメタ情報にName
を追加しました。
認証
以下のページを参考にサービスアカウントというものを作成します。
作成するアカウントは以下を選びました。
- サービスアカウント:Compute Engineのデフォルトのサービスアカウント
- キーのタイプ:JSON
※もしかしたらCompute Engine
のVMを作成していないとデフォルトのサービスアカウント
は出てこないかもしれません。
「作成」ボタンを押すとJSONファイルがダウンロードされます。
サンプルプログラム
コード
Cloud IoT Coreに登録されている端末の一覧と、各端末の情報を表示するサンプルプログラムです。
Google Cloud IoT Coreに登録されている端末の一覧を取得するプログラム
プログラム中のPROJECT_ID
, REGION
, REGISTRY_ID
は各自置き換えます。PROJECT_ID
はClout IoT Coreを作成したプロジェクトのID、REGION
はus-central1
など、REGISTRY_ID
はCloud IoT CoreのレジストリIDです。
端末の情報として以下の2つを表示しています。
ID
- メタ情報の
Name
cloudIotService.Projects.Locations.Registries.Devices.List(parent).ExecuteAsync()
で取得できる端末は、IDなどの限られた情報のみ設定されているようで、メタ情報は取得できません。
そこで、さらに各端末毎にcloudIotService.Projects.Locations.Registries.Devices.Get(name).ExecuteAsync()
を呼び出して詳細な端末情報を取得します。このメソッドで取得した端末情報にはメタ情報なども含まれています。
必要な設定
このプログラムは環境変数GOOGLE_APPLICATION_CREDENTIALS
が必要です。値はサービスアカウントの作成でダウンロードしたJSONファイルのパスです。
この環境変数をGoogleCredential.GetApplicationDefault()
で参照しているようです。
また、このプログラムでは Google.Apis.CloutIot.v1 を使っているので、プロジェクトに追加します。
参照
- Authenticating Applications
- Clout IoT CoreのAPIへ認証する方法とサンプルプログラム
- .NET Cloud IoT Core Sample
- Clout IoT Coreの各APIへアクセスするサンプルコード
- Google APIs Explorer
Dockerイメージを使ってWebアプリをGoogle Compute Engineで動かす
ASP.NET Core MVCのアプリをGCPで公開できたので、その手順をまとめます。
前提
- GCPのアカウント作成済み
- Google Cloud SDKをインストール済み
- Docker for Windowsをインストール済み
Container Registryの認証設定
Container RegistryにDockerイメージを登録する時にはdocker push
を使いますが、その前に認証設定が必要です。
認証方法 | Container Registry | Google Cloud
このドキュメントの書かれていることがよく分からず、とりあえず以下の2つを実行しました。
ただよく読むと、どちらかだけ行えばよかったのかもしれません。Docker 認証ヘルパーとしての gcloudの節には、
可能であれば、この方法を使用することを強くおすすめします。この方法では、プロジェクト リソースに安全で短期間のアクセス権が付与されます。
と書かれているので、どちらかであれば上の方法の方がよいみたいです。
とりあえず両方のやり方を載せます。
gcloudをDocker 認証ヘルパーとして使う設定
以下のコマンドを実行します。
$ gcloud auth configure-docker
WARNING: `docker-credential-gcloud` not in system PATH.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
WARNING: `docker` not in system PATH.
`docker` and `docker-credential-gcloud` need to be in the same PATH in order to work correctly together.
gcloud's Docker credential helper can be configured but it will not work until this is corrected.
The following settings will be added to your Docker config file
located at [C:\Users\loca\.docker\config.json]:
{
"credHelpers": {
"gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"eu.gcr.io": "gcloud",
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud"
}
}
警告が出ていますが特に問題なくイメージの登録ができたので、今回は無視します。
スタンドアロン Docker 認証ヘルパー
以下の2つのコマンドを実行します。
$ gcloud components install docker-credential-gcr
Restarting command:
$ gcloud components install docker-credential-gcr
$ docker-credential-gcr
C:\Users\loca\.docker\config.json configured to use this credential helper for GCR registries
DockerイメージをContainer Registryに登録する
以下のドキュメントに沿って登録します。
イメージの push と pull | Container Registry | Google Cloud
Dockerイメージへのタグ付け
Dockerイメージに以下のような決まったフォーマットのタグを付ける必要があるようです。
[HOSTNAME]/[PROJECT-ID]/[IMAGE]
HOSTNAMEはContainer Registryの場所で、以下の4つがあります。
・ gcr.io は米国でイメージをホストしていますが、今後は場所が変更される可能性があります。
・ us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
・ eu.gcr.io は、欧州連合でイメージをホストします。
・ asia.gcr.io は、アジアでイメージをホストします。
今回は無料枠のCompute Engineを使うので、それに合わせて米国に作られるようにus.gcr.io
を使います。※Compute Engineの無料枠は米国の特定のリージョンでなければ適用されないため。
PROEJCT-IDは今回のアプリを動かすプロジェクトのIDです。Googleアカウントでログインしていれば、プロジェクトのホームの「プロジェクト情報」に載っています。
https://console.cloud.google.com/home
IMAGEはDockerイメージの名前で、今回はsampleapp
です。
以上から、タグの名前は以下のようになります。
us.gcr.io/[PROJECT-ID]/sampleapp
そしたらdocker
コマンドでイメージにタグを付けます。
$ docker tag sampleapp us.gcr.io/[PROJECT-ID]/sampleapp
docker push
でDockerイメージをContainer Registryに登録します。
$ docker push us.gcr.io/[PROJECT-ID]/sampleapp
The push refers to repository [us.gcr.io/[PROEJCT_ID]/sampleapp]
cd1a588c63a5: Pushed
e5f18c307014: Pushed
e7ba18774395: Pushed
a0afac1d9f1c: Pushed
3fb318ee8d39: Pushed
ef68f6734aa4: Layer already exists
latest: digest: sha256:c60eae957fe7a7729b4b3c3199d96985674641962f579d7010cd8edb43511ffb size: 1581
これでContainer Registoryにイメージが登録されます。
Compute EngineでDockerイメージを使ってアプリを起動する
Compute Engineのインスタンス作成画面で以下のように設定し、他の項目は適宜変更して作成します。
- 「この VM インスタンスにコンテナ イメージをデプロイします。」にチェック
- 「コンテナイメージ」にDockerイメージの名前を設定
- us.gcr.io/[PROJECT-ID]/sampleapp
- 「HTTP トラフィックを許可する」にチェック
作成が完了して起動したら、外部IPアドレスを確認してブラウザからアクセスします。
http://xxx.xxx.xxx.xxx/
これでとりあえずアプリの公開ができました。
もしアクセスできなければ、以下のページのトラブルシューティングが参考になるかもしれません。
Running a basic Apache web server | Compute Engine Documentation | Google Cloud
Flashforge Adventurer3 のノズル詰まりの直し方
Flashforge Adventurer3 でプリントを開始してもフィラメントがまったく出てこなくなってしまったので、ノズルにフィラメントが詰まっていると考えて除去したら直りました。
マニュアルに詰まりの解消方法が書いてありますが読んだだけでは細かいところがよく分からなかったので、また必要になった時のために実際にやった手順を書こうと思います。
マニュアルの確認
マニュアルの3章Q&AのQ1にノズルが詰まった時の解決方法が載っています。
また、方法1の「エアーチューブジョイント」は、マニュアルの「1.1 部品紹介」の「2. フィラメントガイドチューブジョイント」の事だと思われます。
ノズル詰まり解消の手順
マニュアルの方法1と2を行います。
フィラメントをアンロードする
手順ではアンロードしていないのでこれはやらなくてもいいと思いますが、自分はやってしまったので一応書いておきます。
アンロードは本来のメニューの「樹脂交換」を選択して行います。フィラメントがアンロードされたら「確認」を押さずに、「←」を押してメニューのトップに戻ります。
ヘッドを移動する
フィラメントの除去ではヘッドの上部からピンツールを押し込むので、ヘッドの場所によっては作業ができません。なのでヘッドを作業しやすい場所へ移動します。ヘッドの移動はメニューの「ツール」→「設定」→「移動」でできます。
移動先は最下部から少し上のあたりにしました。ヘッドの上部に拳を入れるので下の方、ただし下過ぎるとノズルから出たフィラメントを取りにくくなるので最下部より少し上、という感じです。
エクストルーダーを加熱する
メニューの「ツール」→「加熱準備」を選択してエクストルーダーの温度を200℃まで加熱します。プラットフォームは加熱しなくていいのでOFFにします。
ヘッドからガイドチューブを取る
「フィラメントガイドチューブジョイント」を押してチューブを取ります。チューブジョイントは画像の黒い部品で、これを下に押し込むと体感で1mmくらい下がります。その状態のままガイドチューブ(ジョイントに繋がっている白いやつ)を引っ張って抜きます。ちゃんとジョイントを押し込めていればそんなに力はいらなかったです。
※エクストルーダーが熱いので触らないように気を付けます。
ガイドチューブを取れました。
フィラメントを除去する
詰まり除去用ピンツールを使ってノズルの中のフィラメントを押し出して除去します。
詰まり除去用ピンツールは付属品のこんなやつです。
ピンツールをチューブジョイントの部分に差し込みます。フィラメントが中に残っていると柔らかい感触がするので押し込みます。押し込むとノズルからフィラメントが出てきます。これを繰り返してフィラメントを全て押し出します
なんとなくコツを書くと、
- ゆっくり押し込む
- 中の空洞の側面にあるフィラメントを下に押し込む感じでやる
- ノズルからフィラメントが出てこなくなっても念を押して何度も繰り返す
という感じでやりました。
念を押して何度も繰り返すのは、もう出ないと思っても意外と出てくるためです。1回1回では変化がなくても何度もやると変化があったりします。そしてちゃんと除去できていないとおそらく次のフィラメントのロードでまた詰まってしまいます。私は2回やりました。
元に戻す
フィラメントを除去し終わったら、チューブジョイントを押し込みながらガイドチューブを差し込んで元の状態に戻します。
フィラメントをロードする
除去が終わったらメニューの「樹脂交換」→「押出」を選択してフィラメントをロードします。もしここでフィラメントが出てこず、フィラメント吸入口から「ガッガッ」といった感じの音がしたら、まだフィラメントが詰まっていると思いますので上の手順を再度やります。
フィラメントがノズルから出てくるようになったら成功です。
仕上げ
最後にメニューの「ツール」→「設定」→「校正」を選択して校正します。
Flashforge Adventurer3のビルドシートを交換する
Adventurer3のプラットフォームからラフトを剥がせなくなってしまったので、ビルドシートを交換してみることにしました。
ビルドシートの注文
ビルドシートは公式サイトから注文することができます。
プラットフォームの掃除
シートを剥がしたら糊がプラットフォームにかなり残ってしまいました。結構強力で、ググって出てきた消しゴムをかけたり食器用洗剤を使ったりする方法では取れませんでした。
ツイッターでつぶやいたところ、FLASHFORGE JAPAN の方から無水エタノールかシンナーで取れると教えていただいたので、無水エタノールを注文して試してみました。
無水エタノール若しくはシンナで綺麗に取れます。
— FLASHFORGE JAPAN (@flashforge_jp) August 10, 2018
準備
以下のものを用意します。
- 新品の雑巾
- ゴム手袋
- 無水エタノール
また、掃除に入る前に以下のことをやっておくとよいと思います。(やらずに掃除をした後で気付きました。)
- プラットフォームのつまみのネジにノリが付くので事前に取っておく
- シートを正確に張れるように上下左右の間隔を測っておく
掃除
まず無水エタノールが床にかからないように段ボールを敷きます。そしてプラットフォームに無水エタノールをかけて数十秒待ってから雑巾でこする、を繰り返します。
最初は雑巾に無水エタノールを染み込ませてこすってみたんですが、何もなしでこするよりもだいぶ楽そうでしたが糊を取るのにかなりこする必要がありました。その後直接かける方法でやってみたらずいぶん楽に取れるようになりました。
掃除が終わって綺麗になりました。上の方に少しノリが残っているように見えますが、触ってもベタベタしなかったので問題ないと思います。
シートの貼り付け
綺麗になったプラットフォームに新しいビルドシートを張ります。ビルドシートは固めなので、皺ができることもなく簡単に張れました。
Flashforge Adventurer3 でABSフィラメントを使った
ABSフィラメントを使ってサイコロを出力
前回は本体に付いてきたPLAフィラメントを使いました。
今度はABSフィラメントを購入して使ってみました。出力したのは前回のサイコロで設定は標準です。
PLAのサイコロと品質面の違いは特に見当たりらず、サイズも同じでした。
印刷時間は出力が始まってからの時間はPLAと変わりませんでしたが、出力が始まる前にヘッドとプラットフォームを温める時間が結構長くかかりました。このサイコロの時は6分50秒ほど経ってからオブジェクトの出力が始まりました。PLAの時は測ってなかったんですが、こんなに長くはなかった気がします。
その他
他にもオブジェクトを出力してみていていくつか分かったことがあります。
ラフト
ABSで最初に出力したのはギアだったんですが、ラフトを無効にして出力したら失敗しました。
ABS初印刷は失敗した。ラフトをなしにしたのが多分悪かった。 pic.twitter.com/pyc5ptNkrL
— loca (@locatw) 2018年8月1日
この後ラフトを有効にしたらうまく出力できたので、これ以降は必ずラフトを有効にして出力するようにしています。
ヘッドの温度
[2018/08/11 追記] ヘッドの温度を230℃にすると、プラットフォームとラフトの食いつきが非常に強固になり、ヘラを使っても剥がれなくなってしまうようになりました。デフォルトの225℃の戻したところまたうまく剥がれるようになったので、温度設定はデフォルトのままにする方がよいです。
Adventurer3のABSのデフォルトだと、ヘッドの温度が225℃になっています。ところがこの温度だとオブジェクトを出力すると糸が引いたり、変な所にも樹脂が出てしまうことが結構ありました。
完璧にできてるようで実はちょっと課題もある。ABSのデフォルト設定だと変な所に材料が出ちゃってる。設定を変えてみた方がいいのかもしれない。温度かな? pic.twitter.com/DKF4ElLI7R
— loca (@locatw) 2018年8月2日
調べてみると、ABSでは230℃以上に設定するらしいので、設定で230℃にして出力するようにしたらうまく出力されることが多くなりました。(それでもたまに起きます。)
プラットフォームの温度
ABSの場合はプラットフォームの温度が100℃くらいになるので、出力が終わった後に触るときはやけどしないように注意する必要がありました。
作ったもの
サイコロ以外にABSフィラメントを使って作ったものです。モデルは全てFusion360で作りました。
ギア
モジュール0.5という規格のギアで歯数は36と12です。タミヤの工作キットのギアと同等のものが作れるか確認したくて作ってみたものです。
ラフトをありにしたらちゃんと印刷できた。でもラフトが強力にくっ付き過ぎてて取れないw pic.twitter.com/yQDYCLUOIl
— loca (@locatw) 2018年8月1日
ギアボックスに組み込んでもちゃんと動いた。赤いのはPLAで印刷したもの。 pic.twitter.com/NKnqNbpmz9
— loca (@locatw) 2018年8月1日
同じものはPLAでも出力していました。
Adventurer3でモジュール0.5のギア(36Tと12T)をPLA樹脂を使って印刷してみた。青いのはタミヤの工作キットのギア。正直歯の部分は歪になるんじゃないかと思ってたけど、まったくそんなことなくキレイに印刷できてるっぽい。これそのまま使えるんじゃないか? pic.twitter.com/GLzrNlSqHX
— loca (@locatw) 2018年7月29日
ただ課題があって、真ん中の穴の直径がデータより小さくなってしまいます。
小さいギアの部分で歯と穴の距離が近すぎて直径が小さくなってるのかと思ってでかい方だけで印刷した。それでも穴の直径が2.5mmになったから別の理由らしい。 pic.twitter.com/V2FjfbkLBD
— loca (@locatw) 2018年7月29日
乾電池ホルダー
乾電池を収納ボックスにそのまま入れて保管していたんですが、ショートしたら危ないなぁと思っていたのでホルダーを作りました。(これを作るときに金属のノギスでサイズを測っていたら、電池が発熱して火傷しかけました...)
単三乾電池ホルダーを3Dプリンターで作ってみた。モデリングはFusion360。印刷はFlashforge Adventurer3で材質はABS。 pic.twitter.com/A2VSVPv63M
— loca (@locatw) 2018年8月2日
円の深さを10mmにしたらかなり安定した。あとヘッドの温度をデフォルトの225℃から230℃に上げて印刷したら変な所に材料が出てた問題も解消された。ABSは230℃以上って記事があるからデフォルト設定が少し低いらしい。 pic.twitter.com/WlREzQCZ8g
— loca (@locatw) 2018年8月3日
ユニバーサルジョイント
3Dプリンターで作ってみたかったものの1つがユニバーサルジョイントでした。
Flashforge Adventurer3でユニバーサルジョイントを作れた。手に持ってるシャフトの直径が3mm、ジョイントの直径が8.2mm、真ん中の立方体は1辺5mm、ネジはM1.4x3mm。こんな小さなパーツでも3Dプリンターで作れるんだね。 pic.twitter.com/a5UUsUWwao
— loca (@locatw) 2018年8月4日
モーターで回してみた。たーのしー! pic.twitter.com/N35Otx9ALL
— loca (@locatw) 2018年8月4日