PC通过手机发短信的性能问题求解,请有经验者指教,高分相送

zhhuang2002 2003-08-24 07:19:11
问题1:
通过AT+CMGS连续发短信时,发现手机返回状态从OK变为ERROR,或从ERROR变为OK时相当的慢,如何解决才能保持稳定并维持在3秒/每条左右!

问题2:
通过AT+CMGW先将短信内容存入SIM卡,然后发送,结果竟然比直接从PC发送还慢,是不是手机读SIM卡的速度很慢?还是本人实验有问题?有没有命令将短信存到手机的内存而不是SIM卡?
...全文
271 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
seafarer777 2003-11-13
  • 打赏
  • 举报
回复
ok
blueice2002 2003-10-22
  • 打赏
  • 举报
回复
关注!
zhhuang2002 2003-09-06
  • 打赏
  • 举报
回复
谢谢lin6194(),你的代码好专业,我的只能算玩具,这次我获益非浅,对手机发短信有了较深入理解这都归功于各位朋友的热心帮助,CSDN真是个温暖的大家庭!


lin6194 2003-09-06
  • 打赏
  • 举报
回复
状态应该是这个吧。
b) TP-Reject-Duplicates (TP-RD)
The bit 2 is set to 0, indicating the Service Center can accept an SMS-SUBMIT, which has the same TP-MR and
the same TP-DA as a previously submitted from the same Originated Address.
lin6194 2003-09-06
  • 打赏
  • 举报
回复
zhhuang2002(老兵) :我的错误代码,不完全,但够用了。
long CMobile::ParseError(CString strResult)
{
long lCode=0;
CString strTemp;
if(strResult.Find("OK")>=0)
return ERR_SUCCEED;
if(strResult.IsEmpty())
m_lLastError=ERR_NO_RESPOND;
else if(strResult.Find("+CME ERROR:")>=0||strResult.Find("+CMS ERROR:")>=0||strResult.Find("+CEER ERROR:")>=0)
{
if(strResult.Find("+CME ERROR:")>=0)
{
strTemp="+CME ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(3==lCode||4==lCode)
m_lLastError=ERR_NOT_SUPPORT;
else if(5==lCode||6==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(7==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(lCode==10)
m_lLastError=ERR_SIM_NOT_INSERTED;
else if(11==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(12==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(13==lCode||14==lCode||15==lCode)
m_lLastError=ERR_SIM_COMMUNICATION;
else if(16==lCode)
m_lLastError=ERR_INCORRECT_PASSWORD;
else if(17==lCode)
m_lLastError=ERR_SIM_PIN2_REQUIRED;
else if(18==lCode)
m_lLastError=ERR_SIM_PUK2_REQUIRED;
else if(20==lCode)
m_lLastError=ERR_MEMORY_FULL;
else if(21==lCode)
m_lLastError=ERR_INVALID_INDEX;
else if(22==lCode)
m_lLastError=ERR_LOCATION_EMPTY;
else if(23==lCode)
m_lLastError=ERR_MEMORY_FAIL;
else if(24==lCode)
m_lLastError=ERR_TEXT_TOO_LONG;
else if(25==lCode)
m_lLastError=ERR_INVALID_CHARACTERS;
else if(26==lCode)
m_lLastError=ERR_NUMBER_TOO_LONG;
else if(27==lCode)
m_lLastError=ERR_INVALID_CHARACTERS;
else if(30==lCode)
m_lLastError=ERR_NETWORK_SERVICE;
else if(31==lCode)
m_lLastError=ERR_NETWORK_TIMEOUT;
else if(32==lCode)
m_lLastError=ERR_NETWORK_SERVICE;
else if(42==lCode||44==lCode||46==lCode)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(43==lCode||45==lCode||47==lCode)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else
m_lLastError=ERR_UNKNOWN_CODE;
}
}
else if(strResult.Find("+CMS ERROR:")>=0)
{
strTemp="+CMS ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(lCode<128)
m_lLastError=ERR_NETWORK_RP;
else if(lCode<256)
m_lLastError=ERR_NETWORK_TP;
else if(lCode==301)
m_lLastError=ERR_SMS_SERVICE;
else if(lCode==302||lCode==302)
m_lLastError=ERR_NOT_SUPPORT;
else if(lCode=304||lCode==305)
m_lLastError=ERR_SMS_PDU_PARAMETER;
else if(lCode==310)
m_lLastError=ERR_SIM_NOT_INSERTED;
else if(lCode==311||lCode==312)
m_lLastError=ERR_SIM_PIN_REQUIRED;
else if(lCode==313||lCode==314||lCode==314)
m_lLastError=ERR_SIM_COMMUNICATION;
else if(lCode==316)
m_lLastError=ERR_SIM_PUK_REQUIRED;
else if(lCode==317)
m_lLastError=ERR_SIM_PIN2_REQUIRED;
else if(lCode==318)
m_lLastError=ERR_SIM_PUK2_REQUIRED;
else if(lCode==320)
m_lLastError=ERR_MEMORY_FAIL;
else if(lCode==321)
m_lLastError=ERR_INVALID_INDEX;
else if(lCode==322)
m_lLastError=ERR_MEMORY_FULL;
else if(lCode==330)
m_lLastError=ERR_SMSC_NOT_FOUND;
else if(lCode==331)
m_lLastError=ERR_NETWORK_SERVICE;
else if(lCode==332)
m_lLastError=ERR_NETWORK_TIMEOUT;
else
m_lLastError=ERR_UNKNOWN_CODE;
}
}
else if(strResult.Find("+CEER ERROR:")>=0)
{
strTemp="+CEER ERROR:";
ParseResult(strResult,strTemp);
if(RC>=1)
{
lCode=atoi(RD[0]);
if(atoi(RD[0])<128)
m_lLastError=ERR_NETWORK_RP;
else
m_lLastError=ERR_NETWORK_TP;
}
}
}
else if(strResult.Find("ERROR")>=0)
m_lLastError=ERR_NOT_SUPPORT;
else
m_lLastError=m_Con.m_lLastError;
return ERR_FAIL;
}
zhhuang2002 2003-09-05
  • 打赏
  • 举报
回复
短信的标志位在哪???不明白啊!
lin6194 2003-09-05
  • 打赏
  • 举报
回复
fengshachen(fengshachen) :
-》“对与连续发送将标志位设为这样一来发送完一条MN层链路不会立即断,可以减短连续发送的时间”
这个方法不错,那要是我把每个短信的标志位都设置一下,这样发送少量或间隔时间很长的时候会不会有什么问题?
fengshachen 2003-09-04
  • 打赏
  • 举报
回复
3s基本可以的
我做过一个采用多线程来实现的
对与连续发送将标志位设为这样一来发送完一条MN层链路不会立即断,可以减短连续发送的时间
kl520 2003-09-03
  • 打赏
  • 举报
回复
up
lin6194 2003-09-03
  • 打赏
  • 举报
回复
zhhuang2002(老兵):
那个错误代码的问题,我正在做,等等。
im9394(巴黎铁塔反转再反转) :
用语言和用超级终端没有区别的,我一般是用超级终端调试。
xysome(Conqueror):
你的速度比较正常啦,3秒是极限。与模块无关,网络相关。
xysome 2003-09-02
  • 打赏
  • 举报
回复
我做的最快是3秒钟发送一条短信;如果短信比较长,那么可能发送一条需要5到6秒钟
由于模块的反应速度慢,如果间隔时间太短会造成模块死掉;一般间隔4到5秒钟比较保险
一秒钟发送一条真是令我惊讶,是什么模块的??
  • 打赏
  • 举报
回复
>"大概一秒每条上下。前五条较快,之后的就稳定。"
你们的都这么快,我的怎么就最快3秒一条.

我计算发送短信的时间是把数据保存在数据库中,端口在连接中,编码后从AT+CMGS开始计算,总的时间除以数量。环境是WIN98+VB6。数据线连接NOKIA 8850


>"你可先测试AT+CMGS=<Length>,不测试PDU部份。"
等手机返回">",这个是很快啊,后面发送PDU也很快,就是在Ctrl+Z之后要等待,这个时候把手机接近CRT的显示器,显示器明显闪动,等闪动停止后返回OK,我怎么做都要3秒中.到底是什么问题,实在搞不懂了.

你是使用超级终端测试还是使用编程语言?
lin6194 2003-09-01
  • 打赏
  • 举报
回复
nlnc(风之8号) :
>"AT+CMGS指令PDU编码中必须将短信中心号码编码进去"
不是的,如果你把PDU中的SMSC设置空值,就可以用手机中设置的号码直接发送,编码长度短一些.

zhhuang2002(老兵) :
ctrl-z的问题,还是在于AT+CMGS和AT+CMGW之类的指令,所以以后遇到通讯不到就先Ctrl-Z然后AT,还不返回就是完蛋了,呵呵.
另外如果想要详细的返回信息可以打开错误提示,会给出代码的,比如512之类的,你查错误表就知道错误原因了.
发送速度只能依赖于网络.3秒/条是极限了.
nlnc 2003-09-01
  • 打赏
  • 举报
回复
AT+CMGS指令PDU编码中必须将短信中心号码编码进去,手机确实有短信中心号码,但是那是通过手机发送短信时手机自动编码的来源,通过电脑发送AT指令的时候,只有自己将短信中心相关位编码后发送,没有办法,即使通过AT指令读到手机中的短信中心号,还是得自己编码加入到“>”后发送才可以;

三分钟没有响应正在测试中;

其实无论MOTO还是NOKIA还是SONY或者SIMENSE,那个手机类型你可以不管他,只是在发送的时候,NOKIA可以发送N多字符,其他类型手机最好只发三个以做测试;
zhhuang2002 2003-09-01
  • 打赏
  • 举报
回复
to lin6194()
谢谢,我测试结果和你所说的非常一致,还想请教一下:如何打开错误提示让手机返回详细错误码,我看到协议文档上确实列有代码表,只是下何命令得到?
zhhuang2002 2003-08-31
  • 打赏
  • 举报
回复
我是用西门子的手机,但你的测试程序也还是认的,比如读电话薄,但速度很慢,发送短信似乎没有成功,等了近3分钟好象是"发送超时或失败",实际上手机中已设置了中心号码,应该直接用该号码发送出去啊,由于发送不成功,想到是不是一定要设置中心号码,但"确定"时却连接失败,可能是由于中心号码下面那个下拉框中只有MOTO和Nokia的原因???

算了,还是继续调试自己的程序,目前发现速度问题其实与很多因素有关,比如三个字和三十个字就会有1秒之差,不同的SIM卡也有差异,与信号强弱也有关,与SMC也有关,......

lin6194()的那个强送ctrl-z的方法今天好象成功了,如果稳定,这将是有效的解法,非常感谢各位朋友的帮助,csdn和大家一直是我的老师!
nlnc 2003-08-31
  • 打赏
  • 举报
回复
关于测试测试程序中只可以发送一条,因为是客户端嘛,哪个只是用来测试随便写的,真正和手机打交道的是SMSCOM.DLL,一个COM,如果需要实现群发或者重复发送,只要再写一个客户端就可以了;

只有三个汉字,是因为MOTO的PDU编码在信息长度那一位上和标准的PDU编码格式有差异,如果你使用NOKIA手机,就不用管几个字了;

短信中心号是可以修改的,在系统设置-短信中心号里面修改就可以了,或者直接修改SMS.INI文件里面相关内容也可以;

如果短信中心号码设置错误,那么根据AT指令和PDU编码规则,那么发送是不可能成功的,另外,发送失败,客户端会弹出“发送超时或失败”,然后状态条中显示“执行完成”;你说的情况我这边没有测出来,请将你的情况具体描述一下可以嘛?
zhhuang2002 2003-08-31
  • 打赏
  • 举报
回复
我一个朋友发了近一千条后,手机就不工作了,好象是在搜索网络,必须断开再连接.

另外我看了nlnc(风之8号)的测试程序,它只限发一条,而且只有3个汉字,短信中心号码也定死了,试着发一条,等了3分钟还在"执行中",同意每条速度不可能<3秒

我还发现如果发短信返回即使是ERROR,手机仍被扣去0.1元,说明短信还是发到了SMC,那么这个ERROR究竟是如何产生的??
lin6194 2003-08-31
  • 打赏
  • 举报
回复
所以我总觉得GSM的网络里,达到平均1秒/条的速度是不太可能的.有人说用CDMA的机速度飞快,不知道是不是这样,可能CDMA的短信网络不一样吧.不过就算速度快又会有另外一个问题,那就是"互联互通"的问题,发是发出去了,但移动的不一定收到,得不偿失,呵呵.

另外还有一个问题,不知道你注意到没有,当你连续大量发送的时候,发个几百条之后,就会连续失败,你要停止操作很久时间,比如说1个小时,才能够继续发送,否则会持续返回ERROR!
lin6194 2003-08-30
  • 打赏
  • 举报
回复
>"大概一秒每条上下。前五条较快,之后的就稳定。"
你们的都这么快,我的怎么就最快3秒一条.

>"你可先测试AT+CMGS=<Length>,不测试PDU部份。"
等手机返回">",这个是很快啊,后面发送PDU也很快,就是在Ctrl+Z之后要等待,这个时候把手机接近CRT的显示器,显示器明显闪动,等闪动停止后返回OK,我怎么做都要3秒中.到底是什么问题,实在搞不懂了.
加载更多回复(33)

790

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 其他移动相关
社区管理员
  • 移动开发其他问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧