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
i7456 发表于 2013-11-24 11:01 static/image/common/back.gif
这样肯定是不行的。
从网上查到的信息:
1.发送中文短信,需要用UCS2编码
:'(:'(:'(:'(:'(:'(
kevinzhang 发表于 2013-11-24 11:16 static/image/common/back.gif
从网上找到个中文转UCS2编码的小软件。
试试ucs-big的结果;
如果短信发送的是固定内容,可以直接用这个软件转换好,写在程序里。
i7456 发表于 2013-11-24 11:36 static/image/common/back.gif
从网上找到个中文转UCS2编码的小软件。
要是有个在Arduino中直接转换中文的库就好了~~~
本帖最后由 kevinzhang 于 2013-11-24 13:27 编辑
i7456 发表于 2013-11-24 11:36 static/image/common/back.gif
从网上找到个中文转UCS2编码的小软件。
再请教一下大神:
这些都是字符型的吗?
这样行不行呢?
#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: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,根据你用的短信模块,可能需要做些修改。
大神,这个UCS2编码,是不是和unicode编码是一样的?
kevinzhang 发表于 2013-11-24 19:01 static/image/common/back.gif
大神,这个UCS2编码,是不是和unicode编码是一样的?
这个我也不懂。网上查了下,可以简单的认为是一样,但概念还是有差别的。
i7456 发表于 2013-11-24 18:42 static/image/common/back.gif
上面的程序我已经测试成功了发送中文短信,我用的是西门子的手机CX65,根据你用的短信模块,可能需要做些修 ...
弱弱的 问句楼上怎么通过串口打包发送???
学慧放弃 发表于 2013-11-24 21:16 static/image/common/back.gif
弱弱的 问句楼上怎么通过串口打包发送???
抱歉,看不懂你的问题
i7456 发表于 2013-11-24 20:56 static/image/common/back.gif
这个我也不懂。网上查了下,可以简单的认为是一样,但概念还是有差别的。
:L呕滴神呀
i7456 发表于 2013-11-24 21:51 static/image/common/back.gif
抱歉,看不懂你的问题
就是数据发送不是容易出现丢失吗??可以打包发送,通过加效验字,你会吗?那样可以避免数据损坏,就算丢失也可以被发现
学慧放弃 发表于 2013-11-25 19:06 static/image/common/back.gif
就是数据发送不是容易出现丢失吗??可以打包发送,通过加效验字,你会吗?那样可以避免数据损坏,就算丢失也可 ...
这里不需要、也不能加校验
i7456 发表于 2013-11-25 20:30 static/image/common/back.gif
这里不需要、也不能加校验
可能她指的是一般性数据传输中的压缩,不是特定指PDU。