工作中短信,wappush,彩信的总结短信 wappush短信

2009-08-11 10:43

短信下行(发送短信):

依据CMPP2.0 协议,采用huawei的短信接口

SMProxy myProxy= new SMProxy(this,args);

Args args = new Cfg("SMProxy.xml",false).getArgs("ismg");

args.set("source-addr",loginName.getText().trim());

args.set("shared-secret",loginPass.getText().trim());

args.set("shared-secret",loginPass.getText().trim());

CMPPSubmitMessage submitMsg =

new CMPPSubmitMessage(

int pk_Total, //

int pk_Number, // pk_Number 相同msg_Id的消息序号

int registered_Delivery, // registered_Delivery 是否要求返回状态报告

int msg_Level, // msg_Level 信息级别

String service_Id, // service_Id 业务类型

int fee_UserType, // fee_UserType 计费用户类型字段

String fee_Terminal_Id, // fee_Terminal_Id 被计费用户的号码

int tp_Pid, // tp_Pid GSM协议类型

int tp_Udhi, // tp_Udhi GSM协议类型

int msg_Fmt, // msg_Fmt 消息格式

String msg_Src, // msg_Src 消息内容来源

String fee_Type, // fee_Type 资费类别

String fee_Code, // fee_Code 资费代码(以分为单位)

Date valid_Time, // valid_Time 存活有效期

Date at_Time, // at_Time 定时发送时间

String src_Terminal_Id, // src_Terminal_Id 源号码

String[] dest_Terminal_Id, // dest_Terminal_Id 接收短信的MSISDN号码

byte[] msg_Content, // msg_Content 消息内容

String reserve // LinkID 点播业务使用的LinkID

) ;

System.out.println("Send Msg=["+ submitMsg.toString()+"]n");

CMPPSubmitRepMessage submitRepMsg = myProxy.send(submitMsg);

//查询SMProxy与ISMG的TCP连接状态

String stateDesc = myProxy.getConnState();

System.out.println("Rep Msg= ["+stateDesc.toString()+"]n");

//退出

myProxy.close()

短信上行(接收短信)

//extends SMProxy 继承com.huawei.smproxy.SMProxy类 覆盖onDeliver方法

public CMPPMessage onDeliver(CMPPDeliverMessage msg) {

byte msgId[] = msg.getMsgId();

String revertMessage=null;

try {

System.out.println("msg is " + new String(msg.getMsgContent(), "ISO-10646-UCS-2"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

//来源手机号

msg.getSrcterminalId();

……

}

注意事项

CMPP2.0协议规定ICP与网关之间保持长连接,并且API可自动提供重连机制,所以在对接口函数的调用时应注意只需在程序启动时调用InitInterface()、及Login_R();无需在自己程序的其它线程中再次调用,而导致登陆多个接口。

CMPP协议中的目的地址最多可输入100个,在调用SubmitAExEx 时应注意sDestAddrs的定义为21*100字节的数组,每个号码固定的长度21个字节,不足21位的应赋空(十六进制0)。没有特殊情况,请尽量不要使用多目的地址发送。

短信长度应填写短信的实际字节长度,不应每次都填写短信的最大字节长度140。

调用SubmitAExEx后API会自动等待应答消息,并将应答消息的MsgID通过指针回传。MsgID应注意是一个22位的字符串。10位时间戳+7位的网关代码+5位的序列号。

通过调用GetDeliverExExEx可以将状态报告的MsgID解析出来,可通过此MsgID与调用SubmitAExEx得到的MsgID进行匹配。此API可同时支持SMPP协议、CMPP协议、SGMP协议、应注意其端口号的区别:这些端口号是在登录infoX信息平台的时的端口号。 登录短消息中心时端口号不同。

协议类型 dwCodeProtocol 端口号

SMPP 3 5018

CMPP 5 7890

SMGP 6 7118

如果利用华为的API,SP可以自动配置握手间隔时间,SP和infoX相连应采用长连接,但是infoX信息平台一般在50秒如果没有收到握手消息时就会断掉和SP的接口。建议SP在程序中对接口的断连写详细的日志,以便查看。

关于重发机制。如果SP开发的程序使用重发机制,建议重发的间隔最好设为5分钟之后,

重发次数不要超过5次。具体需要重发的消息也要根据错误码来决定,对于特定的错误码

(比如接口断连,应答超时,SCP应答超时)才采用重发机制,而对于一些错误码(如

SCP鉴权失败,用户不存在)则不要重发,以免造成不必要的网络负担。

SMProxy.xml

<?xml version="1.0" encoding="GB2312"?>

<!-- SM Proxy 配置文件-->

<config>

<!--与ISMG(Internet Short Message Gateway)建立连接所需参数-->

<ismg>

<!-- ISMG主机地址 -->

<host>10.76.148.147</host>

<!-- ISMG主机端口号 -->

<port>7890</port>

<!-- 心跳信息发送间隔时间(单位:秒) -->

<heartbeat-interval>60</heartbeat-interval>

<!-- 连接中断时重连间隔时间(单位:秒)-->

<reconnect-interval>60</reconnect-interval>

<!-- 需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)-->

<heartbeat-noresponseout>5</heartbeat-noresponseout>

<!-- 操作超时时间(单位:秒) -->

<transaction-timeout>10</transaction-timeout>

<!--SP…ID(最大为六位字符)-->

<source-addr></source-addr>

<!--双方协商的版本号(大于0,小于256)-->

<version>33</version>

<!--shared-secret由中国移动与ICP事先商定-->

<shared-secret></shared-secret>

<!--是否属于调试状态,true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出-->

<debug>true</debug>

</ismg>

</config>

说明:

1. 利用华为提供的jar包(smproxy(20040730).jar)进行开发。

2. 根据华为提供的“短消息代理(CMPP20 SMProxy)使用说明书.doc”文档说明。

对于当前通常的开发,即需上行,也需下行。

所以首先必须继承 SMProxy的抽象类,对其进行封装代码如下:

/**

* 说明:这个类关键是继承SMproxy,然后才可以接收短信。

* 触发onDeliver事件。

*/

import com.huawei.insa2.util.Args;

import com.huawei.smproxy.SMProxy;

import com.huawei.insa2.comm.cmpp.message.*;

import com.ibatis.common.logging.Log;

import com.ibatis.common.logging.LogFactory;

public class SMProxyRec extends SMProxy {

private static Log log = LogFactory.getLog(SMProxyRec.class);

private SMProxySendFacadeImpl demo;

public SMProxyRec(SMProxySendFacadeImpl demo,Args args)

{

super(args);

this.demo = null;

this.demo = demo;

}

public CMPPMessage onDeliver(CMPPDeliverMessage msg)

{

log.debug("启动SMProxyRec接收短信");

demo.ProcessRecvDeliverMsg(msg);

return super.onDeliver(msg);

}

public void OnTerminate()

{

demo.Terminate();

}

}

然后,就可应用该类,进行短信的接收和发送的事件重写。

/**

* 说明:网关短信处理主类。

* 接收

* ProcessRecvDeliverMsg(CMPPMessage msg)接收短信

* 发送

* SendMessage(SmsBean sms) 仅处理短信的发送

* 时间:2008-12-16

*

*/

//基本类的方法导入

import java.io.*;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List; //华为软件包

import com.huawei.insa2.comm.cmpp.message.*;

import com.huawei.insa2.util.*; //日志

import com.ibatis.common.logging.Log;

import com.ibatis.common.logging.LogFactory; //数据库操作包

import net.trust.IbatisDaoTools.BaseSqlMapDAO;

public class SMProxySendFacadeImpl {

// 从xml中读取配置信息

private static Args argsconn; // 读取连接信息

private static Args argssumbit; // 读取提交信息

// 基本提交信息参数说明

private static int pk_Total = 1;

private static int pk_Number = 1;

private static int registered_Delivery = 1;

private static int msg_Level = 1;

private static String service_Id = "";

private static int fee_UserType = 2;

private static String fee_Terminal_Id = "";

private static int tp_Pid = 0;

private static int tp_Udhi = 0;

private static int msg_Fmt = 15;

private static String msg_Src = "";

private static String fee_Type = "02";

private static String fee_Code = "000";

private static Date valid_Time = null;

private static Date at_Time = null;

private static String src_Terminal_Id = "";

private static String[] dest_Terminal_Id = { "" };

private static byte[] msg_Content = null;

private static String reserve = "";

/** 短信收发接口 */

public static SMProxyRec myProxy = null;

// 数据库操作类

public BaseSqlMapDAO baseSqlMapDAO;

// 日志记录

private static Log log = LogFactory.getLog(SMProxySendFacadeImpl.class);

// 基本参数设置

private void ProBaseConf() {

try {

log.debug("初始化连接信息");

// 连接配置信息

argsconn = new Cfg("Smproxy.xml", false).getArgs("CMPPConnect");

// 初始化短信收发接口

myProxy = new SMProxyRec(this, argsconn);

// 提交参数设置

argssumbit = new Cfg("Smproxy.xml", false)

.getArgs("CMPPSubmitMessage");

pk_Total = argssumbit.get("pk_Total", 1);

pk_Number = argssumbit.get("pk_Number", 1);

registered_Delivery = argssumbit.get("registered_Delivery", 1);

msg_Level = argssumbit.get("msg_Level", 1);

service_Id = argssumbit.get("service_Id", "");

fee_UserType = argssumbit.get("fee_UserType", 2);

fee_Terminal_Id = argssumbit

.get("fee_Terminal_Id", "");

tp_Pid = argssumbit.get("tp_Pid", 1);

tp_Udhi = argssumbit.get("tp_Udhi", 1);

msg_Fmt = argssumbit.get("msg_Fmt", 15);

msg_Src = argssumbit.get("msg_Src", "");

fee_Type = argssumbit.get("fee_Type", "02");

fee_Code = argssumbit.get("fee_Code", "000");

src_Terminal_Id = argssumbit

.get("src_Terminal_Id", "");

reserve = argssumbit.get("reserve", "");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 构造方法

*/

public SMProxySendFacadeImpl() {

// 处理基本的配置信息

ProBaseConf();

}

/**

* 华为短信发送类处理(公用类)

*

* @param 短信类,包括手机号,内容,序号

*/

public int SendMessage(SmsBean sms) {

// 返回结果

int result = 0;

// 发送内容

try {

msg_Content = sms.getSmsContent().getBytes("GBK");

} catch (UnsupportedEncodingException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

// 发送号码

ArrayList telList = sms.getMobileNoList();

dest_Terminal_Id = new String[telList.size()];

for (int i = 0; i < telList.size(); i++) {

dest_Terminal_Id[i] = telList.get(i).toString();

}

// 存活有效期

valid_Time = new Date(System.currentTimeMillis() + (long) 0xa4cb800); // new

// Date();//

// 定时发送时间

at_Time = null;// new Date(System.currentTimeMillis() + (long)

// 0xa4cb800); //new Date();

// 用户手机上显示为短消息的主叫号码

// src_Terminal_Id=src_Terminal_Id+"001";

// 初始化提交信息

CMPPSubmitMessage submitMsg = new CMPPSubmitMessage(pk_Total,

pk_Number, registered_Delivery, msg_Level, service_Id,

fee_UserType, fee_Terminal_Id, tp_Pid, tp_Udhi, msg_Fmt,

msg_Src, fee_Type, fee_Code, valid_Time, at_Time,

src_Terminal_Id, dest_Terminal_Id, msg_Content, reserve);

try {

CMPPSubmitRepMessage submitRepMsg = (CMPPSubmitRepMessage) myProxy

.send(submitMsg);

if (submitRepMsg.getResult() == 0) {

result = 1;

log.debug("发送短信成功msgid:" + submitRepMsg.getMsgId().toString()

+ "t SequenceId:" + submitRepMsg.getSequenceId());

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result;

}

/**

* 对于MyProxy分发短信的接收

* 接收短信后的处理,现在的情况是通过网关方式处理。编码是utf-8

* @param msg

*/

public void ProcessRecvDeliverMsg(CMPPMessage msg) {

CMPPDeliverMessage deliverMsg = (CMPPDeliverMessage) msg;

if (deliverMsg.getRegisteredDeliver() == 0)

try {

// 编码方式

if (deliverMsg.getMsgFmt() == 8) {

log.debug("deliverMsg.getMsgFmt() == 8");

log.debug(String.valueOf(String.valueOf((new StringBuffer(

"接收消息: 主叫号码=")).append(";内容=").append(

new String(deliverMsg.getMsgContent(),

"UTF-16BE")))));

}

// 编码方式GBK

else {

log.debug(String.valueOf(String.valueOf((new StringBuffer(

"接收消息: 主叫号码=")).append(

deliverMsg.getSrcterminalId()).append(";内容=")

.append(new String(deliverMsg.getMsgContent())))));

}

} catch (Exception e) {

e.printStackTrace();

}

else

{

log.debug(String.valueOf(String.valueOf((new StringBuffer(

"收到状态报告消息: stat="))

.append(new String(deliverMsg.getStat())).append(

"dest_termID=").append(

new String(deliverMsg.getDestTerminalId())).append(

";destterm=").append(

new String(deliverMsg.getDestnationId())).append(

";serviceid=").append(

new String(deliverMsg.getServiceId())).append(

";tppid=").append(deliverMsg.getTpPid()).append(

";tpudhi=").append(deliverMsg.getTpUdhi()).append(

";msgfmt").append(deliverMsg.getMsgFmt()).append(

//";内容").append(new String(deliverMsg.getMsgContent())).append(

";srctermid=").append(

new String(deliverMsg.getSrcterminalId())).append(

";deliver=").append(

deliverMsg.getRegisteredDeliver()))));

}

}

/**

* 终端结束程序

*/

public void Terminate() {

log.debug("SMC下发终断消息");

myProxy.close();

myProxy = null;

}

/**

* 关闭连接

*/

public void Close() {

// 查询SMProxy与ISMG的TCP连接状态

String stateDesc = myProxy.getConnState();

log.debug("数据连接状态:" + stateDesc);

// 退出

myProxy.close();

}

// 测试方法

工作中短信,wappush,彩信的总结(短信) wappush短信
public static void main(String[] args) {

}

}

该类写完毕后,用户就可调用该类中的SendMessage(SmsBean sms)方法进行发送短信。

短信的接收,是自动触发的用户不必别外写事件。只要有连上服务器,就可以了。

附:Smproxy.xml网关配置文件:

<?xml version="1.0" encoding="GB2312"?>

<!-- SM Proxy 配置文件-->

<config>

<!--与ISMG(Internet Short Message Gateway)建立连接所需参数-->

<CMPPConnect>

<!-- ISMG主机地址 -->

<host></host>

<!-- ISMG主机端口号:行业网关地址8855 -->

<port>8855</port>

<!-- 心跳信息发送间隔时间(单位:秒) -->

<heartbeat-interval>10</heartbeat-interval>

<!-- 连接中断时重连间隔时间(单位:秒)-->

<reconnect-interval>10</reconnect-interval>

<!-- 需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)-->

<heartbeat-noresponseout>5</heartbeat-noresponseout>

<!-- 操作超时时间(单位:秒) -->

<transaction-timeout>10</transaction-timeout>

<!--SP…ID(最大为六位字符) 移动提供的用户名-->

<source-addr></source-addr>

<!--双方协商的版本号(大于0,小于256),

其值的计算方法为:主版本号*16+副版本号 例如:版本1.2的值为0x12-->

<version>18</version>

<!--shared-secret由中国移动与ICP事先商定,移动提供的用户名-->

<shared-secret></shared-secret>

<!--是否属于调试状态,true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出-->

<debug>true</debug>

</CMPPConnect>

<!--与ISMG(Internet Short Message Gateway)提交短信所需的配置-->

<CMPPSubmitMessage>

<!--相同Msg_id消息的总条数,目前只能为1-->

<pk_Total>1</pk_Total>

<!--相同Msg_id的消息序号,目前只能为1-->

<pk_Number>1</pk_Number>

<!--是否需要状态报告,0:不需要,1:需要,2:产生SMS话单-->

<registered_Delivery>1</registered_Delivery>

<!--信息类别-->

<msg_Level>1</msg_Level>

<!--业务类型,应与Infox对应-->

<service_Id></service_Id>

<!--计费用户类型, 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段-->

<fee_UserType>2</fee_UserType>

<!--计费终端-->

<fee_Terminal_Id></fee_Terminal_Id>

<!--GSM协议类型-->

<tp_Pid>0</tp_Pid>

<!--GSM协议类型-->

<tp_Udhi>0</tp_Udhi>

<!--编码GBK-->

<msg_Fmt>15</msg_Fmt>

<!--信息内容来源,对应于登录Infox的帐号,移动提供的用户名-->

<msg_Src></msg_Src>

<!--资费类别,“短消息类型”为“发送”,对“计费用户号码”不计信息费,此类话单仅用于核减SP对称的信道费

01计费用户号免费。02按条计费信息费。03对“计费用户号码”按包月收取信息费 04:对“计费用户号码”的信息费封顶 05:对“计费用户号码”的收费是由SP实现-->

<fee_Type>02</fee_Type>

<!--资费代码,以分为单位-->

<fee_Code>000</fee_Code>

<!--存活有效期(单位:分钟)-->

<valid_Time/>

<!--定时发送时间-->

<at_Time/>

<!--源终端MSISDN号码(为SP的服务代码或前缀, 为服务代码的长号码, 网关将该号码完整的填到SMPP协议相应的destination_address字段,

该号码最终在用户手机上显示为短消息的主叫号码) (没有可以为空),短信接入号-->

<src_Terminal_Id></src_Terminal_Id>

<!--接收业务的MSISDN号码,即被叫号码-->

<dest_Terminal_Id/>

<!--消息内容-->

<msg_Content/>

<!-- 保留-->

<reserve/>

</CMPPSubmitMessage>

</config>

注:现在对敏感觉的字段隐藏,用户可用模拟器,设置相关网关,端口,用户名,密码,网关接入号等信息。这样就不受环境约束。

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/85009.html

更多阅读

怎么样处理烦人的垃圾短信 手机垃圾短信过滤软件

怎么样处理烦人的垃圾短信——简介短信诈骗、短信促销、短信广告相信大家都遇到过,例如:“你中了某某某节目大奖。。。需要缴纳XXX税”、“XXXX大型促销活动”、“XXX什么保险”想必大家有时候一天都能接到几十条类似的短信,那么针对这

转载 有关硕士论文查重的总结:使用paperpass和知网的心得!

原文地址:有关硕士论文查重的总结:使用paperpass和知网的心得!作者:蚂蚁酷9月30日上交了论文查重,今天晚些时候年级通知我们,结果出来了,没有公布相似的比例,但通过了。这算是过了论文的第一关了,略微松了一口气,回想之前改论文的痛苦过程,觉得

转载 哈佛医学院半年Juniorattendingdoctor的总结演讲 attending to

原文地址:哈佛医学院半年Juniorattendingdoctor的总结演讲作者:嘟嘟今天早上,本来是泌尿肿瘤中心的多学科大查房,由于6月16日的一个会议,今天临时改成xxxxx的演讲,是他即将结束在MGH的住院医生与juniorattendingdoctor的生涯,所作的一个总

声明:《工作中短信,wappush,彩信的总结短信 wappush短信》为网友腹肌凘裂锗分享!如侵犯到您的合法权益请联系我们删除