www.pudn.com > WapUtils.zip > WapUtils.java


 
package com.newpalm.sms.utils; 
 
 
import java.io.*; 
 
import com.newpalm.sms.business.common.ServiceFee; 
import java.util.ArrayList; 
import com.newpalm.sms.spmaster.CorbaConnectionContainer; 
import spmaster.ISpMaster; 
import com.newpalm.sms.Sms; 
import java.util.Date; 
 
 
/** 
 * 完整的一套Wap发送支撑公用类! 
 * 彩信 wapPush,的特点是: 
 *     包括两部分 ;1: 主题 2:一个超文本链接地址 
 *  注意点: 
 *     用这个工具包,在传递主题时请采用ISo8859-1编码; 
*   还有写日志的方法! 
 * 
 * 

Copyright: Copyright (c) 2000 - 2001 Newpalm (China) Information Technology * Co., Ltd. All Rights Reserved. * * This SOURCE CODE FILE, which has been provided by Newpalm as part * of an Newpalm product for use ONLY by licensed users of the product, * includes CONFIDENTIAL and PROPRIETARY information of Newpalm. * * USE OF THIS SOFTWARE IS GOVERNED BY THE TERMS AND CONDITIONS * OF THE LICENSE STATEMENT AND LIMITED WARRANTY FURNISHED WITH * THE PRODUCT. * * IN PARTICULAR, YOU WILL INDEMNIFY AND HOLD Newpalm, ITS RELATED * COMPANIES AND ITS SUPPLIERS, HARMLESS FROM AND AGAINST ANY CLAIMS * OR LIABILITIES ARISING OUT OF THE USE, REPRODUCTION, OR DISTRIBUTION * OF YOUR PROGRAMS, INCLUDING ANY CLAIMS OR LIABILITIES ARISING OUT OF * OR RESULTING FROM THE USE, MODIFICATION, OR DISTRIBUTION OF PROGRAMS * OR FILES CREATED FROM, BASED ON, AND/OR DERIVED FROM THIS SOURCE * CODE FILE.

*

Company: newpalm

* @author zhupengfei * @version 1.0 */ public class WapUtils { private static byte[] multihead = { //length=12 (byte) 0x0B, (byte) 0x05, (byte) 0x04, (byte) 0x0B, (byte) 0x84, (byte) 0x23, (byte) 0xF0, (byte) 0x00, (byte) 0x03, (byte) 0x14, (byte) 0x00, (byte) 0x00 //wdp headers }; private static byte[] singlehead = { //length=7 (byte) 0x06, (byte) 0x05, (byte) 0x04, (byte) 0x0b, (byte) 0x84, (byte) 0x23, (byte) 0xf0, //wdp headers }; private static byte[] head = {//length=17 (byte) 0x72, (byte) 0x06, (byte) 0x0a, (byte) 0x03, (byte) 0xae, (byte) 0x81, (byte) 0xea, (byte) 0xaf, (byte) 0x82, (byte) 0x8d, (byte) 0xae, (byte) 159, //这里是url长度 //(byte) 0x0, //这里是url长度 (byte) 0x87, (byte) 0x01, (byte) 0x05, (byte) 0x6a, (byte) 0x00 //这里是title长度 }; private static byte[] urlhead = {//length=5 (byte) 0x00, (byte) 0x45, (byte) 0xc6, (byte) 0x0c, (byte) 0x03 }; /** * //length=7 */ private static byte[] tail = { (byte) 0x00, (byte) 0x08, (byte) 0x01, (byte) 0x83, (byte) 0x00, (byte) 0x01, (byte) 0x01 }; /** * 合并数据流;加上头尾信息! * @param hint String * @param urlstr String * @return byte[] */ private static byte[] generationDate ( String hint, String urlstr) { byte[] rst =combineToStream( hint , urlstr ) ; if ( rst.length + 7 <= 140 ) { //单条是否足够 //单条OK byte[] tempbytes = rst ; rst = new byte[ rst.length + 7 ] ; for ( int i = 0 ; i < singlehead.length ; i++ ) { rst[ i ] = singlehead[ i ] ; } for ( int i = 0 ; i < tempbytes.length ; i++ ) { rst[ i + 7 ] = tempbytes[ i ] ; } } else { //多条 multihead[ 9 ] = ( byte ) ( Math.random () * 1000 % 255 ) ; byte[] tempbytes = rst ; rst = new byte[ 140 ] ; //构造长度=140的数组 for ( int i = 0 ; i < multihead.length ; i++ ) { rst[ i ] = multihead[ i ] ; } rst[ 10 ] = 2 ; rst[ 11 ] = 1 ; for ( int i = 0 ; i < 128 ; i++ ) { rst[ i + 12 ] = tempbytes[ i ] ; } rst = new byte[ tempbytes.length - 128 + 12 ] ; for ( int i = 0 ; i < multihead.length ; i++ ) { rst[ i ] = multihead[ i ] ; } rst[ 10 ] = 2 ; rst[ 11 ] = 2 ; for ( int i = 0 ; i < tempbytes.length - 128 ; i++ ) { rst[ i + 12 ] = tempbytes[ i + 128 ] ; } } return rst ; } /** * * @param title String * @param url String * @return byte[] */ public static byte[] combineToStream(String title, String url) { try{ int title_len; //标题长度 int url_len; //url长度 int total_len; //结果长度 byte[] title_bytes; //标题byte流 byte[] url_bytes; //url byte流 if ( title==null|| url==null) return null ; String validTitle = new String ( ( new String(title.getBytes("ISO8859_1") ,"Gb2312")).getBytes("UTF8"), "ISO8859_1") ; String validUrl = new String ( ( new String(url.getBytes("ISO8859_1") ,"Gb2312")).getBytes("UTF8"), "ISO8859_1") ; //ISO-8859-1 title_bytes = validTitle.getBytes("ISO8859_1"); url_bytes = validUrl.getBytes("ISO8859_1"); title_len = title_bytes.length; url_len = url_bytes.length; total_len = title_len + url_len + 29;//计算总长度 byte[] result_bytes = new byte[total_len];//根据总长度构造结果流 int i = 0; //头部17 bytes 赴值 for (i = 0; i < 17; i++) { result_bytes[i] = head[i]; } //给特殊位置赴url长度 result_bytes[11] += (byte) (url_len+1); //标题长度 result_bytes[16] = (byte) (title_len+1); //标题赴值 for (int j = 0; j < title_len; j++) { result_bytes[i + j] = title_bytes[j]; } i += title_len;//指针后移 //urlheader 5 bytes赴值 for (int j = 0; j < 5; j++) { result_bytes[i++] = urlhead[j]; } //url 赴值 for (int j = 0; j < url_len; j++) { result_bytes[i + j] = url_bytes[j]; } i += url_len; //尾部 for (int j = 0; j < 7; j++) { result_bytes[i++] = tail[j]; } return result_bytes; } catch (Exception e){ return null; } } // convert gb to unicode public static String npgb2utf(String npgb) { try { String outputstr = new String(npgb.getBytes("UTF8"), "ISO8859_1"); return outputstr; } catch (Exception e) { e.printStackTrace(System.out); return null; } } public static void addMMSMessage( String hint, String urlstr, String phone_num , String feephone_num , ServiceFee serid , String srcTermianlID, ArrayList arrsubmitmsg ) { addMMSMessage( hint, urlstr, phone_num , feephone_num , serid , srcTermianlID, 1, arrsubmitmsg ); } /** * * @param hint String * @param urlstr String * @param phone_num String * @param feephone_num String * @param serid ServiceFee * @param srcTermianlID String * @param arrsubmitmsg ArrayList */ public static void addMMSMessage( String hint, String urlstr, String phone_num , String feephone_num , ServiceFee serid , String srcTermianlID, int tp_pid , ArrayList arrsubmitmsg ) { //SmsUtils. addMMSMessage( hint,urlstr, phone_num , feephone_num , serid ,srcTermianlID, Sms.PUSH_SP_CODE, Sms.PUSH_SP_PASSWORD, tp_pid, arrsubmitmsg) ; } public static void addMMSMessage( String hint, String urlstr, String phone_num , String feephone_num , ServiceFee serid , String srcTermianlID, String spCode , String spPassword , int tp_pid , ArrayList arrsubmitmsg ) { byte[] date = generationDate( hint, urlstr); addBinaryMessage( date, phone_num , feephone_num , serid ,srcTermianlID, spCode , spPassword , tp_pid , arrsubmitmsg) ; } public static void addBinaryMessage( byte[] messages , String phone_num , String feephone_num , ServiceFee serid , String spNo, String spCode , String spPassword , int tp_pid , ArrayList arrsubmitmsg ) { spmaster.SubmitMsgSp2 onesubmitmsg = null ; onesubmitmsg = new spmaster.SubmitMsgSp2 () ; onesubmitmsg.sp_code = spCode; onesubmitmsg.sp_password = spPassword; onesubmitmsg.msg_id = 10101010; onesubmitmsg.pk_total = 1; onesubmitmsg.pk_number = 1; onesubmitmsg.registered_delivery = 0; onesubmitmsg.msg_level = 1; onesubmitmsg.fee_usertype = 3; onesubmitmsg.fee_terminal_id = phone_num; onesubmitmsg.tp_pid = tp_pid; // 默认为一; 49 可以不显示的 onesubmitmsg.tp_udhi = 1; onesubmitmsg.msg_fmt = 4; if ( spNo==null ||spNo =="") onesubmitmsg.msg_src = "1010" ; else onesubmitmsg.msg_src = spNo ; onesubmitmsg.fee_type = "1"; onesubmitmsg.fee_code = "0"; onesubmitmsg.valid_time = ""; onesubmitmsg.at_time = ""; onesubmitmsg.src_terminal_id = onesubmitmsg.msg_src ; onesubmitmsg.destusr_tl = 1; if (feephone_num==null) onesubmitmsg.dest_terminal_id = phone_num ; else onesubmitmsg.dest_terminal_id = feephone_num; try { onesubmitmsg.msg_content = new String ( messages , "ISO8859_1" ) ; } catch ( UnsupportedEncodingException ex ) { } // onesubmitmsg.msg_length = 5; onesubmitmsg.msg_length = messages.length; // Add by zhupf at 2004.12.7 onesubmitmsg.link_id = " "; onesubmitmsg.fee_terminal_type=0; onesubmitmsg.dest_terminal_type=0; onesubmitmsg.service_id = serid.getId () ; onesubmitmsg.fee_type = serid.getFeetype () ; onesubmitmsg.fee_code = serid.getFeecode () ; arrsubmitmsg.add(onesubmitmsg); } /** * * @param ispmaster * @param arrsubmitmsg * @return */ synchronized public static boolean sendMessages ( spmaster.ISpMaster ispmaster , ArrayList arrsubmitmsg ) { boolean rv = true ; if ( arrsubmitmsg == null || arrsubmitmsg.size () == 0 ) return false ; int [] spmrev = new int[arrsubmitmsg.size()] ; for (int i = 0 ; i < spmrev.length ; i++) spmrev[i] = -1 ; //发送短信息 spmaster.SubmitMsgSp2[] submit_msg = (spmaster.SubmitMsgSp2[] )arrsubmitmsg.toArray( new spmaster.SubmitMsgSp2[arrsubmitmsg.size() ]) ; try { // 向CORBA服务发送信息 // 暂时不发送 if(ispmaster!=null) { if (Sms.PUSH_CORBA_SENDMESSAGE) spmrev = ispmaster.SendSubmitMsg2 ( submit_msg ) ; else SmsLog.info(" sending property in configfile is disable . "); } else SmsLog.info(" the corba message is not sent out ,because spmaster is null . "); } catch ( Exception E ) { rv = false ; Log.error ("sendMessages " ,E ) ; } if (rv) writelog(submit_msg,spmrev) ; return rv ; } private static boolean checkCorbaMessageIsSame( spmaster.SubmitMsgSp2[] submit_msg ) { boolean issame = true ; for (int i = 1 ; i < submit_msg.length ; i++) { if (!submit_msg[0].fee_code.equals( submit_msg[i].fee_code ) || !submit_msg[0].fee_type.equals( submit_msg[i].fee_type) || !submit_msg[0].msg_content.equals( submit_msg[i].msg_content) ) { issame = false ; break ; } } return issame ; } /** * 写日志信息新的,将同一的内容信息以;另外一种方式记录 * @param submit_msg * @param spmrev * @param issame */ private static void writelog ( spmaster.SubmitMsgSp2[] submit_msg ,int[] spmrev) { // 写日志 if (spmrev==null || submit_msg==null) return ; boolean issame = checkCorbaMessageIsSame(submit_msg) ; try { String logcontent = null ; String strtime = TimeUtils.format ( new Date () , "kk:mm:ss.SSS" ) ; if ( issame ) { SmsLog.info ( "time :" + strtime ) ; SmsLog.info( submit_msg[ 0 ].service_id + ":" + submit_msg[ 0 ].fee_type + ":" + submit_msg[ 0 ].fee_code + ":" + submit_msg[ 0 ].msg_src+ ":BYTE" + submit_msg[ 0 ].msg_content.length () + ":" + spmrev[ 0 ] ) ; logcontent = new String (submit_msg[ 0 ].msg_content) ; if ( 4 == submit_msg[ 0 ].msg_fmt ) { logcontent = submit_msg[ 0 ].msg_content.replace ( '\n' , '#' ) ; if ( logcontent.length () > 25 ) logcontent = logcontent.substring ( 0 , 25 ) ; logcontent = StringUtils.encodeHex ( logcontent.getBytes ("ISO-8859-1" ) ) ; } else { logcontent = submit_msg[ 0 ].msg_content.replace ( '\n' , '#' ) ; // SmsLog.info( "content:" + logcontent ) ; logcontent = new String ( logcontent.getBytes ( "GB2312" ) , "ISO-8859-1" ) ; SmsLog.info( "content:" + logcontent ) ; } SmsLog.info( "destinate phones : ") ; StringBuffer phones = new StringBuffer() ; for ( int i = 0 ; i < submit_msg.length ; i++ ) { phones.append( submit_msg[ i ].dest_terminal_id ).append(" ") ; // 八个一排 if ( (i+1) % 8 == 0 ) { SmsLog.info(phones.toString()) ; phones = new StringBuffer() ; } } SmsLog.info(phones.toString()) ; } else { for ( int i = 0 ; i < submit_msg.length ; i++ ) { if ( 4 == submit_msg[ i ].msg_fmt ) { logcontent = submit_msg[ i ].msg_content.replace ( '\n' , '#' ) ; if ( logcontent.length () > 25 ) logcontent = logcontent.substring ( 0 , 25 ) ; logcontent = StringUtils.encodeHex ( logcontent.getBytes ("ISO-8859-1" ) ) ; } else { logcontent = submit_msg[ i ].msg_content.replace ( '\n' , '#' ) ; if ( logcontent.length () > 45 ) { logcontent = logcontent.substring ( 0 , 45 ) ; logcontent = new String ( logcontent.getBytes ( "GB2312" ) , "ISO-8859-1" ) ; } } SmsLog.info( submit_msg[ i ].dest_terminal_id + ":" + submit_msg[ i ].service_id + ":" + submit_msg[ i ].fee_type + ":" + submit_msg[ i ].fee_code + ":" + submit_msg[ i ].msg_src+ ":" + logcontent + ":" + spmrev [ i ] + ":" + strtime ) ; } } } catch ( java.io.IOException E ) { E.printStackTrace ( System.out ) ; } } /** * * @param args String[] * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { ArrayList arrsubmitmsg = new ArrayList() ; String urlstr = "wap.newpalm.com/wapcmcc/game/rtpic/xtdbydemo/index.jsp?start=1&MISC_ServiceID=03201077"; String titlestr = StringUtils.to8859_1( "测试彩信"); addMMSMessage( titlestr , urlstr , "13815856177" , null , new ServiceFee("SYSTEM|01|00") , null, 1, arrsubmitmsg ) ; // String spMasterServer = CorbaConnectionContainer.defaultCorbaServer ; ISpMaster ispmaster = null ; ispmaster = CorbaConnectionContainer.corbaService.get () ; sendMessages( ispmaster ,arrsubmitmsg) ; System.out.println(" Over !@"); } }