GCM Cloud Connection Server不响应XMPP上的SASL

时间:2013-07-17 10:34:19

标签: xmpp google-cloud-messaging agsxmpp

使用agsXMPP连接到Google Cloud Messaging XMPP API,以便向Android设备发送通知。

建立连接正常,但在SASL启动时,在发送PLAIN auth元素后,服务器停止响应,并在再过20秒后关闭连接。

Base64对文档页面(http://developer.android.com/google/gcm/ccs.html)中的auth示例进行解码,显示登录值:

  

126200347933 @ projects.gcm.android.com12620034793 @项目-GA-.android.comAIzaSyB3rcZNkfnqKdFb9mhzCBiYpORDA2JWWtw

agsXMPP(正确地说我认为)编码字符串的地方,给出类似的东西:

  

[专案编号] \ 40gcm.googleapis.com [** API * KEY * PASSWORD **]

请注意我的版本中的 \ 40 而不是Google示例中的 @ - 这会有所不同吗?

我期待成功或失败的消息,根本没有响应很难调试。这可能导致某些失败,或者Google的XMPP实施是否提供了正确的答案。

更新:

我在下面回答,基本上,是的,Google无法处理编码的@字符,因为它不支持该XMPP扩展。

1 个答案:

答案 0 :(得分:2)

经过一些更多的测试,我在agsXMPP中添加了一个新的SaslFactory机制并将其绑定为使用没有编码的用户名(扩展http://xmpp.org/extensions/xep-0106.html的一部分,Google不支持),然后在SaslStartEvent上 - 指定我想使用该机制而不是内置的机制。 - 现在连接将正常继续。

xmpp = new XmppClientConnection();
xmpp.UseSSL = true;
xmpp.UseStartTLS = false;
xmpp.Server = "gcm.googleapis.com";
xmpp.ConnectServer = "gcm.googleapis.com";
xmpp.Port = 5235;
/* Other connection settings /*

SaslFactory.AddMechanism("MyPLAINMechanism", typeof(MyPlainMechanismClass));

xmpp.OnSaslStart += (sender, args) =>
                                {
                                   args.Auto = false;
                                   args.Mechanism = "MyPLAINMechanism";
                                   args.ExtentedData = new GcmPlainSaslExtendedData
                                                          {
                                                             Username = "MY UNENCODED USERNAME"
                                                          };
                                };

然后我们在agsXMPP中定义从机制继承的MyPlainMechanismClass,源代码与原始PlainSaslMechanism相同,除了输入用户名的行 - 您可以使用{{传递未编码的用户名args上的1}}属性。

ExtendedData

我们用于传递自定义参数的自定义public class MyPlainMechanismClass: Mechanism { private XmppClientConnection m_XmppClient = null; public GcmPlainSaslMechanism() { } public override void Init(XmppClientConnection con) { m_XmppClient = con; // <auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">$Message</auth> m_XmppClient.Send(new agsXMPP.protocol.sasl.Auth(agsXMPP.protocol.sasl.MechanismType.PLAIN, Message())); } public override void Parse(Node e) { // not needed here in PLAIN mechanism } private string Message() { // NULL Username NULL Password StringBuilder sb = new StringBuilder(); //sb.Append( (char) 0 ); //sb.Append(this.m_XmppClient.MyJID.Bare); sb.Append((char)0); //sb.Append(this.Username); sb.Append(((GcmPlainSaslExtendedData) this.ExtentedData).Username); sb.Append((char)0); sb.Append(this.Password); byte[] msg = Encoding.UTF8.GetBytes(sb.ToString()); return Convert.ToBase64String(msg, 0, msg.Length); } } 对象,例如本例中未编码的用户名。

ExtendedData