极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: shenhaiyu

通过串口收发短消息(PDU方式的具体实现)

[复制链接]
发表于 2013-11-24 11:01:32 | 显示全部楼层
kevinzhang 发表于 2013-11-24 10:28
在message_text里改成中文的内容。

这样肯定是不行的。
从网上查到的信息:
1.发送中文短信,需要用UCS2编码
msgPDU += "000000";                        
// “00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “00”用户信息编码方式(TP-DCS) 7-bit编码; “00”有效期(TP-VP)
发送中文短信时,TP-DCS应该是“08”
2.函数String gsmEncode7bit(String pSrc)也不再适用,这个是函数是7位编码的。
参考这里:  http://www.docin.com/p-334991618.html
回复 支持 反对

使用道具 举报

发表于 2013-11-24 11:16:03 | 显示全部楼层
i7456 发表于 2013-11-24 11:01
这样肯定是不行的。
从网上查到的信息:
1.发送中文短信,需要用UCS2编码

回复 支持 反对

使用道具 举报

发表于 2013-11-24 11:36:34 | 显示全部楼层
kevinzhang 发表于 2013-11-24 11:16

从网上找到个中文转UCS2编码的小软件。


试试ucs-big的结果;
如果短信发送的是固定内容,可以直接用这个软件转换好,写在程序里。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-24 12:53:13 | 显示全部楼层
i7456 发表于 2013-11-24 11:36
从网上找到个中文转UCS2编码的小软件。

要是有个在Arduino中直接转换中文的库就好了~~~
回复 支持 反对

使用道具 举报

发表于 2013-11-24 13:26:23 | 显示全部楼层
本帖最后由 kevinzhang 于 2013-11-24 13:27 编辑
i7456 发表于 2013-11-24 11:36
从网上找到个中文转UCS2编码的小软件。


再请教一下大神:

这些都是字符型的吗?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-11-24 15:26:53 | 显示全部楼层
这样行不行呢?

#include<SoftwareSerial.h>

SoftwareSerial mySerial(2,3);

void setup()
{
  char myMsg_01_SCA[] = {0x08, 0x91, 0x86, 0x31, 0x08, 0x20, 0x01, 0x05, 0xF0, 0x11, 0x00, 0x0B, 0x81, 0x31, 0x18, 0x77, 0x38, 0x61, 0x4F, 0x00, 0x08, 0xA8, 0x06, 0xC9, 0x36, 0x3C, 0x3C, 0xA6, 0x03};

  mySerial.begin(19200);
  mySerial.println("AT");
  delay(50);
  mySerial.println("AT+CMGF=0");
  delay(50);
  mySerial.print("AT+CMGS=");
  mySerial.println(myMsg_01_SCA);
  delay(50);
  mySerial.println(char(26));
  delay(50);
  mySerial.println();
}

void loop()
{
}
回复 支持 反对

使用道具 举报

发表于 2013-11-24 18:42:38 | 显示全部楼层
本帖最后由 i7456 于 2013-11-24 18:44 编辑
kevinzhang 发表于 2013-11-24 15:26
这样行不行呢?

#include
  1. /*
  2. SoftSerial_2_MobilePhone_SMS_UCS2
  3. 本程序编写时,参考了网友和一些公司公布出来的程序,手册,如有侵权,请与我联系: [email][email protected][/email]
  4. 不保证程序无任何错误,请勿用于商业或其它违反中国法律的用途。使用前请自行测试,本人不承担运行此程序造成的任何结果。
  5. 2013-11-24
  6. */
  7. #include <SoftwareSerial.h>
  8. String phoneNumber = "+8613800138000";         // 接收方号码
  9. String messageCenterNumber = "+8613800100500"; // 短信中心号码
  10. //String message_text = "Hello world!";          // 短信内容
  11. String message_text = "4F60597D";    // 短信内容UCS2:"你好"
  12. SoftwareSerial mySerial(8,9);
  13. void setup() {
  14.   mySerial.begin(9600);
  15. }

  16. void loop() {
  17.   UCS2PduSms(messageCenterNumber, phoneNumber, message_text);
  18.   delay(200000);
  19. }

  20. // 函数作用:AT指令发送7-bit编码的PDU短信。SMSCNumber:短信中心号码;ReceiverNumber:接收方号码;message:短信内容
  21. void UCS2PduSms(String SMSCNumber, String ReceiverNumber, String message) {
  22.   String PDUSMSCNumber;   // 经过处理的短信服务中心号码
  23.   String _SMSCNumber;     // 中间变量,处理短信服务中心号码时使用
  24.   String msgPDU;          // 经过处理的接收方号码和短信内容
  25.   String _ReceiverNumber; // 中间变量,处理接收方号码时使用

  26.   // 处理短息服务中心号码
  27.   _SMSCNumber = SMSCNumber;
  28.   if(_SMSCNumber.charAt(0) == '+')                            // 如果首位是‘+’,除掉它
  29.   _SMSCNumber = _SMSCNumber.substring(1,_SMSCNumber.length());
  30.   if(_SMSCNumber.length()%2 == 1)                             // 如果号码的长度是奇数,在后面加上一个‘F’
  31.   _SMSCNumber += "F";
  32.   PDUSMSCNumber = Dec2Hex_String(_SMSCNumber.length()/2 + 1); // 短信服务中心号码的长度,包括后面的“91”,两位、十六进制
  33.   PDUSMSCNumber += String(91);                                // SMSC 地址类型,“91” 国际格式
  34.   for(int i = 0; i < _SMSCNumber.length()/2; i++) {           // 短信中心号码,十进制数值,将奇偶位互换
  35.     PDUSMSCNumber += _SMSCNumber.charAt(i*2+1);
  36.     PDUSMSCNumber += _SMSCNumber.charAt(i*2);
  37.   }

  38.   //处理接收方号码
  39.   _ReceiverNumber = ReceiverNumber;
  40.   if(_ReceiverNumber.charAt(0) == '+')                        // 如果首位是‘+’,除掉它
  41.      _ReceiverNumber = _ReceiverNumber.substring(1,_ReceiverNumber.length());
  42.   msgPDU = "1100";                                            // “11” TP_MTI/VFP; “00” TP-MR
  43.   msgPDU += Dec2Hex_String(_ReceiverNumber.length());         // 接收方号码的长度,不包括后面的“91”和“F”,两位、十六进制
  44.   msgPDU +="91";                                              // SMSC 地址类型,“91” 国际格式
  45.   if(_ReceiverNumber.length()%2 == 1) _ReceiverNumber += 'F'; // 如果号码的长度是奇数,在后面加上一个‘F’
  46.   for(int i = 0; i < _ReceiverNumber.length() / 2; i++) {     // 接收方号码,十进制数值,将奇偶位互换
  47.     msgPDU += _ReceiverNumber.charAt(i*2+1);
  48.     msgPDU += _ReceiverNumber.charAt(i*2);
  49.   }

  50.   // 处理短信内容
  51.   msgPDU += "000800";                         // “00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “08”用户信息编码方式(TP-DCS) UCS2编码; “00”有效期(TP-VP)  
  52.   msgPDU += Dec2Hex_String(message.length()/2); // 所发送的信息的长度,两位、十六进制. 例如"4F60597D"是8位,这里应该是4
  53.    msgPDU += message;           // 所发送的信息,UCS2编码
  54.    
  55.   // 发送短信
  56.   mySerial.print("AT+CMGS=");            // 发送AT指令“AT+CMGS=”
  57.   mySerial.println(msgPDU.length()/ 2); // 经过处理接收方号码和信息内容的长度,十进制,字节数
  58.   delay(100);                             // 延时 50ms
  59.   mySerial.print(PDUSMSCNumber);         // 发送经过处理的短信服务中心号码
  60.   delay(100);  
  61.   mySerial.print(msgPDU);                // 发送经过处理的接收方号码和短信内容
  62.   delay(100);  
  63.   mySerial.println(char(26));            // 结束标志 Ctrl^Z,ASCII码值为 26


  64. }

  65. // 将2位的十进制数转换为十六进制,字符串格式
  66. String Dec2Hex_String(int number_2bit) {

  67.   String number;

  68.   if(number_2bit < 16)
  69.     number = "0";   

  70.   number += String(number_2bit, HEX);
  71.   number.toUpperCase();

  72.   return number;
  73. }
复制代码
上面的程序我已经测试成功了发送中文短信,我用的是西门子的手机CX65,根据你用的短信模块,可能需要做些修改。

回复 支持 反对

使用道具 举报

发表于 2013-11-24 19:01:50 | 显示全部楼层
大神,这个UCS2编码,是不是和unicode编码是一样的?
回复 支持 反对

使用道具 举报

发表于 2013-11-24 20:56:51 | 显示全部楼层
kevinzhang 发表于 2013-11-24 19:01
大神,这个UCS2编码,是不是和unicode编码是一样的?

这个我也不懂。网上查了下,可以简单的认为是一样,但概念还是有差别的。
回复 支持 反对

使用道具 举报

发表于 2013-11-24 21:16:06 | 显示全部楼层
i7456 发表于 2013-11-24 18:42
上面的程序我已经测试成功了发送中文短信,我用的是西门子的手机CX65,根据你用的短信模块,可能需要做些修 ...

弱弱的 问句楼上怎么通过串口打包发送???
回复 支持 反对

使用道具 举报

发表于 2013-11-24 21:51:15 | 显示全部楼层
学慧放弃 发表于 2013-11-24 21:16
弱弱的 问句楼上怎么通过串口打包发送???

抱歉,看不懂你的问题
回复 支持 反对

使用道具 举报

发表于 2013-11-25 17:36:47 | 显示全部楼层
i7456 发表于 2013-11-24 20:56
这个我也不懂。网上查了下,可以简单的认为是一样,但概念还是有差别的。

呕滴神呀
回复 支持 反对

使用道具 举报

发表于 2013-11-25 19:06:55 | 显示全部楼层
i7456 发表于 2013-11-24 21:51
抱歉,看不懂你的问题

就是数据发送不是容易出现丢失吗??可以打包发送,通过加效验字,你会吗?那样可以避免数据损坏,就算丢失也可以被发现
回复 支持 反对

使用道具 举报

发表于 2013-11-25 20:30:43 | 显示全部楼层
学慧放弃 发表于 2013-11-25 19:06
就是数据发送不是容易出现丢失吗??可以打包发送,通过加效验字,你会吗?那样可以避免数据损坏,就算丢失也可 ...

这里不需要、也不能加校验
回复 支持 反对

使用道具 举报

发表于 2013-11-26 10:05:18 | 显示全部楼层
i7456 发表于 2013-11-25 20:30
这里不需要、也不能加校验

可能她指的是一般性数据传输中的压缩,不是特定指PDU。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 03:06 , Processed in 0.044983 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表