Delphi Firebase Realtime Database 2019/08/11
Delphi で Firebase Realtime Database のデータを変更、取得するサンプルです。
もう少しスマートな方法があるのだと思いますが、とりあえず公開しておきまます。
Indy コンポーネントを使っているので、Android、iOS でも使えるのではないかと思います。
Firebase Realtime Database について参考にしたサイト:
Firebase Realtime Database のデータ保存、取得、ストリーミング受信実験( ESP32 , M5Stack )
丁寧に書かれていて、非常に分かりやすいです。
■開発画面
Indy IdHTTP と IdSSLIOHandlerSocketOpenSSL、2つのコンポーネントを使用しています。

■データベースの構造
FireBase データ構造は下記のようになっています。(手動で作成しておきます)
command の内容を Delphi から変更。
Wi-Fi エリア内の ESP32 マイコンでその内容を受け取り、出力状態を変更します。
また、response には、ESP32 から 30 秒周期で計測値を格納。・・・のように使う予定です。

■Delphi からデータを変更
[PATCH] ボタンをクリックすると、 command の値が、"RT1ON" に変更されます。
{"command":"RY1ON"} は、FireBaseからの返信文字列で、正常に変更されたことが分かります。

Database 上で確認すると、"RY1ON"に変更されていることが分かります。

■ Delphi で取得
[GET] ボタンをクリックすると、データが取得されます。
{"command":"RY1ON","response":"1111"}
がその内容です。

// Delphi 10.3.1 Community Edition
unit tryFirebase;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdIOHandler, IdIOHandlerStream,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
Vcl.StdCtrls, IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdIOHandlerSocket,
IdIOHandlerStack;
type
TForm4 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
Memo1: TMemo;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form4: TForm4;
const
// Database secrets ( データベースシークレット)
Db_auth = 'xxxxxxxxyyyyyyyyyyzzzzzzzz';
// データベースのURL
Db_url = 'https://xxxxxxxx.firebaseio.com';
// データベース名?(先頭に'/'が必要)
Db_userpath = '/esp32';
implementation
{$R *.dfm}
// データ変更
procedure TForm4.Button1Click(Sender: TObject);
var
JsonString1, JsonString2 : string;
JsonToSend : TStringStream;
res : string;
begin
Memo1.Lines.Clear;
// 2つを書き換え
jsonString1 := '{' +
'"command" : "1234",' +
'"response" : "5678"' +
'}';
// 1つだけを書き換え
jsonString2 := '{' +
'"command" : "RY1ON"' +
'}';
// 1つだけ書き換えてみる
JsonToSend := TStringStream.Create(jsonString2, TEncoding.UTF8);
try
// データを書き換え
res := IdHTTP1.Patch(Db_url + Db_userpath + '.json?' + 'auth=' + Db_auth
, JsonToSend);
res := res.Replace(#10, '');
except
on E: EIdHTTPProtocolException do
res := e.ErrorMessage;
end;
Memo1.Lines.Insert(0, res);
end;
// データ取得
procedure TForm4.Button2Click(Sender: TObject);
var
JsonToReceive : TStringStream;
res : string;
begin
Memo1.Lines.Clear;
JsonToReceive := TStringStream.Create('', TEncoding.UTF8);
try
IdHttp1.Get(Db_url + Db_userpath + '.json?' + 'auth=' + Db_auth
, JsonToReceive);
res := StringOf(JsonToReceive.Bytes);
res := res.Replace(#10, '');
except
on E: EIdHTTPProtocolException do
res := e.ErrorMessage;
end;
Memo1.Lines.Insert(0, res);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
// オブジェクトインスペクタで設定するので、コメントアウト
// IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
// IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
end;
end.