通过串口、红外线等发短信怎么编程?有这样源码吗?谢谢(100分)

  • 主题发起人 主题发起人 YongSoft
  • 开始时间 开始时间
Y

YongSoft

Unregistered / Unconfirmed
GUEST, unregistred user!
通过串口、红外线等发短信怎么编程?有这样源码吗?谢谢
 
你是什么外部设备?手机?GPRS /CDMA MODEM?还是其它啊?然后芯片型号?AT指令是否支持?短信有自己的编码格式;主要是STRING和短信PDU的转化;看你的设备是否支持TXT 格式/PDU格式,大多数设备两种都支持,但早期的设备就难讲了;等等;需要你的详细需求;
 
通过串口、红外线等连结手机,然后用AT控制手机发短信.
 
我有串口的
 
串口的我到是作过。有一个外部设备,然后先用At 指令,我这里有个标准的AT指令集,
联系MSN:chenfreax@hotmail.com
 
楼上的能将资料发给我一份吗?

rzm2001@163.com
 
串口,红外的控件实例我有,也做过可以使用,但发现一个问题,用手机nokia8250发送单条ok,如果连续发送,4-5条后就失败,甚至手机死翘翘。大家遇到过吗?
 
AT命令仅被用于modem操作。由于没有控制移动电话文本消息的先例,因此开发了一种叫SMS Block Mode的协议,通过终端设备(TE)或电脑来完全控制SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT命令,其中包含对SMS的控制。AT命令在此基础上演化并被加入GSM 07.05标准,以及之后的GSM 07.07标准。
对SMS的控制共有三种实现途径:1 最初的Block Mode 2基于AT命令的Text Mode 3 基于AT命令的PDU Mode
 
从终端设备向蜂窝电话发送短消息文本是十分简单的。以下的代码片段就演示了这个过程。所使用的电话是Nokia 7100系列,并且ME (mobile equipment)是连接在计算的#1号通信端口上。

注意到Ctrl-Z是用来表示终结发送到移动设备的文本输入。

使用Visual Basic来发送SMS文本到Nokia电话:

' Set up the communications port
MSComm1.CommPort = 1 ' Com Port 1

' Set for 9600 baud, no parity, 8 data, and 1 stop bit.
MSComm1.Settings = "9600,N,8,1"

' Tell the control to read entire buffer when Input is used
MSComm1.InputLen = 0

' Open the port
MSComm1.PortOpen = True

' Send an 'AT' command to the phone
MSComm1.Output = "AT" & Chr$(13) & Chr(10)
' The phone will respond with an 'OK'

' Set up the phone for a text message
MSComm1.Output = "AT+CMGF=1" & Chr$(13) & Chr(10)
' The phone will respond with an 'OK'

' Prep for SMS, give destination type and destination address.
' Enter the destination type and destination address to prep for SMS
' e.g. AT+CMGS="+2145551212",129
MSComm1.Output = "AT+CMGS= " & Chr(34) & "+2145551212" & Chr(34) & ",129" & Chr$(13) & Chr(10)
' The phone will return a'>' prompt, and await entry of the SMS message text.

' Now send the text to the phone and terminate with (Ctrl-Z)
MSComm1.Output = "This is a test. WOW! "
' The phone will respond with a conformation containing the 'message reference number' eg. +CMGS:

' Close the port
MSComm1.PortOpen = False

在终端,看起来就象下面:

AT
OK
AT+CMGF=1
OK
AT+CMGS="+15127752607",129
>This is a test. WOW!
+CMGS: 49

OK
 
串口编程总懂点吧?就是用普通串口通讯控件;当然最好的是APRO串口系列;经典;

PDU串不仅仅 包含了消息,而且还有很多发送者的元信息,他的SMS服务中心,时间标志等等。这些都是以8位字节的16进制数,或者半8位字节

的十进制数。以下的字符书我从Nokia 6110 收到的信息,当从www.mtn.co.za发送的串是"hellohello"的时候。
07 917238010010F5 040BC87238880900F100009930925161958003C16010


这个八位串包含了三个部分:第一个8位表示SMSC信息的长度("07"),SMSC的信息 ("917238010010F5"),和SMS_DELIVER部分(GSM 03.40中

指定)。

注意: 有些手机(例如:Ericssson 888?)头三个部分(被着色)在PDU模式下被省略。
8位 描述
07 SMSC信息的长度。(在这个例子里是7个八位)
91 SMSC的地址类型 (91意味着国际格式的电话号码)
72 38 01 00 10 F5 服务中心号码(半八位的十进制数)电话号码是一个奇数(11),因此加入F来保证8位。这个服务中心的号码

是"+27381000015"
04 SMS_DELIVER的第一个8位。
0B 地址长度。发送号码的长度(0B hex = 11 dec)
C8 发送号码的地址类型
72 38 88 09 00 F1 发送号码(半八位的十进制数),有一个F结尾。
00 TP-PID.协议标识
00 TP-DCS 编码方式
99 30 92 51 61 95 80 TP-SCTS.时间邮戳(半8位)
0A TP-UDL.用户数据长度,信息的长度。TP-DCS域表明是7-bit格式的数据。因此长度在这里是一个10个7-bits。如果TP-DCS被设置成8-bit或

者Unicode,那么长度就应该是9个八位长度。
E8329BFD4697D9EC37 TP-UD. 7-bit编码的信息。


所有的8位都是16进制编码,除了服务中心号码,发送号码和时间邮戳;他们都是十进制的半8位编码。在PDU串的结尾部分包含了一些16进

制的8-bits数据,但他们实际7-bits数据。
十进制的半8位只需要将高位和地位交换就可以得到实际的数值。例如:"72 38 88 09 00 F1" 到 "27 83 88 90 00 1F"。因为电话号码是

一个奇数,没有办法组成8位编码,所以使用F来补齐。在解析时间邮戳的时候("99 03 29 15 16 59 08"),前6位代表日期,后6位代表时间

,最后2位是时区。

Flash SMS
在某些手机上(所有的Nokias,某些Siemens, Ericsson, Motorola 等等..)class 0信息将被显示为一种flash SMS信息。这些信息只要一到

达,将立即显示在屏幕上,而不需要按任何按钮。如果数据的编码方式是设置成16-bit unicode (ucs2), 而且信息以"0001"开头,那么它将作

为一个闪烁的flash message显示。
1、 英文编码

  缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。

  例如:1234 编码后得到31D98C06

  2进制表示

  8位编码 00110001 00110010 00110011 00110100

  7位编码 00110001 11011001 10001100 00000110

  通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。

  以下是C++Builder的实现代码:

String __stdcall EncodeEnglish(String InputStr)

{

int n,len,cur;

String tempstr,returnstr;

unsigned char mid1[2],mid2[2];

len=InputStr.Length();

n=0;

for(int i=1;i<=len;i++)

{

if (i
{

strcpy(mid1,InputStr.SubString(i,1).c_str());

strcpy(mid2,InputStr.SubString(i+1,1).c_str());

cur=(mid1[0]>>n)|((mid2[0]<<(7-n))&amp; 0xff);

}

else

{

strcpy(mid1,InputStr.SubString(i,1).c_str());

cur=(mid1[0]>>n)&amp; 0x7f;

}

FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));

returnstr=returnstr+tempstr;

n=(n+1)%7;

if (n==0)

i++;

}

return returnstr;

}


 
以上是我以前搞SMS开发时余下的资料。大家参考吧
 
我还有一点高手的SMS开发资料,是ZIP格式的,有密码,我不知道密码;如果有高手能破解密码可以留言啊;能打开了,资源就共享了;
 
补上中文的解码编码
  中文编码

  中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可

  以下是C++Builder的实现代码

String EncodeChinese(String InputStr)

{

int cur;

String tempstr,returnstr;

WideString ws;

wchar_t mid[2];

ws=WideString(InputStr);

for(int i=1;i<=ws.Length();i++)

{

wcscpy(mid,ws.SubString(i,1).c_bstr());

cur=mid[0];

FmtStr(tempstr,"%4.4X",ARRAYOFCONST((cur)));

returnstr=returnstr+tempstr;

}

return returnstr;

}

  4、中文解码

  将代码页为CP936的Unicode编码转换为GB2312的中文编码即可

  以下是C++Builder的实现代码

String DecodeChinese(String InputStr)

{

wchar_t Buf[300];

for(int i=0;i
{

Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));

}

Buf[InputStr.Length()/4]=0;

return WideCharToString(Buf);

}
 
谁有源代码给我一份LZPLZP001@163.com
另外jinwutong 你的ZIP也可以发一个给我解密试试!!
 
jinwutong ,我解过密码,你给我一份,解开后给你!LIU_hunter@hotmail.com
 
文件2M,超过邮箱限制;不能发送啊 等我找个FTP地址看看
 
http://jinwutong.91x.net/
到网站上下载吧
 
后退
顶部