【问题标题】:Cannot send SMS more then 140 via HUAWEI USB stick modem无法通过华为 U 盘调制解调器发送超过 140 条短信
【发布时间】:2018-12-05 19:55:21
【问题描述】:

我使用华为 USB 记忆棒调制解调器和下面的代码成功发送短信,但长度小于 140(请参见代码 pls -- double lenMes = textsms.Length / 2;)。

但现在我看到了非常大的 SMS 消息。

所以我想知道 AT commnds 出了什么问题,或者我的硬件太旧了,所以我无法发送大短信。

请问有什么线索吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;


namespace sendSMSPDU
{
    class Program
    {
        static SerialPort port;

        static void Main(string[] args)
        {
            port = new SerialPort();

            Console.WriteLine("Sending SMS");

            OpenPort();
            bool result;

            result = sendSMS("Some text that less 140 is gonna sending OK", " +75434355544");

            if (result == true)
            {
                Console.WriteLine("OK");
            }
            else
            {
                Console.WriteLine("ERROR");
            }
            Console.ReadLine();

            port.Close();
        }



        private static bool sendSMS(string textsms, string telnumber)
        {
            if (!port.IsOpen) return false;

            try
            {
                System.Threading.Thread.Sleep(500);
                port.WriteLine("AT\r\n");  
                System.Threading.Thread.Sleep(500);

                port.Write("AT+CMGF=0\r\n"); 
                System.Threading.Thread.Sleep(500);
            }
            catch
            {
                return false;
            }

            try
            {
                telnumber = telnumber.Replace("-", "").Replace(" ", "").Replace("+", "");


                telnumber = "01" + "00" + telnumber.Length.ToString("X2") + "91" + EncodePhoneNumber(telnumber);

                textsms = StringToUCS2(textsms);

                string leninByte = (textsms.Length / 2).ToString("X2");
                textsms = telnumber + "00" + "08" + leninByte + textsms;


                double lenMes = textsms.Length / 2;

                if (lenMes < 140) // It sends OK
                {
                    port.Write("AT+CMGS=" + (Math.Ceiling(lenMes)).ToString() + "\r\n");
                    System.Threading.Thread.Sleep(500);


                    textsms = "00" + textsms;

                    port.Write(textsms + char.ConvertFromUtf32(26) + "\r\n");
                    System.Threading.Thread.Sleep(500);
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }

            try
            {
                string recievedData;
                recievedData = port.ReadExisting();

                if (recievedData.Contains("ERROR"))
                {
                    return false;
                }

            }
            catch { }

            return true;
        }


        private static void OpenPort()
        {

            port.BaudRate = 9600;  
            port.DataBits = 7;  

            port.StopBits = StopBits.One;          
            port.Parity = Parity.Odd;  

            port.ReadTimeout = 500;  
            port.WriteTimeout = 500;  

            //port.Handshake = Handshake.RequestToSend;
            //port.DtrEnable = true;
            //port.RtsEnable = true;
            //port.NewLine = Environment.NewLine;

            port.Encoding = Encoding.GetEncoding("windows-1252");

            port.PortName = "COM7";


            if (port.IsOpen)
                port.Close();
            try
            {
                port.Open();
            }
            catch { }

        }




        public static string EncodePhoneNumber(string PhoneNumber)
        {
            string result = "";
            if ((PhoneNumber.Length % 2) > 0) PhoneNumber += "F";

            int i = 0;
            while (i < PhoneNumber.Length)
            {
                result += PhoneNumber[i + 1].ToString() + PhoneNumber[i].ToString();
                i += 2;
            }
            return result.Trim();
        }



        public static string StringToUCS2(string str)
        {
            UnicodeEncoding ue = new UnicodeEncoding();
            byte[] ucs2 = ue.GetBytes(str);

            int i = 0;
            while (i < ucs2.Length)
            {
                byte b = ucs2[i + 1];
                ucs2[i + 1] = ucs2[i];
                ucs2[i] = b;
                i += 2;
            }
            return BitConverter.ToString(ucs2).Replace("-", "");
        }


    }
}

【问题讨论】:

    标签: c# sms send modem


    【解决方案1】:

    单个 SMS 消息仅限于 GSM-7 编码的 160(或 PDU 模式中的 152)符号。不仅如此,如果有任何符号未列出here,您需要使用UCS-2 编码,并且您的消息现在限制为 67 符号。如果您需要发送更长的消息,欢迎来到SMS PDU mode的“闪亮世界”。

    所以发送一条长短信就这么简单:

    1. 将其拆分为 67 个(或 152 个)符号的部分;
    2. 将此部分转换为UCS-2GSM-7 编码;
    3. 将它们转换为PDU 消息;
    4. 使用附加的 AT 命令 (AT+CMGF=0) 依次发送它们

    编辑

    设计PDU格式的人是个真正的恶人。这真是令人心碎的事情,我不想写转换代码,对不起。但是,我可以用这个存根指出你:

    protected void SendMessage(string phoneNumber, string message)
    {
        const char CR = '\r'; // "Carage Return"
        const char CtrlZ = (char)26; // Ctrl+Z character
    
        var header = GeneratePDUHeader(phoneNumber);
        foreach (var messagePart in SplitSMSMessage(message))
        {
            SendToCOM("AT+CMGF=0" + CR);
            SendToCOM("AT+CMGS=42" + CR);
            SendToCOM($"{header}{messagePart}" + CtrlZ);
        }
    }
    
    // should return something like "0041000B910000000000F000088C"
    protected string GeneratePDUHeader(string phoneNumber) { }
    
    // split long message to parts
    protected IEnumerable<string> SplitSMSMessage(string message)
    {
        var useUCSEncoding = IsUCSEncodingNeeded(message);
        var partLength = useUCSEncoding ? 67 : 152;
    
        var messageParts = Enumerable.Range(0, message.Length / partLength)
            .Select(i => message.Substring(i * partLength, partLength))
            .ToArray();
    
        var referenceNumber = $"{GenerateReferenceNumber():X2}"; // convert to HEX, i.e. "01"
        var totalMessagesCount = $"{messageParts.Length:X2}";    // convert to HEX, i.e. "01"
        var udhBase = $"050003{referenceNumber}{totalMessagesCount}";
    
        var messageNumber = (char)0;
        foreach (var messagePart in messageParts)
        {
            var udh = $"{udhBase}{++messageNumber}";
            var messagePartText = useUCSEncoding ? StringToUCS(messagePart) : StringToGSM7(messagePart);
            yield return $"{udh}{messagePartText}";
        }
    }
    
    private void SendToCOM(string message) { } // writes message to COM port
    private bool IsUCSEncodingNeeded(string message) { } // determine if UCS-2 convert is required
    private char GenerateReferenceNumber() { } // random number 0-255
    private string StringToUCS(string message) { } // convert string to UCS encoding
    private string StringToGSM7(string message) { } // convert string to GSM7 encoding (don't forget about padding!)
    

    您可能还会发现此链接很有用:

    【讨论】:

    • 你好兄弟!感谢您的回答!您是否介意更改我的问题代码中的显示以适合您的解决方案作为工作解决方案。谢谢你,伙计!
    • @AcademyofProgrammer 添加了一些代码存根,但这只是一个基本想法。您需要自己实施所有这些对话。有很多工作。
    【解决方案2】:

    我的问题的最佳答案在这里

    How to concat long SMS in GSMComm Library?

    https://github.com/welly87/GSMComm

    https://www.nuget.org/packages/GSMComm/

    我的 HUAWEI GSM 调制解调器可以正常工作!哇!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多