private void OnHeartBeatPingTag(HeartbeatPing heartbeatPing)
        {
            HeartbeatAck message = (HeartbeatAck)BuildProtobufOfTag(MessageTag.kHeartbeatAckTag);

            connection.Send(CreateBufferForSend(MessageTag.kHeartbeatAckTag, message));
        }
Exemplo n.º 2
0
        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);
            }
        }