SPRESENSEとLTE拡張基板でFirebaseにGPS情報を送りたい
公式のLTEチュートリアルを見る
Firebaseの設定はここを参考にしてみる
ルート証明書、Chromeでやろうとすると.cerになるし、変換とかいろいろ調べてみたけどFirefoxでやるのが簡単だった。
5.4. TLSプロトコルを使用したHTTP Clientの動作を確認する
を試してみた。
12:23:21.350 -> Starting secure HTTP client.
12:23:28.847 -> attach succeeded.
12:23:28.847 -> 2022/04/06 12:23:28
12:23:28.884 -> making GET request
ここで止まってしまう。
この辺りで報告されている内容が関係するのかも。
ファームウェアのアップデートをしてみる。
ファームウェアアップデート方法
ファームウェアアップデート、結構時間かかる。
ファームウェアアップデートが必要な旨、チュートリアルにも載せておいてほしい。
アップデート対象じゃなかった。別の原因なのか、、
FirebaseのRealtime Databaseに全然アクセスできないのでCloud Functionsを試してみる
Cloud Functionsの設定方法
天気予報の場合は以下のチュートリアルで情報が返ってくる
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
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.
よく分からないけどこういうことなのか
全然わからないままgcloudを入れてみた。
この辺を見てデプロイしてみる。
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!
5.3. HTTP GETメソッドをサーバに送信してデータを取得する
のチュートリアルの以下の部分を今回のURLに変更したらArduinoからでも返ってきた!
char server[] = "arduino.cc";
char path[] = "/asciilogo.txt";
次はCloud FunctionでRealtime Databaseを更新したい。
これが参考になるのか?
Firestoreの方がよく使うと同僚に聞いたので、Cloud FunctionsでFirestoreにアクセスしてみる。
サンプル通りで上手く行った。
Firestoreの書き込みが上記のサンプルは固定の値なので、SpresenseからGPSなど指定した値を書き込めるようにする。
上記を参考に、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で指定した数値を入れることができた。
サンプルのgnssとLteWebClientを合体させて、クエリで経度、緯度を送るようにした。
複数のクエリは&でつなぐということを学んだ。
バッテリー情報も送る準備だけしたけど、まだ固定値を送ってるだけ。
やることメモ
- 1分ごとにDeepSleepしたい
- バッテリー情報送りたい
- 時刻も送ったほうが良さそう(バッテリー切れを検出できる)
Firestoreの値をMapboxで表示する方も進めてみる。
上のページを参考に、任意の場所を表示して、任意の場所にマーカーを置いてみた。
上のサンプルで使っていたGeoJsonの値をFirestoreから取ってくることができればいいはず。
上のサイトを参考にして、Consoleに表示することはできたが、GeoJsonに入らず悩んでいた。
geojson.features[0].geometry.coordinates[1] = Number(doc.get('latitude'));
みたいな書き方でFirestoreのデータをGeoJsonに入れれた!
書き方については以下のサイトを参考にした。
バッテリーと日時もFirestoreに入れるようにした。
バッテリーは上のサイトを参考にした。
#include <LowPower.h>
int mvolt = LowPower.getVoltage();
めっちゃ使い方簡単だ。
USBだと4V(=4000mV)が表示される
なんか今度はSPRESENSEから書き込めなくなった。
シリアルモニタを確認するとconnection failed
のエラーがでている。
ERROR:LTEClient:123 getaddrinfo() error : 1
connection failed
SPRESENSEのプログラムは変えていないので、Firebase側の設定かなと思って調べてみた。
一応期限を伸ばしてみたけど変わらず。
ターミナルからcurlでアクセスしてみたら書き込めた。なぜだ、、。
curl 'https://<project name>.cloudfunctions.net/helloWorld?date=2022-5-6&time=3-37-39&latitude=11&longitude=11&battery=11'
Firestore関係ないこのプログラムでもエラーが出たのでおかしいなと思ったらSIMの月100MBの容量を使い切っていた。
1秒に1回送るプログラムで一晩つけっぱなしにして電池の持ちを調べていたのがダメだった様子。
100MBってそんなにすぐに無くなるのか、、。確かに1秒に1回も送らなくてもいい内容だけども、、
受信間隔の変更はこちらのページを参考にした。
#define POSITIONING_INTERVAL 10
~~~
Gnss.setInterval(POSITIONING_INTERVAL);
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
なんでだろ