轻松学习C#开发CMPP2.0协议网关-4

来源:互联网 发布:我的淘宝网购物车 编辑:程序博客网 时间:2024/04/27 18:09

大家通过上面3讲应当已经对协议包的封装、解析有了了解。

2、登录应答协议包

3、短信发送协议包

4、短信发送应答协议包

5、上行消息/状态报告协议包

6、上行消息/状态报告应答协议包

7、心跳连接协议包

8、心跳连接应答协议包

剩下这些协议包的封装与解析都类似与登录。

这里要重点讲解的是长短信的封装;

长短信实现

 长短信最主要就是在短信内容前加了一个协议头。同时将submit的参数TP_udhi设为1,将短信格式设为8,提交时,先将短信内容转为ucs2编码,再加上头协议,合成一个byte[]类型,直接提交即可。

协议头的长度为6

byte[] tp_udhiHead = new byte[6];

tp_udhiHead[0] = 0x05;//最大支持5条

tp_udhiHead[1] = 0x00;

tp_udhiHead[2] = 0x03;

tp_udhiHead[3] = 0x01;

tp_udhiHead[4] = (byte)num;//长短信拆分后的条数

tp_udhiHead[5] = 0x01;//当前条数

 

短信消息的总长度为140字节,协议头占用了6字节,剩下的短信内容占用134字节,在拆分短信时按照134字节一条进行拆分。

                                    byte[] _msgContent = Tools.StringToByte(info.Smscontent, "UCS2");                                    //获取长度                                    int messageUCS2Len = _msgContent.Length;                                    //短信最大长度                                    int maxMessageLen = 140;                                        //长短信                                        int messageUCS2Count = messageUCS2Len % 134 == 0 ? messageUCS2Len / 134 : messageUCS2Len / 134 + 1;                                                                                    //长短信分为多少条发送                                            byte[] tp_udhiHead = new byte[6];                                            tp_udhiHead[0] = 0x05; ;                                            tp_udhiHead[1] = 0x00; ;                                            tp_udhiHead[2] = 0x03; ;                                            tp_udhiHead[3] = 0x01; ;                                            tp_udhiHead[4] = (byte)messageUCS2Count; ;                                            tp_udhiHead[5] = 0x01; ;                                            //默认为第一条                                            for (int j = 0; j < messageUCS2Count; j++)                                            {                                                tp_udhiHead[5] = (byte)(j + 1);                                                if (j != messageUCS2Count - 1)                                                {                                                    byte[] msgContent = new byte[134];                                                    //不为最后一条                                                    byte[] ocon = new byte[140];                                                    tp_udhiHead.CopyTo(ocon, 0);                                                    //取出第一条短信                                                    Array.Copy(_msgContent, j * 134, msgContent, 0, 134);                                                    msgContent.CopyTo(ocon, 6);                                                    //发送  ocon                                              }                                                else                                                {                                                    byte[] msgContent1 = new byte[messageUCS2Len - j * 134];                                                    byte[] ocon = new byte[messageUCS2Len - j * 134 + 6];                                                    tp_udhiHead.CopyTo(ocon, 0);                                                    //取出最后一条短信                                                    Array.Copy(_msgContent, j * 134, msgContent1, 0, messageUCS2Len - j * 134);                                                    msgContent1.CopyTo(ocon, 6);                                                    //提交短信,自行添加代码,提交短信                                                    //发送 ocon                                                }                                            }                                                                           


 

原创粉丝点击