|
发表于 2013-11-23 21:02:17
|
显示全部楼层
本帖最后由 kevinzhang 于 2013-11-23 21:10 编辑
八锅借用大神代码发送pdu模式短信,木有啥反应,好像没有发送。 跪求大神再搭救一哈啦子。{:soso_e183:}
==
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2,3);
String phoneNumber = "+86138177XXXXX"; // 接收方号码
String messageCenterNumber = "+8613800210500"; // 短信中心号码
String message_text = "DU mode test."; // 短信内容
void setup()
{
mySerial.begin(19200);
SevenBitPduSms(messageCenterNumber, phoneNumber, message_text);
}
void loop()
{
}
// 函数作用:AT指令发送7-bit编码的PDU短信。SMSCNumber:短信中心号码;
// ReceiverNumber:接收方号码;message:短信内容
void SevenBitPduSms(String SMSCNumber, String ReceiverNumber, String message)
{
String PDUSMSCNumber; // 经过处理的短信服务中心号码
String _SMSCNumber; // 中间变量,处理短信服务中心号码时使用
String msgPDU; // 经过处理的接收方号码和短信内容
String _ReceiverNumber; // 中间变量,处理接收方号码时使用
// 处理短息服务中心号码
_SMSCNumber = SMSCNumber;
if(_SMSCNumber.charAt(0) == '+') // 如果首位是‘+’,除掉它
_SMSCNumber = _SMSCNumber.substring(1,_SMSCNumber.length());
if(_SMSCNumber.length()%2 == 1) // 如果号码的长度是奇数,在后面加上一个‘F’
_SMSCNumber += "F";
PDUSMSCNumber = Dec2Hex_String(_SMSCNumber.length()/2 + 1);
// 短信服务中心号码的长度,包括后面的“91”,两位、十六进制
PDUSMSCNumber += String(91); // SMSC 地址类型,“91” 国际格式
for(int i = 0; i < _SMSCNumber.length()/2; i++)
{ // 短信中心号码,十进制数值,将奇偶位互换
PDUSMSCNumber += _SMSCNumber.charAt(i*2+1);
PDUSMSCNumber += _SMSCNumber.charAt(i*2);
}
//处理接收方号码
_ReceiverNumber = ReceiverNumber;
if(_ReceiverNumber.charAt(0) == '+') // 如果首位是‘+’,除掉它
_ReceiverNumber = _ReceiverNumber.substring(1,_ReceiverNumber.length());
msgPDU = "1100"; // “11” TP_MTI/VFP; “00” TP-MR
msgPDU += Dec2Hex_String(_ReceiverNumber.length());
// 接收方号码的长度,不包括后面的“91”和“F”,两位、十六进制
msgPDU +="91"; // SMSC 地址类型,“91” 国际格式
if(_ReceiverNumber.length()%2 == 1)
_ReceiverNumber += 'F'; // 如果号码的长度是奇数,在后面加上一个‘F’
for(int i = 0; i < _ReceiverNumber.length() / 2; i++)
{ // 接收方号码,十进制数值,将奇偶位互换
msgPDU += _ReceiverNumber.charAt(i*2+1);
msgPDU += _ReceiverNumber.charAt(i*2);
}
// 处理短信内容
msgPDU += "000000";
// “00” 协议标识(TP-PID)是普通GSM类型,点对点方式;
// “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)
msgPDU += Dec2Hex_String(message.length()); // 所发送的信息的长度,两位、十六进制
msgPDU += gsmEncode7bit(message); // 所发送的信息,7位编码
// 发送短信
mySerial.print("AT+CMGS="); // 发送AT指令“AT+CMGS=”
mySerial.println(msgPDU.length() / 2); // 经过处理接收方号码和信息内容的长度,十进制,字节数
delay(50); // 延时 50ms
mySerial.print(PDUSMSCNumber); // 发送经过处理的短信服务中心号码
mySerial.print(msgPDU); // 发送经过处理的接收方号码和短信内容
mySerial.println(char(26)); // 结束标志 Ctrl^Z,ASCII码值为 26
}
// 将2位的十进制数转换为十六进制,字符串格式
String Dec2Hex_String(int number_2bit)
{
String number;
if(number_2bit < 16)
number = "0";
number += String(number_2bit, HEX);
number.toUpperCase();
return number;
}
// 7-bit编码
String gsmEncode7bit(String pSrc)
{
int nSrc = 0; // 源字符串的计数值
String pDst ; // 转换完的结果
String nStr ; // 中间变量,将源字符串的每8位作为一组
int nSrcLength = pSrc.length(); // 源字符串的长度
for(int byteSrc = 0; byteSrc <= nSrcLength/8; byteSrc++)
{ // 将源字符串的每8位作为一组
nStr = pSrc.substring(byteSrc*8,(byteSrc+1)*8);
for(int index = 0; index < 7; index ++)
{
int nChar;
nChar = (nStr.charAt(index) >> index) | ((nStr.charAt(index + 1) & (0xFF >> (7 - index))) << (7 - index));
// 将8位编码转换为7位编码
pDst += Dec2Hex_String(nChar); // 将2位的十进制数转换为十六进制,字符串格式
nSrc ++; // 已经转换完的源字符数,如果已经转换完,退出程序
if(nSrc >= nSrcLength-1) break;
}
}
return pDst;
} |
|