Open28

SPRESENSEとLTE拡張基板でFirebaseにGPS情報を送りたい

yuji_miyanoyuji_miyano

ファームウェアアップデート、結構時間かかる。
ファームウェアアップデートが必要な旨、チュートリアルにも載せておいてほしい。

アップデート対象じゃなかった。別の原因なのか、、

yuji_miyanoyuji_miyano

天気予報の場合は以下のチュートリアルで情報が返ってくる
https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_http_getメソッドをサーバに送信してデータを取得する

00:26:14.872 -> Starting web client.
00:26:20.024 -> attach succeeded.
00:26:20.343 -> connected
00:26:20.880 -> HTTP/1.1 200 OK
00:26:20.880 -> Date: Sat, 09 Apr 2022 15:26:20 GMT
00:26:20.880 -> Server: Apache
00:26:20.880 -> Cache-Control: no-cache, private
00:26:20.880 -> Access-Control-Allow-Origin: *
00:26:20.880 -> Content-Length: 4690
00:26:20.880 -> Connection: close
00:26:20.880 -> Content-Type: application/json
00:26:20.918 -> 
00:26:20.918 -> {
00:26:20.918 ->     "publicTime": "2022-04-09T17:00:00+09:00",
00:26:20.918 ->     "publicTimeFormatted": "2022/04/09 17:00:00",
00:26:20.918 ->     "publishingOffice": "福岡管区気象台",
00:26:20.918 ->     "title": "福岡県 久留米 の天気",
00:26:20.918 ->     "link": "https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=400000",
00:26:20.918 ->     "description": {
00:26:20.918 ->         "publicTime": "2022-04-09T16:33:00+09:00",
00:26:20.918 ->         "publicTimeFormatted": "2022/04/09 16:33:00",
00:26:20.918 ->         "headlineText": "",
00:26:20.952 ->         "bodyText": " 福岡県は、高気圧に覆われて晴れています。\n\n 9日は、高気圧に覆われて晴れとなるでしょう。\n\n 10日は、高気圧に覆われて概ね晴れとなるでしょう。",
00:26:20.952 ->         "text": " 福岡県は、高気圧に覆われて晴れています。\n\n 9日は、高気圧に覆われて晴れとなるでしょう。\n\n 10日は、高気圧に覆われて概ね晴れとなるでしょう。"
00:26:20.985 ->     },

...略...

00:26:21.308 -> disconnecting
yuji_miyanoyuji_miyano

Cloud Functionsだと返ってこない。ブラウザでアクセスしたらHello from Firebase!が見えたのに。

00:21:11.438 -> Starting web client.
00:21:16.439 -> attach succeeded.
00:21:16.817 -> connected
00:21:17.409 -> HTTP/1.1 302 Found
00:21:17.409 -> Location: https://asia-northeast1-spresese-gps-test.cloudfunctions.net/helloWorld
00:21:17.443 -> X-Cloud-Trace-Context: 7bb257b4ba1591fd6fa7ce24f12faa9b
00:21:17.443 -> Date: Sat, 09 Apr 2022 15:21:17 GMT
00:21:17.443 -> Content-Type: text/html
00:21:17.443 -> Server: Google Frontend
00:21:17.443 -> Content-Length: 0
00:21:17.443 -> Connection: close
00:21:17.443 -> 
00:21:17.443 -> 
00:21:17.443 -> disconnecting.
yuji_miyanoyuji_miyano

この辺を見てデプロイしてみる。

https://cloud.google.com/functions/docs/calling/http?hl=ja
https://qiita.com/h-hiroki/items/0025a3e6a0d65a25299b

functionsフォルダに移動してデプロイしてみる。

cd [プロジェクト名]/functions
% gcloud functions deploy helloWorld --runtime nodejs16 --trigger-http --allow-unauthenticated

デプロイできた様子

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=us-central1/9ef3e1fd-7f02-4e34-8504-e5b954bad22a?project=195051512227
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: 9ef3e1fd-7f02-4e34-8504-e5b954bad22a
buildName: projects/195051512227/locations/us-central1/builds/9ef3e1fd-7f02-4e34-8504-e5b954bad22a
dockerRegistry: CONTAINER_REGISTRY
entryPoint: helloWorld
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://[リージョンとプロジェクト名].cloudfunctions.net/helloWorld
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/[プロジェクト名]/locations/us-central1/functions/helloWorld
runtime: nodejs16
serviceAccountEmail: [プロジェクト名]@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/[なんかいろいろ].zip
status: ACTIVE
timeout: 60s
updateTime: '2022-04-10T13:34:07.462Z'
versionId: '4'

curlで試してみたら返ってきた!!

curl -X GET https://us-central1-spresese-gps-test.cloudfunctions.net/helloWorld
Hello from Firebase!
yuji_miyanoyuji_miyano

Firestoreの書き込みが上記のサンプルは固定の値なので、SpresenseからGPSなど指定した値を書き込めるようにする。

https://hamburger.hatenablog.jp/entry/2020/04/29/Firebase_Cloud_Functionsを試す_1日目

上記を参考に、index.jsの

  citiesRef.doc('SF').set({
    name: 'San Francisco', state: 'CA', country: 'USA',
    capital: false, population: 860000 })


上記を参考に、

  citiesRef.doc('SF').set({
    name: 'San Francisco', state: 'CA', country: 'USA',
    capital: false, population: request.query.population})

して、Spresenseのプログラムの

char path[] = "/helloWorld";

char path[] = "/helloWorld?population=1234";

にしてみたらpopulationのところにqueryで指定した数値を入れることができた。

yuji_miyanoyuji_miyano

やることメモ

  • 1分ごとにDeepSleepしたい
  • バッテリー情報送りたい
  • 時刻も送ったほうが良さそう(バッテリー切れを検出できる)
yuji_miyanoyuji_miyano

上のサンプルで使っていたGeoJsonの値をFirestoreから取ってくることができればいいはず。
https://blog.katsubemakito.net/firebase/firestore_readwrite_1

上のサイトを参考にして、Consoleに表示することはできたが、GeoJsonに入らず悩んでいた。

geojson.features[0].geometry.coordinates[1] = Number(doc.get('latitude'));

みたいな書き方でFirestoreのデータをGeoJsonに入れれた!

書き方については以下のサイトを参考にした。
https://www.wakuwakubank.com/posts/723-firebase-firestore-query/#ドキュメントを取得

yuji_miyanoyuji_miyano

なんか今度はSPRESENSEから書き込めなくなった。
シリアルモニタを確認するとconnection failedのエラーがでている。

ERROR:LTEClient:123 getaddrinfo() error : 1
connection failed
yuji_miyanoyuji_miyano

SPRESENSEのプログラムは変えていないので、Firebase側の設定かなと思って調べてみた。

https://note.com/noabou/n/n35a5cd349c77
ルールに書かれた有効期限が切れている可能性があるということで、見てみたけどあと4日残ってた。
一応期限を伸ばしてみたけど変わらず。

ターミナルからcurlでアクセスしてみたら書き込めた。なぜだ、、。

curl 'https://<project name>.cloudfunctions.net/helloWorld?date=2022-5-6&time=3-37-39&latitude=11&longitude=11&battery=11'
yuji_miyanoyuji_miyano

Firestore関係ないこのプログラムでもエラーが出たのでおかしいなと思ったらSIMの月100MBの容量を使い切っていた。
https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_http_getメソ��%[…]E5��得する

1秒に1回送るプログラムで一晩つけっぱなしにして電池の持ちを調べていたのがダメだった様子。
100MBってそんなにすぐに無くなるのか、、。確かに1秒に1回も送らなくてもいい内容だけども、、

yuji_miyanoyuji_miyano

DeepSleepを入れようとRTCを入れたりしていたら今度は年月日がおかしくなった

GPS測位前

14:06:30.340 -> 1980/01/06 09:00:33.001179, numSat: 9, No-Fix, No Position
14:06:30.340 -> RTC.getTime() : 315997233
14:06:30.340 -> gps_time : 315997233

日時だけ測位した

14:06:31.980 -> 2100/11/07 14:06:32.001478, numSat: 9, No-Fix, No Position
14:06:31.980 -> RTC.getTime() : 315997234
14:06:31.980 -> gps_time : 4129279592

位置も測位した

14:07:21.636 -> 2100/11/07 23:07:21.001456, numSat: 4, No-Fix, Lat=35.xxx, Lon=139.xxx, bat=4020
14:07:21.636 -> RTC.getTime() : 4129279641
14:07:21.636 -> gps_time : 4129312041

なんでだろ