短信模块的问题?大家快来抢分
我现在正在编写一个短信模块,(用标准的AT命令进行编写),现在遇到的问题就是:如何判断我的短信信息发送成功?是否存在返回值,如果存在应该如何捕获呢?? 问题点数:0、回复次数:17Top
1 楼wycking(讨)回复于 2004-09-03 15:10:59 得分 0
关注Top
2 楼LGYAN(紫衣随想)回复于 2004-09-03 15:13:17 得分 0
抢一下!Top
3 楼lovebeethoven(小佛-寻找幸福)回复于 2004-09-03 15:34:32 得分 0
怎么抢?Top
4 楼chewinggum(口香糖·个人二五计划第一年)回复于 2004-09-03 15:35:15 得分 0
爱莫能助帮你顶吧Top
5 楼xmmmhdj(猫猫)回复于 2004-09-03 15:42:12 得分 0
应该到高级区去问,西西!Top
6 楼starsoulxp(星魂)回复于 2004-09-03 16:22:23 得分 0
楼主参考一下,希望能给你帮助。
用PocketPCPhone替代AT指令的手机SMS服务
发表日期:2004-03-02 作者:转自CSDN[] 出处:
新型Pocket PC电话版已将Pocket PC所具备的全部精妙特性同最新电话功能集于一身,我们该到淘汰老式手机的时候了。
国产联想 ET180, dopod 696,dopod 686 等,都是 Pocket PC Phone中的精品,且 ET180中关村售价己经降至 ¥3700元!
看到大家在破8850等机器上折腾AT指令集编写短信收发程序,我感到万分难过。 有这么好用的 Pocket PC Phone,为什么还要用AT指令集的破玩意儿呢?
采用AT指令集编写短信收发程序,需要解决许多技术难题和非计算难题,能折腾你好一阵子,我们就不说了。加上一些不法商贩老是在网上倒腾些控件在兜售,我无法忍受了!
这里我提供了另外一种途径发送中文短信,并给出全部源码,供大家下载。
ET180 PPC机和多普达手机中,含有强大的WINCE操作系统,可以使用WINCE操作系统的开发工具开发出一个简单的短信发送程序。
环境: 联想et180机器,操作系统Pocket 2002, 开发工具为eVB3.0
源代码:
1、创建一个Modules: SMSMessage
源码如下:
Option Explicit
' API declarations
Public Declare Function SmsOpen Lib "SMS" (ByVal ptsMessageProtocol As String, ByVal dwMessageModes As Long, ByRef psmshHandle As Long, ByRef phMessageAvailableEvent As Long) As Long
Public Declare Function SmsSendMessage Lib "SMS" (ByVal smshHandle As Long, ByVal psmsaSMSCAddress As Long, ByVal psmsaDestinationAddress As String, ByVal pstValidityPeriod As Long, ByVal pbData As String, ByVal dwDataSize As Long, ByVal pbProviderSpecificData As String, ByVal dwProviderSpecificDataSize As Long, ByVal smsdeDataEncoding As Long, ByVal dwOptions As Long, ByRef psmsmidMessageID As Long) As Long
Public Declare Function SmsClose Lib "SMS" (ByVal smshHandle As Long) As Long
' API constants
Public Const SMS_MSGTYPE_TEXT = "Microsoft Text SMS Protocol"
Public Const SMS_MODE_SEND = 2 ' Open in send mode
Public Const SMSDE_GSM = 0 ' Use Unicode GSM encoding
Public Const SMSAT_INTERNATIONAL = 1 ' International number format
Public Const PS_MESSAGE_OPTION_NONE = 1 ' message options
Public Const PS_MESSAGE_CLASS0 = 0 ' Send immediately
Public Const PSRO_NONE = 0 ' No replacements
Public Const SMS_OPTION_DELIVERY_NONE = 0 ' No delivery options
Public Sub SendSMS(ByVal Number As String, ByVal Message As String)
Dim SMSHandle As Long
Dim SMSEvent As Long
Dim SMSAddress As String
Dim SMSProvider As String
' Open SMS Messaging Component
If 0 <> SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, SMSHandle, SMSEvent) Then
MsgBox "Could not open SMS component!", _
vbCritical, App.Title
Exit Sub
End If
' Set Address structure (UDT as string)
SMSAddress = LongToBytes(SMSAT_INTERNATIONAL) & Number
' Set Provider structure (UDT as string)
SMSProvider = LongToBytes(PS_MESSAGE_OPTION_NONE) & _
LongToBytes(PS_MESSAGE_CLASS0) & _
LongToBytes(PSRO_NONE)
' Send message
If 0 = SmsSendMessage(SMSHandle, 0, SMSAddress, 0, Message, LenB(Message), _
SMSProvider, 12, SMSDE_GSM, SMS_OPTION_DELIVERY_NONE, 0) Then
'MsgBox "Message sent!", vbInformation, App.Title
MsgBox "短信息发送成功!", vbInformation, App.Title
Else
'MsgBox "Could not send message!", vbCritical, App.Title
MsgBox "短信息发送失败!", vbCritical, App.Title
End If
' Close SMS Messaging Component
If 0 <> SmsClose(SMSHandle) Then
'MsgBox "Could not close SMS component!", vbCritical, App.Title
MsgBox "无法关闭短信息组件!", vbCritical, App.Title
Exit Sub
End If
End Sub
Function LongToBytes(ByVal Value As Long) As String
Dim lsHex As String, i As Integer
lsHex = Right("00000000" & Hex(Value), 8)
For i = 1 To 7 Step 2
LongToBytes = ChrB(CInt("&H" & Mid(lsHex, i, 2))) & LongToBytes
Next
End Function
Function BytesToLong(ByVal Value As String) As Long
Dim lsHex As String, i As Integer
For i = 1 To 4
lsHex = Hex(AscB(MidB(Value, i, 1))) & lsHex
Next
BytesToLong = CLng("&H" & lsHex)
End Function
2、创建一个窗体,frmSMS
包含两个文本框,一个按钮,源码如下:
Private Sub Command1_Click()
SendSMS txtNumber.Text, txtMessage.Text
End Sub
大家可以用winSock编写一个小程序,实现PPC和PC之间的通讯,达到把et180机器作为短信中心的目的,实现如办公自动化系统之类的应用软件 手机短信收发功能。
大家如有技术发面的意见建议,请到MSN(mr_hsx@hotmail.com ,Seala@126.com)上联系。
Top
7 楼wycwyc(.net老菜)回复于 2004-09-03 16:24:17 得分 0
难道没有人做过手机短信业务么?Top
8 楼starsoulxp(星魂)回复于 2004-09-03 16:26:03 得分 0
用VB6.0编写手机短信发送
http://www.enet.com.cn/eschool/inforcenter/A20040525311257_1.html
手机短信的发送主要借助于VB的Mscomm控件实现,关于Mscomm控件,前面的技术介绍部分有详细介绍。短信的发送是由AT+CMGS指令完成的,采用PDU模式发送,函数代码如下:
Const prex = "0891"
Const midx = "11000D91"
Const sufx = "000800"
Public Function Sendsms(csca As String, num As String, msg As String) As _Boolean
Dim pdu, psmsc, pnum, pmsg As String
Dim leng As String
Dim length As Integer
length = Len(msg)
length = 2 * length
leng = Hex(length)
If length < 16 Then leng = "0" & leng
psmsc = Trim(telc(csca))
pnum = Trim(telc(num))
pmsg = Trim(ascg(msg))
pdu = prex & psmsc & midx & pnum & sufx & leng & pmsg
sleep(1)
mobcomm.Output = "AT+CMGF=0" + vbCr
mobcomm.Output = "AT+CMGS=" & Str(15 + length) + vbCr
mobcomm.Output = pdu & Chr$(26)
sleep(1)
Sendsms = True
End Function
因为手机同一时间只能处理一件事情,因此这个函数只负责发送短信,关于短信发送成功与否以及阅读短信的部分集中在一起处理。判断手机短信发送成功与否主要由AT+CMGS命令执行以后的返回码来决定(可参见前文的AT指令介绍部分)。
为了防止手机因过于繁忙而出错,这里采取了一定的方法让手机有充分的时间处理发送和接收及删除等操作。Sleep()函数正是为此而设计的,在发送及删除操作后都会让程序暂停一秒,这样就不至于使得手机过于繁忙。
Unicode码解码函数
相比于手机短信的发送而言,手机短信的接收主要的工作正好与之相反。手机短信的发送需要将待发送的短信内容转换为Unicode码,而短信的接收则需要将接收到的Unicode码转换成中文字符。下面的函数将实现解码功能。同手机短信发送的编码函数一样,这里也应用了一个VB内置的函数AscW()函数来将Unicode码转换为中文:
Public Function ascg(smsg As String) As String
Dim si, sb As Integer
Dim stmp As Integer
Dim stemp As String
sb = Len(smsg)
ascg = ""
For si = 1 To sb
stmp = AscW(Mid(smsg, si, 1))
If Abs(stmp) < 127 Then
stemp = "00" & Hex(stmp)
Else
stemp = Hex(stmp)
End If
ascg = ascg & stemp
Next si
ascg = Trim(ascg)
End Function
2 手机短信接收函数
相对于短信的发送函数而言,短信的接收相当简单,只需要以下的三行代码就完成了。但是它使用的技术却决不比短信的发送少,这里主要用到了Mscomm控件的Output属性和AT+CMGR指令。
Public Sub readsms(rnum As String)
mobcomm.Output = "AT+CMGF=1" + vbCr
mobcomm.Output = "AT+CMGR=" & rnum + vbCr
End Sub
Top
9 楼yk84(好人(专蹭百分贴))回复于 2004-09-03 18:12:04 得分 0
嗯.百分贴,我不会,蹭下分Top
10 楼admin0594(无巧不成书)回复于 2004-09-03 18:26:33 得分 0
m_Ports.WriteToPort("AT+CMGS=\"135********\" \r");
执行后要等应答后才能执行语句m_Ports.WriteToPort(buffer);//把短信发出去
因为你是异步访问串口的
以下是我的代码片断,绝对能够解决你的问题,因为我也是用的该CSerialPort类;
void CServiceModule::OnCommunication(WPARAM ch, LPARAM port)
{
m_szReceive += (char)ch;
if(m_szReceive.Find(_T("\r\n> ")) != -1 ||
m_szReceive.Find(_T("\r\nOK\r\n")) != -1 ||
m_szReceive.Find(_T("\r\nERROR\r\n")) != -1)
{
switch(m_eOpType)
{
case eSMReceive: //收取短信
DoRecv();
break;
case eSMDelete: //删除短信
DoDelete();
break;
case eSMSend: //发送短信
DoSend();
break;
}
m_szReceive.Empty();
}
}
Top
11 楼renjunjun(飞黄)回复于 2004-09-03 18:34:01 得分 0
哇,收藏Top
12 楼zhangzumiao(梦里水香)回复于 2004-09-03 21:13:22 得分 0
你发出去应该有回应呀。怎么要你自己来看怎么有没有发出去呢。!
应该是对方的问题。
这样说实在是太愚蠢了。 每一个手机都需要的功能。!!1Top
13 楼tangbq(梦梅书生)回复于 2004-09-06 09:40:49 得分 0
发送:AT+CMGF=1
返回:OK
发送:AT+CMGS=13552180240
返回:>
发送:>Hello Test<Ctrl+Z>
返回:OK
Top
14 楼wycwyc(.net老菜)回复于 2004-09-06 14:02:35 得分 0
大家还有什么好意见??Top
15 楼wycking(讨)回复于 2004-09-06 15:23:41 得分 0
gzTop
16 楼ryuginka(一米八五的猪)回复于 2004-09-13 11:26:25 得分 0
我最近也要搞这个.学习Top
17 楼zmrok(朱朱)回复于 2004-09-14 09:31:39 得分 0
学习Top
相关问题
- 有谁做过WAVECOM模块的中文短信发送?SOS
- OA系统中的短信发送模块求助
- 求cdma模块短信发送的例子
- CMS91模块无法发中文短信问题
- 关于用wavecom模块连接com口发送短信的问题???
- 有没有办法直接操作手机的GSM模块?进行发短信!
- PC串口连手机模块发送短信(用MSComm控件)给分100
- 使用CDMA手机模块WaveCom公司的Q2358c模块,使用Spcomm连接PC串口,收发短信的问题,大侠请进
- 使用CDMA手机模块WaveCom公司的Q2358c模块,使用Spcomm连接PC串口,收发短信的问题,大侠请进来帮忙
- 问 GSM 模块开发时,短信息最长可以多长,费用是否和手机短信一样?




