pcdbqllorr 发表于 2016-6-6 07:51:27

短信开发(华为软件包)

  
  说明:
  
  1. 利用华为提供的jar包(smproxy(20040730).jar)进行开发。
  
  2. 根据华为提供的“短消息代理(CMPP20 SMProxy)使用说明书.doc”文档说明。
  
  
  
  对于当前通常的开发,即需上行,也需下行。
  
  所以首先必须继承 SMProxy的抽象类,对其进行封装代码如下:
  
  
  
  /**
  * 说明:这个类关键是继承SMproxy,然后才可以接收短信。
  *       触发onDeliver事件。
  * 时间:2008-12-16
  */
  
  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;
  for (int i = 0; i < telList.size(); i++) {
  dest_Terminal_Id = 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();
  }
  
  // 测试方法
  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://download.csdn.net/source/878588
  
  cmpp2.0模拟器:http://download.csdn.net/source/878567
  
  
  
  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fjfdszj/archive/2008/12/18/3549811.aspx
页: [1]
查看完整版本: 短信开发(华为软件包)