首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

用PHP做过短信开发的,都给我马上进来。

交流一下撒~~~:blowzy:

:D :D
昵称: 开心果  时间: 2003-12-13 16:44:00
做不了吧!开发内核还是要用到C!
昵称: liaoqiuhu  时间: 2003-12-13 16:50:00
先把老的贴出来,省的一堆废话

高人,现身吧。。。村民需要你~~~

CODE:
[Copy to clipboard]
<? 
//###########################################################
// 
// For questions and comments
// Roland (alias -=: Vlieg :=-)
// icq #78354631 
// mail: [email]vlieg@atoomnet.net[/email] 
// 
// NB: This script won't work on free hosting pages, because of the secure mode! 
// NB: You must have registered your ICQ# at [url]http://web.icq.com/sms/login/[/url] in order for this script to work
//########################################################### 


//****************************************************************\ 
//Config: 

$uin=""//your ICQ number
$passw=""//your ICQpassword

$prefix="27"//sms prefix 
$phonenumber="0000000"//sms phone number
$message "Hello!"//sms message


//****************************************************************\ 
// EN: calculate the content length

$contentlength= ( 37
strlen($uin)+ 
strlen($passw
); 

//****************************************************************\ 
// Openen van de inlogpagina 
// EN: open loginpage

$htmlreply=""
$post ="POST [url]http://web.icq.com/karma/dologin/1,,,00.html[/url] HTTP/1.0 
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* 
Referer: [url]http://web.icq.com/sms/login/1,,,00.html[/url] 
Accept-Language: nl 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) 
Host: web.icq.com 
Content-Length: "
.$contentlength.
Proxy-Connection: Keep-Alive 
Pragma: no-cache 
Cookie: uin="
.$uin."; sms_country=".$prefix."; KarmaService1=Yes; uin=".$uin."; sms_country=".$prefix."; KarmaService1=Yes 

uService=1&uLogin="
.$uin."&uPassword=".$passw."&x=0&y=0"

$remote fsockopen("web.icq.com"80, &$errno, &$errstr30); 

global 
$remote
global 
$post
fputs($remote$post); 

while (!
feof($remote)) { $htmlreply.=fgets($remote,120); } 
//UNCOMMENT FOR OUTPUT: echo "".htmlspecialchars($htmlreply).""; 
fclose($remote); 

//****************************************************************\ 
//persoonlijke cookie uit de inlogpage halen 
// EN: fetch personal cookie from login page

$splited split("n",$htmlreply); 
$cookies $splited[3]; 
$cookies str_replace("Set-Cookie: KarmaLogin=","",$cookies); 
$cookies str_replace("; path=/","",$cookies); 
$cookies str_replace("n","",$cookies); 
//UNCOMMENT VOOR OUTPUT: echo $cookies; 

if (strlen($prefix) == 2) { $contentprefix ' '.$prefix; } else { $contentprefix $prefix; } 
$charcount = (160-strlen($message)); 
$contentlength= ( 1561
strlen($message)+ 
strlen($charcount)+ 
strlen($phonenumber)+ 
strlen($prefix
); 

//****************************************************************\ 
//Verzendpagina openen met de opgehaalde cookie 
// EN: open send page with fetched cookie

$htmlreply=""
$post ='POST [url]http://web.icq.com/sms/send_history/1,,,00.html[/url] HTTP/1.0 
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* 
Referer: [url]http://web.icq.com/sms/send_session...0.html?prefix=+[/url]'
.$prefix.'&carrier=&tophone='.$phonenumber.
Accept-Language: nl 
Content-Type: multipart/form-data; boundary=---------------------------7d12442eab4 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) 
Host: web.icq.com 
Content-Length: '
.$contentlength.
Proxy-Connection: Keep-Alive 
Pragma: no-cache 
Cookie: uin='
.$uin.'; sms_country='.$prefix.'; KarmaService1=Yes; KarmaLogin='.$cookies.'; uin='.$uin.'; sms_country='.$prefix.'; KarmaService1=Yes; KarmaLogin='.$cookies.

-----------------------------7d12442eab4 
Content-Disposition: form-data; name="carrier" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="prefix" 

'
.$contentprefix.
-----------------------------7d12442eab4 
Content-Disposition: form-data; name="tophone" 

'
.$phonenumber.
-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uSession" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uReply" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uLastId" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uSend" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uNextId" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uHistoryCounter" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="count" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="uSubmitCount" 


-----------------------------7d12442eab4 
Content-Disposition: form-data; name="checkNewMsg" 

180000 
-----------------------------7d12442eab4 
Content-Disposition: form-data; name="charcount" 

'
.$charcount.
-----------------------------7d12442eab4 
Content-Disposition: form-data; name="msg" 

'
.$message.
-----------------------------7d12442eab4 
Content-Disposition: form-data; name="x" 

30 
-----------------------------7d12442eab4 
Content-Disposition: form-data; name="y" 

16 
-----------------------------7d12442eab4-- 
'


$remote fsockopen("web.icq.com"80, &$errno, &$errstr30); 

global 
$remote
global 
$post
fputs($remote$post); 

while (!
feof($remote)) { $htmlreply.=fgets($remote,120); } 
//UNCOMMENT FOR OUTPUT: echo "".htmlspecialchars($htmlreply).""; 
fclose($remote); 

//****************************************************************\ 
// check if message is send if send 'moved permanently' is returned 

if (eregi('Moved Permanently',$htmlreply)) 

echo 
"Sms message successfully sent!"
} else { 
echo 
"Sms not sent!"

?>
酱紫好看一点
昵称: 开心果  时间: 2003-12-13 16:59:00
接触过  手机上网的   短信 不知道  关注................
昵称: 蓝色地平线  时间: 2003-12-13 17:01:00


QUOTE:
最初由 蓝色地平线 发布
[B]接触过  手机上网的   短信 不知道  关注................ [/B]
关门。。。放村棍:mad:
昵称: 开心果  时间: 2003-12-13 17:08:00
我们的开发是按cmpp2.0的协议来做的,还没完,
昵称: fangjin  时间: 2003-12-13 17:14:00
移动梦网的协议?兄弟传一份给我吧。。。以后还给你更好的
昵称: 开心果  时间: 2003-12-13 17:27:00
给我也来一个,呵呵~~~~
admin@gbschool.org
昵称: bbsbiz  时间: 2003-12-13 17:30:00
NND,比我还快。。。汗

村民们,有宝贝都分大家一点萨~~~

自己吃不下中国市场,PHP火起来了大家才有“钱”图,相互帮助!!!

我刚才找到一个:http://nj.onlinedown.net/soft/19211.htm
昵称: 开心果  时间: 2003-12-13 17:34:00
http://www.ctitech.net/


里面有很多相关资料1!!

希望高手们可以研究出来,

与村民共享!
昵称: 水若寒  时间: 2003-12-13 19:48:00
强烈要求给我一份
顶!!!

哈哈 给我抢了
我接力把你那个"谢谢"给顶上去吧
昵称: yuguanglou  时间: 2003-12-13 19:57:00
谢谢楼上的,CMPP/SGIP/SMPP以及小灵通的文档我都找到了

虽然大部分都是C/JAVA编写的,但是我相信PHP做得更好

NND,下点东西还要注册,不爽。。
昵称: 开心果  时间: 2003-12-13 19:59:00
问个白菜问题。。。。
使用WEB方式的手机短信需要通过专门的设备来发送没?
信号发送后是直接发到用户的手机上吗?
发出的是模拟信号还是数字信号啊?

好菜。。。想笑的话请不要笑出声来
:{
昵称: icesniper  时间: 2003-12-13 20:09:00


QUOTE:
最初由 icesniper 发布
[B]问个白菜问题。。。。
使用WEB方式的手机短信需要通过专门的设备来发送没?
信号发送后是直接发到用户的手机上吗?
发出的是模拟信号还是数字信号啊?

好菜。。。想笑的话请不要笑出声来
:{ [/B]
你去把他们说的协议下载来看看就明白了。
如果想更明白就去看看《通信原理》里面的数学函数一陀一陀的
昵称: Roast Duck  时间: 2003-12-13 20:21:00
那个协议看了啊。。。。。
现在对我来说。。还太深奥。。。。
不过还是谢谢楼上的。。。

PS:问题才是关键。。那张图未免忒夸张。。。。
昵称: icesniper  时间: 2003-12-13 20:38:00
我的问题更菜:)

PHP还能实现发手机短信功能?从网页发到手机里吗?
昵称: 4y8  时间: 2003-12-13 21:04:00
非常直白得告诉你

PHP无所不能!丫的短信算什么,再怎么也要搞一个异步的才像话

听一个高手发话了:短信技术很简单,关键是业务方面的事情

俺不懂,学习中。。。。。。
昵称: 开心果  时间: 2003-12-14 00:58:00
厉害。
昵称: Tung  时间: 2003-12-14 01:45:00


QUOTE:
最初由 开心果 发布
[B]谢谢楼上的,CMPP/SGIP/SMPP以及小灵通的文档我都找到了

虽然大部分都是C/JAVA编写的,但是我相信PHP做得更好

NND,下点东西还要注册,不爽。。 [/B]
希望你能尽快研究出来与大家分享
昵称: 水若寒  时间: 2003-12-14 02:12:00


QUOTE:
最初由 水若寒 发布
[B]希望你能尽快研究出来与大家分享 [/B]
我倒。。。你对一个极品菜鸟还有这么高的期望

I 服了 U,自己只是学习而已。。。研究:blowzy:

泡了一下午的SP论坛,翻出来一点小虾小鱼。。。不知道有没有用

可惜我师傅hisunweb大师这几天有事情,不然大师出马100行以内绝对搞定

村子里面有网关模拟器/代码样板什么资源的,都贴出来吧。。。村花和村棍都不会忘记你的
昵称: 开心果  时间: 2003-12-14 03:15:00
水若寒~~~,差点被你水了

你不是江西金格的吗?短信的动态链接库自己都写出来了。。。到村子里面叫穷

浪费我感情的说
昵称: 开心果  时间: 2003-12-14 03:18:00
兄弟误会了,
我只是需要这个功能模块找了很多资料,
都没头绪在村子里也发过贴求助,但没结果,
我想这也是很多人都想实现的功能,
我现在又发现了"短信联盟",但具体还不知道怎么样\\
昵称: 水若寒  时间: 2003-12-14 03:25:00
人家是要钱的咚咚,有什么好求助的

SP的项目大家都作这么多年了,想知道的都是俺这种底层用户

懂行的有几个出来说两局罗,人家觉得你幼稚。。。才不会鸟你

自己动手,丰衣足食;菜鸟就是酱紫的天不怕地不怕。。。HOHOHO~~~

自我陶醉一下先
昵称: 开心果  时间: 2003-12-14 03:58:00
村子里的大虾怎么就不移步到这里看一下

然后发表一下高雅的论调呢!
\
苦了我们这些小辈
昵称: 水若寒  时间: 2003-12-14 04:05:00
我想不一定要咬定php不放松吧,

在接口方面有成熟的c/java,有现成dll和jar,开发都是很简单的说

能够用php来做应用一块的东东,就很好了
昵称: Belltree  时间: 2003-12-14 04:22:00
不知道楼顶的要干什么。
昵称: fanisky  时间: 2003-12-14 06:22:00


QUOTE:
最初由 Belltree 发布
[B]我想不一定要咬定php不放松吧,

在接口方面有成熟的c/java,有现成dll和jar,开发都是很简单的说

能够用php来做应用一块的东东,就很好了 [/B]
前辈。。。

用c/java地看见过,小辈们是想出口气撒~~

目标定下了:PHP通过CMPP/SGIP自建网关发送短信

如果能够直接调用当然最好,实在不行也要自己做COM/BEAN,再通过PHP调用。。。。

前天一个鸟人在我面前大吹特吹ASP如何如何,说和微软的COM浑然天成,PHP先天不足:flaming: ,俺当时就说了PHP照样调用COM,那鸟又问了“什么版本开始支持COM的,有点进步嘛”

火大~~~,再说现在SP确实有钱图,大家总不能都天天研究一些算法的咚咚,总得先填饱肚子吧

前辈楼下的:我想干嘛?想抢SP,做短信;村子里的村民也可以战斗力提高几百点,说话底气也足。短信比网站赚钱多了,怎么样,不行啊。。。

阿水同志,再接再厉。。。还差一个菜鸟,我们就能顶一个大大了
昵称: 开心果  时间: 2003-12-14 06:52:00
说真的。PHP做短信真的不行
昵称: 飞光  时间: 2003-12-14 13:47:00
PHP &APACHE&C++&MYSQL
昵称: Realdummy  时间: 2003-12-14 13:49:00
PHP确定可以调用COM,

但具体做法还不是很董

特别是自己写COM

再奉献一个关于短信的好地方!

http://www.duanxiaoxi.com/cgi-bin/forums.cgi?forum=1
昵称: 水若寒  时间: 2003-12-14 14:20:00
开心果

只是一点建议:
“要抢SP,做短信”,现在的SP多如牛毛,而移动的政策越来越严,我开始接触这一行的时候,讯龙的什么移动大富翁已经很火了,而我们那时候竟然可以自己找号码进行群发,但现在,就算是一些大的SP也不一定能拿到移动的群发资源,除非你和移动的关系特铁,不然被罚得很惨,什么腾讯,新浪,163啊,被罚得多了

我进入这行,开始也觉得要知道短信怎么发,图片这么发,铃声怎么发,但后来做了一些游戏应用后,觉得哪些去了解干嘛?现在是应用的东西最重要,只有应用吸引用户才能赚到钱。

和别人在技术上纠缠,不如在业务上多想想。

所以,我觉得php还是做应用比较好(我很久没用过php啦),一家之言。
昵称: Belltree  时间: 2003-12-14 14:55:00
和别人在技术上纠缠,不如在业务上多想想


楼上这句话很有道理,

但我们这些菜鸟只是想学点东西,

弄明白一些事情开发一些小东西满足自己的使用
昵称: 水若寒  时间: 2003-12-14 15:03:00
你是江西金格的?端口是不是1234?

你们做的怎么样?
昵称: Belltree  时间: 2003-12-14 15:11:00
[B]Belltree前辈[/B][/COLOR],小辈学习PHP不是为了米米,如果那样早几年就去玩JAVA了。PHP是自己得最爱,所以技术上的东西有时候会据理力争,听到前辈一番话,如沐春风,和前几天的那个高人留下的那句“关键是业务创新”有异曲同工之妙,感动感动,PFPF。。。(PP拍完了

昨天看过相关资料,如果是通过AT发送,不复杂,自己完全相信PHP能够搞定;但是现在有点迷茫,希望[B]Belltree前辈[/B][/COLOR]指点(漏点天际):

1、那几个丫的被罚了?咋整得咧。。。相关法规一直没找到

2、学一个通宵,不知道自己理解有没有错:通过PC调用AT指令发送SMS的话,应该是数据线连接PC得COM口,还有手机,通过超级终端发送AT指令发,这样一来,岂不是一套系统需要连一部手机:D,我想这是土方法。

3、好像现在都是通过网关,调用华为等厂家的网关接口,在CMPP/SGIP(丫的联通在福建萎得很,信号奇差,可能政策放宽:D)的基础上发送短信,这一块的话是如何操作的了?通过SOCKED写?还是其他方法。。。。不懂不懂,越来越好玩

早就听说[B]Belltree大叔[/B][/COLOR]德高望重,俯首甘为村子牛:D,反正都是技术论坛,不谈技术谈什么,就指点一下小辈们吧,我想村子里面希望了解PHP发送短信的人不少的说
昵称: 开心果  时间: 2003-12-14 19:34:00
南昌大众 1234 江西 914023 卓丽娅 0791-6221234 zly@netxun.com 0791-6221234 13807091234

丫的还说自己不是金格的,前辈都一针见血指出来

不多讲了,老老实实贡献点东西上来,俺就要那个调用Office接口源码。。。否则呵呵

关门。。。放村棍~~~,不出三天让你横尸村口
昵称: 开心果  时间: 2003-12-14 19:36:00
http://www.phpclasses.org/search ... h=1&x=8&y=7


phpclasses东西多,建议你们先去看看再讨论。
昵称: cocktail  时间: 2003-12-14 19:58:00
3Q~~,俺去看看先
昵称: 开心果  时间: 2003-12-14 20:01:00
俺就一个字 晕  俺晕了
昵称: binglang  时间: 2003-12-14 21:37:00
真人不露相,俺还班门弄斧,怕怕,闪先~~
昵称: 橡皮筋  时间: 2003-12-14 21:42:00
短信网关接口源代码


供大家研究!!
昵称: 水若寒  时间: 2003-12-14 22:23:00
拿k666.com的东西哄我。。。。才不上当

Office接口~~~,快说。。。你是不是封装了OWC

丫的短信不搞定。。。俺赖在村口不走了

为了本贴不被斑猪拖到水区,先贴点资料避嫌

九十年代初,AT命令仅被用于modem操作。由于没有控制移动电话文本消息的先例,因此开发了一种叫SMS Block Mode的协议,通过终端设备(TE)或电脑来完全控制SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT命令,其中包含对SMS的控制。AT命令在此基础上演化并被加入GSM 07.05标准,以及之后的GSM 07.07标准。

对SMS的控制共有三种实现途径:
•  最初的Block Mode;
•  基于AT命令的Text Mode;
•  基于AT命令的PDU Mode;
到现在,PDU已取代Block Mode,后者逐渐淡出。
什么是PDU Mode?
它是发送或接收手机SMS消息的一种方法。消息正文经过十六进制编码后进行传送。
PDU命令有哪些?
基本的PDU命令是AT+CMGR,AT+CMGL,AT+CMGS。例如读取电话上全部未读过的SMS消息,最简单的办法是用AT+CMGL=0;而用AT+CMGL=4则可读取全部SMS消息,无论已读过与否。

实例:
15:38:58 TX:AT
15:39:05 TX:AT+CPMS="ME"
15:39:05 RX:AT+CPMS="ME"
15:39:05 RX:
+CPMS: 15,15,4,10,15,15
15:39:05 RX:
OK

15:39:07 TX:AT+CMGL=0
15:39:07 RX:AT+CMGL=0
15:39:07 RX:
+CMGL: 5,0,,52

15:39:07
RX:07914408020033F40407D0B1582C0600000030525183920028D43708
2E7FD3CB633A888E2E83EE6F399B0C32CBDF6D10B96C0FCFE9617AFAED76B95C
15:39:07 RX:
OK

使用工具对上述收到的SMS进行解码后,可得到如下的解释:
IEI: 00
LENGTH: 00
MESSAGE REF: 00
STATUS: 00
SC Address length: 07
SC Address type: 91
Type of number: International
Numbering plan identifier: E.164
SC Address: 44802000334
Message Type Indicator: 04
Message Type: SMS-DELIVER / SMS-DELIVER REPORT
More Messages To Send: No
Status Report Indication: No
Reply Path: No
Originating Address Length: 07
Originating Address type: D0
Type of number: Alphanumeric
Numbering plan identifier: Unknown
Originating Address: 1B85C260
Decoded: 1111
Protocol Identifier: Default
Data Coding Scheme: GSM Default Alphabet
SC Timestamp: 00305251839200
decoded: 00/03/25 15:38:29
Time Zone: GMT+0.00H
User Data Length: 28
decimal: 40
Message: To protect the world from devastation
于是我们知道这条SMS消息的第一部分是:
07914408020033F4
07是跟在服务中心地址内的字节数;
91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用到。
44080200033F4是所使用的服务中心地址,由于位置上略有处理,实际号码应为:
44802000334F(字母F意指长度减1),这就是服务中心的准确地址(号码)。
下一单元是:

04

这是文件头字节(header byte, 是一种bitmask)。将每个字节设为1时,有如下含义:

10000000
回复路径(Reply Path):移动电话可循发送SMS消息的短消息中心进行回复(但并非所有SMSC都会这样设置)。

01000000
TP-UDH - 带有用户数据文件头

00100000
TP-Status-Report-Indication - 发送状态报告给发信人,表示消息收到

00010000
00001000
此两类在正常的移动终接短消息(MT,Mobile Terminated SMS)中不会使用。

00000100
TP-More Messages to Send - SMSC内再无新消息发送给该移动电话。

00000010
00000001
最后两个位数表示消息种类 - 10指是移动终接短消息(MT),01指移动起始短消息(MO,Mobile Originated SMS)。

所以"04"指此条消息是正常的移动终接短消息,SMSC内再无新消息发送给该手机。
昵称: 开心果  时间: 2003-12-14 22:42:00
我这里有几个java的CMPP接口的文档(我相信你们也找了),看一看应该有帮助
昵称: Belltree  时间: 2003-12-15 01:56:00
TO:开心果
1.乱群发,乱收费,客服差,技术达不到标准等
2.没搞过,不知道
3.是走socket,具体的实现请看上一个帖子中附带的CMPP文档(java的)
昵称: Belltree  时间: 2003-12-15 02:00:00
这里有一个英斯克的CMPP 1.2的jar,java的,可以反编译,看看吧
昵称: Belltree  时间: 2003-12-15 02:05:00
英斯克的例子
昵称: Belltree  时间: 2003-12-15 02:27:00
感谢。。。感动。。。

中国多一点像Belltree酱紫关爱下一代的前辈

技术积累不用5年,绝对赶超丫的印度阿三

前辈,英斯克的网关模拟器昨晚上找到了,应该是联通的SGIP

我到phpclass上找到了那个sms的类,那是通过web/e-mail发送sms的类

好像和我所期望的毫不相关,在得到前辈的指点后。。。决定从socket下手

被罚看来不怕了,福建联通是一锅稀饭,乱得很。。。有搞头

闪人,看手册先
昵称: 开心果  时间: 2003-12-15 02:49:00
吐血。。。打开看了一下下

酱紫的东西,都能搞得到。。。前辈的资历实在是深不可测

俺极品菜鸟受益匪浅,再次严重感谢一下下
昵称: 开心果  时间: 2003-12-15 02:55:00
使用WinInet编写发送短信程序

[本页面推荐在1024x768分辩率下浏览]
文章类别:移动短信技术   发表日期:2003-9-10  星期三  
   
      


--------------------------------------------------------------------------------



转自:动态网制作指南 www.knowsky.com
  如果能够使自己程序具有短信发送功能,那将会使您的程序蓬荜生辉,特别是通讯录等程序。通常在程序中发送短信有两种方式,一种是使用GSM Modem通过计算机串口编程发送短信,这种方式需要购置硬件设备,既不方便又不经济!另一种方式是通过网络发送,我们可以先在163.com等网站上注册一个用户,然后通过这些具有短信发送功能的网站发送短信。这种方式比较经济。下面本文讲述第二种的实现方式。
   
   实际上,我们的程序只要具有象浏览器那样向HTTP服务器发送数据的功能,我们就可以模拟浏览器的登陆等操作,通过程序来发送短信。我们打算使用WinInet函数来实现与HTTP服务器的通信。

   主要就两个函数,一个就是模拟浏览器的函数,另一个是发送短信的函数,其中使用了网易作为测试样例,您还可以自己添加其他短信网关。

/*****************************************************************
* 函数介绍: 执行HTTP的Post或Get方法
* 输入参数: TCHAR* hdrs       - HTTP头
            TCHAR* accept     - Accept类型
            TCHAR* Method     - POST 或 GET
            TCHAR* frmdata    - 要提交的数据
            TCHAR* ServerName - 服务器地址
            TCHAR* FormAction - 数据提交到的网页名称
* 输出参数: 无
* 返 回 值: int               - 返回操作状态(见SendSMS)
*****************************************************************/
int doHTTP(TCHAR* hdrs, TCHAR* accept, TCHAR* Method, TCHAR* frmdata, TCHAR* ServerName, TCHAR* FormAction)
{
   // 创建Internet
   HINTERNET hSession = InternetOpen("MyAgent",
                                     INTERNET_OPEN_TYPE_PRECONFIG,
                                     NULL,
                                     NULL,
                                     0);
   if (!hSession)
   {
       return 5;
   }
   // 连接服务器
   HINTERNET hConnect = InternetConnect(hSession,
                                        ServerName,
                                        INTERNET_DEFAULT_HTTP_PORT,
                                        NULL,
                                        NULL,
                                        INTERNET_SERVICE_HTTP,
                                        0,
                                        1);
   if (!hConnect)
   {
       return 2;
   }
   // 创建一个请求
   HINTERNET hRequest = HttpOpenRequest(hConnect,
                                        Method,
                                        FormAction,
                                        HTTP_VERSION,
                                        NULL,
                                        (const char**)&accept,
                                        0,
                                        1);
   if (!hRequest)
   {
       return 2;
   }
   // 发送请求
   BOOL bSendRequest = HttpSendRequest(hRequest,
                                       hdrs,
                                       strlen(hdrs),
                                       frmdata,
                                       strlen(frmdata));
   if (!bSendRequest)
   {
       return 2;
   }

////////////////////////调试用/////////////////
#ifdef _DEBUG
   int bDoLoop = 1;
   LPTSTR szReadBuffer;
   DWORD lNumberOfBytesRead;
   FILE* f1;
   szReadBuffer = (LPTSTR) malloc(500);
   ZeroMemory(szReadBuffer, 500);
   if ((f1=fopen("c:\\test.htm", "w"))!=NULL)
   {
       while(bDoLoop)
       {
           bDoLoop = InternetReadFile(hRequest, szReadBuffer, 500, &lNumberOfBytesRead);
           fseek(f1, 0L, SEEK_END);
           fwrite(szReadBuffer, sizeof(szReadBuffer), lNumberOfBytesRead, f1);
           if (lNumberOfBytesRead<500)
               bDoLoop = 0;
       }
   }
   fclose(f1);
   free(szReadBuffer);
#endif
//////////////////////////////////////////////////

   // 清除句柄
   if (hRequest)
       InternetCloseHandle(hRequest);
   if (hConnect)
       InternetCloseHandle(hConnect);
   if (hSession)
       InternetCloseHandle(hSession);

   return 0;
}

/*****************************************************************
* 函数介绍: 发送短信函数
* 输入参数: char* lpGateway  - 发送网关名称
            char* lpUserName - 发送者登陆账号
            char* lpPassword - 发送者登陆密码
            char* lpPhone    - 接收者手机号码
            char* lpContent  - 发送内容
            char* lpNickName - 发送者昵称
            char* lpExtent   - 扩展信息                                      
* 输出参数: 无
* 返 回 值: int       00     - 操作完成,结果未知
                      01     - 网关代号不存在
                      02     - 网络连接超时
                      03     - 用户中止操作
                      04     - 网关/账号/手机/短信内容空白或非法
                      05     - 出现其他错误
*****************************************************************/
SENDSMS_API int CALLAGREEMENT SendSMS(char* lpGateway,
                                        char* lpUserName,
                                      char* lpPassword,
                                      char* lpPhone,   
                                      char* lpContent,
                                      char* lpNickName,
                                      char* lpExtent
                                      )
{
    int Result;
    static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
    static TCHAR accept[] = _T("Accept: */*");
    static TCHAR frmdata[1024];

    // 登陆姓名,密码等不允许为空
    if ((strlen(lpGateway)<=0)||(strlen(lpUserName)<=0)||
          (strlen(lpPassword)<=0)||(strlen(lpPhone)<=0)||(strlen(lpContent)<=0))
        return 4;

    // 选择网易网关发送
    if (strcmp(lpGateway, "163.com")==0)
    {
        // 登录短信发送系统
        sprintf(frmdata, "username=%s&password=%s", lpUserName, lpPassword);
        Result = doHTTP(hdrs, accept, "OST", frmdata, "reg4.163.com", "/in.jsp");
        
        // 发送短信
        if (strlen(lpNickName)>0)
            sprintf(frmdata, "send=1&phone=%s&message=%s--%s", lpPhone, lpContent, lpNickName);
        else
            sprintf(frmdata, "send=1&phone=%s&message=%s", lpPhone, lpContent);
        Result = doHTTP(hdrs, accept, "OST", frmdata, "sms.163.com", "/service/sendmsg_pop.php");
        
        // 退出短信发送系统
        sprintf(frmdata, "username=%s", lpUserName);
        Result = doHTTP(hdrs, accept, "GET", frmdata, "reg4.163.com", "/Logout.jsp");

        return Result;
    }


    // 选择搜狐网关发送
    if (strcmp(lpGateway, "sohu.com")==0)
    {
        Result = 1;
        return Result;
    }

    // 网关代号不存在
    return 1;
}
昵称: 水若寒  时间: 2003-12-15 03:00:00
点对点得短消息是  手机->短信中心....路由....短信中心―>手机
网关是对应于SP的  手机->短信中心―>网关―>SP―>网关_―>短信中心―>手机
昵称: 水若寒  时间: 2003-12-15 03:14:00
看看http://www.wsms.cn

提供一个发送SMS的程序接口供调用[/url]
昵称: 水若寒  时间: 2003-12-15 03:27:00
乱讲啦,通过网关是:

用户发送短信到SP的端口,先通过用户所在地的SMC,然后SP对短信作相应的业务处理后(如天气预报信息捆绑),发送CMPP_Submit信号给ISMG互联网短消息网关,再由ISMG寻址到短信的接受方所在地的SMC,发送后返回状态,SP可通过CMPP_Query信号查询短信状态。

没见过SP还用手机发送的。还是前辈说得对,SP通过英斯克这样的网关接口,实现控制层的功能,然后自己做一点应用层的东西(捞钱的地方)。至少目前敢肯定,应用层PHP没问题。控制层PHP是否能够介入,或者说有没有必要介入,看看先。
昵称: 开心果  时间: 2003-12-15 03:28:00
实用的AT指令
  单片机和GSM引擎之间采用AT指令实现互相之间的通信,因此有必要了解一下AT指令的格式和几条常用的指令。更详细的资料可以参考GSM07.05和GSM07.07规范。
  单片机发出的AT指令用来建立通信链路,AT指令集的命令格式帧都以AT开头,下面是几个常用的AT指令。
1.设置短消息中心
AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)
2.接收短消息
+CMTI:“SM”,X   (X表示接收短消息的SIM卡存储号码)
AT+CMGR=X回车  (从X存储区读短消息)
AT+CMGD=X回车  (从X存储区删除短消息)
3.发送短消息
AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”回车
>输入短消息。Crtl+Z结束并发送。
4.重要的指令
ATZ;E 回车        Echo OFF
ATZ;E1回车       Echo ON
AT+CREG?回车  回答x(X=2脱网,X=1注册,X=0状态不明)
AT+COPS?回车 表示SIM卡是否被网络接受
昵称: 水若寒  时间: 2003-12-15 03:34:00
一、        一般命令
1、        AT+CGMI 给出模块厂商的标识。
2、        AT+CGMM 获得模块标识。这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900)。当模块有多频带时,回应可能是不同频带的结合。
3、        AT+CGMR 获得改订的软件版本。
4、        AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号。
5、        AT+CSCS 选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
6、        AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
7、        AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
8、        AT+CCID 获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
9、        AT+GCAP 获得能力表。(支持的功能)
10、        A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
11、        AT+CPOF 关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
12、        AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。
13、        AT+CPAS 返回移动设备的活动状态。
14、        AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码“+CME ERROR:<xxx>”或者“+CMS ERROR:<xxx>”代替简单的“ERROR”。
15、        AT+CKPD 小键盘控制。仿真ME小键盘执行命令。
16、        AT+CCLK 时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
17、        AT+CALA 警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
18、        AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
19、        AT+CRSL 设定或获得到来的电话铃声的声音级别。
二、        呼叫控制命令
1、        ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。
2、        ATH 挂机命令。
3、        ATA 接电话。
4、        AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
5、        AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
6、        AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
7、        ATDL 重拨上次电话号码。
8、        AT%Dn 数据终端就绪(DTR)时自动拨号。
9、        ATS0 自动应答。
10、        AT+CICB 来电信差。
11、        AT+CSNS 单一编号方案。
12、        AT+VGR,AT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
13、        AT+CMUT 麦克风静音控制。
14、        AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
15、        AT+ECHO 回音取消。
16、        AT+SIDET 侧音修正。
17、        AT+VIP 初始化声音参数。
18、        AT+DUI 用附加的用户信息拨号。
19、        AT+HUI 用附加的用户信息挂机。
20、        AT+RUI 接收附加用户信息。
三、        网络服务命令
1、        AT+CSQ 信号质量。
2、        AT+COPS 服务商选择。
3、        AT+CREG 网络注册。获得手机的注册状态。
4、        AT+WOPN 读取操作员名字。
5、        AT+CPOL 优先操作员列表。
四、        安全命令
1、        AT+CPIN 输入PIN。
2、        AT+CPIN2 输入PIN2。
3、        AT+CPINC PIN的剩余的尝试号码。
4、        AT+CLCK 设备锁。
5、        AT+CPWD 改变密码。
五、        电话簿命令
1、        AT+CPBS 选择电话簿记忆存储。
2、        AT+CPBR 读取电话簿表目。
3、        AT+CPBF 查找电话簿表目。
4、        AT+CPBW 写电话簿表目。
5、        AT+CPBP 电话簿电话查询。
6、        AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
7、        AT+CNUM 签署者号码。
8、        AT+WAIP 防止在下一次重起时初始化所有的电话簿。
9、        AT+WDCP 删除呼叫电话号码。
10、        AT+CSVM 设置语音邮件号码。
六、        短消息命令
1、        AT+CSMS 选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
2、        AT+CNMA 新信息确认应答。
3、        AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。
4、        AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。
5、        AT+CSAS 保存设置。保存+CSAS和+CSMP的参数。
6、        AT+CRES 恢复设置。
7、        AT+CSDH 显示文本方式的参数。
8、        AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。
9、        AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。
10、        AT+CMGL 列出存储的信息。
11、        AT+CMGS 发送信息。
12、        AT+CMGW 写短信息并存储。
13、        AT+CMSS 从存储器中发送信息。
14、        AT+CSMP 设置文本模式的参数。
15、        AT+CMGD 删除短信息。删除一个或多个短信息。
16、        AT+CSCA 短信服务中心地址。
17、        AT+CSCB 选择单元广播信息类型。
18、        AT+WCBM 单元广播信息标识。
19、        AT+WMSC 信息状态(是否读过、是否发送等等)修正。
20、        AT+WMGO 信息覆盖写入。
21、        AT+WUSS 不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
七、        追加服务命令
1、        AT+CCFC 呼叫继续。
2、        AT+CLCK 呼叫禁止。
3、        AT+CPWD 改变追加服务密码。
4、        AT+CCWA 呼叫等待。
5、        AT+CLIR 呼叫线确认限制。
6、        AT+CLIP 呼叫线确认陈述。
7、        AT+COLP 联络线确认陈述。
8、        AT+CAOC 费用报告。
9、        AT+CACM 累计呼叫计量。
10、        AT+CAMM 累计呼叫计量最大值。
11、        AT+CPUC 单价和货币表。
12、        AT+CHLD 呼叫相关的追加服务。
13、        AT+CLCC 列出当前的呼叫。
14、        AT+CSSN 追加服务通知。
15、        AT+CUSD 无组织的追加服务数据。
16、        AT+CCUG 关闭的用户组。
八、        数据命令
1、        AT+CBST 信差类型选择。
2、        AT+FCLASS 选择模式。这个命令把模块设置成数据或传真操作的特殊模式。
3、        AT+CR 服务报告控制。这个命令允许更为详细的服务报告。
4、        AT+CRC 划分的结果代码。这个命令在呼叫到来时允许更为详细的铃声指示。
5、        AT+ILRR 本地DTE-DCE速率报告。
6、        AT+CRLP 无线电通信线路协议参数。
7、        AT+DOPT 其他无线电通信线路参数。
8、        AT%C 数据压缩选择。
9、        AT+DS 是否允许V42二度数据压缩。
10、        AT+DR 是否报告V42二度数据压缩。
11、        AT\N 数据纠错选择。
九、        传真命令
1、        AT+FTM 传送速率。
2、        AT+FRM 接收速率
3、        AT+FTH 用HDLC协议设置传真传送速率。
4、        AT+FRH 用HDLC协议设置传真接收速率。
5、        AT+FTS 停止特定时期的传送并等待。
6、        AT+FRS 接收沉默。
十、        第二类传真命令
1、        AT+FDT 传送数据。
2、        AT+FDR 接收数据。
3、        AT+FET 传送页标点。
4、        AT+FPTS 页转换状态参数。
5、        AT+FK 终止会议。
6、        AT+FBOR 页转换字节顺序。
7、        AT+FBUF 缓冲大小报告。
8、        AT+FCQ 控制拷贝质量检验。
9、        AT+FCR 控制接收传真的能力。
10、        AT+FDIS 当前会议参数。
11、        AT+FDCC 设置DCE功能参数。
12、        AT+FLID 定义本地ID串。
13、        AT+FPHCTO 页转换超时参数。
十一、V24-V25命令
1、        AT+IPR 确定DTE速率。
2、        AT+ICF 确定DTE-DCE特征结构。
3、        AT+IFC 控制DTE-DCE本地流量。
4、        AT&C 设置DCD(数据携带检测)信号。
5、        AT&D 设置DTR(数据终端就绪)信号。
6、        AT&S 设置DST(数据设置就绪)信号。
7、        ATO 回到联机模式。
8、        ATQ 决定手机是否发送结果代码。
9、        ATV 决定DCE响应格式。
10、        ATZ 恢复为缺省设置。
11、        AT&W 保存设置。
12、        AT&T 自动测试。
13、        ATE 决定是否回显字符。
14、        AT&F 回到出厂时的设定。
15、        AT&V 显示模块设置情况。
16、        ATI 要求确认信息。这命令使GSM模块传送一行或多行特定的信息文字。
17、        AT+WMUX 数据/命令多路复用。
十二、特殊AT命令
1、        AT+CCED 电池环境描述。
2、        AT+CCED 自动RxLev指示。
3、        AT+WIND 一般指示。
4、        AT+ALEA 在ME和MSC之间的数据密码模式。
5、        AT+CRYPT 数据密码模式。
6、        AT+EXPKEY 键管理。
7、        AT+CPLMN 在PLMN上的信息。
8、        AT+ADC 模拟数字转换度量。
9、        AT+CMER 移动设备事件报告。这个命令决定是否允许在键按下时是否主动发送结果代码。
10、        AT+WLPR 读取语言偏好。
11、        AT+WLPW 写语言偏好。
12、        AT+WIOR 读取GPIO值。
13、        AT+WIOW 写GPIO值。
14、        AT+WIOM 输入/输出管理。
15、        AT+WAC 忽略命令。这个特殊命令允许忽略SMS、SS和可用的PLMN。
16、        AT+WTONE 播放旋律。
17、        AT+WDTMF 播放DTMF旋律。
18、        AT+WDWL 下载模式。
19、        AT+WVR 配置信差的声音速率。
20、        AT+WDR 配置数据速率。
21、        AT+WHWV 显示硬件的版本。
22、        AT+WDOP 显示产品的出厂日期。
23、        AT+WSVG 声音增益选择。
24、        AT+WSTR 返回指定状态的状态。
25、        AT+WSCAN 扫描。
26、        AT+WRIM 设置或返回铃声指示模式。
27、        AT+W32K 是否允许32kHz掉电方式。
28、        AT+WCDM 改变缺省旋律。
29、        AT+WSSW 显示内部软件版本。
30、        AT+WCCS 编辑或显示订制性质设置表。
31、        AT+WLCK 允许在特定的操作符上个性化ME。
32、        AT+CPHS 设置CPHS命令。
33、        AT+WBCM 电池充电管理。
34、        AT+WFM 特性管理。是否允许模块的某些特性,如带宽模式、SIM卡电压等。
35、        AT+WCFM 商业特性管理。是否允许Wavecom特殊特性。
36、        AT+WMIR 允许从当前存储的参数值创建定制的存储镜像。
37、        AT+WCDP 改变旋律的缺省播放器。
38、        AT+WMBN 设置SIM卡中的不同邮箱号码。
十三、SIM卡工具箱命令
1、        AT+STSF 配置工具箱实用程序。
2、        AT+STIN 工具箱指示。
3、        AT+STGI 获得从SIM卡发来的预期命令的信息。
4、        AT+STCR 主动提供的结果:工具箱控制反应。
5、        AT+STGR 给出响应。允许程序或用户从主菜单上选择项目,或响应某些命令。
昵称: 水若寒  时间: 2003-12-15 03:38:00
感谢[B]Belltree前辈[/B][/COLOR],代码全部看完

自己明白,彻底的明白了。。。:crying: 有一点点失望,比我想象中的要简单得多;我深深的知道,原本小辈要花几周,甚至几个月才能弄懂的东西,之所以能够在短短的6个小时里全部搞清楚,完全归功[B]Belltree前辈[/B][/COLOR]的无私教导。。。好感动的说:crying:

从理论上讲,PHP完全可以实现,但是实际中效果怎么样,需要实践检验;不过说句老实话,我更愿意BEAN封装后,用PHP去调用。。。终于理解两位前辈的话了,“技术不复杂,关键是业务创新”。继续深入学习,如果有机会实践一下,酝酿得差不多后,再发帖子阐述全部过程。

阿水同志,不管你是不是金格的,我都要告诉你;你走错路了,SP是通过连接某个SOCKET,通过向这个SOCKET写入/读取信息,来实现和运营商信息的交互。链接的开始需要SP的业务代码和密码,相当于用户名和密码,通讯的过程仅限于应用层的交流。就有点像我么们拨号上网一样,上了网,就能发送电子邮件。

我发一个[B]CMPP_Connect[/B]给移动,告诉它我要联网,移动回我一个[B]CMPP_ConnectRep[/B]告诉我可以联网,我再发一个[B]CMPP_Submit[/B]给移动告诉它我要酱紫发短信,移动说知道了[B]CMPP_SubmitRep[/B]这样对吧,并且[B]CMPP_Deliver[/B]给我一个短信白条,但是我不放心啊,钱都花了,天知道发送成功没有,于是我发了个[B]CMPP_Query[/B]给移动,问问发送的情况,移动回你一个[B]CMPP_QueryRep[/B]安慰一下你,你坐看右看看不出问题,心里想还在网上挂着不要浪费钱了我还是先下吧,于是你[B]CMPP_Terminate[/B]给移动要求断网,移动小姐还是那种吃人不吐骨头的甜蜜声音,回个[B]CMPP_TerminateRep[/B]欢迎你下次再来。移动的老大看着不爽,说你丫的敢泡我移动的MM,以后你联网不要那么��里��唆输用户名密码趁机泡小姐了,给我包时间段/包月包年,你丫的只要联网,就记下你的IP,以后让小姐认IP不认人。SP也是在玩这样的游戏。。。就这么简单。。。好失望啊,SP原来这样的不值钱。

真不知道,会有多少短信高手在下面笑俺菜:blowzy: 。。。

再次感谢[B]Belltree前辈[/B][/COLOR],回去一定好好学习,天天上网。。。
昵称: 开心果  时间: 2003-12-15 06:35:00
我也在看
在学习,
但我不能在六个小时内搞懂.
菜哪!!
还望开心果指点
昵称: 水若寒  时间: 2003-12-15 14:10:00
我将改贴置顶,希望大家对短信有更多的认识,斑竹见谅
昵称: Belltree  时间: 2003-12-15 14:21:00
标题太牛了一点~    是不是该改改~  哈哈~
昵称: lingtoss  时间: 2003-12-15 14:56:00
java的可不可以??
昵称: thog  时间: 2003-12-15 15:18:00


QUOTE:
最初由 lingtoss 发布
[B]标题太牛了一点~    是不是该改改~  哈哈~ [/B]
:blowzy: ,不吊一点。。。点击率不够,很快就要沉底了

出此下策
昵称: 开心果  时间: 2003-12-15 15:50:00
帮前辈贴出来,希望更多的人来看看,也不枉俺在村口吆喝了这么多天

mo方的主程序

CODE:
[Copy to clipboard]
import cmpp12.*;
import java.net.*;
import java.io.*;
public class testcomplexmo {

  public static void main(String[] args) {
         testcomplexmo atestprocesse=new testcomplexmo();
  }

  public testcomplexmo() {
         Socket so=null;
         OutputStream out=null;
         InputStream input=null;
         CMPP_Command command=null;
         CMPP_Seq seq=new CMPP_Seq(212);
           int error=0;
      

         try {
             so=new Socket("192.168.1.62",700);
             input=so.getInputStream();
             out=so.getOutputStream();
             command=new CMPP_Command();
                               
                        //CMPP_Connect
                        CMPP_Connect con=new CMPP_Connect(seq.getGlobalSeq(), //设置sequenceid,
                                //可不用API提供的类CMPP_Seq所提供的方法,自己输入sequenceid
                                "xlmo",//CP_ID
                                "xl",//密码
                                0); //版本号一般填0
                        error=con.write(out);//发送消息
                        System.out.println("connect.error="+error);
                        System.out.println();
                               
             boolean loop=true;

             while (loop) {


             CMPP_Command tmpCMD=command.read(input);//读消息

             switch (command.getCommandID()) {
                    //CMPP_Deliver
                    case CMPP_Command.ID_CMPP_DELIVER :
                         CMPP_Deliver deliver=(CMPP_Deliver)tmpCMD;//强制转换

                         int result=deliver.readbody();//解包

                         System.out.println("get cmpp deliver");
                         System.out.println("total_length:"+deliver.getTotalLength());
                         System.out.println("command_id:"+deliver.getCommandID());
                         System.out.println("seq:"+deliver.getSequenceId());
                         //get the information of header

                         System.out.println("msg_id0:"+deliver.getMsgId0());
                         System.out.println("msg_id1:"+deliver.getMsgId1());
                         //MsgID is the message number.
                         //it is int

                         System.out.println("destination_id:"+deliver.getDestnationId());
                         //the Destnation_id is SP MO phone number,
                         //eg. "2000"
                         // it is String

                         System.out.println("service_id:"+deliver.getServiceId());
                         //the Service_id is Service id
                         //it is String

                         System.out.println("tp_pid:"+deliver.getTP_pid());
                         //TP_pid is GSM protocal type
                         //it is int

                         System.out.println("tp_udhi:"+deliver.getTP_udhi());
                         //TP_udhi is GSM protocal type
                         //it is int

                         System.out.println("Msg_Fmt:"+deliver.getMsgFmt());
                         //Msg_Fmt - the formate of this message
                         //int

                         System.out.println("usernumber(SrcTerminalId):"+deliver.getSrcTerminalId());
                         //SrcTerminalId - the user's mobile number
                         //String

                         System.out.println("registered_deliver:"+deliver.getRegisteredDelivery());
                         //Registered_Delivery specify if this MO message is a message Response
                         //0 means not a Response message
                         //1 means is a Response message
                         //it is int

                         System.out.println("msglen:"+deliver.getMsgLength());
                         //MessageLength means the length of this message
                         //it is int

                         System.out.println("content:"+deliver.getMsgContent());
                         //MessageContent - the content of this message
                         //String

                         System.out.println("msgid_submit0:"+deliver.getMsgId_Submit0());
                         System.out.println("msgid_submit1:"+deliver.getMsgId_Submit1());
                         //MsgID_Submit is the message number. the same as MsgID
                         //it is int

                         System.out.println("cmppstat:"+deliver.getStat());
                         //Stat - Response result the meaning follows SMPP3.3 protocol
                         //String

                         System.out.println("submittime:"+deliver.getSubmitTime());
                         //YYMMDDHHMM
                         //String

                         System.out.println("donttime:"+deliver.getDoneTime());
                         //YYMMDDHHMM
                         //String

                         System.out.println("Dest_terminal_id:"+deliver.getDestnationId());
                         //Dest_terminal_id - the user's mobile number who receive the message
                         //String

                         System.out.println("smscseq:"+deliver.getSMSCSequence());
                         //the sequence number that the SMSC provides
                         //int

                    //CMPP_DeliverRep
                         CMPP_DeliverRep deliverRep=
                                         new CMPP_DeliverRep(deliver.getSequenceId(),//SequenceId
                                                            deliver.getMsgId0(),//MsgId,要求和收到的deliver一致
                                                            deliver.getMsgId1(),//MsgId,要求和收到的deliver一致
                                                            55);//Result
                                         //new CMPP_DeliverRep(deliver.getSequenceId(),
                                             //deliver.getMsgId0(),deliver.getMsgId1(),result);
                         deliverRep.write(out);//发送消息

                         System.out.println("deliver responce have send out!");
                         System.out.println();
                         System.out.println("-------------------------------");
                    break;

                    //CMPP_Terminate
                    case CMPP_Command.ID_CMPP_TERMINATE :
                        CMPP_Terminate terminate=(CMPP_Terminate)tmpCMD;//强制转换
                        System.out.println("get cmpp terminate");
                        System.out.println("total_length:"+terminate.getTotalLength());
                        System.out.println("command_id:"+terminate.getCommandID());
                        System.out.println("seq:"+terminate.getSequenceId());

                    //CMPP_TerminateRep
                         CMPP_TerminateRep terminateRep=
                                         new CMPP_TerminateRep(terminate.getSequenceId());//SequenceId
                         terminateRep.write(out);//发送消息
                         System.out.println("termination responce have send out!");
                         System.out.println();
                         System.out.println("--------------------------------");
                         loop=false;
                    break;

                    //CMPP_ActiveTest
                    case CMPP_Command.ID_CMPP_ACTIVE_TEST :
                        CMPP_ActiveTest activetest=(CMPP_ActiveTest)tmpCMD;//强制转换
                        System.out.println("get active test");
                        System.out.println("total_length:"+activetest.getTotalLength());
                        System.out.println("command_id:"+activetest.getCommandID());
                        System.out.println("seq:"+activetest.getSequenceId());

                    //CMPP_ActiveTestRep
                         CMPP_ActiveTestRep activetestRep=
                                         new CMPP_ActiveTestRep(activetest.getSequenceId());//SequenceId
                         activetestRep.write(out);//发送消息

                         System.out.println("active test responce have send out!");
                         System.out.println();
                         System.out.println("--------------------------------");


                    break;

             }
             }
         } catch (Exception e) {
                 System.out.println(e.toString());
         } finally {
                   try {
                       System.out.println("the end of motest");
                       System.in.read();
                       //it just for debug
                   } catch (Exception s) {
                           System.out.println(s.toString());
                   }
         }

  }

}
昵称: 开心果  时间: 2003-12-15 16:07:00
mt放得主程序(如果看不到,下载前辈的软件包)

CODE:
[Copy to clipboard]
import cmpp12.*;
import java.net.*;
import java.io.*;
public class testcomplexmt {

  public static void main(String[] args) {
         testcomplexmt atestprocesse=new testcomplexmt();
  }

  public testcomplexmt() {
         Socket so=null;
         OutputStream out=null;
         InputStream input=null;
         CMPP_Command command=null;
         CMPP_Seq seq=new CMPP_Seq(212);
         int error=0;

         try {
             so=new Socket("192.168.1.62",700);
             input=so.getInputStream();
             out=so.getOutputStream();
             command=new CMPP_Command();

             //int Sequenceid=110;

             //CMPP_Connect
             CMPP_Connect con=new CMPP_Connect(seq.getGlobalSeq(), //设置sequenceid,
                                                                    //可不用API提供的类CMPP_Seq所提供的方法,自己输入sequenceid
                                                  "xlmt",//CP_ID
                                                  "xl",//密码
                                                  0); //版本号一般填0
             error=con.write(out);//发送消息
             System.out.println("connect.error="+error);
             System.out.println();


             //CMPP_ConnectRep
             CMPP_Command tmpCMD=command.read(input);//读消息
             if (command.getCommandID()==CMPP_Command.ID_CMPP_CONNECT_REP) {
                CMPP_ConnectRep conr=(CMPP_ConnectRep)tmpCMD;//强制转换
                conr.readbody();//解包
                if (conr.getStatus()==0) {
                   System.out.println("connection finished, connection response is");
                   System.out.println("total_length:"+conr.getTotalLength());
                   System.out.println("command_id:"+conr.getCommandID());
                   System.out.println("seq:"+conr.getSequenceId());
                   System.out.println("status:"+conr.getStatus());
                   System.out.println("authe:"+conr.AuthenticatorISMG());
                   System.out.println("version:"+conr.Version());
                } else {
                       System.out.println("connection failed");
                       System.out.println("total_length:"+conr.getTotalLength());
                       System.out.println("command_id:"+conr.getCommandID());
                       System.out.println("seq:"+conr.getSequenceId());
                       System.out.println("status:"+conr.getStatus());
                       System.out.println("authe:"+conr.AuthenticatorISMG());
                       System.out.println("version:"+conr.Version());
                }
              }
              System.out.println();
              System.out.println("---------------------------------------");

                //CMPP_Submit
                CMPP_Submit sub=null;

/*                sub=new CMPP_Submit();
                sub.setSequence(seq);
                //set the item you want to send
                //they are not necessary
                sub.setMsgID0(1234);
                sub.setMsgID1(5678);

                sub.setPK_Total(1);
                //the total number that the messages have the same MsgID,
                //begin from 1
                sub.setPK_Number(1);
                //the sequence number that the messages have the same MsgID,
                //begin from 1
                sub.setRegistered_Delivery(0);
                //specify if you need the gateway send response state back
                //suggestion: fill in 0
                sub.setMsg_level(0);
                //the priority of this MT message
                sub.setService_id("TX");
                //set the Service id that the MT message belong to
                sub.setFee_UserType(3);
                //set Fee_UserType, it's int
                //if you fill the "setFee_terminal_id",
                //you need not fill this parameter
                //0 means charge from Dest_terminal_id
                //1 means charge from Src_terminal_id
                //2 means charge from SP
                //3 means this parameter have no effect
                sub.setFee_terminal_id("13601917444");
                //set the Mobile no. that will pay for this message
                //if you fill Fee_UserType, you need not fill this parameter
                sub.setTP_pid(0);
                //GSM protocol type
                sub.setTP_udhi(0);
                //GSM protocol type
                sub.setMsg_src("990009");
                //set the Message source(that means SP id)
                sub.setFee("01","000500");
                //set the info of Fee
                //the first parameter is Fee type
                //the second parameter is the Fee value, the unit is 'Fen'

                //sub.setTime("011083012000032+\0","011083011000032+\0");

                //the first parameter is Valid_time, the formate follows SMPP3.3 protocol
                //the second is At_time, the formate follows SMPP3.3 protocol
                //not necessary to call this function, or just fill in with NULL
                //suggestion: sub.setTime(null,null); or not call it at all
                sub.setSrc_terminal_id("13601917444");
                //set the Mobile no. that the message come from
                sub.setDest_terminal_id("13601917444");
                //set the Mobile no. that will receive this message
                //you can input multiply user that less than 100
                //eg.sub.setDest_terminal_id("138801779966,139901789999");
                sub.setContent(CMPP_Command.MSG_TYPE_ASCII,"shit world!");
                //sub.setContent(0,"shit world!");
                //set the message content
                //the first parameter(int) is the formate of the message content
                //the second parameter(String) is the content
                //Attention: if you want to send Binary formate message you cant use this function

                //sub.setBinContent();
                //use to send binary message
                //eg. byte cont = new byte[20];
                //    loadfromfiletobyte("afilename",cont);
                //     sub.setBinContent(cont);
                System.out.println("BEFORE send a submit, TOUCH the sequence:"+sub.touchSequnece());
                sub.write(out);
                System.out.println("AFTER send a submit, GET the sequence:"+sub.getSequenceId());*/

                //sub=new CMPP_Submit(seq.getGlobalSeq(),
                sub=new CMPP_Submit(
                                   1,//消息标识,前四位
                                   1,//消息标识,后四位
                                   1,//相同Msgid的消息条数,一般填1
                                   1,//相同Msgid的消息序号,一般填1
                                   1,//是否要求返回状态报告:1:要求,0不要求
                                   6,//信息类别
                                   "TXabcdefgh",//业务类型
                                   3,//计费用户类型,0:对目的终端计费,1:对源终端计费,2:对SP计费,3:表示本字段无效
                                   "13501837531",//被计费的号码
                                   0,//GSM协议类型
                                   0,//GSM协议类型
                                   15,//信息格式,0:ASCII 3:短消息写卡 4:二进制信息 8 UCS2编码 15:汉字
                                   "950000",//CP_ID
                                   "01",//资费类别
                                   "000500",//资费代码
                                   "",//存活期具体格式
                                   "",//定时发送时间"011130000000032+\0",
                                   "13501899257",//源终端号码
                                   10,//接收消息用户数量
                                   "13500000000,13500000001,13500000002,13500000003,13500000004,13500000005,13500000006,13500000007,13500000008,13500000009",//接收业务的号码
                                   "hello你好");//消息内容
                sub.setSequence(seq.getGlobalSeq());
                error=sub.write(out);//发送消息
                System.out.println("submit.error="+error);
                System.out.println("AFTER send a submit, GET the sequence:"+sub.getSequenceId());
                System.out.println();

                //CMPP_SUBMITREP
                tmpCMD=command.read(input);
                if (command.getCommandID()==CMPP_Command.ID_CMPP_SUBMIT_REP) {
                    CMPP_SubmitRep subr=(CMPP_SubmitRep)tmpCMD;//强制转换
                    subr.readbody();//解包
                    System.out.println("get a submit responce");
                    System.out.println("total_length:"+subr.getTotalLength());
                    System.out.println("command_id:"+subr.getCommandID());
                    System.out.println("seq:"+subr.getSequenceId());
                    System.out.println("msgid0:"+subr.getMsgId0());
                    System.out.println("msgid1:"+subr.getMsgId1());
                    System.out.println("result:"+subr.getResult());
                    }else{
                    System.out.println("get submit responce failed");}

                System.out.println();
                System.out.println("----------------------------------------");


                //CMPP_ActiveTest
                CMPP_ActiveTest act=null;
                act=new CMPP_ActiveTest( );
                act.setSequence(seq.getGlobalSeq());//sequenceid
                error=act.write(out);//发送消息
                System.out.println("activetest.error="+error);
                System.out.println("AFTER send a ActiveTest, GET the sequence:"+act.getSequenceId());

                //CMPP_ACTIVE_TEST_REP
                tmpCMD=command.read(input);//读消息
                if (command.getCommandID()==CMPP_Command.ID_CMPP_ACTIVE_TEST_REP) {
                    CMPP_ActiveTestRep actr=(CMPP_ActiveTestRep)tmpCMD;
                    actr.readbody();//解包
                    System.out.println("get a active responce");
                    System.out.println("total_length:"+actr.getTotalLength());
                    System.out.println("command_id:"+actr.getCommandID());
                    System.out.println("seq:"+actr.getSequenceId());
                    System.out.println("successid:"+actr.getSuccessId());
                    } else{
                    System.out.println("get active responce failed");}

                    System.out.println();
                    System.out.println("--------------------------------------");



             //CMPP_Terminate
             CMPP_Terminate ter=new CMPP_Terminate();
             seq.computeSequence();
             ter=new CMPP_Terminate(seq.getGlobalSeq());//sequenceid
             //ter.setSequence(seq.getGlobalSeq());
             //que.setSequence(seq.getGlobalSeq());
             error=ter.write(out);//发送消息
             System.out.println("terminate.error="+error);
             System.out.println("AFTER send a Terminate, GET the sequence:"+ter.getSequenceId());


             //CMPP_TerminateRep
             tmpCMD=command.read(input);//读消息
             if (command.getCommandID()==CMPP_Command.ID_CMPP_TERMINATE_REP) {
                CMPP_TerminateRep terr=(CMPP_TerminateRep)tmpCMD;//强制转换
                System.out.println("termination finished");
                System.out.println("total_length:"+terr.getTotalLength());
                System.out.println("command_id:"+terr.getCommandID());
             }

             System.out.println();
             System.out.println("------------------------------------------");

         } catch (Exception e) {
                 System.out.println(e.toString());
         } finally {
                   try {
                        System.out.println("mt is finished");
                        System.in.read();
                       //it just for debug
                   } catch (Exception s) {
                           System.out.println(s.toString());
                   }

}


         }

  }
昵称: 开心果  时间: 2003-12-15 16:09:00
另外最解释一下下(顺便骗点贴子)

CMPP是中国移动的通信协议,SGIP是中国联通的通信协议,它们都是建立在TCP/IP的基础上,小灵通的暂时不讲

这些都是CMPP1.2的,也有CMPP2.0的,据说福建开始CMPP3.0,网上已经有了3.3,不过大同小异,原理知道都一样

名词解释:

ISMG             Internet Short Message Gateway 互联网短消息网关
SMPP             Short Message Peer to Peer     短消息点对点协议
CMPP             China Mobile Peer to Peer      中国移动点对点协议
TLS               Transport Layer Security       传输层安全
SMC              Short Message Center          短消息中心

CMPP用以建立短消息中心和SP之间的通路,业务和信息的提供由SP完成。

    可以为实现移动数据增值业务提供服务,例如以下业务:
    Email通知、语音信箱通知、Internet发短消息、移动台发Email、催费通知、自动综合业务信息台(信息点播业务,主要有:天气预报、股票信息、航班信息等)。

以下以Email通知业务为例,讲述信息的流程:

      某因特网的用户向SP的Email Server发送一封Email,SP的POP3 SERVER激活过滤进程,如果该用户申请了Email通知业务,则过滤进程将用户登记的手机号码取出,将Email的标题取出,绑定在CMPP_SUBMIT消息中,发送给ISMG,

    ISMG将检查CMPP_SUBMIT消息中“接收业务的手机号码”字段,则在ISMG中查询该手机用户归属的SMC的地址,然后发送给SMC。

    ISMG得到确认消息后,将消息转换成CMPP_SUBMIT_REP,发回给SP。

    SMC收到该消息后,对该消息进行处理,发送给用户。

    SMC向ISMG回送状态报告。

    由上述流程可见,对于SP来讲,要做的工作主要集中在第二步,即在EMAIL SERVER中做一个过滤程序,实现上述功能即可。
       
    从协议上说,SP只要具备CMPP中实现的接口,就可以实现对应于控制层的功能,至于对于具体的SP功能实体,比如Email Server、Web Server等,尚需做一些应用层的工作。
昵称: 开心果  时间: 2003-12-15 16:21:00
另外(再骗点贴子),如果是一般用户可能没有SP的条件,那就用模拟器或者超级终端之类的东西自己玩,这些都可以去网上的SP论坛找。

上次俺去狼窝找GTK,这一次推荐大家去鸟巢,LOOK:http://asp.7i24.com/yjack/

看到这里,村民应该不会怪我标题太XX了吧。。。不然怎么有这么多咚咚浮出水面

PS:阿水~~~,你的那个Office接口源码。。。自己看着办吧。只感兴趣如何在web中显示那一块,其它的我自己摆平,这样总行了吧
昵称: 开心果  时间: 2003-12-15 16:33:00
你总不相信,

我都说我不是金格的

我只是看到他那里有相关的东西

下来看看

然后与大家一起分享
昵称: 水若寒  时间: 2003-12-15 17:01:00
那你什么时候一不小心,搞到那个资料后,再给我一份。。。酱紫总行了吧

(不给我,自己动手拿
昵称: 开心果  时间: 2003-12-15 17:28:00
按也要一份协议
昵称: wohugb  时间: 2003-12-15 18:22:00
添砖加瓦

术语
ATM 异步传输模式
BS 基站
BSC 基站控制器
BTS base transceiver station
CDMA 码分多路存取
CMT cellular messaging teleservice
CPT cellular paging teleservice
ERMES European Radio Messaging System
ESME external short message entities
ETSI 欧洲通信标准协会
GSM 全球移动通讯系统
HLR home location register
IN intelligent network
IP Internet protocol
LAN local-area network
MAP mobile application part
MO mobile originated
MO�SM mobile-originated short message
MSC mobile switching center
MT mobile terminated
MT�SM mobile-terminated short message
PDA personal digital assistant
POS 销售点
PP 点对点
SIM subscriber identity module
SM 短信息
SMD short message delivery
SMD�PP short message delivery�point to point
SME short messaging entity
SMS 短信息服务
SMSC 短信息服务中心
SS7 七号信令系统
STP 信令传送点
TCAP transactional capabilities application part
TDMA 时分多址
VLR visitor location register
VMN voice-mail notification
VMS voice-mail system
WAN 广域网络
WAP 无线应用协议
昵称: 开心果  时间: 2003-12-15 18:57:00
中国移动通信CMPP2.0短消息网关开发接口库(1.3)《中国移动通信CMPP2.0短消息网关开发接口库》

      本接口是用VC6.0遵循中国移动通信标准CMPP2.0协议开发的短消息网关接口,目的是简化SP接入移动短消息网关的复杂度。
      本接口对网络通信和CMPP2.0协议进行了高度封,连接过所有类型的移动网关,暂时不支持CMPPE(东软格式,但东软也支持标准CMPP).
      本接口还提供了网关的部分功能接口,可以很方便地用来开发模拟网关),接口库就提供了一个功能完整的模拟网关源码!接口包含两个示例工程,一个是客户端,通过CMPP2.0连接网关,演示了登录、MT、MO的全过程;一个就是模拟网关,可以接收用户的登录,接收MT请求,同时还可以主动批量下发MO消息。

更新历史:
2003-08-08  V1.3
1.  增加了对cmpp_recv函数的返回值CMPP_RECVTIMEOUT的说明。
2.  修改了cmpp_login_value_set()函数,去掉了一个参数。

2003-07-23  V1.22
1.增加了两个函数(cmpp_submit_sm_set_msgsrc和cmpp_submit_sm_set_srctermid),可以分别用来设置Src_Id和Msg_src。
根据移动的要求(升级后的网关),sp下发消息时,Src_Term_Id和Msg_src必须为该连接的对端的SP的服务代码和企业代码
(见《关于SP下发数据格式的规范》).

2003-07-08  V1.2
1.修正了cmpp_login_value_set函数的一个bug。

2003-06-07  V1.1
1.增加了网关接收部分的接口,同时新增了详细使用手册和模拟网关的源码,并且在真实环境中测试通过!
2003-04-25  V1.0
1.0发布。  

作者:  princetoad
Email:princetoad@tom.com
Homepage:http://gmm.nease.net

1.3版下载地址:http://gmm.nease.net/CMPP.rar
1.22版下载地址:http://skybird.9s9s.com/upload/upfile/2003723956540.rar
1.21版下载地址:http://www.csdn.net/cnshare/soft/17/17025.shtm
1.2版下载地址:http://skybird.9s9s.com/upload/upfile/2003781329230.rar
1.1版下载地址:http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=917

本接口库有偿提供源码,请到中国共享软件注册中心注册或联系作者,princetoad@tom.com。

注册地址:http://www.softreg.com.cn/shareware.asp?id=11530


同时提供中国联通SGIP1.2接口库,更多详情请访问作者主页!
下载:http://gmm.nease.net/SGIP.rar
注册地址:http://www.softreg.com.cn/shareware.asp?id=11517
昵称: 水若寒  时间: 2003-12-16 00:10:00
中国联通SGIP1.2短消息网关开发接口库(1.0)
作者:princetoad 网址:

  
总下载次数86  月下载次数20 (软件大小:497k)



  

  《中国联通SGIP1.2短消息网关开发接口库》

1.接口说明
    该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现,接口对中国联通SGIP协议进行了高度封装,目的是方便SP接入中国联通短消息网关。

2.功能特点
1)严格按照SGIP1.2协议实现,支持Bind,  BindResp,Submit,  SubmitResp,  Deliver,  DeliverResp,  Report,  ReportResp,  Unbind,  UnbindResp消息。
2)采用多线程并发处理的方式获取强大的性能,针对SGIP协议的特点,内建线程池进行消息的收发及处理操作,充分发挥系统和网络性能,再大的业务量也能够得到及时处理,丢包率小于0.01/%。
3)发送消息采用短连接的方式;接收消息采用半长连接的方式,可以设置超时时间,在没有消息的情况下,主动断开网关连接。
4)接口库经过高度封装,模块化强,使用简单,屏蔽了网关通信,消息收发和处理的复杂性操作,SP用户只需要关注具体的业务处理过程,大大简化了短消息开发的难度!
5)利用内建的线程池,可以大幅度提高SP短消息处理的速度。

3.接口使用
    该接口库以动态库的形式提供,包含以下三个文件:sgip.h,  sgip.lib,  SGIP.DLL.在动态库中导出了CSgip类,只需要调用三个函数就可以完成短消息收发的全部工作(Start,Submit,Release)。


《中国联通SGIP1.2模拟网关》

功能介绍:
1.运用线程池原理,支持大量并发连接,命令处理速度快。
2.可以主动批量下发Deliver消息,可以自定义Deliver消息的任何字段内容,以及MO消息发送的循环次数,相邻两条消息的间隔时间。
3.具有日志记录功能。
4.自定义功能强,可以自定义日志记录方式,以及屏幕输出方式。
5.目前,只支持sgip专用方式,不支持http方式。


作者:PrinceToad

Email:princetoad@tom.com

类型:有偿提供源码!

平台:Windows98/NT/2K/XP/2003.

接口库下载地址:http://gmm.nease.net/SGIP.rar

SGIPAPI接口使用说明:http://gmm.nease.net/SGIPAPI.htm
SGIP模拟网关使用说明:http://gmm.nease.net/SGIPGW.htm

(模拟网关包含在开发包内)

免费使用,无任何限制,注册用户提供源码一份!
注册地址:http://www.softreg.com.cn/shareware.asp?id=11517
或联系作者:PrinceToad@tom.com
昵称: 水若寒  时间: 2003-12-16 00:11:00
牛,居然是java的,
我还以为这里只有php的。
昵称: thog  时间: 2003-12-16 04:12:00
这么多东西实在消化不了……
昵称: huix  时间: 2003-12-16 05:02:00
有这样的勇气是可嘉的。也希望看到用php写的经得起测试(强度,速度等)的网关出来。

就我公司的开发来说,php只是用在了应用的开发上,网关部分还是由C来完成的。
昵称: i don't know  时间: 2003-12-16 13:02:00
楼主那段移动的姑娘只看IP不看人的解说实在精彩之极啊.

基本解释的很清楚了,我这个接触php不深的菜鸟也能看懂七七八八了,
不知道哪位有空能写点具体的php代码出来参考一下?

顺便把楼主的看法整理一下

用户发送短信到SP的端口,先通过用户所在地的SMC,然后SP对短信作相应的业务处理后(如天气预报信息捆绑),发送CMPP_Submit信号给ISMG互联网短消息网关,再由ISMG寻址到短信的接受方所在地的SMC,发送后返回状态,SP可通过CMPP_Query信号查询短信状态。

SP通过英斯克这样的网关接口,实现控制层的功能,然后自己做一点应用层的东西(捞钱的地方)。


形象点说


SP是通过连接某个SOCKET,通过向这个SOCKET写入/读取信息,来实现和运营商信息的交互。链接的开始需要SP的业务代码和密码,相当于用户名和密码,通讯的过程仅限于应用层的交流。就有点像我么们拨号上网一样,上了网,就能发送电子邮件。[/COLOR]

我发一个CMPP_Connect给移动,告诉它我要联网,移动回我一个CMPP_ConnectRep告诉我可以联网,我再发一个CMPP_Submit给移动告诉它我要酱紫发短信,移动说知道了CMPP_SubmitRep这样对吧,并且CMPP_Deliver给我一个短信白条,但是我不放心啊,钱都花了,天知道发送成功没有,于是我发了个CMPP_Query给移动,问问发送的情况,移动回你一个CMPP_QueryRep安慰一下你,你坐看右看看不出问题,心里想还在网上挂着不要浪费钱了我还是先下吧,于是你CMPP_Terminate给移动要求断网,移动小姐还是那种吃人不吐骨头的甜蜜声音,回个CMPP_TerminateRep欢迎你下次再来。移动的老大看着不爽,说你丫的敢泡我移动的MM,以后你联网不要那么��里��唆输用户名密码趁机泡小姐了,给我包时间段/包月包年,你丫的只要联网,就记下你的IP,以后让小姐认IP不认人。SP也是在玩这样的游戏。。。就这么简单。。。



顺带名词解释:

CMPP是中国移动的通信协议,SGIP是中国联通的通信协议,它们都是建立在TCP/IP的基础上,小灵通的暂时不讲

这些都是CMPP1.2的,也有CMPP2.0的,不过大同小异,原理知道都一样

ISMG Internet Short Message Gateway 互联网短消息网关
SMPP Short Message Peer to Peer 短消息点对点协议
CMPP China Mobile Peer to Peer 中国移动点对点协议
TLS Transport Layer Security 传输层安全
SMC Short Message Center 短消息中心



CMPP用以建立短消息中心和SP之间的通路,业务和信息的提供由SP完成。

可以为实现移动数据增值业务提供服务,例如以下业务:
Email通知、语音信箱通知、Internet发短消息、移动台发Email、催费通知、自动综合业务信息台(信息点播业务,主要有:天气预报、股票信息、航班信息等)。

以下以Email通知业务为例,讲述信息的流程:

某因特网的用户向SP的Email Server发送一封Email,SP的POP3 SERVER激活过滤进程,如果该用户申请了Email通知业务,则过滤进程将用户登记的手机号码取出,将Email的标题取出,绑定在CMPP_SUBMIT消息中,发送给ISMG,

ISMG将检查CMPP_SUBMIT消息中“接收业务的手机号码”字段,则在ISMG中查询该手机用户归属的SMC的地址,然后发送给SMC。

ISMG得到确认消息后,将消息转换成CMPP_SUBMIT_REP,发回给SP。

SMC收到该消息后,对该消息进行处理,发送给用户。

SMC向ISMG回送状态报告。

由上述流程可见,对于SP来讲,要做的工作主要集中在第二步,即在EMAIL SERVER中做一个过滤程序,实现上述功能即可。

从协议上说,SP只要具备CMPP中实现的接口,就可以实现对应于控制层的功能,至于对于具体的SP功能实体,比如Email Server、Web Server等,尚需做一些应用层的工作(捞钱捞钱~~~~~~~)。
昵称: Dalamar  时间: 2003-12-16 19:09:00
汗!这些东东从来没接触过!太感谢开心果和水~以及超级斑竹贡献出来的宝贝了,我要学习你们的可贵的精神;,我去看这些资料了。哈哈
昵称: chengxin119  时间: 2003-12-17 00:44:00
http://www.montnets.com/dxpt/info_1.htm
梦网短信网关

梦网短信网关 
※短信网关概述
    短信网关是由深圳梦网公司专业开发的, 为企事业单位内部系统发送短信而提供的一个动态数据短信发送
软件。网关具有开放的接口,可以与各种系统和软件进行无缝高效相连,将系统中随时产生的动态信息转变成
手机短信进行实时发送,为各种系统(或软件)建立一个快速的短信发送通道。
※短信网关分类
 (一)短信网关在发送短信方面分为两种方式
 1. 有线网关:即直接通过互联网方式与梦网短信平台相连,通过梦网短信平台的端口通道或无线通道发送
   短信。
 2. 本地无线网关:即在本地系统上连接手机或无线Gsm Moden 进行短信发送
 (二)梦网短信网关按与系统软件的接口方式分为两种:
 1. 网关软件方式
   ⑴数据库连接方式
   ⑵TCP/IP方式
   ⑶串口传输方式
 2.DLL函数调用方式
※具体叙述如下:
 (一)有线网关  
    基于各行业的短信需求。深圳梦网公司联合中国移动各中国联公司共同建了大型的梦网短信平台,该平台
与中国移动和中国联通网络的SMS中心采用高速专线相连。同时通过互联网与众多的企事业单位系统相连,各
单位系统信息通过互联网送到中国移动和中国联通的网络进行发送。图示如下:   

    有线短信网关将企事业单位的内部管理(业务)系统与梦网短信平台通过互联网方式实现了动态的联接,
从而使单位内部数据可以用最快最廉价的短信方式发送到接收目标手中。例如:银行对欠款客户自动催费。学
校对学生家长进行信息通报。酒店对客户提供问侯,企业对用户实时发送商情等。
    有线网关最大的优点是发送速度快(可达5000条/分钟),瞬间发送,大面积接收,实时性强,不会堵塞拥挤
通道,但它要求信息内容严格遵守中国移动和中国联通的信息管理条例,因而在接入审查和资格认证方面严格

    收费方面
    ①信息责任押金5000元(可退),接入费5000元, 平台维护费360元/年.
    ②短信息费用0.1元/条,一次性购买短信充值卡1000元以上可免平台维护费用。  
    ③短信充值卡购买每次不得低于200元,优惠条件为一次性购买3000元-10000元之间者赠送10%,1万元以上
      赠送20%。
 (二) 无线网关
    无线网关是指通过使用梦网无线短信网关软件系统, 直接由电脑连接手机或无线Gsm Moden进行短信发送的
方式。图示如下:

    使用无线网关最大的好处是不需要连接互联网,因而不会受到网络上安全威胁,具有完全的独立性,不足
的地方是发送速度和容量方面比有线网关要慢和小。按照正常GSM网无线短信发送速度每通道可发送短信
700~1000条。因此根据容量的要求无线短信网关分2口~34口不等。
昵称: 水若寒  时间: 2003-12-17 03:08:00
无线网关是指通过使用梦网无线短信网关软件系统, 直接由电脑连接手机或无线Gsm Moden进行短信发送的
方式。图示如下:
昵称: 水若寒  时间: 2003-12-17 03:09:00
汗。。。阿水还没有缓过劲来

如果要这么玩,自己到修手机那里买一个数据线,一端接PC的COM口,一端接手机

调用AT指令,你自己爱怎么玩就怎么玩。。。
昵称: 开心果  时间: 2003-12-17 06:30:00
其实我现在也不想搞太深入,

因为急用,

我必须以最快的方法能够令我的系统可以发短信
昵称: 水若寒  时间: 2003-12-17 13:32:00
http://www.gmcc.net/others/spjr.html
昵称: Realdummy  时间: 2003-12-17 15:11:00
昵称: ibet  时间: 2003-12-17 19:04:00


QUOTE:
最初由 水若寒 发布
[B]其实我现在也不想搞太深入,

因为急用,

我必须以最快的方法能够令我的系统可以发短信 [/B]
不早讲,自己做SP要投入大量的人力物力,加上给运营商领导做的“售后服务”,累。。。

你还是考虑借助别人的借口发送短信,这样比较实用;自己只需要POST过去信息,剩下的事情让他们去做吧;或者你去买一个数据线,连上PC的COM口,调用“超级终端”程序,我保证你能发送短信,熟悉了再自己编写AT指令集。

[B]Belltree前辈[/B][/COLOR],网关接口的编写,以及调用已基本成型,但是小辈还有很多使用上的疑虑:

1、如果做成接口,实现系统的自动发送,则无可避免要在接口中如CMPP_connect中包含SP的业务号码+认证密码,那岂不是成了第二个ASP调用ACCESS数据包,心慌慌。。。如果是固定IP的认证,那在该服务器上架一个代理服务器,晕,连密码都不要直接调用资源。

2、投入使用估计应该是两种方式:
    A、用户发送短信息到SP商的业务代码,SP商捆绑相关服务数据后,系统触发回发信息给用户/用户指定的目标。
    B、用户通过互联网(SP提供的相关无线增值业务如企业短信平台),与SP商联系,SP商代为发送短信。
    那这样一来,用户认证很是心慌,流量攻击尚且不怕,大不了网站管几天。盗用短信资源后,群发数以万记的短信息,买单的是谁了?:crying:
    本来打算限制发送量,一个单位每天100条基本上不可能^_^,但是总还心虚,不知道实际运用中是如何解决以上的问题,前辈用空的时候看看吧。

    另外,需要解释一下本贴针对的是短信平台,而不是讨论用某种语言实现,当然我们更愿意大家用PHP解决。事实上,手机平台作为新兴的一个无线业务,有着与互联网极其类似的特点,大家很可能有不了多久都会开始手机平台的后台服务,连JAVA都提供J2ME的项目,所以大家值得关注相关的动态,这片贴子劳师动众说了这么多废话,也只是想让更多的人了解相关细节。如果是仅仅为了发布所谓的代码,没有任何讨论的意义,稍微熟悉一点PHP的人,看了前辈提供的资源以及分析,我想,调用短信网关接口不出20行PHP代码即能搞定。希望更多的村民了解相关的信息,前辈用心良苦,很照顾我们小辈的说。
昵称: 开心果  时间: 2003-12-17 21:05:00
太感谢了~
是个好好帖啊
昵称: annan98  时间: 2003-12-17 21:23:00
我做了快一年的短信了.不过只用PHP来开发业务.
网关还是别人用JAVA开发的.还没有听过用PHP来开发网关的
昵称: Ayu  时间: 2003-12-17 22:07:00
晕晕!!没有短信网关!!开发什么啊!!什么语言也搞不了!!
昵称: hanliu  时间: 2003-12-17 22:10:00
我需要一些短信应用的小程序

有经验的,请与我联系。。。

Q:6733583
M:dechg@mail.my8998.net
昵称: dechg  时间: 2003-12-17 22:30:00
开心果,我实在看不懂你说的是什么,:(,除了上下行平衡的短信,其他的下行都是要收费的,收0.05-0.08元不等。

实际上需要控制用户每日(或一段时间内)发送短信的数量,原因是SP很难知道用户手机里还有没有钱,在用户发了一定量后,需要重新验证
昵称: Belltree  时间: 2003-12-18 00:03:00
汗。。。邮箱爆满

前辈,有些东西版聊不方便,可否QQ俺一下,俺不经常Q的,保证以后不会“信”骚扰

21960039
昵称: 开心果  时间: 2003-12-18 00:10:00
给大家一个网页,也许有用
http://zekiller.skytech.org/smssend.php
昵称: coolhome  时间: 2003-12-18 12:33:00
我有应用环境以及条件
但是缺一些小巧的应用程序
哪位有兴趣
与我联系

dechg@mail.my8998.net
昵称: dechg  时间: 2003-12-18 14:36:00
可以调用 网易呀  TOM的网关进行发送嘛~~
笔者调试  网易网关成功。
不知大家有没有免费的短消息网关~
昵称: shelly0577  时间: 2004-02-22 15:26:00


QUOTE:
最初由 shelly0577 发布
[B]可以调用 网易呀  TOM的网关进行发送嘛~~
笔者调试  网易网关成功。
不知大家有没有免费的短消息网关~ [/B]
可以说说怎样用吗?我正好需要,可引隐藏发送过程吗?
昵称: timwhoung  时间: 2004-02-22 16:24:00
php 可以组装彩信
彩信组装协议要比短信简单的多
昵称: 活靶子  时间: 2004-02-22 17:35:00
回复一下以便收藏
昵称: wamper  时间: 2004-02-22 22:16:00


QUOTE:
最初由 wamper 发布
[B]回复一下以便收藏 [/B]
:blowzy: ,兄弟们

给偶留点面子吧,这个垃圾贴[B]不要再顶了[/B][/COLOR],丢人啊

感兴趣的自己用C写好网关,定义为PHP的扩展库

编译成DLL,就可以直接用PHP调用了,如何编译手册上都有写
昵称: 开心果  时间: 2004-02-22 22:31:00


QUOTE:
最初由 timwhoung 发布
[B]可以说说怎样用吗?我正好需要,可引隐藏发送过程吗? [/B]
可以隐藏发送过程的。

事实上你看看网上的那个短消息发送类,就不难改出来了
昵称: shelly0577  时间: 2004-02-23 00:33:00
我把程序放网上,做测试用。
不好的地方,就是,需要在网易收费网关注册。如果大家有免费网关,可以通知我,以便在些基础上添加更多的网关。
http://shelly.3322.org/temp/sms/
PS:测试链接我只放两三天,有需要的可以同我联系。
昵称: shelly0577  时间: 2004-02-23 01:08:00


QUOTE:
最初由 shelly0577 发布
[B]可以隐藏发送过程的。

事实上你看看网上的那个短消息发送类,就不难改出来了 [/B]
哪一个类啊,老大?
昵称: timwhoung  时间: 2004-02-23 01:31:00


QUOTE:
最初由 shelly0577 发布
[B]我把程序放网上,做测试用。
不好的地方,就是,需要在网易收费网关注册。如果大家有免费网关,可以通知我,以便在些基础上添加更多的网关。
http://shelly.3322.org/temp/sms/
PS:测试链接我只放两三天,有需要的可以同我联系。 [/B]
可否把这个程序提供一下?我很需要,我想很多村民也想要的!
昵称: 水若寒  时间: 2004-02-23 02:43:00
贡献出来了~ /
http://www.phpx.com/happy/showthread.php?s=&threadid=58508

顶一下哦~
昵称: shelly0577  时间: 2004-02-23 09:25:00
谢谢
昵称: 水若寒  时间: 2004-02-23 11:39:00
哈,我学php只为了应用,哈,用php编写手机短信程序,也是同样,只是用sp的短信接口作应用程序,我编写了手机交友和短信联盟,并且有不少的大客户。哈以下是用我的程序作的交友和短信联盟
http://www.easymy.net
http://www.sn77.com
http://www.fjsms.com
http://www.6465.com
http://www.51meng.com
http://sms.51meng.com


还有其他几个客户和几个正在为客户做的程序!

哈,我只是用sp给的短信通道作的接口。
方式一是用http协议,再就是用socket方式,来和sp传递参数和交互。

我对php只是会应用,但学的不深,没有办法,为了赚钱生活吧!

如果大家对我的程序感兴趣 ,可以联系我!QQ:8268058
昵称: gemei  时间: 2004-02-29 00:30:00
如果我是sp,跟移动签协议,移动会给我网关接口么。
昵称: 随渊  时间: 2004-03-25 11:29:00
楼主:记得我以前刚来时候发一个帖子,说了个进来被你骂了一通
昵称: 『残风』  时间: 2004-03-25 11:53:00
。。。:blowzy: 应该不算骂吧,除了大师其他人你随便CALL,JUST LIKE:“地主,小样你给我进来~~!”“关门,放KE”。。。

况且本贴缘由前面说得很清楚地说,对村民因该多少有所帮助。。。SO  %^*&*(^*^*((())666,就是酱紫啦

(又水一贴)
昵称: 开心果  时间: 2004-03-27 14:24:00


QUOTE:
最初由 开心果 发布
[B]:blowzy: ,兄弟们

[B]给偶留点面子吧,这个垃圾贴不要再顶了[/B][/COLOR],丢人啊

感兴趣的自己用C写好网关,定义为PHP的扩展库

编译成DLL,就可以直接用PHP调用了,如何编译手册上都有写 [/B]
看了前面的一些关键的帖子
呵呵 终于明白开心这些话的意思了
哈哈
看到为技术发狂->迷失方向->然后掉入空洞
是不是啊 果子
昵称: yuguanglou  时间: 2004-03-27 14:48:00
搂主,能否谈谈铃声图片,怎样才能将铃声图片转换成代码?手机铃声图片转换工具有吗?
昵称: sh131  时间: 2004-04-08 10:35:00


QUOTE:
最初由 开心果 发布
[B]:blowzy: ,兄弟们

给偶留点面子吧,这个垃圾贴[B]不要再顶了[/B][/COLOR],丢人啊

感兴趣的自己用C写好网关,定义为PHP的扩展库

编译成DLL,就可以直接用PHP调用了,如何编译手册上都有写 [/B]
请问如何编译成PHP的扩展库?

我在手册上找不到相关的信息,

请指点?!
昵称: 水若寒  时间: 2004-04-08 17:15:00
谁知道如何将手机铃声图片转换为二进制,
昵称: sh131  时间: 2004-04-08 18:11:00
楼主,谈谈铃声图片嘛
昵称: sh131  时间: 2004-04-10 09:58:00
up!!!!!!!!!!!111
昵称: foxmx  时间: 2004-05-23 10:36:00


QUOTE:
最初由 开心果 发布
[B]感谢[B]Belltree前辈[/B][/COLOR],代码全部看完

自己明白,彻底的明白了。。。:crying: 有一点点失望,比我想象中的要简单得多;我深深的知道,原本小辈要花几周,甚至几个月才能弄懂的东西,之所以能够在短短的6个小时里全部搞清楚,完全归功[B]Belltree前辈[/B][/COLOR]的无私教导。。。好感动的说:crying:

从理论上讲,PHP完全可以实现,但是实际中效果怎么样,需要实践检验;不过说句老实话,我更愿意BEAN封装后,用PHP去调用。。。终于理解两位前辈的话了,“技术不复杂,关键是业务创新”。继续深入学习,如果有机会实践一下,酝酿得差不多后,再发帖子阐述全部过程。

阿水同志,不管你是不是金格的,我都要告诉你;你走错路了,SP是通过连接某个SOCKET,通过向这个SOCKET写入/读取信息,来实现和运营商信息的交互。链接的开始需要SP的业务代码和密码,相当于用户名和密码,通讯的过程仅限于应用层的交流。就有点像我么们拨号上网一样,上了网,就能发送电子邮件。

我发一个[B]CMPP_Connect[/B]给移动,告诉它我要联网,移动回我一个[B]CMPP_ConnectRep[/B]告诉我可以联网,我再发一个[B]CMPP_Submit[/B]给移动告诉它我要酱紫发短信,移动说知道了[B]CMPP_SubmitRep[/B]这样对吧,并且[B]CMPP_Deliver[/B]给我一个短信白条,但是我不放心啊,钱都花了,天知道发送成功没有,于是我发了个[B]CMPP_Query[/B]给移动,问问发送的情况,移动回你一个[B]CMPP_QueryRep[/B]安慰一下你,你坐看右看看不出问题,心里想还在网上挂着不要浪费钱了我还是先下吧,于是你[B]CMPP_Terminate[/B]给移动要求断网,移动小姐还是那种吃人不吐骨头的甜蜜声音,回个[B]CMPP_TerminateRep[/B]欢迎你下次再来。移动的老大看着不爽,说你丫的敢泡我移动的MM,以后你联网不要那么��里��唆输用户名密码趁机泡小姐了,给我包时间段/包月包年,你丫的只要联网,就记下你的IP,以后让小姐认IP不认人。SP也是在玩这样的游戏。。。就这么简单。。。好失望啊,SP原来这样的不值钱。

真不知道,会有多少短信高手在下面笑俺菜:blowzy: 。。。

再次感谢[B]Belltree前辈[/B][/COLOR],回去一定好好学习,天天上网。。。 [/B]
果果不去写本N小时学会做SP真是可惜的说。。。

有这么详细的文档,真是难得:)虽然说只要公司交钱给移动,移动给个文档你不成问题,可是必竟对于偶等以技术为先的村里兄弟来说还是不容易呀。。。
昵称: s_seraph  时间: 2004-05-23 11:02:00
给SP发信息不难..

但是真正的应用要考虑的还会更多些..USC2编码, WideCharToMultipleByte转换..

相应手机中发送图片、铃声的编码规则。。。。。。。。。

问题多多。。
昵称: 帅的像人渣  时间: 2004-05-23 11:11:00
还有感兴趣的,参考下面这里,比较丰富

http://www.knowsky.com/more.asp?typeid=22

PS:本文标题。。。历史原因、说来话长,不再解释(此处删除一万字) :blowzy:
今后再有WHO效仿,横尸街头、满门叉烧,概不负责~

――开心果友情封帖
2004年5月20日

如有其他IDEA,请自行开新贴,多谢噻~
昵称: 开心果  时间: 2004-07-09 19:48:00
用PHP做短信开发
http://troyoo.com/article/04/05/17/112906.shtml
昵称: chengxin119  时间: 2004-07-09 20:01:00
-_-!! 想不到我也进了sp这个行业了
昵称: Roast Duck  时间: 2004-07-09 21:14:00
我们的开发是用c语言和按cmpp2.0的协议来做的
通过移动协议网关来通讯
昵称: chillming  时间: 2004-07-25 18:25:00


QUOTE:
最初由 开心果 发布
[B]还有感兴趣的,参考下面这里,比较丰富

http://www.knowsky.com/more.asp?typeid=22

PS:本文标题。。。历史原因、说来话长,不再解释(此处删除一万字) :blowzy:
今后再有WHO效仿,横尸街头、满门叉烧,概不负责~

――开心果友情封帖
2004年5月20日

如有其他IDEA,请自行开新贴,多谢噻~ [/B]
:rolleyes: 叉烧

我喜欢:cool:
昵称: 剑枫  时间: 2004-07-25 19:32:00
www.spforum.com里有移动的其他协议
搞短信的可以去看看啊
昵称: Dardan  时间: 2004-08-06 17:48:00
我进来了。
昵称: pswdf  时间: 2004-08-06 18:12:00
有人没人做过长短信,用SMPP协议开发
昵称: mackey  时间: 2009-01-12 01:22:00
http://www.520fit.com        最好的减肥药

http://www.333fang.com       G2000男装和G2000女装

http://www.88gedi.com        哥弟女装官方网站
昵称: leiyu998  时间: 2011-11-26 23:02:31