GCM云连接服务器没有';在XMPP上不响应SASL
使用agsXMPP连接到Google云消息XMPP API,以便向Android设备发送通知 连接建立正常,但在SASL启动时,在发送普通auth元素后,服务器停止响应,并在20秒后关闭连接 Base64从文档页()解码身份验证示例显示以下登录值: 126200347933@projects.gcm.android.com12620034793@项目ga-.android.comAIzaSyB3rcZNkfnqKdFb9mhzCBiYpORDA2JWWtw 其中agsXMPP(我认为正确)对字符串进行编码,给出如下内容: [ProjectID]\40gcm.googleapis.com[**API*密钥*密码**] 请注意,我的版本中的\40而不是谷歌示例中的@——这会有所不同吗 我期待一条成功或失败的消息,没有任何响应都很难调试。这可能是某些失败的原因,还是谷歌的XMPP实现没有提供正确的响应 更新:GCM云连接服务器没有';在XMPP上不响应SASL,xmpp,google-cloud-messaging,agsxmpp,Xmpp,Google Cloud Messaging,Agsxmpp,使用agsXMPP连接到Google云消息XMPP API,以便向Android设备发送通知 连接建立正常,但在SASL启动时,在发送普通auth元素后,服务器停止响应,并在20秒后关闭连接 Base64从文档页()解码身份验证示例显示以下登录值: 126200347933@projects.gcm.android.com12620034793@项目ga-.android.comAIzaSyB3rcZNkfnqKdFb9mhzCBiYpORDA2JWWtw 其中agsXMPP(我认为正确)对字符
我在下面回答说,基本上是的,谷歌无法处理编码的@字符,因为它不支持XMPP扩展。经过更多测试,我在agsXMPP中添加了一个新的SaslFactory机制,并将其绑定为使用未编码的用户名(部分扩展,谷歌不支持),然后在SaslStarteEvent上-指定我希望使用该机制,而不是内置的普通机制。-现在连接将正常继续
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中的机制继承的MyPlainsMechanismClass
,源代码与原始的PlainSaslMechanism相同,除了输入用户名的行之外-您可以使用args上的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);
}
}
没有办法不编辑源代码吗?谢谢。@BarbarosAlp是的,我在答案中添加了一个例子——基本上是添加了一个新的SaslMechanism,保持了原始agsXMPP代码不变。哦,上帝,终于找到了……太好了
public class GcmPlainSaslExtendedData : agsXMPP.Sasl.ExtendedData
{
public string Username { get; set; }
}