通过手机发送短信的程序

最近几天研究通过数据线把手机和电脑连接起来,然后发送手机短信,看了点PDU编码的东西,那个PDU编码的东东害的我花费了两天时间没有发送出短信,而同事在无意中看到其编码的规则,加上我的理解,做些记录。

首先,通过手机发送中文短信,必须采用PDU的编码方式发送短信,所以在先要发送AT指令,告诉手机,发的是PDU编码:(C#伪代码)
SerialPort port
command = AT+CMGF=0
port.Write(command + "\r");

其次,再告诉手机,你的整个PDU的编码长度是多少:
int cnt = 15 + (pdu.Length - 32) / 2;
command = AT+CMGS=cnt;
port.Write(command + "\r");
String pdu = getPDUMessage(Message,PhoneNo);
//23=15+8,15是 PDU的编码规约头,固定是15,后面的8是你传的汉字的长度,一个汉字两个字符,所以这里的8是我传了4个汉字,规约头的购成见下面的PDU编码方法,即PDU的常量值

private string getPDUMessage(string Sms_Text, string Dest_Number)
{
string pdu = ""; //开始合成 PDU 串
pdu += "0011000D9168";
//SMSC中心号码补F凑成偶数
/*char[] tmpSmscNumber = ("13800100500" + "F").ToCharArray();
for (int i = 0; i < tmpSmscNumber.Length; i += 2) //字符两两对调
{
pdu += tmpSmscNumber[i + 1].ToString();
pdu += tmpSmscNumber[i].ToString();
}*/这段代码原来是要加上短信服务中心的号码,加上后不能发短信了,所以得去掉


char[] tmpDestNumber = (Dest_Number + "F").ToCharArray();//对方号码
for (int i = 0; i < tmpDestNumber.Length; i += 2) //字符两两对调
{
pdu += tmpDestNumber[i + 1].ToString();
pdu += tmpDestNumber[i].ToString();
}
pdu += "000800"; //08 表示采用 UCS2 编码
//短信正文转为Unicode
byte[] tmpSmsText = Encoding.Unicode.GetBytes(Sms_Text);
pdu += tmpSmsText.Length.ToString("X2"); //正文内容长度
for (int i = 0; i < tmpSmsText.Length; i += 2) //高低字节对调
{
pdu += tmpSmsText[i + 1].ToString("X2");//("X2")转为16进制
pdu += tmpSmsText[i].ToString("X2");
} //PDU串 完成
return pdu;
}

最后,发送PDU的短信
command = pdu + "\x01a";
port.Write(command);

我开始一直发送不成功的原因就是PDU的长度和实际长度不一致造成的
注意,里面的command是字符串,要用引号引起来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值