百度云推送java服务器怎么弄
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度云推送java服务器怎么弄相关的知识,希望对你有一定的参考价值。
在官网没有找到文档,下载的SDK怎样集成到自己的项目中?
百度云(Baidu Cloud)是百度推出的一项云存储服务,首次注册即有机会获得2T的空间,已覆盖主流PC和手机操作系统,包含Web版、Windows版、Mac版、android版、iphone版和Windows Phone版,用户将可以轻松将自己的文件上传到网盘上,并可跨终端随时随地查看和分享。百度云推送
百度提供了完整的Demo帮助开发者集成云推送服务,推送服务SDK通过.jar包和.so文件的方式可以集成到我们自己的工程中。在此之前,需要到百度开发者中心进行应用注册并获取API Key,这个作为使用推送服务应用的唯一标示,具体流程我就不赘述了,需要使用的话可以直接访问百度开发者中心进行查看。
下面主要看看Android_SDK的整体概览和内部运行机制:
上图是百度云推送Android_SDK的框架图,通过SDK可以绕过复杂的Push HTTP/HTTPS API直接和Push服务器进行交互,主要提供如下功能:
Push服务初始化以及Client注册绑定
创建或删除标签(Tag)
接收Push Server的通知并提供自定义展现消息方式
推送统计分析功能,包括通知的点击和删除统计以及应用使用情况统计
富媒体推送
在Android端,总共实现了三个Receiver和一个Service,其中,一个Receiver是用来处理注册绑定后接收服务端返回的channelID等信息:
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver" android:process=": bdservice_v1"> <intent-filter> <action android:name="com.baidu.android.pushservice.action.METHOD " /> <action android:name="com.baidu.android.pushservice.action.BIND_SYNC " /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package" /> </intent-filter> </receiver>
第二个Receiver是用于接收系统消息以保证PushService正常运行:
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver" android:process=": bdservice_v1"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="com.baidu.android.pushservice.action.notification.SHOW" /> <action android:name="com.baidu.android.pushservice.action.media.CLICK" /> </intent-filter> </receiver>
第三个Receiver就是开发者自己实现的用来接收并处理推送消息:
<receiver android:name="your.package.PushMessageReceiver"> <intent-filter> <!-- 接收 push 消息 --> <action android:name="com.baidu.android.pushservice.action.MESSAGE" /> <!-- 接收 bind、setTags 等 method 的返回结果 --> <action android:name="com.baidu.android.pushservice.action.RECEIVE" /> </intent-filter> </receiver>
一个Service就是在后台运行的用于保障与Push Server维持长连接并做相关处理的后台服务:
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true" android:process=" bdservice_v1"/> <!-- push service end -->
在开发者自己需要处理的广播接收器中,可以对接收到的推送消息进行处理,Push消息通过 action为com.baidu.android.pushservice.action.MESSAGE的Intent把数据发送给客户端your.package.PushMessageReceiver,消息格式由应用自己决定,PushService只负责把服务器下发的消息以字符串格式透传给客户端。接口调用回调通过action为com.baidu.android.pushservice.action.RECEIVE的Intent 返回给your.package.PushMessageReceiver。
PushMessageReceiver.java
/** * Push消息处理receiver * @Author Ryan * @Create 2013-8-6 下午5:59:38 */ public class PushMessageReceiver extends BroadcastReceiver public static final String TAG = PushMessageReceiver.class.getSimpleName(); @Override public void onReceive(final Context context, Intent intent) if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) //获取消息内容 String message = intent.getExtras().getString( PushConstants.EXTRA_PUSH_MESSAGE_STRING); //消息的用户自定义内容读取方式 Log.i(TAG, "onMessage: " + message); else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) //处理绑定等方法的返回数据 //PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到 //获取方法 final String method = intent .getStringExtra(PushConstants.EXTRA_METHOD); //方法返回错误码。若绑定返回错误(非0),则应用将不能正常接收消息。 //绑定失败的原因有多种,如网络原因,或access token过期。 //请不要在出错时进行简单的startWork调用,这有可能导致死循环。 //可以通过限制重试次数,或者在其他时机重新调用来解决。 final int errorCode = intent .getIntExtra(PushConstants.EXTRA_ERROR_CODE, PushConstants.ERROR_SUCCESS); //返回内容 final String content = new String( intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT)); //用户在此自定义处理消息,以下代码为demo界面展示用 Log.d(TAG, "onMessage: method : " + method); Log.d(TAG, "onMessage: result : " + errorCode); Log.d(TAG, "onMessage: content : " + content);
通过在入口Activity的onCreate方法中进行推送服务的注册绑定后,即可在推送管理后台或是自己的应用服务器上进行消息推送的操作了。
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY, "you_api_key");
另外,云推送提供php、java等Server端的SDK供开发者在自己的服务器上实现推送服务进行定制化管理和操作。
四、单服务单通道机制
百度云推送实现了单服务单通道的机制,如果在一台Device上安装了多款Push SDK的应用,不会为每个应用都创建PushService,而是会采用多应用共享一个PushService的模式。这样既能减少资源消耗也能降低网络流量。PushService运行于一个独立进程,没有和主进程运行于同一进程,所以主进程不需要常驻内存,当有新的Push消息时,PushService会通过Intent发送消息给主进程进行处理。通过Intent,以指定目标应用包名的方式,发送私有消息给应用。应用即不能接收不属于自己的消息,也不能截取别人的消息,同时又降低了消耗,如下为示意图:
后记:如今,国内提供Android推送服务的还有很多家,例如个推和极光推送等,实现的原理大同小异,开发者可以根据自身需要进行选择。 参考技术A 官方提供的,可以在eclipse上运行。
为方便开发者更灵活方便的使用云推送服务进行开发,云推送服务按照百度HTTP Open API 规范为开发者提供REST风格的 HTTP 和 HTTPS 服务端接口。
URL里的resource为操作的资源名,这里的resource可能为channel固定值,也有可能是具体的channel_id。
query_string由通用参数部分和具体API调用参数部分组成。
query_string中的key/value对都必须经过urlencode处理,且必须是UTF-8编码。
对于GET请求,query_string必须放在QUERY参数中传递,即放在“?”后面。
对于POST请求,query_string放在POST参数中传递。
本文中同一接口的 HTTP 和 HTTPS 版参数一致,请按需使用。
请求方式
目前所有的提交类接口仅支持POST方式,查询类接口同时支持POST方式和GET方式。
通用参数
以下参数是所有云推送服务API都会用到的统一系统级参数。
参数名称
类型
是否必需
描述
method string 是 API的资源操作方法名。
apikey string 是 API的资源操作方法名,访问令牌,明文AK,可从此值获得App的信息,配合sign中的sk做合法性身份认证
timestamp uint 是 用户发起请求时的unix时间戳,本次请求签名的有效时间为该时间戳+10分钟。
sign string 是 调用参数签名值,与apikey成对出现。
expires uint 否 用户指定本次请求签名的失效时间。格式为unix时间戳形式。
v uint 否 API版本号,默认使用最高版本。
注意:
调用时timestamp必须设置,而expires可选设置,用于防止 replay 型攻击。为保证防止 replay 攻击算法的正确有效,请保证客户端系统时间正确。
参数编码
由于云推送服务API的数据交互格式为JSON,所以要求请求参数进行UTF-8编码。
响应数据包格式规范
响应数据包的格式为JSON,输出内容为UTF-8编码。
响应数据包的response heade中的Content-Type头会被设为:
application/json;charset=utf-8
JSON响应输出格式
响应输出内容符合以下规范:
如果交互正常则返回http status code为200,其它错误内容参见下面的错误码定义。
Http API调用失败时平台返回的异常响应输出由error_code, error_msg参数组成,分别用于描述错误码和错误信息。具体参见下面的《错误码定义》。
交互正常时响应里会有一个request_id字段,该字段的值由web server生成,返回给用户方便问题追查与定位。
response_params属性是一个二级json,由n个包含key和value属性的对象组成;表示API返回的数据内容。
响应示例
正确响应(Http Status Code = 200)
“request_id”:12394838223,
“response_params”:
“channel_id”:”124343-32323-12323”,
“channel_token”:”asdfwerf24f2fsdafa-23423asfdsadf”
错误响应(Http Status Code = 400)
“request_id”:12394838223,
“error_code”:30000,
“error_msg”:”Request params not valid”
JSON响应编码
云服务API需要对响应中可能出现中文的部分进行UTF-8转码。
错误码定义
HTTP状态码
Error_code
Error_msg
备注
500 30600 Internal Server Error 服务器内部错误。
405 30601 Method Not Allowed 不允许的操作(指定了错误的HTTP方法或API)。
400 30602 Request Params Not Valid 请求参数非法。
403 30603 Authentication Failed 权限校验错误 。
402 30604 Quota Use Up Payment Required 无quota。
404 30605 Data Required Not Found 请求数据不存在。
408 30606 Request Time Expires Timeout 请求已超时。
408 30607 Channel Token Timeout channel_token已经过期。
404 30608 Bind Relation Not Found 绑定关系不存在。
404 30609 Bind Number Too Many 绑定数过多。
409 30610 Duplicate Operation 重复操作。
404 30611 Group Not Found 组不存在。
签名算法
云推送服务API使用的签名算法如下:
获取请求的http method;
获取请求的url,包括host和sheme,但不包括query_string的部分;
将所有参数(包括GET或POST的参数,但不包含签名字段)格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3”;
将格式化好的参数键值对以字典序升序排列后,拼接在一起,如“k1:v1,k2:v2,k3:v3”,并将http method和url按顺序拼接在这个字符串前面;
在拼接好的字符串末尾追加上应用的secret_key,并进行urlencode,形成base_string;
上述字符串的MD5值即为签名的值: 参考技术B 有API,就好办。应该是一个服务器+客户端的模式。 参考技术C 官网有提供代码呀!也有文档 呀
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/serversdk追问
只有php的文档
Java只有代码,也没有个说明文档
看代码就行了呀!那么简单的东西
消息推送之百度云推送Android集成与用法
这两天因为项目须要。研究了一下百度云推送,本来这事没什么多大工作量的,但注冊百度开发人员账户创建应用令我蛋疼菊紧了好一阵,这些东西做了对技术没啥提升,不做又不行,必经之路。
好在我耗费了N多个毫毫秒秒后稀里哗啦的闯了过来。
在此先吐槽一下。这个云推送尽管没多少东西,但对于初次接触的人来说还是有点不利索的,所以肯定要看官方文档。仅仅是不知是百度哪个哥们做的文档。pdf做的也太不地体贴了:英文字符里面居然有中文空格,拷贝到自己的项目中发现江山一片红,娘的。这猛一看还不一定能看得出来究竟是哪里出了错。
for instance:
what‘s wrong? ....
如今也许能一眼望穿bug,但当血色迷蒙的时候是相当有蛋碎的快感的。
以下開始集成。
先介绍用法以便爽一把
一:用法
1.打开管理控制台,找到自己创建的project
http://developer.baidu.com/console#app/project
2:选择云推送---通知:
注:用户范围:
全部人是向全部安装这一app的用户发送通知
广播组可依据标签向特定用户发送通知
3:手机界面:
二:集成方法:
1.清单文件的配置
①:加权限
<!-- Push service 执行须要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Push service 执行须要的权限 -->
②:注冊消息接收的receiver
<receiver android:name="com.zhuim.sgghealth.MyPushMessageReceiver" >
<intent-filter>
<!-- 接收push消息 -->
<action android:name="com.baidu.android.pushservice.action.MESSAGE" />
<!-- 接收bind、setTags等method的返回结果 -->
<action android:name="com.baidu.android.pushservice.action.RECEIVE" />
<!-- 可选。接受通知点击事件,和通知自己定义内容 -->
<action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
</intent-filter>
</receiver>
<!-- 用于接收系统消息以保证PushService正常执行 -->
<receiver
android:name="com.baidu.android.pushservice.PushServiceReceiver"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
<action android:name="com.baidu.android.pushservice.action.media.CLICK" />
</intent-filter>
</receiver>
<!-- Push服务接收client发送的各种请求 -->
<!-- 注意:RegistrationReceiver 在2.1.1及之前版本号有拼写失误,为RegistratonReceiver ,用新版本号SDK时请更改为例如以下代码 -->
<receiver
android:name="com.baidu.android.pushservice.RegistrationReceiver"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="com.baidu.android.pushservice.action.METHOD" />
<action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<!-- Push 服务 -->
<service
android:name="com.baidu.android.pushservice.PushService"
android:exported="true"
android:process=":bdservice_v1" />
<!-- AndroidMenifest.xml添加pushservice配置 -->
2:代码文件:
①:让推送功能起作用
在自己的主Activity中增加以下代码,让推送功能開始工作:
// 以apikey的方式登录。一般放在主Activity的onCreate中
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY, "bYI*********************zLi3qLk");
当中的apikey是自己project的创建时赋予的:
②:继承FrontiaApplication类
public class MyApp extends FrontiaApplication {
public List<Activity> activitiesList;
@Override
public void onCreate() {
// TODO Auto-generated method stub
activitiesList = new ArrayList<Activity>();
super.onCreate();
}
}
③:自己定义广播接收者:
public class MyPushMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
// 获取消息内容
String message = intent.getExtras().getString(
PushConstants.EXTRA_PUSH_MESSAGE_STRING);
} else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) {
// 处理绑定等方法的返回数据
// PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到
final String method = intent.getStringExtra(PushConstants.EXTRA_METHOD);
// 方法返回错误码。若绑定返回错误(非0)。则应用将不能正常接收消息。
// 绑定失败的原因有多种,如网络原因。或access token过期。
// 请不要在出错时进行简单的startWork调用。这有可能导致死循环。
// 能够通过限制重试次数,或者在其它时机又一次调用来解决。
int errorCode = intent.getIntExtra(PushConstants.EXTRA_ERROR_CODE,PushConstants.ERROR_SUCCESS);
String content = "";
if (intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT) != null)
content = new String(intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT));
// 用户在此自己定义处理消息:TODO Something
// 通知用户点击事件处理
} else if (intent.getAction().equals(
PushConstants.ACTION_RECEIVER_NOTIFICATION_CLICK)) {
String title = intent.getStringExtra(PushConstants.EXTRA_NOTIFICATION_TITLE);
String content = intent.getStringExtra(PushConstants.EXTRA_NOTIFICATION_CONTENT);
// 用户在此自己定义处理点击事件:TODO Something
}
}
}
④:导入百度云推送所须要的jar包及so文件:
libs下导入pushservice-3.2.0.jar并add to build path
libs/armeabi下导入libbdpush_V1_0.so
以上是关于百度云推送java服务器怎么弄的主要内容,如果未能解决你的问题,请参考以下文章