手机发短信问题求助

chinazhf 2003-12-19 11:28:27
目前我能够使用MSCOMM控件,利用手机红外线连接NOKIA8310发送短信,文本方式发送没有问题,但发送中文短信确一直不行,希望高手指点,如解决,谁有兴趣可拿源程序一起研究
以下简单短信代码:
MSComm.portopen:=true;
mscomm.output:='AT+CMGF=0'+chr(13);
mscomm.output:='AT+CMGS="0891683108200005F011000D91683117417906F5000800165982679C6536523077ED4FE1002C8BF756DE590D002E"'+chr(26);

使用超级终端输入AT+CMGS命令报错,不知是否语法有问题
...全文
25 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingscv 2003-12-23
哦,我会Text模式发送:)
回复
chinazhf 2003-12-23
感谢各位的帮助!!!
回复
victorwish 2003-12-22
MSComm.portopen:=true;
mscomm.output:='AT+CMGF=0'+chr(13);
mscomm.output:='AT+CMGS="0891683108200005F011000D91683117417906F5000800165982679C6536523077ED4FE1002C8BF756DE590D002E"'+chr(26);
修改一下第三行代码:
mscomm.output="at+cmgs=msgleng+chr(13)";
mscomm.output="0891683108200005F011000D91683117417906F5000800165982679C6536523077ED4FE1002C8BF756DE590D002E"+chr(26);
其中msgleng的值是您的短信内容的长度*2+15。剩下的在回信中已经说了。祝您成功。
回复
chinazhf 2003-12-21
使用PDU,已经转换UCS2编码,难道真的要放弃,这个问题已经围绕我一个多星期,好郁闷!!!!!!!!!!!!无奈这里的高手都解决不了,上哪去咨询,好失望!!!!!!!!!!
回复
rainstormmaster 2003-12-21
使用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()函数了.写完这篇文章,才算松了一口气,算是对大家有个交待吧,感谢大家的关注.
回复
踏平扶桑 2003-12-20
不好意思,没做过这个
帮你up:)
回复
rainstormmaster 2003-12-20
不知你发送短信用的是text模式还是pdu模式,发中文的话要用pdu模式,pdu模式有三种形式可用:7-bits,8-bits,ucs2发送中文短信用的是ucs2编码,你可以用ascw和chrw进行编码解码
回复
hemeijun81 2003-12-20
这是新浪网短信发送的原代码!

Dim remMSG As String

Private Sub Command1_Click()
On Error Resume Next
If Command1.Caption = "取消" Then
Command1.Caption = "发送"
Label6.Caption = " 用户取消"
Winsock1.Close
Exit Sub
End If
Dim msg As String, Length As Integer, msgSend As String
msgSend = "login=1&mobile=" & Text1.Text & "&msg=" & Text5.Text & "&sname=" & Text4.Text & "&user=" & Text2.Text & "&passwd=" & Text3.Text
Length = LenB(StrConv(msgSend, vbFromUnicode))
'MsgBox msgSend, , Length: Exit Sub
msg = msg + "POST /cgi-bin/sms/sendto.cgi HTTP/1.1" + vbCrLf
msg = msg + "Accept: *.*" + vbCrLf
msg = msg + "Accept-Language: zh-cn" + vbCrLf
msg = msg + "Accept-Encoding: gzip , deflate" + vbCrLf
msg = msg + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)" + vbCrLf
msg = msg + "Host::0" + vbCrLf
msg = msg + "Content-Type: application/x-www-form-urlencoded" + vbCrLf
msg = msg + "Content-Length: " + CStr(Length) + vbCrLf
msg = msg + "Connection: Keep -Alive" + vbCrLf + vbCrLf
msg = msg + msgSend
Winsock1.RemoteHost = "sms.sina.com.cn"
Winsock1.RemotePort = 80
Winsock1.Connect

Label6 = " 正在连接主机..."
Command1.Caption = "取消"
Do While Command1.Caption = "取消" And Winsock1.State <> 7
DoEvents
Loop
'If Command1.Caption = "取消" Then Command1.Caption = "发送" ': Exit Sub
If Winsock1.State = 7 Then
Label6 = " 正在发送短信息..."
Winsock1.SendData msg
DoEvents
End If

End Sub



Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Winsock1.GetData strData

remMSG = remMSG + strData
If InStr(1, remMSG, "发送成功") Then
Winsock1.Close
MsgBox "发送成功", vbExclamation
Label6 = " 已经发送成功"
Command1.Caption = "发送"
remMSG = ""
ElseIf InStr(1, remMSG, "注册") Then
Winsock1.Close
MsgBox "您还没有在新浪注册", vbCritical
Label6 = " 没有注册"
Command1.Caption = "发送"
remMSG = ""
ElseIf InStr(1, remMSG, "密码错误") Then
Winsock1.Close
MsgBox "您输入的密码错了", vbCritical
Label6 = " 密码无效"
Command1.Caption = "发送"
remMSG = ""
ElseIf InStr(1, remMSG, "请输入用户或密码") Then
Winsock1.Close
MsgBox "请输入用户或密码", vbCritical
Label6 = " 请输入用户或密码"
Command1.Caption = "发送"
remMSG = ""
ElseIf InStr(1, remMSG, "请输入朋友的手机号") Then
Winsock1.Close
MsgBox "您要发送的手机号错了", vbCritical
Label6 = " 发送手机号错误"
Command1.Caption = "发送"
remMSG = ""
ElseIf InStr(1, remMSG, "请输入要发送的信息") Then
Winsock1.Close
MsgBox "请输入要发送的信息", vbCritical
Label6 = " 发送错误"
Command1.Caption = "发送"
ElseIf InStr(1, remMSG, "对方不是移动全球通用户") Then
Winsock1.Close
MsgBox "对方不是移动全球通用户", vbCritical
Label6 = " 对方不是移动全球通用户"
Command1.Caption = "发送"
' ElseIf InStr(1, remMSG, "错误") Then对方不是移动全球通用户

'Winsock1.Close
' MsgBox "发送错误", vbCritical
' Label6 = " 发送错误"
' Command1.Caption = "发送"
Else
' MsgBox remMSG
' Command1.Caption = "发送"
End If

End Sub

回复
yoki 2003-12-20
楼上正解
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7451

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告