Пример #1
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)
                {
                    log.ErrorFormat("Error sending {0}. Error: {1}.", message.GetType().Name, ex);
                    Disconnect();
                    return(false);
                }
                return(true);
            }
        }
Пример #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);
        }
Пример #3
0
        protected override object Decode(IChannelHandlerContext context, IByteBuffer input)
        {
            var obj = base.Decode(context, input);

            if (AcceptInboundMessage(obj))
            {
                IByteBuffer msg   = (IByteBuffer)obj;
                byte[]      array = new byte[msg.ReadableBytes];
                msg.GetBytes(0, array);
                var cmppHeader = new CmppHead().FromBytes0(array);

                if (cmppHeader.TotalLength == array.Length)
                {
                    CmppMessageReceiveArgs <IMessage, IMessage> args = null;
                    switch (cmppHeader.CommandId)
                    {
                    case CmppConstants.CommandCode.Connect:

                        break;

                    case CmppConstants.CommandCode.ConnectResp:
                        var ConnectResp = new CmppConnectResp().FromBytes0(array);
                        args = new CmppMessageReceiveArgs <IMessage, IMessage>(cmppHeader, ConnectResp);
                        break;

                    case CmppConstants.CommandCode.Terminate:
                        //var Terminate = new CmppTerminate();
                        //Terminate.FromBytes(packet);
                        break;

                    case CmppConstants.CommandCode.TerminateResp:
                        //var TerminateResp = new CmppTerminateResp();
                        //TerminateResp.FromBytes(packet);
                        break;

                    case CmppConstants.CommandCode.Submit:
                        //var Submit = new Cmpp2.CmppSubmit();
                        //Submit.FromBytes(packet);
                        break;

                    case CmppConstants.CommandCode.SubmitResp:
                        var SubmitResp = new CmppSubmitResp().FromBytes0(array);
                        args = new CmppMessageReceiveArgs <IMessage, IMessage>(cmppHeader, SubmitResp);
                        break;

                    case CmppConstants.CommandCode.Deliver:
                        var Deliver = new CmppDeliver().FromBytes0(array);
                        args = new CmppMessageReceiveArgs <IMessage, IMessage>(cmppHeader, Deliver);
                        break;

                    case CmppConstants.CommandCode.DeliverResp:
                        //var DeliverResp = new Cmpp2.CmppDeliverResp();
                        //DeliverResp.FromBytes(packet);
                        break;

                    case CmppConstants.CommandCode.ActiveTest:
                        var ActiveTest = new CmppActiveTest().FromBytes0(array);
                        args = new CmppMessageReceiveArgs <IMessage, IMessage>(cmppHeader, ActiveTest);
                        break;

                    case CmppConstants.CommandCode.ActiveTestResp:
                        var ActiveTestResp = new CmppActiveTestResp().FromBytes0(array);
                        args = new CmppMessageReceiveArgs <IMessage, IMessage>(cmppHeader, ActiveTestResp);
                        break;

                    default:
                        throw new NotSupportedException(cmppHeader.CommandId.ToString());
                    }
                    return(args);
                }
                else
                {
                    throw new InvalidDataException("The received cmpp package is invalid");
                }
            }
            return(obj);
        }
Пример #4
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);
            }
        }