i7456 发表于 2013-11-24 11:01:32

kevinzhang 发表于 2013-11-24 10:28 static/image/common/back.gif
在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

kevinzhang 发表于 2013-11-24 11:16:03

i7456 发表于 2013-11-24 11:01 static/image/common/back.gif
这样肯定是不行的。
从网上查到的信息:
1.发送中文短信,需要用UCS2编码


:'(:'(:'(:'(:'(:'(

i7456 发表于 2013-11-24 11:36:34

kevinzhang 发表于 2013-11-24 11:16 static/image/common/back.gif


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


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

shenhaiyu 发表于 2013-11-24 12:53:13

i7456 发表于 2013-11-24 11:36 static/image/common/back.gif
从网上找到个中文转UCS2编码的小软件。




要是有个在Arduino中直接转换中文的库就好了~~~

kevinzhang 发表于 2013-11-24 13:26:23

本帖最后由 kevinzhang 于 2013-11-24 13:27 编辑

i7456 发表于 2013-11-24 11:36 static/image/common/back.gif
从网上找到个中文转UCS2编码的小软件。




再请教一下大神:

这些都是字符型的吗?


kevinzhang 发表于 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()
{
}

i7456 发表于 2013-11-24 18:42:38

本帖最后由 i7456 于 2013-11-24 18:44 编辑

kevinzhang 发表于 2013-11-24 15:26 static/image/common/back.gif
这样行不行呢?

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

void loop() {
UCS2PduSms(messageCenterNumber, phoneNumber, message_text);
delay(200000);
}

// 函数作用:AT指令发送7-bit编码的PDU短信。SMSCNumber:短信中心号码;ReceiverNumber:接收方号码;message:短信内容
void UCS2PduSms(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 += "000800";                         // “00” 协议标识(TP-PID)是普通GSM类型,点对点方式; “08”用户信息编码方式(TP-DCS) UCS2编码; “00”有效期(TP-VP)
msgPDU += Dec2Hex_String(message.length()/2); // 所发送的信息的长度,两位、十六进制. 例如"4F60597D"是8位,这里应该是4
   msgPDU += message;         // 所发送的信息,UCS2编码
   
// 发送短信
mySerial.print("AT+CMGS=");            // 发送AT指令“AT+CMGS=”
mySerial.println(msgPDU.length()/ 2); // 经过处理接收方号码和信息内容的长度,十进制,字节数
delay(100);                           // 延时 50ms
mySerial.print(PDUSMSCNumber);         // 发送经过处理的短信服务中心号码
delay(100);
mySerial.print(msgPDU);                // 发送经过处理的接收方号码和短信内容
delay(100);
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;
}
上面的程序我已经测试成功了发送中文短信,我用的是西门子的手机CX65,根据你用的短信模块,可能需要做些修改。

kevinzhang 发表于 2013-11-24 19:01:50

大神,这个UCS2编码,是不是和unicode编码是一样的?

i7456 发表于 2013-11-24 20:56:51

kevinzhang 发表于 2013-11-24 19:01 static/image/common/back.gif
大神,这个UCS2编码,是不是和unicode编码是一样的?

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

学慧放弃 发表于 2013-11-24 21:16:06

i7456 发表于 2013-11-24 18:42 static/image/common/back.gif
上面的程序我已经测试成功了发送中文短信,我用的是西门子的手机CX65,根据你用的短信模块,可能需要做些修 ...

弱弱的 问句楼上怎么通过串口打包发送???

i7456 发表于 2013-11-24 21:51:15

学慧放弃 发表于 2013-11-24 21:16 static/image/common/back.gif
弱弱的 问句楼上怎么通过串口打包发送???

抱歉,看不懂你的问题

kevinzhang 发表于 2013-11-25 17:36:47

i7456 发表于 2013-11-24 20:56 static/image/common/back.gif
这个我也不懂。网上查了下,可以简单的认为是一样,但概念还是有差别的。

:L呕滴神呀

学慧放弃 发表于 2013-11-25 19:06:55

i7456 发表于 2013-11-24 21:51 static/image/common/back.gif
抱歉,看不懂你的问题

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

i7456 发表于 2013-11-25 20:30:43

学慧放弃 发表于 2013-11-25 19:06 static/image/common/back.gif
就是数据发送不是容易出现丢失吗??可以打包发送,通过加效验字,你会吗?那样可以避免数据损坏,就算丢失也可 ...

这里不需要、也不能加校验

kevinzhang 发表于 2013-11-26 10:05:18

i7456 发表于 2013-11-25 20:30 static/image/common/back.gif
这里不需要、也不能加校验

可能她指的是一般性数据传输中的压缩,不是特定指PDU。
页: 1 2 [3] 4 5
查看完整版本: 通过串口收发短消息(PDU方式的具体实现)