首页  |  u-blox简介 |  u-blox产品设计  | 软件下载 | 飞扬科技其他产品 |  GPS方案  |  样品采购  |   
 
最新资讯
122.gif


这是GPS史上第一次评测,我们收集国际市场最主流的行业资讯,对主流的GPS进行相应的评测,以帮助客户更透彻的了解这个变幻莫测的新市场.....


GPS设计的重点在哪里?成功的GPS产品有哪些共同的设计上的优势?我们将为你解开这个迷团



作为GPS数据回传的主要途径,GPRS模块发挥了重要的作用,我们将向大家介绍主流的GPRS模块采购与选型指南....



收集市场主流GPS导航用的LCD液晶屏资讯,进入液晶屏的丰富多彩的导航资讯生活新世界,资料收集整理中....


GPS附件零部件的性能往往是很多人忽略的,但是它会影响到整机的GPS性能,我们今天对它进行详细的了解....



这是GPS史上最浓重的一墨,也是u-blox公司沤心历血近三年最强悍的GPS模块,我们将对其进行最详细的说明,让读者一睹为快这款世界上最强大的民用级GPS产品的迷人风采.....



LEA-5H及AEK-5H正式版本到货,这预计u-blox的第五代GPS模块产品及ublox-5系列产品正式进入大批量的量产阶段,这将是2008年头条重磅新闻,GPS业界将进行新的革局.....

u-blox GPS产品最新信息
122.gif


这里将详细介绍u-blox GPS设计方法

GPS天线选型
GPS电源器件选型
GPS 常用高速ARM及其他CPU选型
GPS LCD液晶屏选型
GPS 陀螺仪选用 
GPS零部件供应商

Siemens TC35 短信发送程序设计:
122.gif

作为GPS模块数据传输配套的GSM短信模块,这里将详细介绍Siemens TC35 短信发送程序设计,同时可以应用于短信猫等产品的设计方案

 

Siemens TC35 短信发送程序设计

作者: 光大证券有限公司信息技术部 江龙      

    西门子TC35/TC35i GSM Modem TC35 是西门子公司生产的第三代GSM 双频模块, 可广泛应用于:
POS 终端,手持式设备,移动电脑,无线电话等系统中。今日为朋友设计短信群送系统,我便着手开始研
究这个小东东。
按硬件说明的要求,与电脑COM口连接上,放上我的SIM卡,接上电源,快闪的绿灯慢慢成了”信号
慢标志“――哈哈,表示一切正常。我打开电脑,从网上DOWN了一个COM口专测试的小程序,开始读
硬件专带的一个说明书(E文的,你可直接从下载)。
可惜了。那个工具好是好,但只提供文本(文本方式下无法发送vbCr 符号)或者二进制方式,因此它
无法用于该AT命令。只好启动VB6.0,自己编程来写了。
从网上找了一些相关的文章:
1)C# 开发 终端 式短 信的 原理 和方 法:
http://www.yesky.com/SoftChannel/72342380468109312/20040523/1800310.shtml, 讲解详尽,笔者最爱这一
篇。
2)在PC上通过手机发送短消息 http://www.knowsky.com/2944.html。此文讲解简介,可惜不适合中文
发送。算是一个文章提纲吧!
3)用VB6.0编写手机短信发送:http://www.pcbookcn.com/article/3061.htm 讲解比较好,原理也不错,
可惜程序中一些基本的函数都写错了,另外,根本不能通过连续OUTPUT信息发送SM(我是说基于我现在
用的TC35)。
因此,笔者也开始座小板凳了,带上头盔,准备迎接大家投掷的砖头了。
一、TC35 AT 命令的处理方法
我们向TC35发送AT命令,结果一般均返回
1) OK:返回了正确的OK指令
2) ERROR:返回错误的指令
3) 什么也不返回(我们称之为无返回值)
4) 有返回值,但系统在一定的反应时间内没收到(我们称之为超时)
 
注意:TC35 默认的 Response 结果中带有你所发送
T+CMGF=0<vbCr>”,结果会返回:“AT+CMGF=0<vbCr><vbCSM,也会这样。这显然给我们本来传输速度慢的COM 接口
向其发送“ATE0<vbCr>”将其关闭,结果会只返回 OK 或者
E1<vbCr>”将其打开)。
下述程序即是向TC35发送一命令,返回我们所述的4种状态
'向串口MSCOMM输出一个命令或者信息
'入口参数
' MSCOMM 通讯对象
' msg 需要输出的信息串
' errMsg 若出错,返回的错误信息
' isCheckResult 是否需要检查返回的结果(True需要,False
' nTimeout 等待结果超时的毫秒数(只对isCheckResult=Tru
' okRetMsg 返回正确结果时含的字符特征串,如"OK"
' errRetMsg 返回错误结果时含的字符特征串,如"ERROR
'返回值:True \ FALSE
' 若为fasle ,errMsg表示出错的信息详情
Public Function TC35_OutMsg(MSComm As MSComm, _
ByVal Msg As String, _
errMsg As String, _
Optional ByVal isCheckRes
Optional ByVal nTimeout A
Optional ByVal okRetMsg A
Optional ByVal errRetMsg A
Dim i As Integer, n As Integer
Dim rs As String, StartTime As Long
With MSComm
'清输入内容以及输出内容
While .InBufferCount > 0
DoEvents
rs = .Input
Wend
'清除输出、输入Buffer
.InBufferCount = 0
.OutBufferCount = 0

.Output = Msg
While .OutBufferCount > 0 '发送信息,直到完成
DoEvents
Wend
If isCheckResult = True Then '需要处理返回结果
rs = ""
注意:TC35 默认的 Response 结果中带有你所发送的 AT 命
T+CMGF=0<vbCr>”,结果会返回:“AT+CMGF=0<vbCr><vbCrLf>OK<vSM,也会这样。这显然给我们本来传输速度慢的COM 接口带来了困难
向其发送“ATE0<vbCr>”将其关闭,结果会只返回 OK 或者 ERROR
TE1<vbCr>”将其打开)。
下述程序即是向TC35发送一命令,返回我们所述的4种状态。如下

---------

'向串口MSCOMM输出一个命令或者信息
'入口参数
' MSCOMM 通讯对象
' msg 需要输出的信息串
' errMsg 若出错,返回的错误信息
' isCheckResult 是否需要检查返回的结果(True需要,Fals
' nTimeout 等待结果超时的毫秒数(只对isCheckResult=T
' okRetMsg 返回正确结果时含的字符特征串,如"OK"
' errRetMsg 返回错误结果时含的字符特征串,如"ERRO
'返回值:True \ FALSE
' 若为fasle ,errMsg表示出错的信息详情
Public Function TC35_OutMsg(MSComm As MSComm,
ByVal Msg As String, _
errMsg As String, _
Optional ByVal isCheckR
Optional ByVal nTimeout
Optional ByVal okRetMsg
Optional ByVal errRetMsg
Dim i As Integer, n As Integer
Dim rs As String, StartTime As Long
With MSComm
'清输入内容以及输出内容
While .InBufferCount > 0
DoEvents
rs = .Input
Wend
'清除输出、输入Buffer
.InBufferCount = 0
.OutBufferCount = 0

.Output = Msg
While .OutBufferCount > 0 '发送信息,直到完成
DoEvents
Wend
If isCheckResult = True Then '需要处理返回结果
rs = ""
StartTime = timeGetTime
Do
DoEvents
rs = rs & .Input
If InStr(1, rs, okRetMsg) > 0 Then '返回的结果中含有正确代码特征
errMsg = "处理命令[" & Msg & "],成功!返回结果为:" & rs
TC35_OutMsg = True '处理正确
Exit Function
ElseIf InStr(1, rs, errRetMsg) > 0 Then '返回的结果中含有错误代码特征
errMsg = "处理命令[" & Msg & "]失败!返回结果为:" & rs
TC35_OutMsg = False '处理失败
Exit Function
End If
Loop Until StartTime + nTimeout < timeGetTime '直到没超时
errMsg = "处理命令[" & Msg & "]时超时!" '超时
TC35_OutMsg = False
Else
errMsg = "发送[" & Msg & "]成功!"
TC35_OutMsg = True
End If
End With
End Function
二、短信发送方法
如果只需要发送SM,我们在此只需要了解2个命令就OK了。如下:

上述命令设置发送 SM 相关的格式信息,按上述文档说明设置格式,只需要向 TC35 发送一个为
AT+CMGF=[0|1]+vbCr即可。
因此有必要了解一下什么叫PDU Mode与 text Mode。text Mode比较简单,多款诺基亚手机均支持
该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息
正文经过十六进制编码后被传送,而Block Mode是早期的一种,现在基本没有。
SMS是由Etsi 所制定的一个规范(GSM 03.40 和 GSM 03.38)。当使用 7-bits编码时,它可以发送
多160个字符;但用8-bit编码,最多可以发送140个字符,通常无法直接通过手机显示;还有用16-bit 编
时,最多70 个字符(不管英文还是中文),被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所
示。
在发送的处理中,手机号码均需要移位处理,即 1)首先要在号码前面加入国别区号 86,2)将 86+
机号码组合后偶数对(不足的后面加 F)。3)按 BCD 编码方式,重新组后,即 2 个字符组成一组,高低
换。
如手机号码为 138 1234 5678 ,按上述提供的移位处理,三步处理结果如下:
第一步,加入国别代码86:8613812345678
第二步,组成偶数对,不足的后面补F:8613812345678F
第三步,2个字符一组,高低互换:86 13 81 23 45 67 8F(组队),68 31 18 32 54 76 F8(互换
后)
最终的结果为:68 31 18 32 54 76 F8 (注意,中间是没有空格的,只是为了方便阅读才加入去的)。
下是处理的函数:
-------------------------------------------------------
'将电话号码移位处理
Private Function TC35_ChangeT
Dim l As String
Dim r As String
Dim rs As String
Dim i As Integer
Dim n As Integer
rs = ""
n = Len(Mobile)
FOr i = 1 To n Step 2
l = Mid(Mobile, i, 1)
If i = n Then '若是最后一
r = "F"
Else
r = Mid(Mobile, i + 1,
End If
rs = rs & r & l '高低位互换
Next i
TC35_ChangeTelCode = rs
End Function
------------------------------------------------------------------
上述中提到了信息的 USC2 编码,即是利用 VB 提供的 AscW()以及 Hex()来实现的,它可以将短信内
容转换成USC2编码:.
Private Function TC35_ChangeToUSC2 (ByVal s As String) As String
Dim i As Integer
Dim rs As String
Dim n As Integer
Dim tn As Integer
rs = ""
FOr i = 1 To Len(s)
n = AscW(Mid(s, i, 1))
tn = Abs(n)
If tn >= 16 And tn <= 127 Then
rs = rs & "00"
ElseIf tn > 1 And tn < 16 Then
rs = rs & "000"
End If
rs = rs & Hex(n) ' Mid(s, i, 1) & "=" & Hex(n) & ","
Next i
TC35_ChangeToUSC2 = rs
nd Function
计好发送的短信格式后,即可通过AT+CMGS=命令来发送短信,它需要分2步走,如下表

其中<datan>表示需要发送的数据长度(用Hex表示,它实际
2 得到),而 MSG 则由如下的短消息中心地址(
P-Destination-Address)+ 短信信息 三个部分组成。
下面分别简述这三个部分
短消息中心地址(Address of the SMSC)。
短消息中心地址部分主要是设置发送短信的服务中心号码(SM内容发送到这个中心中。它的组成部分如下:

其表述表格如下(注意:为方便起见,我们将2个字符表示一个WORD单元)


如深圳移动的短信服务中心号码是13800755500(前面需要加86),即8613800755500,(共13位BYTE,
经过号码换位转换后为“86 31 08 70 55 05 F0”,共7 WORD。此时的信息应该为 08 + 91 + 86 31 08 70
55 05 F0。
目的地址(TP-Destination-Address)
目的地址描述的是接收者的一些相关信息,如下

各部分描述如下

短信信息
短信信息存放的是具体的短信内容以及相关的一些辅助信息,其结构如下

各项表述如下:

了解了上述 AT 命令以及相关的编码方法,下面该着手写这个发送的过程了。
Const PREX = "0891"
Const SUFX = "000800"
Const CharTimeDelay = 4
Public Declare Function timeGetTime Lib "winmm.dll" () As Long
'发送SM
' 入口参数:
' mscomm 通讯对象
' mobile 手机号码/市话通号码(必须加入长度区号)
' errMsg 若发送不正确,此处表示错误信息
' CenterNo 短信服务中心号码
'返回 TRUR | false
' 若为False, errMsg表示错误信息
Public Function TC35_SendSM(MSComm As MSComm, _
ByVal Mobile As String, _
ByVal Msg As String, _
errMsg As String, _
Optional ByVal CenterNo As String = "13800755500" _
) As Boolean
Dim pmsg As String, length As Integer
Dim at As String , pdu As String
Dim CenterPart As String, TPPart As String, SMPart As String

TC35_SendSM = False
length = Len(Msg) * 2
If length > 140 Then
errMsg = "发送的短信内容不能超过70个字符。"
Exit Function
End If
CenterNo = TC35_ToServerMobile(CenterNo, errMsg) '检查服务中心号码是否正确
If CenterNo = "" Then Exit Function
'检查手机号码,若不成功,则会返回空字符串值
Mobile = TC35_ToMobile(Mobile, errMsg) '检查接收的手机或者市话通号码是否正确
If Mobile = "" Then Exit Function
pmsg = TC35_ChangeToUSC2(Msg) '将SM转换成USC2编码
CenterPart = PREX & TC35_ChangeTelCode(CenterNo) '组合成短信中心部分
'组合成接受对象部分
TPPart = "1100" & TC35_ToHex(Len(Mobile), 2) & "91" & TC35_ChangeTelCode(Mobile)
'短信信息部分
SMPart = SUFX & IIf(length < 16, "0", "") & Hex(length) & pmsg
'组成成AT 发送SM的命令串,并等待正确返回"> ",超时是1秒
at = "AT+CMGS=" & ((Len(TPPart) + Len(SMPart)) \ 2) & vbCr
If TC35_OutMsg(MSComm, at, errMsg, True, 1000, "> ") = True Then
'正确接受到“> ",则向串口写入相关的信息内容
at = CenterPart & TPPart & SMPart & Chr$(26)
TC35_SendSM = TC35_OutMsg(MSComm, at, errMsg)
End If
End Function

当然上述程序还用到一些相关的协助函数,分别如下:

'将n转换成Hex格式,nbits表示结果的位数
Private Function TC35_ToHex(ByVal n As Integer, Optional ByVal nBits As Integer = 2) As String
Dim s As String
Dim i As Integer
s = Hex(n)
FOr i = Len(s) + 1 To nBits
s = "0" & s
Next i
TC35_ToHex = s
End Function
--------------------------------------------------------------------
'检查手机号码是否正确,若正确返回加入了国别或者接受者信息的号码,否则为空字符串值,此时
sg表示错误信息
Public Function TC35_ToMobile(ByVal Mobile As String, errMsg As String) As String
Dim c As String
Dim n As Integer
Dim i As Integer

TC35_ToMobile = ""
n = Len(Mobile)
If n <> 11 And n <> 12 Then
errMsg = "手机号码/市话通[" & Mobile & "]必须是11 位数字,小灵通(市话通)必须为11或者12
区号)"
Else
If Left(Mobile, 2) = "13" Then
If n <> 11 Then
errMsg = "手机号码[" & Mobile & "]必须由11位数字组成."
Exit Function
Else
FOr i = 1 To 11
c = Mid(Mobile, i, 1)
If c < "0" Or c > "9" Then
errMsg = "手机号码[" & Mobile & "]必须由11位数字组成."
Exit Function
End If
Next i
errMsg = ""
TC35_ToMobile = "86" & Mobile
End If
Else
FOr i = 1 To n
c = Mid(Mobile, i, 1)
If c < "0" Or c > "9" Then
errMsg = "市话通(小灵通)号码[" & Mobile & "]必须由11或12位数字组成."
Exit Function
End If
Next i

If Left(Mobile, 1) <> "0" Then
errMsg = "市话通(小灵通)号码必须由0开头(区号)"
Else
errMsg = ""
TC35_ToMobile = "106" & Mobile
End If
End If
End If
End Function
--------------------------------
Public Function TC35_ToServerMobile(ByVal Mobile As String, errMsg As String) As String
Dim c As String
Dim n As Integer
Dim i As Integer
TC35_ToServerMobile = ""
n = Len(Mobile)
If n <> 11 Then
errMsg = "服务中心号码[" & Mobile & "]必须是11位数字"
Else
If Left(Mobile, 2) <> "13" Then
errMsg = "服务中心号码[" & Mobile & "]必须由11位数字组成,且须以13开头."
Exit Function
Else
FOr i = 1 To 11
c = Mid(Mobile, i, 1)
If c < "0" Or c > "9" Then
errMsg = "服务中心号码[" & Mobile & "]必须由11位数字组成."
Exit Function
End If
Next i
errMsg = ""
TC35_ToServerMobile = "86" & Mobile
End If
End If
End Function
---------------------------------------
'初始化串口
'入口参数
' mscomm 通讯对象
' errMsg 返回初始化结果信息
' commPort COM端口号
'返回:TRUR |false
' 若为 false ,errMsg 会有详细的错误描述
Public Function TC35_Init(MSComm As MSComm, errMsg As String, _
Optional ByVal CommPort As Integer = 1) As Boolean
On ErrOr GoTo laberr
TC35_Init = False
With MSComm
If .PortOpen = True Then .PortOpen = False '已经找开端口,则关闭它
.CommPort = CommPort '写端口号
If .PortOpen = False Then .PortOpen = True '打开端口
.Settings = "9600,n,8,1" '设置相关值
If TC35_OutMsg(MSComm, "ATE0" & vbCr, errMsg, True, 1000) = True Then
'不需要T35返回命令数值
TC35_Init = TC35_OutMsg(MSComm, "AT+CMGF=0" & vbCr, errMsg, True, 1000)
'设置发送短信的格式为PDU
End If
End With
Exit Function
laberr:
errMsg = "初始化出错,错误信息为" & Err.Description
End Function
------------------------------------
'关闭MSCOMM对象
Public Sub TC35_Destory(MSComm As MSComm)
With MSComm
If .PortOpen = True Then .PortOpen = False
End With
End Sub
测试程序的编写
原理与基本一些函数写好后,我们即可着手写这个测试程序了。我做的界面如下:

用户设置好相关的参数后,按下“发送”,则执行如下:
If TC35_Init(MSComm, errMsg, Port) = True Then
b = TC35_SendSM(MSComm, _
txtMobile.Text, _
txtMsg.Text, _
errMsg, _
txtCenterNo.Text)
s = "短信发送" & IIf(b, "成功!", "失败!")
msgbox s
End If
详细的源码如下:
Option Explicit
Dim Port As Integer
Private Sub bntCancel_Click()
Unload Me
End Sub
‘发送
Private Sub bntSend_Click()
Dim b As Boolean
Dim errMsg As String
Dim s As String
bntSend.Enabled = False
If TC35_Init(MSComm, errMsg, Port) = True Then
StatusBar.Panels(2).Text = "串口[" & Port & "]初始成功。正在发送短信....." & vbCrLf
b = TC35_SendSM(MSComm, txtMobile.Text, txtMsg.Text, errMsg, txtCenterNo.Text)
s = "短信发送" & IIf(b, "成功!", "失败!")
txtRS.Text = errMsg
StatusBar.Panels(2).Text = s
Else
s = "串口[" & Port & "]初始化失败"
StatusBar.Panels(2).Text = s
txtRS.Text = errMsg
End If
MsgBox s, vbOKOnly Or vbInformation, "发送结果"
bntSend.Enabled = True
End Sub

Private Sub Form_Load()
txtMsg.Text = "您好!我是江龙,这是一个基于AT 命令的PC短信发送测试程序。"
Port = 1
txtMsg_Change
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call TC35_Destory(MSComm)
End Sub
//用户点击端口号时
Private Sub optPort_Click(Index As Integer)
Port = Index + 1
End Sub
//短信长度
Private Sub txtMsg_Change()
labLen.Caption = "当前长度:" & Len(txtMsg.Text)
End Sub

参考书目

i. Siemens Technical Product Information TC35
ii. 蚕蛹《C#开发终端式短信的原理和方法》

         以上资料属于网络摘抄,著作人版权所有,如需转载请与原著作人联系。






粤ICP备06076881号