CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

想做个发送短信的程序,硬件设备:手机Modem、SIM卡 软件:自己写程序

楼主zhangjing1979666(好小子)2005-07-18 16:10:08 在 Delphi / 网络通信/分布式开发 提问

小弟也是初次涉及短信问题,从来没有做过,不知道怎么弄,请大家给点意见,我的邮箱:zhangjing1979666@sohu.com,还有我能借来一个NEC的手机,支持彩信,去年买的,3000   多块呀,能不能写个程序先测试一下呢,具体用到什么控件、哪些技术指标,请大家互相交流 问题点数:20、回复次数:32Top

1 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2005-07-18 16:35:16 得分 0

AT指令  
  COM编程  
   
  还需要最难找到的,手机AT协议规范文件,说白了,就是手机连接PC的SDK文档  
  一般手机厂商是不公开的  
   
  http://lysoft.7u7.netTop

2 楼hzq99(kuei)回复于 2005-07-18 16:39:28 得分 0

在串口编程,用AT指令Top

3 楼zhangjing1979666(好小子)回复于 2005-07-18 16:45:26 得分 0

谢谢ly_liuyang(Liu   Yang),   hzq99(kuei),你说用   AT   指令,我也知道,怎么用?能不能说的详细点,具体的操作步骤之类的Top

4 楼chenylin(陈SIR)回复于 2005-07-18 17:55:21 得分 1

先在超级终端时试一下就清楚了。Top

5 楼cjf1009(农民程序员)回复于 2005-07-18 21:48:09 得分 0

利用手机模块实现短消息  
   
  上海市粤秀路46号76楼302室   童瑞华  
     
  全球定位系统(GPS)系统由于性能优异,在民用上应用范围很广。其可以用于空中交通管理、大地精密测量、摄影测量、监测地壳运动、火山活动、野外调查和勘探的定位、地面沉降、土地塌方,甚至于用于民用如建筑、汽车、旅行探险、狩猎等方面。但是如何将GPS定位数据传递到监控中心一直是相应系统关注的焦点。目前,移动子系统和监控中心子系统之间往往通过短消息方式传送数据。这种方式采用通常的无线GSM发送接收设备就能实现短消息的传送,实现简单,具有通信成本低、频谱利用率高、系统容量大、业务种类多、保密性能好、抗干扰能力强、通话质量高、国际自动漫游等优点,它利用信令信道传输,不用拨号建立连接,直接把要发的信息加上目的地址发送到短消息服务中心,由短消息服务中心在发给最终的信宿,是目前应用最广泛的通信方案。    
  目前,在相关的系统中往往使用手机模块(摩托罗拉、西门子等均有相应的产品)来实现与短消息中心的联系。主要原因在于:使用手机模块利于系统集成,成本较低,而使用手机虽然也可以实现相应功能,但是需要外加数据线,成本相当高。本文主要介绍与短消息开发相关的GSM   AT指令。    
       
  1.相关的GSM   AT指令    
  与SMS有关的GSM   AT指令(from   GSM07.05)如表1所示:    
  表1   相关的GSM   AT指令  
     
  AT   指令    
    功                                           能    
     
  AT+CMGC    
    Send   an   SMS   command(发出一条短消息命令)    
     
  AT+CMGD    
    Delete   SMS   message(删除SIM卡内存的短消息)    
     
  AT+CMGF    
    Select   SMS   message   formate(选择短消息信息格式:0-PDU;1-文本)    
     
       
   
  AT+CMGL    
    List   SMS   message   from   preferred   store(列出SIM卡中的短消息PDU/text:       0/“REC   UNREAD”-未读,1/“REC   READ”-已读,2/“STO   UNSENT”-待发,3/“STO   SENT”-已发,4/“ALL”-全部的)    
     
  AT+CMGR    
    Read   SMS   message(读短消息)    
     
  AT+CMGS    
    Send   SMS   message(发送短消息)    
     
  AT+CMGW    
    Write   SMS   message   to   memory(向SIM内存中写入待发的短消息)    
     
  AT+CMSS    
    Send   SMS   message   from   storage(从SIN|M内存中发送短消息)    
     
  AT+CNMI    
    New   SMS   message   indications(显示新收到的短消息)    
     
  AT+CPMS    
    Preferred   SMS   message   storage(选择短消息内存)    
     
  AT+CSCA    
    SMS   service   center   address(短消息中心地址)    
     
  AT+CSCB    
    Select   cell   broadcast   messages(选择蜂窝广播消息)    
     
  AT+CSMP    
    Set   SMS   text   mode   parameters(设置短消息文本模式参数)    
     
  AT+CSMS    
    Select   Message   Service(选择短消息服务)    
     
     
  对短消息的控制共有三种模式:    
    Block   Mode    
     
    基于AT命令的PDU   Mode    
     
    基于AT命令的Text   Mode    
     
  使用Block模式需要手机生产厂家提供驱动支持,目前,PDU   Mode   已取代   Block   Mode,   Text   Mode比较简单,本文重点介绍模式PDU   Mode,以西门子公司的产品TC35T为例。    
  2.计算机与TC35T的通信    
  (1)RS232串口连接    
  由于TC35T自带RS232串口线,故只需将其连接到计算机串口即可。打开超级终端,选择相应的串口,将端口参数设置为:速率—4800、奇偶校验位—无、数据位—8、停止位—1、流量控制—硬件。    
  (2)连接测试    
  输入“AT”然后回车,屏幕上返回“OK”表明计算机与TC35T已连接成功,TC35T能够正常工作。这时就可以测试各类AT命令。    
  当测试命令“AT+CMGS=?<CR>”时,如果返回“OK”标明TC35T支持该指令。该指令的完整语法如下:    
    如果此时TC35T处于PDU   Mode(即“AT+CMGF?<CR>”返回“0”)    
     
  AT+CMGS=<length><CR>PDU   is   given<^Z/ESC>    
  如果短消息发送成功,则返回“OK”,并显示信息号:    
  +CMGS:   <mr>[,<ackpdu>]    
  如果短消息发送失败,则返回如下信息号:    
  +CMS   ERROR:   <err>    
    如果此时TC35T处于Text   Mode(即“AT+CMGF?<CR>”返回“1”)    
     
  AT+CMGS=<da>[,toda]<CR>text   is   entered<^Z/ESC>    
  如果短消息发送成功,则返回“OK”,并显示信息号:    
  +CMGS:   <mr>[,<scts>]    
  如果短消息发送失败,则返回如下信息号:    
  +CMS   ERROR:   <err>    
  另外,由于使用的是TC35T,当有新的短消息到来时,需要TC35T产生提示,使用指令“AT+CNMI”。该指令的完整语法如下:    
  AT+CNMI=[<mode>][,<mt>][,<bm>][,<ds>][,<bfr>]    
  如果有新的短消息来到,则TC35T将自动返回下列提示:    
  +CMTI:   “SM”,   <index>    
  此时读出<index>,然后用“AT+CMGR”指令即可读出短消息内容。    
  3.PDU数据格式分析:    
  例如,我们要将字符“Hi”字符发送到目的地“13677328099”    
  PDU字符串为:    
  08   91   683108701305F0   11   00   0D   91   3176378290F9   00   00   00   02   C834    
  ⑴08—短信息中心地址长度。指(91)+(683108701305F0)的长度。    
  ⑵91—短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还有其它数值,但91最常用。    
  91—10010001    
  BIT   No.    
    7    
    6    
    5    
    4    
    3    
    2    
    1    
    0    
     
  Name    
    1    
    数值类型    
    号码鉴别    
     
     
  数值类型(Type   of   Number):000—未知,001—国际,010—国内,111—留作扩展;    
  号码鉴别(Numbering   plan   identification):0000—未知,0001—ISDN/电话号码(E.164/E.163),1111—留作扩展;    
  ⑶683108701305F0—短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。    
  ⑴、⑵、⑶通称短消息中心地址(Address   of   the   SMSC)。    
  ⑷11—文件头字节。    
  11&h=00010001&b    
  BIT   No.    
    7    
    6    
    5    
    4    
    3    
    2    
    1    
    0    
     
  Name    
    TP-RP    
    TP-UDHI    
    TP-SPR    
    TP-VFP    
    TP-RD    
    TP-MTI    
     
  Value    
    0    
    0    
    0    
    1    
    0    
    0    
    0    
    1    
     
     
  应答路径—TP-RP(TP-Reply-Path):0—不设置;   1—设置    
  用户数据头标识—TP-UDHL(TP-User-Data-Header-Indicator):0—不含任何头信息;   1—含头信息    
  状态报告要求—TP-SPR(TP-Status-Report-Request):0—需要报告;   1—不需要报告    
  有效期格式—TP-VPF(TP-Validity-Period-Format):00—不提供(Not   present);   10—整型(标准);01—预留;   11—提供8位字节的一半(Semi-Octet   Represented)    
  拒绝复制—TP-RD(TP-Reject-Duplicates):0—接受复制;   1—拒绝复制    
  信息类型提示—TP-MTI(TP-Message-Type-Indicator):00—读出(Deliver);   01—提交(Submit)    
  ⑸00—信息类型(TP-Message-Reference)    
  ⑹0B—被叫号码长度。    
  ⑺91—被叫号码类型(同⑵)。    
  ⑻3176378290F9—被叫号码,经过了位移处理,实际号码为“13677328099”。    
  ⑹、⑺、⑻通称目的地址(TP-Destination-Address)。    
  ⑼00—协议标识TP-PID(TP-Protocol-Identifier)    
  BIT   No.    
    7    
    6    
    5    
    4    
    3    
    2    
    1    
    0    
     
     
  Bit   No.7与Bit   No.6:   00—如下面定义的分配Bit   No.0—Bit   No.5;01—参见GSM03.40协议标识完全定义;10—预留;11—为服务中心(SC)特殊用途分配Bit   No.0—Bit   No.5。    
  一般将这两位置为00。    
  Bit   No.5:0—不使用远程网络,只是短消息设备之间的协议;1—使用远程网络。    
  Bit   No.0—Bits   No.4:00000—隐含;00001—电传;00010—group   3   telefax;00100—语音;00101—欧洲无线信息系统(ERMES);00110—国内系统;10001—任何基于X.400的公用信息处理系统;10010—Email。    
  ⑽00—数据编码方案TP-DCS(TP-Data-Coding-Scheme)    
  BIT   No.    
    7    
    6    
    5    
    4    
    3    
    2    
    1    
    0    
     
     
  Bit   No.7与Bit   No.6   :一般设置为00;Bit   No.5:0—文本未压缩,1—文本用GSM标准压缩算法压缩;Bit   No.4:0—表示Bit   No.1、Bit   No.0为保留位,不含信息类型信息,1—表示Bit   No.1、Bit   No.0含有信息类型信息;Bit   No.3与Bit   No.2:00—默认的字母表,01—8bit,10—USC2(16bit),11—预留;Bit   No.1与Bit   No.0:00—Class   0,01—Class   1,10—Class   2(SIM卡特定信息),11—Class   3。    
  ⑾00—有效期TP-VP(TP-Valid-Period)      
  VP   value(&h)    
    相应的有效期    
     
  00   to   8F    
    (VP+1)*5   分钟    
     
  90   to   A7    
    12小时+(VP-143)*30分钟    
     
  A8   to   C4    
    (VP-166)*1天    
     
  C5   to   FF    
    (VP-192)*1   周    
     
     
  ⑿02—用户数据长度TP-UDL(TP-User-Data-Length)    
  ⒀C834—用户数据TP-UD(TP-User-Data)“Hi”    
  4.短消息编码    
  设需要发送的短消息内容为“Hi”,使用的GSM字符集为7位编码。首先将字符转换为7位的二进制,然后,将后面字符的位调用到前面,补齐前面的差别。例如:H翻译成1001000,i翻译成1101001,显然H的二进制编码不足八位,那么就将i的最后一位补足到H的前面。那么就成了11001000(C8),i剩下六位110100,前面再补两个0,变成00110100(34),于是“Hi”就变成了两个八进制数   C8   34。    
  5.短消息的发送与接收案例    
  鉴于TC35(T)支持TEXT格式,我们在试验中主要测试该格式。    
  (1)设置短消息中心    
  AT+CSCA="+8613800731500"(短消息中心);      
  (2)设置短消息发送格式    
  AT+CMGF=1   (1-TEXT;   0-PDU);      
  (3)发送短消息(短消息内容为“test”)    
  AT+CMGS="13508485560"(目的地址)   <cr>    
  >   test   ^z   ;      
  (4)设置短消息到达自动提示:   设置短消息到达提示当短消息被接收,将获取指令:   +CMTI:"SM",INDEX(信息存储位置)    
  AT+CNMI=1,1,0,0,1();    
  (5)获取短消息内容(Once   more),假设INDEX=8。    
  AT+CMGR=8    
  返回信息如下:    
  +CMGR:   "REC   UNREAD","+8613508485560",,"01/07/16,15:37:28+32",Once   more    
  6.注意事项    
  (1)短消息中心一般不会改动,如果短消息中心号码改动,在使用“AT+CSCA”语句时,记住TC35要重新启动,否则TC35不能正常工作(TC35T不存在此问题)。    
  (2)某些SIM卡带有密码,启动时需要输入密码。    
  Top

6 楼cjf1009(农民程序员)回复于 2005-07-18 21:52:07 得分 5

要先掌握串口编程的基本方法,可以用spcomm  
  发短信主要是发短信的两种格式:TEXT和PDU,一般用PDU(可以发中文)Top

7 楼zhangjing1979666(好小子)回复于 2005-07-19 12:24:21 得分 0

Win2000pro   下没有超级终端吧,哪里有超级终端,还有别说太多理论的东西,一点都不实际,不实用,想要一个具体的操作过程Top

8 楼zhangjing1979666(好小子)回复于 2005-07-19 15:40:04 得分 0

高手呢,进来啊,给点菜鸟似的操作步骤Top

9 楼geyobing(大地精灵)回复于 2005-07-19 15:47:25 得分 0

用手机的话,你就需要了解AT指令,如果你需要我可以给你GSM短信猫,已经封装好了,发短信这一块,只要简单了解跟GSM短信猫的通讯协议,就可以进行程序开发,如果你需要可以跟我联系,我已经用在很多地方,相当好用,我的邮箱:ajq_8036@163.com,软件我也有的Top

10 楼zhangjing1979666(好小子)回复于 2005-07-19 16:10:13 得分 0

大家继续来,我继续等待,我就是先想测试一下、学习一下,然后正式在用Top

11 楼zhangjing1979666(好小子)回复于 2005-07-19 16:23:29 得分 0

Win2000pro   下有超级终端吗Top

12 楼wanshi131(顽石)回复于 2005-07-19 16:31:07 得分 2

开始-〉附件-〉通讯-〉超级终端  
   
  用串口调试软件也行的,你用手机发,还需要买根串口线啊Top

13 楼zhangjing1979666(好小子)回复于 2005-07-19 16:40:48 得分 0

wanshi131(顽石)   ,你有   QQ   号吗,我想跟你学学,我的   25038693(土不小子)Top

14 楼wanshi131(顽石)回复于 2005-07-19 17:03:27 得分 0

公司不敢上QQ,     MSN:wanshi131@hotmail.comTop

15 楼zhangjing1979666(好小子)回复于 2005-07-19 17:10:10 得分 0

啊,那   POPO   有吗?就是网易的泡泡,我的   ZHANGJING1979666@163.COM,如果没有,咱们邮箱联系吧,我的   ZHANGJING1979666@SOHU.COMTop

16 楼geyobing(大地精灵)回复于 2005-07-20 11:46:09 得分 0

我的泡泡ajq_8036@163.com,我们可以在线聊Top

17 楼tjianliang(乡关何处)回复于 2005-07-20 13:29:20 得分 0

用程序向串口发AT指令,就和超级终端里敲AT指令是一样的Top

18 楼bluesen(善哉)回复于 2005-07-20 14:01:20 得分 0

别自己写了,到我的网站上下载一个免费的:  
  http://www.bluespace.com.cn/koodoo/examples_sms.htm  
  Top

19 楼zhangjing1979666(好小子)回复于 2005-07-20 16:43:52 得分 0

好的,谢谢大家的帮助,不长时间我还会来的,在调试的过程当中肯定会遇到各种各样的问题的Top

20 楼noahroom()回复于 2005-07-20 17:44:50 得分 0

您好:  
  短信收发设备(短信猫)(全国最低价)=750元/台  
  短信软件开发接口(无任何限制)=800元  
  我公司郑重承诺:诺亚短信开发接口与诺亚短信设备(短信猫)无任何绑定限制:即第一次买入后,以后无需再次购买此开发接口,请广大用户在购买时注意咨询,如有疑问,欢迎来电咨询!诺亚短信设备(短信猫)为全国最低价!      
  我公司还供应以下软件产品:  
  ●   诺亚短信开发接口   ●   诺亚短信群发办公版    
  ●   诺亚短信防伪系统   ●   诺亚短信群发广告版    
  ●   诺亚短信查询系统   ●   诺亚短信群发网络版    
  ●   诺亚短信家校通版   ●   诺亚短信群发物流版  
  如需了解更多优惠信息,请与我们联系:  
  北京诺亚公司  
  联系人:王先生  
  地     址:北京市海淀区远大路20号鹏安世纪大厦A座12A  
  邮     编:100089      
  电     话:010-87416460/51980693      
  传     真:010-51666783      
  邮     箱:beijingsms@126.com      
  QQ     号:397923974      
        MSN:noahsoft@hotmail.com    
  网     址:www.taobaozhe.comTop

21 楼zhangjing1979666(好小子)回复于 2005-07-27 17:05:36 得分 0

noahroom()   不要发广告了,我是不会买你的接口的,不过短信猫没准可以买你的,如果有心,就帮忙,就知道钱,素质Top

22 楼haogui0(好鬼)回复于 2005-07-29 09:44:18 得分 12

其实这个东东的开发还是比较简单地,不过需要一点点经验,需要你两方面的知识,一是串口通讯,再就是你的gsm   modem的AT指令集了。我个人开发过不少gsm   modem的程序,实现了同类商业软件的几乎所有功能,有什么需求请联系   QQ:Top

23 楼haogui0(好鬼)回复于 2005-07-29 09:46:16 得分 0

呵呵,刚才没发完,QQ:185597150Top

24 楼shxng(重新开始。。。)回复于 2005-07-29 10:48:47 得分 0

学习一下Top

25 楼noahroom()回复于 2005-08-01 18:56:18 得分 0

您好:  
  短信收发设备(短信猫)(全国最低价)=750元/台  
  短信软件开发接口(无任何限制)=800元  
  我公司郑重承诺:诺亚短信开发接口与诺亚短信设备(短信猫)无任何绑定限制:即第一次买入后,以后无需再次购买此开发接口,请广大用户在购买时注意咨询,如有疑问,欢迎来电咨询!诺亚短信设备(短信猫)为全国最低价!      
  我公司还供应以下软件产品:  
  ●   诺亚短信开发接口   ●   诺亚短信群发办公版    
  ●   诺亚短信防伪系统   ●   诺亚短信群发广告版    
  ●   诺亚短信查询系统   ●   诺亚短信群发网络版    
  ●   诺亚短信家校通版   ●   诺亚短信群发物流版  
  如需了解更多优惠信息,请与我们联系:  
  北京诺亚公司  
  联系人:王先生  
  地     址:北京市海淀区远大路20号鹏安世纪大厦A座12A  
  邮     编:100089      
  电     话:010-87416460/51980693      
  传     真:010-51666783      
  邮     箱:beijingsms@126.com      
  QQ     号:397923974      
        MSN:noahsoft@hotmail.com    
  网     址:www.taobaozhe.comTop

26 楼zhangjing1979666(好小子)回复于 2005-08-05 09:52:13 得分 0

广告拜托不要发了,我想学真材实料的东西,不想买你们现成的东西,哇哈哈Top

27 楼FlyBird2004(Phoenix)回复于 2005-08-05 10:38:52 得分 0

这是我自己写的一个单元,是一个项目中的GPRS发送短信代码,是移动的短信发送.给你做个参考.  
   
  unit   U_Function;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   ExtCtrls,   OleCtrls,   MSCommLib_TLB,   ComCtrls,     DBCtrls,  
      IniFiles,   DB,   ADODB;  
   
  type  
      TSendNoteInfo   =   Record  
          lAddr   :   string;  
          lSendPhone   :   WideString;  
          lNoteContent   :   string;  
          lSendFlag       :   integer;  
      end;  
   
      TPublicFunction   =   Class  
      public  
          Constructor   Create;  
          Destructor     Destroy();   override;  
   
      public  
          IniFile   :   TIniFile;  
   
          function   ConnectDataSource()   :   Boolean;  
          procedure   SendNote(_Addr   :   string;   _Phone,   _NoteContent   :   WideString);  
   
          function   ConversionText(_NoteText   :   string):   string;  
          function   ConversionPhone(_Phone   :   string):   string;  
          function   ConversionAddr(_Addr   :   string)   :   string;  
      end;  
   
  implementation  
   
  uses   U_DataMoudle;  
   
  {   TPublicFunction   }  
   
  //连接数据库  
  function   TPublicFunction.ConnectDataSource:   Boolean;  
   
      type  
          TSQLConnect   =   Record  
              tServerName,   tDataBaseName,   tUserName,   tPassword   :   string;  
          end;  
  var  
      iSQLConnect   :   TSQLConnect;  
      i   :   integer;  
  begin  
      Result   :=   False;  
      try  
          iSQLConnect.tServerName       :=   IniFile.ReadString('BasicSetting',   'ServerName',   'Phoenix');  
          iSQLConnect.tDataBaseName   :=   IniFile.ReadString('BasicSetting',   'DataBaseName',   'online');  
          iSQLConnect.tUserName           :=   IniFile.ReadString('BasicSetting',   'UserName',   'online');  
          iSQLConnect.tPassword           :=   IniFile.ReadString('BasicSetting',   'SQLPassword',   '');  
          if   (iSQLConnect.tServerName   <>   '')   and   (iSQLConnect.tDataBaseName   <>   '')   then  
          begin  
              F_DM.iADOConnection.Connected   :=   False;  
              F_DM.iADOConnection.ConnectionString   :=  
                  'Provider=SQLOLEDB.1;Persist   Security   Info=False;'+  
                  'User   ID='+iSQLConnect.tUserName+';Password='+iSQLConnect.tPassword+  
                  ';Initial   Catalog='+iSQLConnect.tDataBaseName+';Data   Source='+iSQLConnect.tServerName;  
              //ShowMessage(F_DM.iADOConnection.ConnectionString);  
              F_DM.iADOConnection.LoginPrompt   :=   False;  
              F_DM.iADOConnection.Connected       :=   True;  
   
              for   i   :=   0   to   F_DM.ComponentCount   -   1   do  
              begin  
                  if   (F_DM.Components[i]   is   TADODataSet)   then  
                      TADODataSet(F_DM.Components[i]).Connection   :=   F_DM.iADOConnection;  
              end;  
              F_DM.AT_PersonalInfo.TableName     :=   'PersonalInfo';  
              F_DM.AT_PersonalInfo.Active           :=   False;  
              F_DM.AT_PersonalInfo.Active           :=   True;  
   
              F_DM.AT_AlarmVal.TableName             :=   'AlarmVal';  
              F_DM.AT_AlarmVal.Active                   :=   False;  
              F_DM.AT_AlarmVal.Active                   :=   True;  
   
              Result   :=   True;  
          end;  
      except  
   
      end;  
  end;  
   
  //转换地址(短信中心号码)  
  function   TPublicFunction.ConversionAddr(_Addr:   string):   string;  
  var  
      iAddr,   iConversion   :   string;  
      i,   j   :   integer;  
  begin  
      Result   :=   '';  
      try  
          if   Copy(_Addr,   1,   3)   =   '+86'   then  
              iAddr   :=   Copy(_Addr,   2,   Length(_Addr)-   1)  
          else   if   Copy(_Addr,   1,   2)   =   '86'   then  
              iAddr   :=   _Addr  
          else   if   Copy(_Addr,   1,   2)   =   '13'   then  
              iAddr   :=   '86'+   _Addr;  
   
          if   (Length(iAddr)   Mod   2   =   1)   then  
              iAddr   :=   iAddr   +   'F';  
   
          i   :=   1;   j   :=   2;  
          while   j   <=   Length(iAddr)   do  
          begin  
              iConversion   :=   iConversion+   Copy(iAddr,   j,   1)+   Copy(iAddr,   i,   1);  
              Inc(i,   2);  
              Inc(j,   2);  
          end;  
   
          iConversion   :=   '91'+   iConversion;  
          Result   :=   IntToHex((Length(iConversion)   div   2),   2)+   iConversion;  
      except  
          Result   :=   '';  
      end;  
  end;  
   
  //转换电话号码  
  function   TPublicFunction.ConversionPhone(_Phone:   string):   string;  
  var  
      iPhoneNumber,   iConversion   :   string;  
      i,   j   :   integer;  
  begin  
      Result   :=   '';  
      try  
          if   Copy(_Phone,   1,   3)   =   '+86'   then  
              iPhoneNumber   :=   Copy(_Phone,   2,   Length(_Phone)-   1)  
          else   if   Copy(_Phone,   1,   2)   =   '86'   then  
              iPhoneNumber   :=   _Phone  
          else   if   Copy(_Phone,   1,   2)   =   '13'   then  
              iPhoneNumber   :=   '86'+   _Phone;  
   
          if   (Length(iPhoneNumber)   Mod   2   =   1)   then  
              iPhoneNumber   :=   iPhoneNumber   +   'F';  
   
          i   :=   1;   j   :=   2;  
          while   j   <=   Length(iPhoneNumber)   do  
          begin  
              iConversion   :=   iConversion+   Copy(iPhoneNumber,   j,   1)+   Copy(iPhoneNumber,   i,   1);  
              Inc(i,   2);  
              Inc(j,   2);  
          end;  
          //ShowMessage(iConversion);  
          Result   :=   '11000D91'   +   iConversion   +   '000800';  
      except  
          Result   :=   '';  
      end;  
  end;  
   
  //转换中文文本  
  function   TPublicFunction.ConversionText(_NoteText:   string):   string;  
  var  
      i,   j,   Len   :   integer;  
      Cur   :   integer;  
      Temp   :   string;  
      Ws,   Wt   :   WideString;  
  begin  
      Result   :=   '';  
      Wt   :=   '';  
      try  
          Ws   :=   _NoteText;  
          Len   :=   Length(Ws);  
          i   :=   1;     j   :=   0;  
          while   i   <=   Len   do  
          begin  
              Cur   :=   ord(Ws[i]);  
              FmtStr(Temp,   '%4.4X',   [Cur]);  
              Wt   :=   Wt   +   Temp;  
              Inc(i);  
              j   :=   (j+   1)   Mod   7;  
          end;  
   
          //ShowMessage(Wt+   '     '+   IntToHex(Length(Wt)   div   2,   2)+   '     '+   IntToStr(Length(Wt)   div   2));  
          Result   :=   IntToHex(Length(Wt)   div   2,   2)+   Wt;  
      except  
          Result   :=   '';  
      end;  
  end;  
   
  constructor   TPublicFunction.Create;  
  var  
      iFileDir   :   string;  
  begin  
      iFileDir   :=   ExtractFilePath(Application.ExeName)+   'Initialize.ini';  
      if   FileExists(iFileDir)   then  
          IniFile   :=   TIniFile.Create(iFileDir);  
  end;  
   
  destructor   TPublicFunction.Destroy;  
  begin  
   
      inherited;  
  end;  
   
  //短信发送报警信息  
  procedure   TPublicFunction.SendNote(_Addr   :   string;   _Phone,   _NoteContent   :   WideString);  
  var  
      iOutStr   :   Widestring;  
      iStr,   iSubPhone   :   string;  
      iMSComm   :   TMSComm;  
      iRecordPhone   :   WideString;  
   
      procedure   MSCommSendNote(_Count,   _Note   :   string);  
      begin  
          if   Not   iMSComm.PortOpen   then  
              iMSComm.PortOpen   :=   True;  
   
          iMSComm.Output   :=   'at+cmgf=0'+   Char(13)+   Char(10);  
          Sleep(300);  
          iMSComm.Output   :=   'at+cmgs='+   _Count+   Char(13)+   Char(10);  
          Sleep(4000);  
          iMSComm.Output   :=   _Note;  
          Sleep(4000);  
   
          iMSComm.PortOpen   :=   False;  
      end;  
  begin  
      iMSComm   :=   TMSComm.Create(Nil);  
      try  
          if   (_Phone   =   '')   or   (_NoteContent   =   '')   then  
              Exit;  
   
          if   iMSComm.PortOpen   then  
                  iMSComm.PortOpen   :=   False;  
   
          case   IniFile.ReadInteger('BasicSetting',   'PortNumber',   1)   of  
              1   :   iMSComm.CommPort   :=   1;  
              2   :   iMSComm.CommPort   :=   2;  
              3   :   iMSComm.CommPort   :=   3;  
              4   :   iMSComm.CommPort   :=   4;  
          end;  
   
          iMSComm.InputLen             :=   0;  
          iMSComm.InBufferCount   :=   0;  
   
          if   Not   iMSComm.PortOpen   then  
              iMSComm.PortOpen   :=   True;  
   
          //__________________________________________________________________________  
          //检索地址、电话号码、内容   发送短信  
          if   AnsiPos(',',   _Phone)   <>   0   then  
          begin  
              iRecordPhone   :=   _Phone;  
              Repeat  
                  iSubPhone   :=   Copy(iRecordPhone,   1,   AnsiPos(',',   iRecordPhone)-   1);  
                  try  
                      iStr   :=   FloatToStr(Length(ConversionPhone(iSubPhone)+   ConversionText(_NoteContent))/   2);  
                      iOutStr   :=     ConversionAddr(_Addr)+  
                                              ConversionPhone(iSubPhone)+  
                                              ConversionText(_NoteContent)+  
                                              Char(26)+   Char(13)+   Char(10);  
                      //ShowMessage(iStr+   '     '+   iOutStr);  
                  finally  
                      MSCommSendNote(iStr,   iOutStr);  
                      Delete(iRecordPhone,   1,   AnsiPos(',',   iRecordPhone));  
                  end;  
              until  
                  AnsiPos(',',   iRecordPhone)   =   0;  
          end;  
   
          try  
              iSubPhone   :=   Copy(iRecordPhone,   1,   Length(iRecordPhone));  
              iStr   :=   FloatToStr(Length(ConversionPhone(iSubPhone)+   ConversionText(_NoteContent))/   2);  
              iOutStr   :=     ConversionAddr(_Addr)+  
                                      ConversionPhone(iSubPhone)+  
                                      ConversionText(_NoteContent)+  
                                      Char(26)+   Char(13)+   Char(10);  
              //ShowMessage(iStr+   '       '+   iOutStr);  
          finally  
              MSCommSendNote(iStr,   iOutStr);  
          end;  
          //群发短信,以“,”将电话号码格开  
          //__________________________________________________________________________  
      finally  
          iMSComm.Free;  
      end;  
  end;  
   
  end.  
  Top

28 楼woaichenyu(小吴)回复于 2005-08-05 10:39:04 得分 0

路过  
   
  学习到了Top

29 楼leaber(鹤舞白沙)回复于 2005-08-10 15:05:15 得分 0

嗯,关注一下。Top

30 楼opqhjb(又回来做程序员了!苦呀!)回复于 2005-08-10 16:14:58 得分 0

爽呀!Top

31 楼lanyus()回复于 2005-08-10 16:29:17 得分 0

路过捡了点好东西。。。UPTop

32 楼noahroom()回复于 2005-08-21 19:12:56 得分 0

您好:  
  短信收发设备(短信猫)(全国最低价)=750元/台  
  短信软件开发接口(无任何限制)=800元  
  我公司现面向全国诚征短信产品代理商,全线代理我公司产品,代理我公司产品具有投资少,见效快,收益高等特点!有意者请速与我公司联系:010-87416460,谢谢!  
  我公司郑重承诺:诺亚短信开发接口与诺亚短信设备(短信猫)无任何绑定限制:即第一次买入后,以后无需再次购买此开发接口,请广大用户在购买时注意咨询,如有疑问,欢迎来电咨询!诺亚短信设备(短信猫)为全国最低价!      
  我公司还供应以下软件产品:  
  ●   诺亚短信开发接口   ●   诺亚短信群发办公版    
  ●   诺亚短信防伪系统   ●   诺亚短信群发广告版    
  ●   诺亚短信查询系统   ●   诺亚短信群发网络版    
  ●   诺亚短信家校通版   ●   诺亚短信群发物流版  
  如需了解更多优惠信息,请与我们联系:  
  北京诺亚公司  
  联系人:王先生  
  地     址:北京市海淀区远大路20号鹏安世纪大厦A座12A  
  邮     编:100089      
  电     话:010-87416460/51980693      
  传     真:010-51666783  
  邮     箱:beijingsms@126.com      
  QQ     号:397923974      
        MSN:noahsoft@hotmail.com    
  网     址:www.taobaozhe.comTop

相关问题

  • Modem通讯程序
  • 在WIN 2000下,每次开机都会提示找到新硬件,重装MODEM驱动程序,才可以正常上网??
  • DirectShow怎样支持硬件?没有硬件相关的源程序可以吗?
  • vc++可以开发硬件驱动程序吗?
  • 谁编写过硬件驱动程序啊!!!
  • c/c++能对直接编写硬件的驱动程序吗?
  • 硬件驱动程序的文件是哪一个
  • 从哪里可以下栽到LINUX的硬件驱动程序?
  • 怎么在win2k/xp设置硬件中断服务程序?
  • 外部硬件信号控制程序运行问题!

关键词

  • win2000
  • 消息
  • 指令
  • 接口
  • sim卡
  • sms
  • 诺亚
  • 短消息
  • tp
  • 短信

得分解答快速导航

  • 帖主:zhangjing1979666
  • chenylin
  • cjf1009
  • wanshi131
  • haogui0

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo