[单片机资料]

WiFi单片机向智能手机推送消息

[复制链接]
511|1
手机看帖
扫描二维码
随时随地手机跟帖
Simon西|  楼主 | 2020-9-30 10:46 | 显示全部楼层 |阅读模式

现在市面上的WiFi物联网单片机越来越多,但是真正可以实现有价值的功能的实例比较少,这里给大家介绍使用瑞昱的RTL8722双频WiFi+蓝牙的单片机来做“单片机向智能手机推送消息”,这篇**适合向海外推广的产片,因为这里使用的是谷歌的Firebase云信息推送服务:


使用Firebase推送讯息服务
[size=1.125em]材料准备
  • Ameba x 1
  • Android Studio
  • 提供Google Play Service的智慧型手机 x 1

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

程式码说明
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的回应,并将其回应内容印出来





使用特权

评论回复

相关帖子

一路向北lm| | 2020-9-30 10:56 | 显示全部楼层
不错啊,感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

62

帖子

0

粉丝