回复:WinCC解决方案-短信

工控界的程序员

  • 帖子

    13
  • 精华

    0
  • 被关注

    6

论坛等级:游士

注册时间:2017-11-20

普通 普通 如何晋级?

发布于 2017-11-22 14:00:21

1楼

补下中文编码的代码:


    public class PDUEncoder

    {

        /// <summary>

        /// 服务中心地址编码(SCA = Service Center Adress)

        /// </summary>

        /// <param name="SCA">服务中心地址</param>

        /// <returns>编码后的字符串</returns>

        /// <remarks>

        /// SCA组成:1~12个八位位组

        /// A:服务中心地址长度,长度1,其值为B+C字节数

        /// B:服务中心地址类型,长度0~1

        /// C:服务中心地址,长度0~10。

        /// </remarks>

        private static string SCAEncoding(string SCA)

        {

            if (string.IsNullOrEmpty(SCA))

            {   // 表示使用SIM卡内部的设置值,该值通过AT+CSCA指令设置

                return "00";

            }


            StringBuilder sb = new StringBuilder(SCA.Length + 5);

            int Index = 0;

            if (SCA.StartsWith("+"))

            {   // 国际号码

                sb.Append((SCA.Length / 2 + 1).ToString("X2"));         // SCA长度编码

                sb.Append("91");    // SCA类型编码

                Index = 1;

            }

            else

            {   // 国内号码

                sb.Append(((SCA.Length + 1) / 2 + 1).ToString("X2"));   // SCA长度编码

                sb.Append("81");    // SCA类型编码

            }


            // SCA地址编码

            for (; Index < SCA.Length; Index += 2)

            {   // 号码部分奇偶位对调

                if (Index == SCA.Length - 1)

                {

                    sb.Append(SCA[Index]);

                }

                else

                {

                    sb.Append(SCA[Index + 1]);

                }

            }


            return sb.ToString();

        }

        /// <summary>

        /// 接收方地址编码

        /// </summary>

        /// <param name="DA">接收方地址</param>

        /// <returns>编码后的字符串</returns>

        /// <remarks>

        /// DA组成:2~12个八位位组

        /// F:地址长度,长度1。注意:其值是接收方地址长度,而非字节数

        /// G:地址类型,长度1,取值同B。

        /// H:地址,长度0~10。

        /// </remarks>

        private static string DAEncoding(string DA)

        {

            if (string.IsNullOrEmpty(DA))

            {   // 地址长度0,地址类型未知

                return "0080";

            }


            StringBuilder sb = new StringBuilder(DA.Length + 5);

            sb.Append("1100");

            int Index = 0;

            if (DA.StartsWith("+"))

            {   // 国际号码

                sb.Append((DA.Length - 1).ToString("X2"));  // 地址长度编码

                sb.Append("91");    // 地址类型

                Index = 1;

            }

            else

            {   // 国内号码

                sb.Append(DA.Length.ToString("X2"));        // 地址长度编码

                sb.Append("81");    // 地址类型

            }


            for (; Index < DA.Length; Index += 2)

            {   // 号码部分奇偶位对调

                if (Index == DA.Length - 1)

                {

                    sb.Append("F");     // 补“F”凑成偶数个

                }

                else

                {

                    sb.Append(DA[Index + 1]);

                    sb.Append(DA[Index]);

                }

            }

            return sb.ToString();

        }


        /// <summary>

        /// 用户数据内容编码

        /// </summary>

        /// <param name="UDC">用户数据内容</param>

        /// <param name="UDCL">输出:UCS2编码字节数或7-Bit编码字符数</param>

        /// <returns>编码字符串</returns>

        private static string UDCEncoding(string UDC, out int UDCL)

        {

            if (string.IsNullOrEmpty(UDC))

            {

                UDCL = 0;

                return string.Empty;

            }


            // UCS2编码

            UDCL = UDC.Length;     // 字节数

            StringBuilder sb = new StringBuilder(UDCL << 1);

            foreach (char Letter in UDC)

            {

                sb.Append(Convert.ToInt32(Letter).ToString("X4"));

            }


            return sb.ToString();

        }

        /// <summary>

        /// 获取PDU

        /// </summary>

        /// <param name="SCA">服务中心地址</param>

        /// <param name="DA">短信发送地址</param>

        /// <param name="msg">短信内容</param>

        /// <param name="DALen">数据长度</param>

        /// <returns></returns>

        public static string GetPDU(string SCA, string DA, string msg,out int DALen)

        {

            string SCAPdu = SCAEncoding(SCA);

            string DAPdu = DAEncoding(DA);

            int len = 0;

            string UDCPdu = UDCEncoding(msg, out len);


            StringBuilder sb = new StringBuilder();

            sb.Append(SCAPdu).Append(DAPdu).Append(len.ToString("X2")).Append(UDCPdu);

            DALen = (sb.Length - SCAPdu.Length) / 2;

            return sb.ToString();

        }

    }


承接WinCC脚本、控件、数据采集、存档、报表开发。微信见头像。

推荐帖推荐理由:代码体现解决问题的思路(推荐人:'Razor)

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32575条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。