`
悠悠白鼠
  • 浏览: 14659 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

短信开发(华为软件包)

阅读更多

说明:

 

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[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();

 }

 

 // 测试方法

 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics