Ameba Arduino: [RTL8722CSM][RTL8722DM] 使用Firebase推送讯息服务

材料准备
  • Ameba x 1
  • Android Studio
  • 提供Google Play Service的智慧型手机 x 1

范例说明

在智慧型手机普及的年代,在手机里常不定时收到特定App的提示讯息,大家对这样的经验一定不陌生,在本范例里将教学如何使用Google Firebase从Ameba Client端将讯息推送至手机。

首先我们使用的Firebase Cloud Messaging(FCM)是一种跨平台的讯息传递方案,可让您免费可靠地传递消息。

使用FCM,您可以通知客户端应用程序(App),能同步更新电子邮件或其他数据。您可以发送讯息来推动用户的参与。对于即时讯息传递内容,一个讯息最多可传输4KB的payload到客户端应用程序。

1

FCM实现包括两个用于发送和接收的主要部份:

1. 受信任的环境,例如Cloud Functions for Firebase或用于构建,定位和发送讯息的应用服务器。
2. 接收消息的iOS,Android或Web(JavaScript)客户端应用程序。

您可以通过Admin SDKHTTP&XMPP API 发送消息。要使用功能强大的内置定位和分析功能测试或发送营销或参与消息,您还可以使用Notifications composer

了解到这里,我们得知Ameba只要实现http client功能,即可以推送讯息至特定的APP里。

首先我们要先架设开发Android App的环境,请大家先至Android官网下载Android Studio

https://developer.android.com/studio/install

接着我们可以使用Firebase提供的Android 范例,下载Firebase Quickstart Samples

https://github.com/firebase/quickstart-android

开启Android Studio并点击Import project,选择Firebase Quickstart Samples 里的messaging project,这里因为我们用不到其他的功能,所以选择messaging project即可。

Android Studio第一次开启messaging project会需要安装SDK及Google repository,可以参考以下网页进行update

https://developer.android.com/studio/intro/update

等到编译app所需的要件安装完成,即能开启messaging project,Android Studio本身自带Firebase注册功能

1

如上图,打开工具列点击Tools->选择Firebase

1

右窗格即开启Firebase Assisant,接着看到Cloud Messaging,选择Set up Firebase Cloud Messaging开启注册程序

1

点击 Connect to Firebase

1

接着会带出网页,并且点击左边的Firebase并登入Gmail帐号,登录成功会进入Firebase首页

1

我们先留着首页,等等还需要进入Firebase Console,接着回到Android Studio

1

我们可以看到当网页登入成功,Android studio也带出登入资讯对话框,点击connect to Firebase

1

即可右窗格看到Dependencies set up correctly,并且在左窗格看到多了一个google-service.json的档案,代表此app已注册成功
此时能将手机接上电脑(按下Shift+F10)或按下工具列的Runs App,在这里请大家注意,Firebase需要手机提供Google play service(GPS)的服务,在有一些手机,预设没有安装Google Play是无法使用Firebase的范例。

1

如上图,messaging app在手机上安装并执行成功,此时按一下LOG TOKEN

1

会出现一段Token ID,此为推送讯息所需的Access Token,代表某一特定手机里所安装拥有FCM服务APP的ID,此ID是唯一的,并且在App移除再安装时会被重新分配一个Access Token,这也代表讯息能推送至某一特定手机,FCM服务还可以推送讯息至某一个NEWS(Topic),这部份可以参考Firebase topic-messaging教学:

https://firebase.google.com/docs/cloud-messaging/android/topic-messaging

因此我们需要把这段Access Token保存起来,如下图回到Android Studio,在底下Logcat的地方log level选取Debug,当按下App上的LOG TOKEN按钮时,Logcat就会印出这一段Access Token ID,我们把Log讯息中InstanceID Token:后面的字码先保起来。

1

接着我们要回到刚刚登入Firebase时所带出的网页

1

右上角点进前往控制台

1

此时在页面中已看到Android Studio在刚刚的操作中,为我们建好了messaging project

1

点击进入messaging project,如上图我们进入设定页面

1

选择 Set up

1

进入设定页面选择Cloud Messaging页,我们会看到Legacy server key,这段Server key也需要在程式里使用,我们先将之保存起来,接下来开始编辑程式码。
我们打开范例 “File” -> “Examples” -> “AmebaWiFi” -> “Firebase.ino”

1

如上图,在反白处定义了ACCESS_TOKEN及SERVER_KEY,也就是我们刚从APP保存下来的ACCESS token ID及Firebase console页面里保存的Server Key,我们将这两组ID填上去,编译并上传至Ameba之后按下Reset按钮,此时打开终端机

1

连上AP之后开始连线FCM Server

1

出现Connect to Server successful连线FCM成功,开始推送讯息,过程中会收到HTTP/1.1 200 OK代表讯息推送成功,此时打开手机萤幕,App收到来自Ameba推送的讯息

1

程式码说明

Firebase.ino
此范例使用HTTP协议来推送讯息,使用者可以到Firebase开发网站学习payload格式

https://firebase.google.com/docs/cloud-messaging/send-message

程式中主要的payload格式如下,使用者可自由更改讯息的Title及Body,Body代表讯息的内容


char const* payload = "{" \
    "\"to\": \"" ACCESS_TOKEN "\"," \
    "\"notification\": {" \
    "\"body\": \"Hello World!\"," \
    "\"title\" : \"From Realtek Ameba\" " \
    "} }" ;

程式的setup()里


if (client.connect(server, 80)) {
    Serial.println("connected to server");
    // Make a HTTP request:
    sprintf(message,"%s%s%s%s%s%d%s%s%s","POST /fcm/send HTTP/1.1\nContent-Type: application/json\nAuthorization: key=",SERVER_KEY,"\nHost: ",HOST_NAME,"\nContent-Length: ",strlen(payload),"\n\n",payload,"\n");
    printf("\nRequest:\n%s \n",message);
    client.println(message);
    client.println();
  }

sprintf的部份将payload包进了HTTP POST的content里,并在连上FCM Server之后将此message 推送出去

loop()里


while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

等待Server的回应,并将其回应内容印出来

请先确认已安装QQ通讯软体