如何在asp网站上实现手机短信功能?

chouchy 2007-07-08 04:29:22
现在有移动提供的短信接口参数,象这样:

网关IP地址:101.102.103.104
企业号码:9123456
接入码:01234
用户名:111111
密码:111111
上行端口:7910
下行端口:7890

请问如果利用这些参数实现网站发送手机短信的功能?是不是要自己开发接口实现CMPP协议?如何通过socket登陆到短信网关?
之前没有做过类似的接口,请做过的朋友指点一下思路,或者提供个例子,非常感谢!

顶者有分!谢谢关注!


...全文
2213 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
shan__le 2010-04-27
  • 打赏
  • 举报
回复
是那里提供的?晕死,他们一般有一个客户端,安装在服务器上,然后自己在自己的服务器上建立一个数据库,将数据插入到你本地数据库,利用客户端直接发送到他们网上的提供地址的数据库中,他们会发送的,问他们要客户端,移动电信联通都有。
netcea 2007-08-03
  • 打赏
  • 举报
回复
现在很多相关的公司提供网站的接口,也特别简单。我是用的 www.tosms.cn 这个网站提供的,还可以,速度很快。并且支持移动、联通、小灵通、网通。
chouchy 2007-07-12
  • 打赏
  • 举报
回复
rotApple(烂苹果) ,谢谢!
rotApple 2007-07-12
  • 打赏
  • 举报
回复
请用C++写一个封装的DLL,写一个很简单,为的是SOCKET发送.
REGSVR32后再用SERVER.CREATEOBJECT来发送.

如CMPP的CONNECT消息,参数为你的用户名和密码,当然地址是要他们提供的:
void Ccmpp_API::CmppConnect(const char *UserName, const char *PWD)
{
char netbuf[100];
CMPP_CONNECT *bufer;
bufer=(CMPP_CONNECT*)netbuf;
memset(bufer, 0, 100);
bufer->nTotalLength = htonl(39);//CMPP_CONNECT消息总长度
bufer->nCommandId = htonl(CMPP_CONNECT_tag);//消息标志
//自动产生SeqId号
if (sequenceid == 123456789i32)
{
sequenceid = 1;
}else{
sequenceid++;
}
bufer->nSeqId = htonl(sequenceid);

int MD5Len;
MD5_CTX md5;//MD5源字串
CTime TimeData = CTime::GetCurrentTime();
CString timestamp = TimeData.Format("%m%d%H%M%S");
unsigned char md5source[29];
int Len1 = strlen(UserName);
int Len2 = strlen(PWD);
MD5Len = Len1 + 9 +Len2 + timestamp.GetLength();
memset(md5source, 0, MD5Len);

memcpy(bufer->sSourceAddr, UserName, Len1);
memcpy(md5source, UserName, Len1);

for (int j = 0; j<Len2; j++)
{
md5source[j + Len1 + 9] = PWD[j];
}
for (int i=0;i<timestamp.GetLength();i++)
{
md5source[i + Len2 + Len1 + 9]=timestamp[i];
}

//进行md5加密转换
md5.MD5Update(md5source, MD5Len);
md5.MD5Final(md5source);
memcpy(bufer->sAuthSource, md5source, 29);
bufer->cVersion = 0x30;
bufer->nTimeStamp = htonl(atoi(timestamp));
CmppSocket.Send(bufer, 39, 0);//把消息打包发送
return;
}
chouchy 2007-07-12
  • 打赏
  • 举报
回复
谢谢xocom(福大) ,他们没有提供文档.
chouchy 2007-07-12
  • 打赏
  • 举报
回复
我以前所在的公司用java实现了,参考了该源代码,对实现过程清楚,但不知道怎么用M$语言去实现.

再顶顶!
alexlee002 2007-07-11
  • 打赏
  • 举报
回复
移动提供的网关IP和上行端口是干什么的?
------------------------------------------
无论上行和下行, 都是移动做server, 你做client,
上行也是, 你去连接移动的上行端口, 建立一个socket长连接, 或者不停的建立短连接来接受上行


用.net可以方便实现吗?随便问问.关注中
---------------------------------------
可以
chouchy 2007-07-11
  • 打赏
  • 举报
回复
因为我只管数据上行,所以我觉得不用“你要开一个端口监听上行信息啊”


“一点都不高深, 过段时间有空, 我把我的通用平台(支持四大运营商)放到网上让下载(可以提供部分源代码, 完整源代码恕不提供^_^)”
==========================================
看来 alexlee002(什么都不会ing) 对短信这块很有研究,
能否写段支持移动的样例代码在这里?非常感谢~
紫气东来_999 2007-07-11
  • 打赏
  • 举报
回复
另外本地开发需要SP申请,他们会给文档

下面有参考代码

<title>HTTP开发接口测试页面</title>
<style type="text/css">
<!--
.style1 {font-size: 12px}
.style2 {color: #FF0000}
-->
</style>
<div align="center">短信易HTTP开发接口测试页面</div>
<form action="Sendsms.asp" method="post" name="f_Send" id="f_Send">
<div align="center">
<table width="52%" border="1" cellpadding="3" cellspacing="0">
<tr>
<td height="24" colspan="2" align="left" valign="middle" class="style1">
<span class="style2">Sendsms.asp (发送短信) </span></td>
</tr>
<tr>
<td height="29" align="right" valign="middle" class="style1">企业代码</td>
<td align="left" valign="middle" class="style1"><input value="3251751800 " name="sFinCode" type="text" id="sFinCode"

size="18" maxlength="16"></td>
</tr>
<tr>
<td height="27" align="right" valign="middle" class="style1">密码</td>
<td align="left" valign="middle" class="style1"><input value="rxfrxf" name="sRnd" type="text" id="sRnd" size="10"

maxlength="10"></td>
</tr>

<tr>
<td height="25" align="right" valign="middle" class="style1">企业手机号码</td>
<td align="left" valign="middle" class="style1"><input name="sDestTermID" type="text" id="sDestTermID" size="30"

maxlength="30"></td>
</tr>
<tr>
<td height="25" align="right" valign="middle" class="style1">企业手机子号码</td>
<td align="left" valign="middle" class="style1"><input name="sSubNumber" type="text" id="sSubNumber" size="30"

maxlength="30"></td>
</tr>
<tr>
<td height="25" align="right" valign="middle" class="style1">定时发送时间</td>
<td align="left" valign="middle" class="style1"><input name="sSendTime" type="text" id="sSendTime" size="20"

maxlength="20">
(时间格式:2006-01-01 12:00:00)</td>
</tr>
<tr>
<td width="20%" height="39" align="right" valign="middle" class="style1">内容</td>
<td width="80%" align="left" valign="middle" class="style1"><textarea name="sMsgContent" cols="30" rows="6"

id="sMsgContent"></textarea></td>
</tr>
<tr align="center">
<td height="38" colspan="2" valign="middle" class="style1"><input type="submit" name="Submit" value="提交"></td>
</tr>
</table>
</div>
</form>

Sendsms.asp

<%
'Option Explicit
Dim objHttpRequest'XML文档对象


'根据参数,生成调用URL,因为是测试例子,不对变量为空的情况做处理
URL = "http://219.238.239.179:8008/webservice/etoneservice.asmx?sFinCode="&request("sFinCode")&"&sRnd="&request("sRnd")

&"&sSubNumber="&request("sSubNumber")&"&sDestTermID="&request("sDestTermID")&"&sSendTime="&request("sSendTime")

&"&sMsgContent="&Server.URLEncode(request("sMsgContent"))


'调用MSXML,发送请求
set objHttpRequest = CreateObject("MSXML2.ServerXMLHTTP" )

if objHttpRequest is Nothing Then
'返回错误
response.write "create Msxl2.ServerXMLHTTP error"
response.end
end if


'发出请求
objHttpRequest.open "GET",URL,False
objHttpRequest.send()
if objHttpRequest.status <> 200 then
'返回错误
response.write "Open Request Error"
response.end
end if

'取返回信息,并且分析
retMsg = objHttpRequest.responseText

Ret = left(retMsg,InStr(retMsg,",")-1)
iRet = Cint(Ret)

if Ret>0 then '判断是否发送成功
SendID = right(retMsg,len(retMsg)-InStr(retMsg,","))
response.write "发送短信成功,SmsID:"&SendID
else
response.write "发送短信失败,错误代码:"&iRet
end if

'释放资源
Set objHttpRequest = Nothing


%>



xml格式定义:
<?xml version="1.0" encoding="utf-8" ?>
<SmsStateReport>
<ErrorNumber></ErrorNumber>
<ErrorDescription></ErrorDescription>
<SendReport>
<SuccessNum></SuccessNum>
<SendFaildNum></SendFaildNum>
<MoneyRemain></MoneyRemain>
</SendReport>
</SmsStateReport>
紫气东来_999 2007-07-11
  • 打赏
  • 举报
回复
最简单的方法:
调用网上的短信web service ,新浪,SOHU记得都有,网上搜索一下,这个方法优点是没有其它成本,但是你的短信服务器必须一直在网上才行。
alexlee002 2007-07-11
  • 打赏
  • 举报
回复
呵呵,不用谢我

把分给我就行^_^
alexlee002 2007-07-11
  • 打赏
  • 举报
回复
我建议你还是用.net或者其他语言比如c++, java等, 写一个简单的网关, 用于接收mo, 状态报告, 下发mt等,
比较简单的实现, 就像楼上说的, 把上行插入数据库, 然后你的asp程序去扫描这个表,把返回的下行插入下行表, 你的网关去扫描看看有没有下行需要发送,

用.net/java实现socket链接比较容易,你建立一个链接之后, 先发送一个登录包,如果收到成功响应, 那么这个链接就建立了, 你用一个后台线程, 每隔几秒发一个test包来维持这个链接就可以
chouchy 2007-07-11
  • 打赏
  • 举报
回复
问题就在怎么编socket的程序,可以在asp中调用。

移动提供了网关IP和端口,用户名/密码等参数,他们应该在该服务器上有应用侦听该端口,我的想法是先以合法的sp身份通过socket登陆到该网关服务器,然后再发送CMPP格式消息,我只确保消息发送到了短信网关上就可以.

解析或组包CMPP消息看了CMPP协议,已经了解。

非常感谢alexlee002(什么都不会ing)~多次回复这个问题。

不知道我的想法是否正确?又怎么通过socket登陆到短信网关?
请回帖,再次感谢!


alexlee002 2007-07-11
  • 打赏
  • 举报
回复
能否写段支持移动的样例代码在这里?非常感谢~
-----------------------------------------------
协议解析不难, 因为都是字节流解析的,
比如你把从socket里读取到的数据, 都放到一个 byte数组里边,
然后就按照cmpp协议, 从这个byte数组里边取出你需要的数据,
举个例子, 比如(仅仅是举例, 我手头没有cmpp协议, 我也记不清楚了)
按照协议, deliverRequest里边, 第10到21个字节, 是用户手机号(SrctermID),那么

byte[] mobuffer;
// read bytes from socket into mobuffer;
......
byte[] srctermidByte;
System.arraycopy(mobuffer, 10, srctermidByte, 0, 11);
String srctermid = new String(srctermidByte);
System.out.println("用户的手机号:"+srctermid);
ltt1987 2007-07-11
  • 打赏
  • 举报
回复
帮你顶!
chouchy 2007-07-10
  • 打赏
  • 举报
回复
“比较高效的, 应该使用内存队列”
---以前所在公司是用java实现了,做了一个短信收发的service,参考了该实现的java代码,不知道怎么改写为M$的在ASP中使用,同时我也不打算做一个单独的服务,我想知道如何直接把消息发送到ISMG,其他的需求暂时没有。

“计费考虑: 1,如何区分每个合作伙伴的收入;2,如何区分每个业务的收入”
---项目是移动内部使用,没有合作伙伴,发送信息不计费。
chouchy 2007-07-10
  • 打赏
  • 举报
回复
“楼上几位大哥都已经说得很清楚了,所谓ASP短信网站,ASP只是读读写写数据库而已,具体短信端口监听还是得靠应用程序实现”

---不是只是读写数据库而已。

“一般移动是有DLL提供的,你问过没有吗?”

---问过了,没有其他的内容提供,他们提供的接口就这几个参数。


再顶!
sanpizi 2007-07-10
  • 打赏
  • 举报
回复
帮顶

高深中ing...

等科技发达后,没这么复杂,我也整个放网上!
deninghe 2007-07-10
  • 打赏
  • 举报
回复
再顶顶!
deninghe 2007-07-10
  • 打赏
  • 举报
回复
再顶!
加载更多回复(42)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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