注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

在PC上通过手机发送短消息  

2009-11-30 19:43:38|  分类: AT&GSM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

使用Text模式收发短信代码简单,实现起来十分容易,但是最大的缺点是不能收发中文短信,实在是有点美中不足.
不过Pdu模式完全可以解决这个问题,Pdu模式不仅支持中文短信,也能发送英文短信,堪称完美无缺.
Pdu模式收发短信可以使用三种编码: 7-bit、8-bit和UCS2编码. 7-bit编码用于发送普通的ASCII字符,
8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。我们要实现中文短信的发送,所以选择UCS2,即中文Unicode码.
首先介绍一下VB中的两个函数:ChrW()和AscW().对于Chr()和Asc()函数大家一定很熟悉,
对于ChrW()和AscW()可能会比较生疏一点. ChrW 函数返回包含 Unicode 的 String,
若在不支持 Unicode 的平台上,则其功能与 Chr 函数相同; AscW 函数返回 Unicode 字符代码,
若平台不支持 Unicode,则与 Asc 函数功能相同。对于这两个函数我们各举一个例子说明:
?ascw("短")
 30701
?chrw(26482)
 杲
可见这两个函数可以实现中文和Unicode码之间的转换,对于我们编码解码十分方便.我们得到中文的Unicode码之后,就可以编制Pdu串了.
我们再了解一下Pdu串的构成,我们看这样一个Pdu串(我调试程序时采用):
0891683110301405F011000D91683159717456F4000800165982679C6536523077ED4FE1002C8BF756DE590D002E.
我们将其分解为:
08 SMSC地址信息的长度(91683110301405F0共八位字节)
91 SMSC地址格式(TON/NPI)
683110301405F0 SMSC地址(8613010341500南京的短信服务中心号码)
11 基本参数(TP-MTI/VFP)( 发送,接收为84)
00 MR Message Reference
0D 目标SIM卡号码长度(683159717456F4按阿拉伯数字个数计)
91 同上
683159717456F4 对方手机SIM卡号(8613057575064)
00 普通GSM类型,点到点方式
08 UCS2编码
00 有效期
16 用户信息长度(5982679C6536523077ED4FE1002C8BF756DE590D002E的长度共22为字节)
5982679C6536523077ED4FE1002C8BF756DE590D002E(“如果收到短信,请回复.”Unicode码)

Pdu码的构成我们已经了解后,我们就可以开始编码了,上面的红色部分就是我们要编码实现的.
首先看SMSC地址: 683110301405F0与8613010341500F(SMSC最后一位补F构成14位),
我们可以发现只需将奇偶位对调即可.同样道理: 683159717456F4与8613057575064也是一样的处理.
对于用户信息长度,我们可以通过VB里的Len函数得到,例如”你好”,我们用Len(“你好”)得到2,
那么2*2=4即为用户信息长度04(这里要转换为16进制,并且是两位).对于Unicode码,
我们可以通过AscW()函数一个一个汉字取出其Unicode码即可得到.
下面给出短信发送的具体实现代码(相关知识可参见前一篇文章):
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
Length=Len(“如果收到短信,请回复.”)*2
MSComm1.Output = "AT+CMGF=0" + vbCr ‘以Pdu模式发送短信
MSComm1.Output = "AT+CMGS=" & Str(15 + length ) + vbCr
MSComm1.Output= “0891683110301405F011000D91683159717456F4000800165982679C6536523077ED4FE1002C8BF756DE590D002E” & Chr$(26)
start = Timer
pause =1
While Timer < start + pause
  DoEvents
Wend   
reco = MSComm1.Input
If InStr(reco, "OK") Then sendsms = True
If InStr(reco, "ERROR") Then sendsms = False
MSComm1.Output = "AT+CMGS=" & Str(15 + length ) + vbCr中的15为 11000D91683159717456F400080016的位数.
length为5982679C6536523077ED4FE1002C8BF756DE590D002E的位数.
到这里,短信的发送基本完成,短信的接收更简单一点,主要是解码,就是应用ChrW()函数了.

  评论这张
 
阅读(904)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017