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

今回はTestDevice1TestDevice2という2つの端末を作成しました。

f:id:LocaQ:20190117230922p:plain:w800

また、それぞれの端末のメタ情報にNameを追加しました。

f:id:LocaQ:20190117230953p:plain:w900

認証

以下のページを参考にサービスアカウントというものを作成します。

認証の概要

作成するアカウントは以下を選びました。

  • サービスアカウント:Compute Engineのデフォルトのサービスアカウント
  • キーのタイプ:JSON

f:id:LocaQ:20190117231023p:plain:w600

※もしかしたらCompute EngineVMを作成していないとデフォルトのサービスアカウントは出てこないかもしれません。

「作成」ボタンを押すとJSONファイルがダウンロードされます。

サンプルプログラム

コード

Cloud IoT Coreに登録されている端末の一覧と、各端末の情報を表示するサンプルプログラムです。

Google Cloud IoT Coreに登録されている端末の一覧を取得するプログラム

プログラム中のPROJECT_ID, REGION, REGISTRY_IDは各自置き換えます。PROJECT_IDはClout IoT Coreを作成したプロジェクトのID、REGIONus-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 を使っているので、プロジェクトに追加します。

参照

Dockerイメージを使ってWebアプリをGoogle Compute Engineで動かす

ASP.NET Core MVCのアプリをGCPで公開できたので、その手順をまとめます。

前提

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 トラフィックを許可する」にチェック

f:id:LocaQ:20190114231752p:plain

作成が完了して起動したら、外部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にノズルが詰まった時の解決方法が載っています。

f:id:LocaQ:20180825203526p:plain:w500

また、方法1の「エアーチューブジョイント」は、マニュアルの「1.1 部品紹介」の「2. フィラメントガイドチューブジョイント」の事だと思われます。

f:id:LocaQ:20180825203650p:plain:w600

ノズル詰まり解消の手順

マニュアルの方法1と2を行います。

フィラメントをアンロードする

手順ではアンロードしていないのでこれはやらなくてもいいと思いますが、自分はやってしまったので一応書いておきます。

アンロードは本来のメニューの「樹脂交換」を選択して行います。フィラメントがアンロードされたら「確認」を押さずに、「←」を押してメニューのトップに戻ります。

ヘッドを移動する

フィラメントの除去ではヘッドの上部からピンツールを押し込むので、ヘッドの場所によっては作業ができません。なのでヘッドを作業しやすい場所へ移動します。ヘッドの移動はメニューの「ツール」→「設定」→「移動」でできます。

移動先は最下部から少し上のあたりにしました。ヘッドの上部に拳を入れるので下の方、ただし下過ぎるとノズルから出たフィラメントを取りにくくなるので最下部より少し上、という感じです。

f:id:LocaQ:20180825210528j:plain:w800

エクストルーダーを加熱する

メニューの「ツール」→「加熱準備」を選択してエクストルーダーの温度を200℃まで加熱します。プラットフォームは加熱しなくていいのでOFFにします。

f:id:LocaQ:20180825211029j:plain:w800

ヘッドからガイドチューブを取る

「フィラメントガイドチューブジョイント」を押してチューブを取ります。チューブジョイントは画像の黒い部品で、これを下に押し込むと体感で1mmくらい下がります。その状態のままガイドチューブ(ジョイントに繋がっている白いやつ)を引っ張って抜きます。ちゃんとジョイントを押し込めていればそんなに力はいらなかったです。

※エクストルーダーが熱いので触らないように気を付けます。

f:id:LocaQ:20180825211844j:plain:w400

ガイドチューブを取れました。

f:id:LocaQ:20180825212344j:plain:w800

フィラメントを除去する

詰まり除去用ピンツールを使ってノズルの中のフィラメントを押し出して除去します。

詰まり除去用ピンツールは付属品のこんなやつです。

f:id:LocaQ:20180825212317j:plain:w400

ピンツールをチューブジョイントの部分に差し込みます。フィラメントが中に残っていると柔らかい感触がするので押し込みます。押し込むとノズルからフィラメントが出てきます。これを繰り返してフィラメントを全て押し出します

f:id:LocaQ:20180825212618j:plain:w800

なんとなくコツを書くと、

  • ゆっくり押し込む
  • 中の空洞の側面にあるフィラメントを下に押し込む感じでやる
  • ノズルからフィラメントが出てこなくなっても念を押して何度も繰り返す

という感じでやりました。

念を押して何度も繰り返すのは、もう出ないと思っても意外と出てくるためです。1回1回では変化がなくても何度もやると変化があったりします。そしてちゃんと除去できていないとおそらく次のフィラメントのロードでまた詰まってしまいます。私は2回やりました。

元に戻す

フィラメントを除去し終わったら、チューブジョイントを押し込みながらガイドチューブを差し込んで元の状態に戻します。

フィラメントをロードする

除去が終わったらメニューの「樹脂交換」→「押出」を選択してフィラメントをロードします。もしここでフィラメントが出てこず、フィラメント吸入口から「ガッガッ」といった感じの音がしたら、まだフィラメントが詰まっていると思いますので上の手順を再度やります。

フィラメントがノズルから出てくるようになったら成功です。

仕上げ

最後にメニューの「ツール」→「設定」→「校正」を選択して校正します。

Flashforge Adventurer3のビルドシートを交換する

Adventurer3のプラットフォームからラフトを剥がせなくなってしまったので、ビルドシートを交換してみることにしました。

ビルドシートの注文

ビルドシートは公式サイトから注文することができます。

flashforge.shop-pro.jp

flashforge.shop-pro.jp

プラットフォームの掃除

シートを剥がしたら糊がプラットフォームにかなり残ってしまいました。結構強力で、ググって出てきた消しゴムをかけたり食器用洗剤を使ったりする方法では取れませんでした。

f:id:LocaQ:20180811133345j:plain:w800

ツイッターでつぶやいたところ、FLASHFORGE JAPAN の方から無水エタノールかシンナーで取れると教えていただいたので、無水エタノールを注文して試してみました。

準備

以下のものを用意します。

f:id:LocaQ:20180811133415j:plain:h300

また、掃除に入る前に以下のことをやっておくとよいと思います。(やらずに掃除をした後で気付きました。)

  • プラットフォームのつまみのネジにノリが付くので事前に取っておく
  • シートを正確に張れるように上下左右の間隔を測っておく

掃除

まず無水エタノールが床にかからないように段ボールを敷きます。そしてプラットフォームに無水エタノールをかけて数十秒待ってから雑巾でこする、を繰り返します。

最初は雑巾に無水エタノールを染み込ませてこすってみたんですが、何もなしでこするよりもだいぶ楽そうでしたが糊を取るのにかなりこする必要がありました。その後直接かける方法でやってみたらずいぶん楽に取れるようになりました。

f:id:LocaQ:20180811140926j:plain:w800

掃除が終わって綺麗になりました。上の方に少しノリが残っているように見えますが、触ってもベタベタしなかったので問題ないと思います。

f:id:LocaQ:20180811133500j:plain:w800

シートの貼り付け

綺麗になったプラットフォームに新しいビルドシートを張ります。ビルドシートは固めなので、皺ができることもなく簡単に張れました。

f:id:LocaQ:20180811133520j:plain

Flashforge Adventurer3 でABSフィラメントを使った

ABSフィラメントを使ってサイコロを出力

前回は本体に付いてきたPLAフィラメントを使いました。

locaq.hatenablog.com

今度はABSフィラメントを購入して使ってみました。出力したのは前回のサイコロで設定は標準です。

f:id:LocaQ:20180807214533j:plain:w600

PLAのサイコロと品質面の違いは特に見当たりらず、サイズも同じでした。

印刷時間は出力が始まってからの時間はPLAと変わりませんでしたが、出力が始まる前にヘッドとプラットフォームを温める時間が結構長くかかりました。このサイコロの時は6分50秒ほど経ってからオブジェクトの出力が始まりました。PLAの時は測ってなかったんですが、こんなに長くはなかった気がします。

その他

他にもオブジェクトを出力してみていていくつか分かったことがあります。

ラフト

ABSで最初に出力したのはギアだったんですが、ラフトを無効にして出力したら失敗しました。

この後ラフトを有効にしたらうまく出力できたので、これ以降は必ずラフトを有効にして出力するようにしています。

ヘッドの温度

[2018/08/11 追記] ヘッドの温度を230℃にすると、プラットフォームとラフトの食いつきが非常に強固になり、ヘラを使っても剥がれなくなってしまうようになりました。デフォルトの225℃の戻したところまたうまく剥がれるようになったので、温度設定はデフォルトのままにする方がよいです。

Adventurer3のABSのデフォルトだと、ヘッドの温度が225℃になっています。ところがこの温度だとオブジェクトを出力すると糸が引いたり、変な所にも樹脂が出てしまうことが結構ありました。

調べてみると、ABSでは230℃以上に設定するらしいので、設定で230℃にして出力するようにしたらうまく出力されることが多くなりました。(それでもたまに起きます。)

プラットフォームの温度

ABSの場合はプラットフォームの温度が100℃くらいになるので、出力が終わった後に触るときはやけどしないように注意する必要がありました。

作ったもの

サイコロ以外にABSフィラメントを使って作ったものです。モデルは全てFusion360で作りました。

ギア

モジュール0.5という規格のギアで歯数は36と12です。タミヤの工作キットのギアと同等のものが作れるか確認したくて作ってみたものです。

同じものはPLAでも出力していました。

ただ課題があって、真ん中の穴の直径がデータより小さくなってしまいます。

乾電池ホルダー

乾電池を収納ボックスにそのまま入れて保管していたんですが、ショートしたら危ないなぁと思っていたのでホルダーを作りました。(これを作るときに金属のノギスでサイズを測っていたら、電池が発熱して火傷しかけました...)

ユニバーサルジョイント

3Dプリンターで作ってみたかったものの1つがユニバーサルジョイントでした。