如何使用Python创建服务器向Android设备发送GCM推送通知

简介: 如何使用Python创建服务器向Android设备发送GCM推送通知

简介

推送通知可以让您的 Android 应用在用户不使用应用时通知用户发生的事件。本教程的目标是向您的应用发送一个简单的推送通知。我们将在服务器上使用 Ubuntu 14.04Python 2.7,以及 Google Cloud Messaging 作为推送通知服务。

我们将使用术语 服务器 来指代在 DigitalOcean 上创建的实例。我们将使用 GCM 来指代 Google 的服务器,即位于 Android 设备和您的服务器之间的服务器。

先决条件

在开始本教程之前,您需要准备以下内容:

  • 一个 Android 应用;请参阅 developer.android.com
  • 一个 Ubuntu 14.04 Droplet
  • 您的 Droplet 的 IP 地址

关于推送通知

由 Google 提供的 GCM 连接服务器从第三方应用服务器(例如您的 Droplet)接收消息,并将这些消息发送到运行在设备上的支持 GCM 的 Android 应用(客户端应用)。目前,Google 提供了 HTTP 和 XMPP 的连接服务器。

!GCM 连接服务器在第三方服务器和客户端应用之间发送数据。

换句话说,您需要自己的服务器与 Google 的服务器通信,以便发送通知。您的服务器将消息发送到 GCM(Google Cloud Messaging)连接服务器,然后连接服务器将排队并存储消息,然后在设备在线时将其发送到 Android 设备。

步骤一 — 创建 Google API 项目

我们需要创建一个 Google API 项目,以启用我们应用的 GCM。

访问 Google Developers 控制台。

如果您以前没有在那里创建开发者帐户,您可能需要填写一些详细信息。

点击 创建项目

输入项目名称,然后点击 创建

!新的 Google API 项目

等待几秒钟,直到新项目被创建。然后,在项目页面的左上角查看您的 项目 ID项目编号

!项目 ID 和编号

记下 项目编号。您将在 Android 应用客户端中使用它。

步骤二 - 为您的项目启用 GCM

确保您的项目仍然在 Google Developers 控制台中被选中。

在左侧的侧边栏中,选择 API 和身份验证

选择 API

在显示的 API 列表中,将 Google 云消息传递(Google Cloud Messaging for Android)的切换按钮设置为 。接受服务条款。

Google 云消息传递(Google Cloud Messaging for Android) 现在应该在此项目的已启用 API 列表中。

!已启用 Google 云消息传递(Google Cloud Messaging for Android)

在左侧的侧边栏中,选择 API 和身份验证

选择 凭据

公共 API 访问 下,点击 创建新密钥

选择 服务器密钥

输入您服务器的 IP 地址。

!服务器密钥 IP

点击 创建

复制 API 密钥。您稍后需要在服务器上输入它。

!API 密钥

步骤三 — 链接 Android 应用

为了测试通知,我们需要将我们的 Android 应用链接到我们创建的 Google API 项目。

如果您是 Android 应用开发的新手,您可能希望按照实施 GCM 客户端的官方指南进行操作。

您可以从 gcm 页面获取官方源代码。

请注意,这些源代码不是最新的,因此您需要修改 Gradle 文件:

gcm-client/GcmClient/build.gradle

旧行:

compile "com.google.android.gms:play-services:4.0.+"

更新后的行:

compile "com.google.android.gms:play-services:5.0.89+"

在主活动中,找到这一行:

String SENDER_ID = "YOUR_PROJECT_NUMBER_HERE";

将其替换为您的 Google API 项目的 项目编号

每次设备注册到 GCM 时,它都会收到一个注册 ID。我们需要这个注册 ID 来测试服务器。为了轻松获取它,只需修改主文件中的这些行:

if (regid.isEmpty()) {
                registerInBackground();
            }else{
                Log.e("==========================","=========================");
                Log.e("regid",regid);
                Log.e("==========================","=========================");
            }

运行应用后,查看 logcat 并复制您的 regid 以备后用。它看起来像这样:

=======================================
10-04 17:21:07.102    7550-7550/com.pushnotificationsapp.app E/==========================﹕ APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UJY0KNqpL4EUXTWOm0RxccxpMk
10-04 17:21:07.102    7550-7550/com.pushnotificationsapp.app E/==========================﹕ =======================================

第四步 — 部署一个 Droplet

部署一个全新的 Ubuntu 14.04 服务器。我们需要这个服务器作为我们的第三方应用服务器。

Google 的 GCM 连接服务器接收来自第三方应用服务器(我们的 Droplet)的消息,并将其发送到 Android 设备上的应用程序。虽然 Google 提供了 HTTP 和 CCS(XMPP)的连接服务器,但在本教程中我们专注于 HTTP。HTTP 服务器只能进行下行通信:从云到设备。这意味着你只能从服务器向设备发送消息。

我们的服务器的角色:

  • 与你的客户端进行通信
  • 向 GCM 服务器发送格式正确的请求
  • 处理请求并根据需要重新发送,使用指数级退避
  • 存储 API 密钥和客户端注册 ID。API 密钥包含在发送消息的 POST 请求的标头中
  • 生成消息 ID 以唯一标识发送的每条消息。消息 ID 应该对每个发送者 ID 是唯一的

客户端将通过发送设备的注册 ID 与你的服务器进行通信,以便你在发送通知时存储并使用它。现在不用担心管理它;这很简单,而且 GCM 会通过在注册 ID 无效的情况下给你提供错误消息来帮助你。

第五步 — 设置 Python GCM 简单服务器

使用 sudo 用户登录到你的服务器。

更新你的软件包列表:

sudo apt-get update

安装 Python 软件包:

sudo apt-get install python-pip python-dev build-essential

安装 python-gcm。在这里了解更多关于 python-gcm 的信息。

sudo pip install python-gcm

在服务器的某个位置创建一个新的 Python 文件。比如说:

sudo nano ~/test_push.py

将以下信息添加到文件中。替换标记为红色的变量。下面有解释。

from gcm import *
gcm = GCM("AIzaSyDejSxmynqJzzBdyrCS-IqMhp0BxiGWL1M")
data = {'the_message': 'You have x new friends', 'param2': 'value2'}
reg_id = 'APA91bHDRCRNIGHpOfxivgwQt6ZFK3isuW4aTUOFwMI9qJ6MGDpC3MlOWHtEoe8k6PAKo0H_g2gXhETDO1dDKKxgP5LGulZQxTeNZSwva7tsIL3pvfNksgl0wu1xGbHyQxp2CexeZDKEzvugwyB5hywqvT1-UxxxqpL4EUXTWOm0RXE5CrpMk'
gcm.plaintext_request(registration_id=reg_id, data=data)

解释:

  • from gcm import *:这导入了用于 Android 的 Google 云消息传递的 Python 客户端
  • gcm:添加你的 API 密钥 来自 Google API 项目;确保你的服务器 IP 地址在允许的 IP 中
  • reg_id:添加你的 regid 来自你的 Android 应用

第六步 — 发送推送通知

运行以下命令向你的应用程序发送一个测试通知:

sudo python ~/test_push.py

等待大约 10 秒。你应该会在你的 Android 设备上收到一个通知。

!推送通知示例

故障排除

如果大约 10 秒后通知没有出现在你的设备上,请按照以下步骤操作:

  • 你的智能手机/平板电脑是否连接到互联网?
  • 你是否有正确的项目密钥?
  • 你是否有来自应用的正确的 regid?
  • 你的服务器的 IP 地址是否添加到 Google API 服务器密钥?
  • 服务器是否连接到互联网?

如果你仍然没有收到通知,那可能是应用的问题。检查 logcat 是否有一些错误。

下一步该怎么办

一旦你完成了这个简单的测试,你可能会想向所有用户发送通知。记住,你必须以 1000 个为一组发送它们。另外,如果 GCM 响应“无效 ID”,你必须从数据库中删除它。

你可以根据本教程中的示例来适应你自己的 Android 应用。


目录
相关文章
|
2月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
52 0
|
23天前
|
安全 Python
使用Python实现简单的Web服务器
使用Python实现简单的Web服务器
22 6
|
2月前
|
运维 监控 数据库
自动化运维:使用Python脚本实现服务器监控
【8月更文挑战第31天】在这篇文章中,我们将探索如何利用Python编写简单的脚本来实现对服务器的基本监控。通过学习和应用这些技术,你可以快速检测服务器的状态,包括CPU使用率、内存占用和磁盘空间等关键指标。这不仅有助于及时发现问题,还能提升运维效率。文章将逐步引导你理解监控的重要性,并展示如何从零开始构建自己的监控工具。
|
2月前
|
Shell 网络安全 数据安全/隐私保护
使用 Python 远程登陆服务器的最佳实践
使用 Python 远程登陆服务器的最佳实践
|
2月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
18 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
2月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
35 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
2月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
49 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
2月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
29 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
2月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
34 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
2月前
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
49 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
下一篇
无影云桌面