针对移动电子商务中商务信息推送存在的信息读取不便和推送成本高等问题,基于Google的云消息框架C2DM,设计并实现一种新的商务信息推送服务。从需求分析与技术思路、手机客户端实现、服务器端实现和服务运行效果等方面进行详细阐述。新的服务可以帮助电子商务企业准确且低成本地向客户推送商务信息,也可以帮助客户利用智能手机方便地接收和查阅商务信息,并节省手机电量和数据流量。
The inconvenient information access and higher information-push cost are the main problems in the current commerce information push methods in M-commerce. To resolve these problems, this paper introduces a proposal to design and implement a new commerce information push service based on Google C2DM.The requirements analysis and technical ideas, the mobile client implementation, the server-side implementation and the service operating results are elaborated. The new service can help E-commerce businesses accurately push commerce information to customers in low-cost, and can help customers using smart phones to receive and access to commerce information conveniently, and also can save battery power and data traffic.
随着智能手机用户数量的不断增加,移动电子商务(M-Commerce)逐渐成为电子商务领域内一颗耀眼的新星[ 1]。电子商务企业如何将各类商务信息(如新品上市信息、商品促销信息等)及时准确地推送给智能手机用户,并确保用户在移动的情况下能轻松查阅,成为一个尤为关键的问题,因为这类商务信息往往会直接触发用户进行在线消费。目前商务信息的推送服务主要依赖于电子邮件和手机短信,但是这两种方式都存在不足,前者不便于用户在移动的情况下查阅信息[ 2],后者则需移动运营商的介入,增加了电子商务企业的成本[ 3]。为此,本文基于Google公司提供的云消息框架(Cloud to Device Messaging,C2DM),设计并实现一种新的商务信息推送服务,以帮助电子商务企业准确且低成本地将商务信息推送给智能手机用户,便于用户快速查阅信息详情,避免过多消耗手机电量和数据流量。
信息推送是通过一定的技术标准或协议,将用户需要的信息主动发送给用户,以减少信息过载现象的一类服务或者技术[ 4]。在本文的研究背景下,信息推送服务主要指服务器主动将信息通过移动互联网发送给智能手机客户端的服务。目前,移动互联网中信息推送服务采用的具体技术主要包括以下4种[ 5]:
(1)客户端轮询。其本质是一种伪“推送”,要求手机客户端定期性地主动连接服务器,查询并读取数据。这种方式虽然简单灵活,但频繁的轮询对手机的电量和数据流量消耗较大,仅适合对实时性要求不高的应用。
(2)客户端保持IP长连接。即通过客户端与服务器之间维持一个持续的TCP/IP连接来实现推送,为此,客户端软件需持续运行,并周期性地向服务器发送“心跳包”。可见这种方式对电量消耗也比较大,较适合执行单一任务的移动终端,例如远程监测设备的无线数据传输模块。
(3)WAP推送技术。该技术主要基于特殊格式的短信息,手机通过识别特殊的标识来进行相应的处理。该方式对手机电量和数据流量的消耗不大,但是需要移动运营商的介入,成本较高。其最常见的用途是作为无线增值应用的推广方式。
(4)手机操作系统厂商提供的信息推送服务。目前主流的智能手机操作系统厂商都为各自的系统平台专门提供了信息推送服务,以帮助第三方应用服务器转发要推送给手机客户端的信息,例如,Google的C2DM[ 6]、Apple的APNs[ 7]和微软的MPNS[ 8]。这种方式下,手机操作系统只需要与其相对应的推送服务器保持一个长连接即可,在节省手机电量的情况下可实现多重任务。该方式的不足之处在于对网络条件要求较高,且作为新技术,各平台的推送体系还在不断完善之中。
商务信息推送服务是电子商务营销过程中至关重要的一个环节。过于频繁的信息、与用户无关的信息和难以阅读的信息,不仅难以达到商务信息推送的目的,还会给用户造成烦扰。为能清晰地阐释本文所提的解决方案,特将商务信息推送服务置于以下具体应用场景:某电子商务企业希望将客户关心的某些类商品的新品上市信息发送给客户,从而可以及时通知有购物需求的客户。该场景涉及电子商务企业和客户两个业务主体,因此,商务信息推送服务需兼顾这两类主体的需求和体验。
电子商务企业的需求主要包括以下两点:
(1)成本低廉。可借由互联网向客户直接推送商务信息,避免向移动运营商支付额外的通信费用。
(2)目标准确。将正确的信息推送给正确的客户,达到商务信息推送目的的同时避免烦扰客户。
电子商务客户的需求主要包括以下三点:
(1)查阅方便。可快速查阅达到的信息,避免与智能手机有过多的交互,只需简单的点击即可查看商务信息的详情。
(2)信息准确。收到的商务信息是客户真正关心和需要的,避免过多垃圾信息的干扰。
(3)节省电量和数据流量。为此,需避免长时间运行客户端软件和频繁的数据传输。
基于需求分析,本文中的商务信息推送服务将采用手机操作系统厂商提供的信息推送服务,具体为Google公司的C2DM,主要原因在于Google提供的Android手机系统所具有的开放性以及其在国内外市场上所占据的领先地位[ 9, 10]。目前,支持C2DM的Android系统为2.2及以上版本。C2DM的主要目的是帮助第三方应用服务器将信息推送至Android手机客户端,它主要涉及Android手机、C2DM服务器和第三方应用服务器这三部分,如图1所示:
C2DM的基本应用流程主要包括以下4步:
(1)启用C2DM。手机程序通过注册启用C2DM功能,注册过程如图1中虚线所示。手机程序通过Android系统向C2DM服务器注册(注册1),以获得一个注册号(registration ID);手机程序向第三方应用服务器注册,将刚刚获得的注册号发送给第三方应用服务器(注册2),第三方应用服务器将注册号存入数据库,以便在推送信息时使用。该注册过程只需在程序首次运行时执行一次。
(2)推送信息。如图1中实线所示,第三方应用服务器将需要推送的信息连同目标手机的注册号一起推送给C2DM服务器(推送1)。C2DM服务器收到信息后,检查手机的状态。如果手机在线,就将信息直接推送给手机(推送2);反之,则临时存储信息,等待推送。
(3)接收信息。接收C2DM信息的任务由Android系统负责,当信息到达手机后,Android系统会通过广播Intent唤起相应的手机程序来处理信息,因此手机程序自身不必长期运行。
(4)停用C2DM。当手机用户不愿继续接收第三方应用服务器推送的信息时,手机程序可通过反注册停用C2DM。与注册过程相反,手机程序可请求第三方应用服务器删除注册号,并通过Android系统向C2DM服务器注销掉该注册号。
基于以上C2DM的基本应用流程,完整的商务信息推送服务主要包括两个部分:一部分是客户端程序,运行于Android手机上,见图2左侧灰色部分;另一部分是服务器端程序,通常可作为电子商务企业已有的后端商品信息管理平台的一部分,运行于企业自己的服务器上,见图2右侧灰色部分。
客户端程序包括“注册与反注册模块”和“信息通知模块”两部分,分别对应于C2DM应用流程的(1)、(4)和(3)。“注册与反注册模块”在注册时,除了获取并将注册号提交给服务器端程序外,还需要将客户关心的商品类型(由客户自己选择)和客户的Google账号(用以唯一标识该客户)提交给服务器端程序。此外,该模块还提供反注册功能,当客户不再需要接收商品信息时,用以从服务器端删除客户信息并向C2DM服务器注销注册号。“信息通知模块”主要用以处理收到的商务信息。Android系统底层服务收到C2DM服务器推送来的信息后,会唤起“信息通知模块”来处理。“信息通知模块”发现到达的信息是新品上市信息后,利用Android的系统通知(Notification)功能通知用户查阅。
服务器端程序可分为“注册与注销接口”和“信息推送模块”两部分,分别对应于C2DM应用流程的(1)、(4)和(2)。“注册与注销接口”主要被客户端程序的“注册与反注册模块”调用,可接收并存储客户端程序在注册过程中提交的客户信息和注册号。当客户端程序执行反注册功能时,该接口可用以删除相关的客户信息和注册号。在商品信息管理平台中添加新上市的商品后(通常通过商品管理模块完成),“信息推送模块”会被调用。模块将查询客户信息,如果新上市商品的类型与某客户所关心的商品类型匹配,则将包含新上市商品详细信息的网址作为信息主体发送给C2DM服务器,同时告知C2DM服务器目标客户手机的注册号,以使C2DM服务器准确地将信息推送给目标客户。
对应于商务信息推送服务的技术思路,分别从手机客户端和服务器端这两个部分介绍商务信息推送服务的具体实现细节。
(1)注册与反注册模块
注册与反注册模块主要用以启用和停用C2DM功能,都需要完成一系列的步骤。当客户安装完手机客户端程序后,首先必须通过注册模块启用C2DM功能,注册流程如图3所示:
注册模块首先会让客户从手机内已经设置好的Google账号中选择一个账号,该账号作为客户的唯一标识;让客户选择他所关心的商品类型,例如女装、男装等;然后注册模块向C2DM服务器注册该手机,以获得注册号;若成功获得注册号,注册模块会将该C2DM注册号、客户选择的Google账号和客户选择的商品类型一起发送给商务信息推送服务的服务器端程序;若没有错误,则注册过程顺利完成。整个流程中,“向C2DM服务器注册”和“向服务器端程序注册”这两个步骤最为重要。
①“向C2DM服务器注册”即是通过Android系统的底层服务向C2DM服务器发送一个注册Intent(com.google.android.c2dm.intent.REGISTER),里面必须包括“app”和“sender”这两个参数。“app”用以标识本客户端程序,通过一个PendingIntent提供本客户端程序的基本信息。“sender”用以标识商务信息推送服务的服务器端程序,它的值是一个专用于服务器端程序的Google账号(本服务采用hzshen.myc2dm@gmail.com),该标识是为了让C2DM服务器知道哪个服务器端程序发送的信息需要推送给该客户端。因此,在“服务器端实现”中也会用该账号。“向C2DM服务器注册”步骤的核心代码如下:
public static void register(Context context, String senderId) {
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
//设置app参数
registrationIntent.putExtra("app",PendingIntent.getBroadcast(context, 0, new Intent(), 0));
//设置sender参数
registrationIntent.putExtra("sender", "hzshen.myc2dm@gmail.com");
//启动注册服务
context.startService(registrationIntent);
}
②“向服务器端程序注册”是为了将手机客户端的基本信息发送给服务器端程序,以帮助服务器端程序向客户端正确地发送信息。其中,客户选择的Google账号用作该客户的唯一标识,商品类型表示该客户关心的商品,C2DM注册号是为了让服务器端程序告诉C2DM服务器信息要推送给哪个客户端。注册过程主要是通过服务器端程序提供的注册与注销接口来实现,该接口会在“服务器端实现”中详细说明。
以上是注册模块的基本流程和核心细节,反注册模块正好相反。当客户不再需要商务信息时,反注册模块首先从服务器端删掉该客户的信息,然后再向C2DM服务器注销掉已获得的注册号。由于篇幅所限,反注册模块的实现细节不再赘述。
(2)信息通知模块
信息通知模块主要用以处理被推送至手机客户端的商务信息。客户端程序不需要始终运行,由Android系统底层服务负责接收来自C2DM服务器的数据,然后将数据封装进一个Intent(com.google.android.c2dm.intent.RECEIVE),并通过该Intent唤起客户端程序。直接响应这个Intent的就是信息通知模块,在该模块中,程序首先从Intent中提取数据,包括新品上市信息所涉及商品的类型(用type标识)和指向新品信息详情的网址(用message标识)。程序利用单独的线程封装并发送一个Android系统通知。封装的过程包括创建通知并设置通知的标题和主体内容,最重要的是,将一个可打开网址的Intent(android.intent.action.VIEW)绑定到通知。因此,客户看到Android系统通知后,通过标题和主体得知这是一个某类型商品的新品上市信息,点击该通知后,Android系统会自动调用浏览器程序打开包含信息详情的网页。
当商品信息管理平台中有符合客户需求的商务信息时,可调用服务器端程序推送信息。本文服务器端程序的实现基于J2EE平台,采用MySQL作为后台数据库。程序主体包括给客户端调用的注册与注销接口和信息推送模块这两个部分。
(1)注册与注销接口
注册与注销接口是一类基于HTTP协议的接口。在注册接口的实现中,程序首先从HTTP请求中提取Google账号、商品类型和C2DM注册号,然后将这些数据连同注册时间一起存入后台数据库的device表,以供信息推送模块使用。具体结构如表1所示:
![]() | 表1 device表的结构 |
在device表中,id为自增式的主键,useraccount用于存储客户的Google账号,type用于存储客户所选的商品类型,registrationid用于存储C2DM注册号,registrationtime用于存储客户端的注册时间。
与注册接口相反,注销接口则主要是将某客户端的相关数据从后台数据库中删除,具体细节不再赘述。
(2)信息推送模块
信息推送模块是服务器端程序中实现信息推送功能的主体部分。当商品信息管理平台中添加新上市的商品后,信息推送模块就会被调用来推送信息,调用时需要商品信息管理平台提供新品上市信息的网址和相应的商品类型。信息推送模块是直接向C2DM服务器推送信息的核心部分,实现推送的前提是C2DM服务器要能识别出信息推送模块。因此,在程序开发之前,需申请一个专门的被C2DM认可的Google账号来标识服务器端程序,该账号就是手机客户端向C2DM注册过程中提到的“sender”(本服务采用hzshen.myc2dm@gmail.com)。此外,信息推送模块在向C2DM服务器推送信息前,须先用该Google账号和密码获得Google的认证授权,因为C2DM服务器要求信息发送者必须通过Google认证。因此,商务信息推送过程会由具体的商品管理模块发起,由信息推送模块执行,还会涉及到Google认证服务和C2DM服务器。具体的顺序图如图4所示:
在信息推送模块的实现中,模块首先根据新上市商品的类型从device数据表中查找需要接收该类商品新品上市信息的客户端设备,其中注册号(registrationid)是模块推送信息时必须用到的。然后,利用标识该服务器端程序的Google账号和密码向Google认证服务申请授权令牌(authorization token)。最后,信息推送模块需要将新品上市信息的网址(用message标识)和商品类型(用type标识)封装好并发送给C2DM服务器。发送过程的核心代码如下:
private boolean doSendViaC2dm(String regId, String type, String message){
……
StringBuilder postDataBuilder = new StringBuilder();
//设置注册号
postDataBuilder.append("registration_id").append("=").append(regId);
postDataBuilder.append("&").append("collapse_key").append("=").append(collapseKey);
//封装商品类型
postDataBuilder.append("&").append("data.type").append("=").append(URLEncoder.encode(type, UTF8));
//封装信息的网址
postDataBuilder.append("&").append("data.message").append("=").append(URLEncoder.encode(message, UTF8));
byte[] postData = postDataBuilder.toString().getBytes(UTF8);
//C2DM服务器的信息推送网址
URL aimURL = new URL("https://android.clients.google.com/c2dm/send");
HttpsURLConnection conn = (HttpsURLConnection) aimURL.openConnection();
……
//设置Google的授权令牌
conn.setRequestProperty("Authorization", "GoogleLogin auth="+ googleAuthService.getAuthKey());
OutputStream out = conn.getOutputStream();
out.write(postData); out.close();
……
}
为测试商务信息推送服务的运行效果,将服务器端程序部署在亚马逊云计算服务(Amazon Web Services,AWS)的EC2虚拟服务器上。服务器的操作系统为Linux,J2EE应用服务器软件为Tomcat 5.5.34,采用1.6版的Java运行环境,后台数据库为MySQL 5.0.18。手机测试终端采用Motorola的 Droid手机,其Android系统的版本为2.2.3。
部署并启动服务器端程序,在手机上安装完客户端程序。客户端程序首次运行时要求完成注册工作,依次选择Google账号(此处选择shenhongzhou@gmail.com)和商品类型(此处选择“女装”),最后点击“注册”按钮完成注册。服务器端程序的客户端注册接口会接收并存储相关的手机客户端信息,如图5所示:
通过访问服务器端预设的网址模拟完成女装的添加,触发服务器端的信息推送模块。很快,手机测试终端上出现了Android系统通知,显示“女装新品上市”,点击通知后,可直接通过浏览器访问到新品上市信息的网页(由于该网页不是本文关注的重点,因此测试中用某电子商务平台的网页替代),具体如图6所示:
本文设计并实现了一种新的基于Google云消息框架C2DM的商务信息推送服务,系统地介绍了商务信息推送服务的需求分析、技术思路、整体技术结构、系统实现细节和服务的最终运行效果。为使其发挥更大的作用,电子商务企业可以将本服务的服务器端与其现有的商品信息管理平台深度整合,除了新品上市信息,还可以向客户推送商品促销信息、客户订单信息等。也可以将本服务的客户端与电子商务企业现有的智能手机终端应用整合,使得客户点击系统通知后直接进入智能手机终端应用,帮助客户完成购物付款等一系列操作,从而为客户提供最佳的在线购物体验。
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|