Пример #1
0
        public DecodedMessage PDUDecoder(int SmsIndex, string strPDU)
        {
            int lenSCA = 0;             //错误PDU时可能抛出异常
            int lenOA;
            int lenPDU = strPDU.Length;

            try
            {
                lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2;       //短消息中心占长度

                //int lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2;       //短消息中心占长度

                serviceCenterAddress = strPDU.Substring(0, lenSCA);

                //PDU-type位组
                protocolDataUnitType = strPDU.Substring(lenSCA, 2);

                lenOA = Convert.ToInt32(strPDU.Substring(lenSCA + 2, 2), 16);           //OA占用长度
                if (lenOA % 2 == 1)                                                     //奇数则加1 F位
                {
                    lenOA++;
                }
                lenOA            += 4;      //加号码编码的头部长度
                originatorAddress = strPDU.Substring(lenSCA + 2, lenOA);

                dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2);             //DCS赋值,区分解码7bit

                serviceCenterTimeStamp = strPDU.Substring(lenSCA + lenOA + 6, 14);

                userDataLength = strPDU.Substring(lenSCA + lenOA + 20, 2);
                int lenUD = Convert.ToInt32(userDataLength, 16) * 2;
            }
            catch (Exception ex)
            {
                //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围
                throw new Exception(ex.Message + " PDU:" + strPDU);
            }

            if ((Convert.ToInt32(protocolDataUnitType, 16) & 0x40) != 0) //长短信
            {
                if (dataCodingScheme.Substring(1, 1) == "8")             //USC2 长短信 去掉消息头
                {
                    try
                    {
                        userDataLength = (Convert.ToInt16(strPDU.Substring(lenSCA + lenOA + 20, 2), 16) - 6).ToString("X2");
                        userData       = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2);
                    }
                    catch (Exception ex)
                    {
                        //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围
                        throw new Exception(ex.Message + " LongMSG1-PDU:" + strPDU);
                    }
                    return(new DecodedMessage(SmsIndex, strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2)
                                              + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2)
                                              , ServiceCenterAddress
                                              , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-"
                                              + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":"
                                              + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2)
                                              , OriginatorAddress, UserData, UserData_Old));
                }
                else
                {
                    try
                    {
                        userData = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2 + 1 * 2);   //消息头六字节,第一字节特殊译码 >>7
                    }
                    catch (Exception ex)
                    {
                        //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围
                        throw new Exception(ex.Message + " LongMSG2-PDU:" + strPDU);
                    }
                    //首字节译码
                    byte byt   = Convert.ToByte(strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2, 2), 16);
                    char first = (char)(byt >> 1);
                    return(new DecodedMessage(SmsIndex, strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2)
                                              + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2)
                                              , ServiceCenterAddress
                                              , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-"
                                              + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":"
                                              + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2)
                                              , OriginatorAddress
                                              , first + UserData, UserData_Old));
                }
            }

            try
            {
                userData = strPDU.Substring(lenSCA + lenOA + 22);
            }
            catch (Exception ex)
            {
                //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围
                throw new Exception(ex.Message + " SMSUserData-PDU:" + strPDU);
            }
            return(new DecodedMessage(SmsIndex, "010100"
                                      , ServiceCenterAddress
                                      , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-"
                                      + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":"
                                      + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2)
                                      , OriginatorAddress
                                      , UserData, UserData_Old));
        }
Пример #2
0
        /*
         * /// <summary>
         * /// 完成手机或短信猫收到PDU格式短信的解码 暂时仅支持中文编码
         * /// 未用DCS部分
         * /// </summary>
         * /// <param name="strPDU">短信PDU字符串</param>
         * /// <param name="msgCenter">短消息服务中心 输出</param>
         * /// <param name="phone">发送方手机号码 输出</param>
         * /// <param name="msg">短信内容 输出</param>
         * /// <param name="time">时间字符串 输出</param>
         * public void PDUDecoder(string strPDU, out string msgCenter, out string phone, out string msg, out string time)
         * {
         *  int lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2;       //短消息中心占长度
         *  serviceCenterAddress = strPDU.Substring(0, lenSCA);
         *
         *  int lenOA = Convert.ToInt32(strPDU.Substring(lenSCA + 2, 2),16);           //OA占用长度
         *  if (lenOA % 2 == 1)                                                     //奇数则加1 F位
         *  {
         *      lenOA++;
         *  }
         *  lenOA += 4;                 //加号码编码的头部长度
         *  originatorAddress = strPDU.Substring(lenSCA + 2, lenOA);
         *
         *  dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2);             //DCS赋值,区分解码7bit
         *
         *  serviceCenterTimeStamp = strPDU.Substring(lenSCA + lenOA + 6, 14);
         *
         *  userDataLenghth = strPDU.Substring(lenSCA + lenOA + 20, 2);
         *  int lenUD = Convert.ToInt32(userDataLenghth, 16) * 2;
         *  userData = strPDU.Substring(lenSCA + lenOA + 22);
         *
         *  msgCenter = ServiceCenterAddress;
         *  phone = OriginatorAddress;
         *  msg = UserData;
         *  time = ServiceCenterTimeStamp;
         * }
         */
        #endregion 解码注释掉

        /// <summary>
        /// 重载 解码,返回信息字符串 格式
        /// </summary>
        /// <param name="strPDU">短信PDU字符串</param>
        /// <returns>信息字符串(MMNN,中心号码,手机号码,发送时间,短信内容 MM这批短信总条数 NN本条所在序号)</returns>
        public DecodedMessage PDUDecoder(string strPDU)
        {
            int lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2;       //短消息中心占长度

            serviceCenterAddress = strPDU.Substring(0, lenSCA);

            //PDU-type位组
            protocolDataUnitType = strPDU.Substring(lenSCA, 2);

            int lenOA = Convert.ToInt32(strPDU.Substring(lenSCA + 2, 2), 16);       //OA占用长度

            if (lenOA % 2 == 1)                                                     //奇数则加1 F位
            {
                lenOA++;
            }
            lenOA            += 4;      //加号码编码的头部长度
            originatorAddress = strPDU.Substring(lenSCA + 2, lenOA);

            dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2);             //DCS赋值,区分解码7bit

            serviceCenterTimeStamp = strPDU.Substring(lenSCA + lenOA + 6, 14);

            userDataLenghth = strPDU.Substring(lenSCA + lenOA + 20, 2);
            int lenUD = Convert.ToInt32(userDataLenghth, 16) * 2;

            if ((Convert.ToInt32(protocolDataUnitType, 16) & 0x40) != 0) //长短信
            {
                if (dataCodingScheme.Substring(1, 1) == "8")             //USC2 长短信 去掉消息头
                {
                    userDataLenghth = (Convert.ToInt16(strPDU.Substring(lenSCA + lenOA + 20, 2), 16) - 6).ToString("X2");
                    userData        = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2);

                    return(new DecodedMessage(strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2)
                                              + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2)
                                              , ServiceCenterAddress
                                              , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-"
                                              + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":"
                                              + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2)
                                              , OriginatorAddress, UserData));
                }
                else
                {
                    userData = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2 + 1 * 2);   //消息头六字节,第一字节特殊译码 >>7

                    //首字节译码
                    byte byt   = Convert.ToByte(strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2, 2), 16);
                    char first = (char)(byt >> 1);

                    return(new DecodedMessage(strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2)
                                              + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2)
                                              , ServiceCenterAddress
                                              , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-"
                                              + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":"
                                              + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2)
                                              , OriginatorAddress
                                              , first + UserData));
                }
            }

            userData = strPDU.Substring(lenSCA + lenOA + 22);
            return(new DecodedMessage("010100"
                                      , ServiceCenterAddress
                                      , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-"
                                      + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":"
                                      + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2)
                                      , OriginatorAddress
                                      , UserData));
        }