我需要实现一个功能,我的应用服务器可以获得有关Android客户端收到GCM推送通知消息的回复。所以我编写了一个XMPP应用服务器来连接GCM以实现推送通知功能。 首先,我使用http连接到GCM的POST消息:
// Create connection to send GCM Message request.
URL url = new URL("https://android.googleapis.com/gcm/send");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", "key=" + API_KEY);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestMethod("POST");
conn.setDoOutput(true);
// Send GCM message content.
OutputStream outputStream = conn.getOutputStream();
outputStream.write(jGcmData.toString().getBytes());
// Read GCM response.
InputStream inputStream = conn.getInputStream();
String resp = IOUtils.toString(inputStream);
System.out.println(resp);
我得到了成功回应:
{" MESSAGE_ID":5112490523075894883}
然后我的应用收到通知:
public class MyGcmListenerService extends GcmListenerService {
private static final String TAG = "MyGcmListenerService";
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("message");
Log.d(TAG, "From: " + from);
Log.d(TAG, "Message: " + message);
String messageId = data.getString("google.message_id");
Log.d(TAG, "Message id : " + messageId);
.....
}
....
}
我收到了resposne日志:
消息ID:0:1473650899594799%744ab298f9fd7ecd
我的XMPP服务器从GCM获取上游消息:
private void sendAck(String to, String msg_id) {
JsonObject jPayload = new JsonObject();
jPayload.addProperty("to", to);
jPayload.addProperty("message_id", msg_id);
jPayload.addProperty("message_type", "ack");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
final String payload = gson.toJson(jPayload);
Stanza stanza = new Stanza() {
@Override
public CharSequence toXML() {
return wrapWithXML(payload);
}
};
logger.info("sending ack: " + stanza);
smackCcsClient.sendStanza(stanza);
}
当然,我的XMPP服务器收到了响应。
<code>
sending ack: <message><gcm xmlns="google:mobile:data">{
"to": "eE3z_9KSnME:APA91bG36ijVaoKBXi- H2Pi4cieFp2_HYmXsAZ5M2pkHLqS2Xxyr1LwfIPfbO_ZfcVSEO_y9r2H76y-V1Ql3x9jGZ_apvTkZUTPEWD9972gDHBFI0Glb04ajRliULbc19LHiiPaOWZ_2",
"message_id": "0:1473650899594799%744ab298f9fd7ecd",
"message_type": "ack"}</gcm></message>
</code>
我发现XMPP服务器和客户端应用程序中的消息ID是相同的。但格式&#34; 0:1473650899594799%744ab298f9fd7ecd&#34; 是什么意思?什么是&strong>&#34; 0:1473650899594799%744ab298f9fd7ecd&#34; 和&#34; 5112490523075894883&#34; 之间的关系?
我想知道在将消息发送给GCM之后,这两个响应的消息是什么,以及http呼叫和XMPP服务器之间的一对一对应。
我尝试了很多次:
服务器接收消息ID:5242809308476536544
客户端收到消息ID:0:1473670928604617%744ab298f9fd7ecd
服务器接收消息ID:9216122830970130711
客户端收到消息ID:0:1473671350517288%744ab298f9fd7ecd
服务器接收消息ID:5133661789983197332
客户端收到消息ID:0:1473671927731592%744ab298f9fd7ecd
我确实需要你的帮助才能找出这种关系。非常感谢你的帮助!
答案 0 :(得分:0)
据我所知,这些消息ID之间没有任何关系,因为HTTP和XMPP是两个不同的连接服务器。
正如Implementing GCM Server中所述,您可以决定使用哪些GCM连接服务器来实施您的应用服务器。
此外,如文档中所述,message_id
是唯一标识HTTP或XMPP连接的关联消息的字符串。
有关详细信息,您还可以查看以下参考资料: