private void OnHeartBeatPingTag(HeartbeatPing heartbeatPing) { HeartbeatAck message = (HeartbeatAck)BuildProtobufOfTag(MessageTag.kHeartbeatAckTag); connection.Send(CreateBufferForSend(MessageTag.kHeartbeatAckTag, message)); }
public bool connectMcs(string androidId, string securityToken) { util.debugWriteLine("connectMcs " + androidId + " " + securityToken); const int kMCSVersion = 41; try { var lr = BuildLoginRequest(androidId, securityToken); using (var client = new TcpClient("mtalk.google.com", 5228)) using (sslStream = new SslStream(client.GetStream(), false, delegate { return(true); })) { sslStream.AuthenticateAsClient("mtalk.google.com"); sslStream.ReadTimeout = 100 * 60 * 1000; sslStream.Write(new byte[] { kMCSVersion, (byte)MCSProtoTag.kLoginRequestTag }); sendMessage(lr); var version = sslStream.ReadByte(); util.debugWriteLine("mcs version " + version); Task.Factory.StartNew(() => { while (isRetry) { //Thread.Sleep(15000); Thread.Sleep(1 * 60 * 1000); util.debugWriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " ping " + sslStream.GetHashCode()); try { var ping = new HeartbeatPing(); sendMessage(ping); } catch (Exception e) { util.debugWriteLine("ping error " + e.Message + e.Source + e.StackTrace + e.TargetSite); break; } } util.debugWriteLine("ping end " + sslStream.GetHashCode()); }); while (isRetry) { util.debugWriteLine("apppush before tag"); var responseTag = getTag(sslStream); if (responseTag == -1) { util.debugWriteLine("getTag error "); break; } util.debugWriteLine("apppush after tag"); var _tag = (MCSProtoTag)Enum.ToObject(typeof(MCSProtoTag), responseTag); util.debugWriteLine(DateTime.Now + " resp tag " + responseTag + " "); // if (_tag == MCSProtoTag.kHeartbeatPingTag || _tag == MCSProtoTag.kCloseTag) { break; } else if (_tag != MCSProtoTag.kLoginResponseTag && _tag != MCSProtoTag.kIqStanzaTag && _tag != MCSProtoTag.kDataMessageStanzaTag && _tag != MCSProtoTag.kHeartbeatPingTag) { //continue; } util.debugWriteLine("apppush before proto"); var proto = BuildProtobufFromTag(_tag, sslStream); util.debugWriteLine("apppush after proto"); if (_tag == MCSProtoTag.kLoginResponseTag) { } else if (_tag == MCSProtoTag.kIqStanzaTag) { } else if (_tag == MCSProtoTag.kDataMessageStanzaTag) { onReceiveData((DataMessageStanza)proto); } else { util.debugWriteLine("unknown response: " + _tag.ToString()); } } } util.debugWriteLine("apppush closed"); return(true); } catch (Exception e) { util.debugWriteLine("mcs connect error " + e.Message + e.Source + e.StackTrace + e.TargetSite); return(false); } }