Esempio n. 1
0
        public void TestProtocol()
        {
            using (var client = new TcpClient(_config.GatewayIp, _config.GatewayPort))
            {
                var dt = DateTime.Now;
                SendMessage(client.Client, new CmppConnect
                {
                    TimeStamp = uint.Parse(string.Format("{0:MMddhhmmss}", dt)),
                    AuthenticatorSource = CreateAuthenticatorSource(dt),
                    Version = CmppConstants.Version,
                    SourceAddress = _config.GatewayUsername,
                });
                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                var buffer = new byte[12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                var head = new CmppHead();
                head.FromBytes(buffer);
                Assert.AreEqual(CmppConstants.CommandCode.ConnectResp, head.CommandId);

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[head.TotalLength - 12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                var response = new CmppConnectResp();
                response.FromBytes(buffer);
                Assert.AreEqual(0, response.Status);
                // connected
                SendMessage(client.Client, new CmppActiveTest());

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                head = new CmppHead();
                head.FromBytes(buffer);
                Assert.AreEqual(CmppConstants.CommandCode.ActiveTestResp, head.CommandId);

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[head.TotalLength - 12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                var active = new CmppActiveTestResp();
                active.FromBytes(buffer);

                Console.WriteLine("Sending message.");
                var submit = new CmppSubmit
                {
                    // 信息内容。
                    MsgContent = "Test",
                    // 信息编码。
                    MsgFmt = (byte)CmppEncoding.UCS2,
                    // SP的服务代码,将显示在最终用户手机上的短信主叫号码。
                    SrcId = _config.SpCode + "1111",
                    // 接收短信的电话号码列表。
                    DestTerminalId = new[] { "13800138000" },
                    // 业务标识(如:woodpack)。
                    ServiceId = _config.ServiceId,
                    // 是否要求返回状态报告。
                    RegisteredDelivery = 1,
                    // 资费类别。
                    FeeType = string.Format("{0:D2}", (int)FeeType.Free),
                    // 计费用户。
                    FeeUserType = (byte)FeeUserType.SP,
                    // 被计费的号码(feeUserType 值为 FeeUser 时有效)。
                    FeeTerminalId = _config.SpCode,
                    // 被计费号码的真实身份(“真实号码”或“伪码”)。
                    FeeTerminalType = 0,
                    // 信息费(以“分”为单位,如:10 分代表 1角)。
                    FeeCode = "10",
                    // 点播业务的 linkId。
                    LinkId = "",
                    PkTotal = (byte)(_config.AttemptRemoveSignature ? 3 : 1),
                    PkNumber = (byte)(_config.AttemptRemoveSignature ? 2 : 1),
                    MsgLevel = 0,
                    TPPId = 0,
                    TPUdhi = 0,
                    MsgSrc = _config.GatewayUsername,
                    ValidTime = "",
                    AtTime = ""
                };
                SendMessage(client.Client, submit);

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                head = new CmppHead();
                head.FromBytes(buffer);
                Assert.AreEqual(CmppConstants.CommandCode.SubmitResp, head.CommandId);

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[head.TotalLength - 12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                var submitResponse = new CmppSubmitResp();
                submitResponse.FromBytes(buffer);
                Assert.AreEqual(0, submitResponse.Result);

                Console.WriteLine("Waiting for message report.");

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                head = new CmppHead();
                head.FromBytes(buffer);
                Assert.AreEqual(CmppConstants.CommandCode.Deliver, head.CommandId);

                Assert.True(client.Client.Poll(-1, SelectMode.SelectRead));
                buffer = new byte[head.TotalLength - 12];
                Assert.AreEqual(buffer.Length, client.Client.Receive(buffer));
                var deliver = new CmppDeliver();
                deliver.FromBytes(buffer);
                Assert.AreEqual(1, deliver.RegisteredDelivery);
                var report = deliver.GetReport();
                Assert.AreEqual(submitResponse.MsgId, report.MsgId);

                Console.WriteLine("Message report: [{0}] {1}", report.MsgId, report.Stat);
            }
        }
Esempio n. 2
0
 private static void SendMessage(Socket socket, ICmppMessage message)
 {
     var buffer = message.ToBytes();
     var head = new CmppHead
     {
         CommandId = message.GetCommandId(),
         SequenceId = _seq++,
         TotalLength = (uint)(CmppConstants.HeaderSize + buffer.Length)
     };
     socket.Send(head.ToBytes());
     socket.Send(buffer);
 }
Esempio n. 3
0
        public bool Send(uint sequenceId, ICmppMessage message)
        {
            lock (_lock)
            {
                if (!Connected) return false;
                try
                {
                    if (_socket.Poll(0, SelectMode.SelectError) || !_socket.Poll(50000, SelectMode.SelectWrite))
                    {
                        Disconnect();
                        return false;
                    }

                    var buffer = message.ToBytes();
                    var header = new CmppHead
                    {
                        SequenceId = sequenceId,
                        TotalLength = (uint)(CmppConstants.HeaderSize + buffer.Length),
                        CommandId = message.GetCommandId()
                    };
                    _socket.Send(header.ToBytes());
                    _socket.Send(buffer);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error sending {0}. Error: {1}.", message.GetType().Name, ex);
                    Disconnect();
                    return false;
                }
                return true;
            }
        }