我使用华为U盘调制解调器和下面的代码成功发送短信,但长度低于140(请参阅代码--double lenMes=textsms.length/2;
)。
但现在我看到了非常大的短信。
所以我想知道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("-", "");
}
}
}
我的问题最好的答案就在这里
如何在GSMComm库中接收长短信?
https://github.com/welly87/GSMComm
https://www.nuget.org/packages/GSMComm/
我的华为GSM调制解调器工作正常!哇!
单个SMS消息在GSM-7编码中被限制为160个(或152个PDU模式)符号。此外,如果这里没有列出任何符号,您需要使用UCS-2编码,您的消息现在被限制为67个符号。如果您需要发送更长的消息,欢迎您进入短信PDU模式的“明亮闪亮的世界”。
所以发送一条长短信就像:
UCS-2
或GSM-7
编码;PDU
消息;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!)
您可能还会发现以下链接很有用:
最好的方法是什么?我读过,但大多数话题都过时了。大多数示例都使用“COM”端口,但我在COM连接(在设备管理器中)中找不到USB调制解调器,而不是在“网卡”中。
我有一个调制解调器中兴型号MF190,并希望通过在串行端口上的AT命令发送短信。我的问题是:当我发送AT命令时,调制解调器响应错误CMS error:305 他研究了很多关于错误的信息,他在信息中使用了一些无效字符,但我在信息中没有写任何错误。 检查: 有趣的是,如果我发送一条空消息,我就会收到短信(显然是空的) 有人去过那里,知道如何通过这种型号的调制解调器配置或发送短信?
我正在创建一个小VB项目,我想通过短信发送一些信息。我试图在这里找到解决方案,但可以得到一个线程。 我使用的是华为E1731 3G USB调制解调器,它能够通过官方软件发送和接收短信。如何使用调制解调器通过从表单中的文本框中获取号码,将固定消息发送到特定号码?
我正在用PHP7.1编写一个脚本,用华为E3531 usb调制解调器发送短信。没有文档记录,我很难找到解决方案。这是发送短信的脚本,但我收到一个错误100002。首先,我用curl恢复令牌和sessionid,然后再次使用curl发布短信 然而,我已经做了另一个脚本,让短信已经发送,它确实工作。以下是代码: 在这个链接上使用的三个步骤(通过命令行与华为E3131和debian系统上的HiLink发
我试图通过控制台发送< code > SMS ,但显然我没有收到任何消息。 到目前为止我做了什么? 创造了一个话题 创建了我的号码和电子邮件ID的订阅。 发表了一条消息 在我的电子邮件ID上,我可以接收相同主题的消息,但不能在手机上接收。 甚至尝试了其他手机,只是为了确保我的号码没有阻止消息,但结果是一样的,sns短信是不能通过控制台工作!!!
我试图使用USB调制解调器发送短信(我有一个D-Link Usb调制解调器)。我刚刚找到SmsLib,但我不知道如何使用USB调制解调器。我找到的例子是串行调制解调器,我没有找到任何USB调制解调器的例子。我需要将usb端口映射为串行端口吗?使用什么?我的调制解调器由SmsLib支持。您对如何使用SmsLib配置USB调制解调器有任何想法吗? (我有一台MacBook)。