查看: 5469|回复: 4

[软件] Uno32控制手机(Siemens CX65)发短信

[复制链接]

该用户从未签到

发表于 2012-8-8 11:42:31 | 显示全部楼层 |阅读模式
分享到:
原帖由
i7
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------

/*
Serial1_2_MobilePhone_SMS_7bit
本程序编写时,参考了网友和一些公司公布出来的程序,手册,如有侵权,请与我联系: i7456@126.com
不保证程序无任何错误,请勿用于商业或其它违反中国法律的用途。使用前请自行测试,本人不承担运行此程序造成的任何结果。
2012-6-30
*/
String phoneNumber = "+8613800138000";
String messageCenterNumber = "+8613800100500";
String message_text = "helloworld";
void setup()
{
  Serial1.begin(9600);
}
void loop()
{
  SevenBitPduSms(messageCenterNumber, phoneNumber, message_text);
  delay(20000);
}

//函数作用:AT指令发送7-bit编码的PDU短信。SMSCNumber:短息服务中心号码;ReceiverNumber:接收方号码;message:短信内容,字符类型
void SevenBitPduSms(String SMSCNumber, String ReceiverNumber, String message)  
{
  String PDUSMSCNumber;      //把串口发送的数据,分为两个部分。此部分为经处理的短信服务中心号码。
  String _SMSCNumber;        //中间变量,处理短信服务中心号码时使用。
  String msgPDU;             //把串口发送的数据,分为两个部分。此部分为经过处理接收方的号码和信息内容。
  String _ReceiverNumber;    //中间变量,处理接收方号码时使用。
  //////////////////////////////////////Short Message Service Center Number////////////////////////
  //////////////////////////////////////处理短息服务中心号码///////////////////////////////////////
  _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);                                         //Type of address of SMSC, "91"internation format

    for(int i = 0; i < _SMSCNumber.length()/2; i++)                    //短信服务中心号码,十进制数值,将奇偶位互换
      {
        PDUSMSCNumber += _SMSCNumber.charAt(i*2+1);
        PDUSMSCNumber += _SMSCNumber.charAt(i*2);
      }
   //////////////////////////////////////Reciever phoneNumber////////////////////////
   ///////////////////////////////////////处理接收方短信号码/////////////////////////
   _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";                                                                 //Type of address of SMSC, "91"internation format
   
   if(_ReceiverNumber.length()%2 == 1)                                           //如果号码的长度是奇数,在后面加上一个‘F’
    _ReceiverNumber += 'F';  
   
    for(int i = 0; i < _ReceiverNumber.length()/2; i++)                          //接收方号码,十进制数值,将奇偶位互换
      {
        msgPDU += _ReceiverNumber.charAt(i*2+1);
        msgPDU += _ReceiverNumber.charAt(i*2);
      }
   //////////////////////////////////////Message////////////////////////
   msgPDU += "000000";                                    //“00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)
   msgPDU += Dec2Hex_String(message.length());            //所发送的信息的长度,两位、十六进制
   msgPDU += gsmEncode7bit(message);                      //所发送的信息,7位编码
   //////////////////////////////////////Send Message////////////////////////  
  Serial1.print("AT+CMGS=");                             //发送AT指令“AT+CMGS=”
  Serial1.println(msgPDU.length()/2);                    //经过处理接收方的号码和信息内容的长度,十进制,字节数
  delay(50);                                              //延时50ms
  Serial1.print(PDUSMSCNumber);                          //把串口发送的数据,分为两个部分。此部分为经处理的短信服务中心号码。
  Serial1.print(msgPDU);                                 //                                此部分为经过处理接收方的号码和信息内容
  Serial1.println(char(26));                             //结束标志Ctrl^z ,Ascii码值为26
}
//将2位的十进制数转换为十六进制,字符串格式
String Dec2Hex_String(int number_2bit)
{
  String number;
  int firstBit = number_2bit/16;        //高位
  int secondBit = number_2bit%16;       //低位

   number = char(firstBit > 9 ? firstBit + 0x37 : firstBit + 0x30);          //如果大于9,加0x37,转换为ASCII码 10->A;如果小于9,加0x30
   number += char(secondBit > 9 ? secondBit + 0x37 : secondBit + 0x30);     //如果大于9,加0x37,转换为ASCII码 10->A;如果小于9,加0x30
   return number;
}

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;
}

回复

使用道具 举报

  • TA的每日心情
    难过
    2013-10-28 12:52
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-10-28 13:01:25 | 显示全部楼层
    支持一下,极客工坊过来学习的~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2013-10-28 12:52
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-10-28 14:39:54 | 显示全部楼层
    代码看着好乱,我给整理一下吧:

    如果81-82行编译出错的话,可以把char换成String试试
    1. /*
    2. Serial1_2_MobilePhone_SMS_7bit
    3. 本程序编写时,参考了网友和一些公司公布出来的程序,手册,如有侵权,请与我联系: i7456@126.com
    4. 不保证程序无任何错误,请勿用于商业或其它违反中国法律的用途。使用前请自行测试,本人不承担运行此程序造成的任何结果。
    5. 2012-6-30
    6. */
    7. String phoneNumber = "+8613800138000";
    8. String messageCenterNumber = "+8613800100500";
    9. String message_text = "helloworld";
    10. void setup()
    11. {
    12.   Serial1.begin(9600);
    13. }
    14. void loop()
    15. {
    16.   SevenBitPduSms(messageCenterNumber, phoneNumber, message_text);
    17.   delay(20000);
    18. }

    19. //函数作用:AT指令发送7-bit编码的PDU短信。SMSCNumber:短息服务中心号码;ReceiverNumber:接收方号码;message:短信内容,字符类型
    20. void SevenBitPduSms(String SMSCNumber, String ReceiverNumber, String message)  
    21. {
    22.   String PDUSMSCNumber;      //把串口发送的数据,分为两个部分。此部分为经处理的短信服务中心号码。
    23.   String _SMSCNumber;        //中间变量,处理短信服务中心号码时使用。
    24.   String msgPDU;             //把串口发送的数据,分为两个部分。此部分为经过处理接收方的号码和信息内容。
    25.   String _ReceiverNumber;    //中间变量,处理接收方号码时使用。
    26.   //////////////////////////////////////Short Message Service Center Number////////////////////////
    27.   //////////////////////////////////////处理短息服务中心号码///////////////////////////////////////
    28.   _SMSCNumber = SMSCNumber;
    29.   if(_SMSCNumber.charAt(0) == '+')                                      //如果首位是‘+’,除掉它
    30.   _SMSCNumber = _SMSCNumber.substring(1,_SMSCNumber.length());

    31.   if(_SMSCNumber.length()%2 == 1)                                       //如果号码的长度是奇数,在后面加上一个‘F’
    32.   _SMSCNumber += "F";

    33.   PDUSMSCNumber = Dec2Hex_String(_SMSCNumber.length()/2 + 1);          //短信服务中心号码的长度,包括后面的“91“,两位、十六进制
    34.   PDUSMSCNumber += String(91);                                         //Type of address of SMSC, "91"internation format

    35.     for(int i = 0; i < _SMSCNumber.length()/2; i++)                    //短信服务中心号码,十进制数值,将奇偶位互换
    36.       {
    37.         PDUSMSCNumber += _SMSCNumber.charAt(i*2+1);
    38.         PDUSMSCNumber += _SMSCNumber.charAt(i*2);
    39.       }
    40.    //////////////////////////////////////Reciever phoneNumber////////////////////////
    41.    ///////////////////////////////////////处理接收方短信号码/////////////////////////
    42.    _ReceiverNumber = ReceiverNumber;
    43.   if(_ReceiverNumber.charAt(0) == '+')                                           //如果首位是‘+’,除掉它
    44.   _ReceiverNumber = _ReceiverNumber.substring(1,_ReceiverNumber.length());      

    45.     msgPDU = "1100";                                                             //"11" TP_MTI/VFP; "00" TP-MR                                                                                                               
    46.   msgPDU += Dec2Hex_String(_ReceiverNumber.length());                            //接收方号码的长度,不包括后面的“91”和“F”,两位、十六进制
    47.   msgPDU +="91";                                                                 //Type of address of SMSC, "91"internation format
    48.    
    49.    if(_ReceiverNumber.length()%2 == 1)                                           //如果号码的长度是奇数,在后面加上一个‘F’
    50.     _ReceiverNumber += 'F';  
    51.    
    52.     for(int i = 0; i < _ReceiverNumber.length()/2; i++)                          //接收方号码,十进制数值,将奇偶位互换
    53.       {
    54.         msgPDU += _ReceiverNumber.charAt(i*2+1);
    55.         msgPDU += _ReceiverNumber.charAt(i*2);
    56.       }
    57.    //////////////////////////////////////Message////////////////////////
    58.    msgPDU += "000000";                                    //“00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)
    59.    msgPDU += Dec2Hex_String(message.length());            //所发送的信息的长度,两位、十六进制
    60.    msgPDU += gsmEncode7bit(message);                      //所发送的信息,7位编码
    61.    //////////////////////////////////////Send Message////////////////////////  
    62.   Serial1.print("AT+CMGS=");                             //发送AT指令“AT+CMGS=”
    63.   Serial1.println(msgPDU.length()/2);                    //经过处理接收方的号码和信息内容的长度,十进制,字节数
    64.   delay(50);                                              //延时50ms
    65.   Serial1.print(PDUSMSCNumber);                          //把串口发送的数据,分为两个部分。此部分为经处理的短信服务中心号码。
    66.   Serial1.print(msgPDU);                                 //                                此部分为经过处理接收方的号码和信息内容
    67.   Serial1.println(char(26));                             //结束标志Ctrl^z ,Ascii码值为26
    68. }
    69. //将2位的十进制数转换为十六进制,字符串格式
    70. String Dec2Hex_String(int number_2bit)
    71. {
    72.   String number;
    73.   int firstBit = number_2bit/16;        //高位
    74.   int secondBit = number_2bit%16;       //低位

    75.    number = char(firstBit > 9 ? firstBit + 0x37 : firstBit + 0x30);          //如果大于9,加0x37,转换为ASCII码 10->A;如果小于9,加0x30
    76.    number += char(secondBit > 9 ? secondBit + 0x37 : secondBit + 0x30);     //如果大于9,加0x37,转换为ASCII码 10->A;如果小于9,加0x30
    77.    return number;
    78. }

    79. String gsmEncode7bit(String pSrc)
    80. {
    81.   int nSrc = 0;        //源字符串的计数值
    82.   String pDst ;        //转换完的结果
    83.   String nStr ;        //中间变量,将源字符串的每8位作为一组
    84.   int nSrcLength = pSrc.length();      //源字符串的长度


    85.   for(int byteSrc = 0; byteSrc <= nSrcLength/8; byteSrc++)    //将源字符串的每8位作为一组
    86.   {
    87.     nStr = pSrc.substring(byteSrc*8,(byteSrc+1)*8);
    88.     for(int index = 0; index < 7; index ++)
    89.     {
    90.       int nChar;
    91.       nChar = (nStr.charAt(index)>>index) | ((nStr.charAt(index+1)&(0xFF>>(7-index)))<<(7-index));    //将8位编码转换为7位编码
    92.       pDst += Dec2Hex_String(nChar);                                                                  //将2位的十进制数转换为十六进制,字符串格式
    93.       nSrc ++;                          //已经转换完的源字符数,如果已经转换完,退出程序
    94.       if(nSrc >= nSrcLength-1) break;   
    95.     }
    96.   }
    97.   return pDst;
    98. }
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2013-12-4 09:38
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-12-3 19:32:41 | 显示全部楼层
    没有高亮看起来还是不爽。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-1 16:42:10 | 显示全部楼层
    整理一下看起来是舒服多了,有硬件原理图或者框图就跟好了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-20 01:39 , Processed in 0.162160 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.