使用Firebase推送讯息服务
材料准备
- Ameba x 1
- Android Studio
- 提供Google Play Service的智慧型手机 x 1
范例说明
在智慧型手机普及的年代,在手机里常不定时收到特定App的提示讯息,大家对这样的经验一定不陌生,在本范例里将教学如何使用Google Firebase从Ameba Client端将讯息推送至手机。
首先我们使用的Firebase Cloud Messaging(FCM)是一种跨平台的讯息传递方案,可让您免费可靠地传递消息。
使用FCM,您可以通知客户端应用程序(App),能同步更新电子邮件或其他数据。您可以发送讯息来推动用户的参与。对于即时讯息传递内容,一个讯息最多可传输4KB的payload到客户端应用程序。
FCM实现包括两个用于发送和接收的主要部份:
1. 受信任的环境,例如Cloud Functions for Firebase或用于构建,定位和发送讯息的应用服务器。
2. 接收消息的iOS,Android或Web(JavaScript)客户端应用程序。
您可以通过Admin SDK或 HTTP&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注册功能
如上图,打开工具列点击Tools->选择Firebase
右窗格即开启Firebase Assisant,接着看到Cloud Messaging,选择Set up Firebase Cloud Messaging开启注册程序
点击 Connect to Firebase
接着会带出网页,并且点击左边的Firebase并登入Gmail帐号,登录成功会进入Firebase首页
我们先留着首页,等等还需要进入Firebase Console,接着回到Android Studio
我们可以看到当网页登入成功,Android studio也带出登入资讯对话框,点击connect to Firebase
即可右窗格看到Dependencies set up correctly,并且在左窗格看到多了一个google-service.json的档案,代表此app已注册成功
此时能将手机接上电脑(按下Shift+F10)或按下工具列的Runs App,在这里请大家注意,Firebase需要手机提供Google play service(GPS)的服务,在有一些手机,预设没有安装Google Play是无法使用Firebase的范例。
如上图,messaging app在手机上安装并执行成功,此时按一下LOG TOKEN
会出现一段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:后面的字码先保起来。
接着我们要回到刚刚登入Firebase时所带出的网页
右上角点进前往控制台
此时在页面中已看到Android Studio在刚刚的操作中,为我们建好了messaging project
点击进入messaging project,如上图我们进入设定页面
选择 Set up
进入设定页面选择Cloud Messaging页,我们会看到Legacy server key,这段Server key也需要在程式里使用,我们先将之保存起来,接下来开始编辑程式码。
我们打开范例 “File” -> “Examples” -> “AmebaWiFi” -> “Firebase.ino”
如上图,在反白处定义了ACCESS_TOKEN及SERVER_KEY,也就是我们刚从APP保存下来的ACCESS token ID及Firebase console页面里保存的Server Key,我们将这两组ID填上去,编译并上传至Ameba之后按下Reset按钮,此时打开终端机
连上AP之后开始连线FCM Server
出现Connect to Server successful连线FCM成功,开始推送讯息,过程中会收到HTTP/1.1 200 OK代表讯息推送成功,此时打开手机萤幕,App收到来自Ameba推送的讯息
程式码说明
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的回应,并将其回应内容印出来