public static void main(String[] args) throws Exception {

    System.out.println(new SGIPSendGZ().getClass().getCanonicalName());

    //    	DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    System.out.println(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
    //    	for (int i=0; i<100; i++)
    //    	{
    //    		System.out.println(new Random().nextInt(254)+1);
    //    	}

    //    	SimpleClient sm = new SimpleClient();
    //		sm.initialize("zjlt", "1FFy6NZZtn3q", "101.227.68.68", 8088);
    //
    //		long msgId = System.currentTimeMillis() + new Random().nextInt();
    //
    //		int ii = sm.send(msgId, "11590132493", "家长,你好!接上级通知精神,今年七年级夏令");
    //		System.out.println(ii);

    String testMsg =
        "1234567890ab1234567890ab1234567890ab1234567890ab1234567890ab1234567890ab1234567890ab1234567890ab1234567890ab1234567890ab12345678";
    System.out.println(testMsg.length());
    System.out.println(testMsg.getBytes("UnicodeBigUnmarked").length);
    System.out.println(
        "尊敬的七年级学生家长,你好!接上级通知精神,今年七年级夏令营暂停,请家长于8月29日登陆玉海实验中学网站或到玉海实验中学(本部)宣传栏查看七年级分班结果。8月31日上午8:30学生分别到本部或公园路校区报到注册、领取校服、始业教育、班容布置等。谢谢!【瑞安市玉海实验中学】"
            .length());
    // 据测试,最大长度为=361
    System.out.println(
        "小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信,ABCabc123!@#$%^&*()兰蔻电影大赏:催人泪下的人狗奇缘——《忠犬八公的故事》:ABCabc123!@#$%^&*()"
            .getBytes()
            .length);
    System.out.println(
        "拆分短信的时候是直接将短信的内容根据字符数来拆分,第一条、第二条后面的每一条都是公平的,不会存在第一条160,第二条146的情况,只会都是153,除了其最后一条可能小于153.这里笔者想表达的含义是拆分与统计是两码事,拆分是将短信内容根据规定拆分成具体的短短信,是在短信的发送流程中进行的。统计是在用户输入字符的时候提示给用户的,统计只是为了方便用户知道当前长短信拆分后的数量以及输入字符数的限制等。"
            .length());

    try {
      // #################################################################
      // 测试MD5开始

      // 添加时间戳
      DateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");
      String timeSpan = df.format(new Date());

      // 添加4位随机数
      Random r = new Random();

      timeSpan += String.valueOf(r.nextInt(10));
      timeSpan += String.valueOf(r.nextInt(10));
      timeSpan += String.valueOf(r.nextInt(10));
      timeSpan += String.valueOf(r.nextInt(10));

      System.out.println(timeSpan);

      char hexDigits[] = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
      };
      byte[] btInput = timeSpan.getBytes();
      // 获得MD5摘要算法的 MessageDigest 对象
      MessageDigest mdInst = MessageDigest.getInstance("MD5");
      // 使用指定的字节更新摘要
      mdInst.update(btInput);
      // 获得密文
      byte[] md = mdInst.digest();
      // 把密文转换成十六进制的字符串形式
      int j = md.length;
      char str[] = new char[j * 2];
      int k = 0;
      for (int i = 0; i < j; i++) {
        byte byte0 = md[i];
        str[k++] = hexDigits[byte0 >>> 4 & 0xf];
        str[k++] = hexDigits[byte0 & 0xf];
      }
      System.out.println(new String(str));

      // 测试MD5结束
      // #################################################################

      String no = "8618611112xx";

      System.out.println(no.matches("861(30|31|32|55|56|85|86)[0-9]{8}"));

      System.out.println(System.getProperty("file.encoding"));

      //        	SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
      //        	String dateStr = format.format(new Date());
      //        	System.out.println(dateStr);

      SGIPClientInitInfo info = new SGIPClientInitInfo();
      info.IP = "211.90.245.97";
      info.port = 8801;
      info.userName = "******";
      info.passWord = "******";
      info.maxLink = 2;

      // info.IP = "10.130.83.207";
      // info.port = 5577;
      // info.userName = "******";
      // info.passWord = "******";
      // info.maxLink =1;
      SGIPClient client = SGIPClient.getInstance();
      client.init(info);

      // SGIPBindBody body = new SGIPBindBody();
      // byte x = 1;
      // body.setLoginType(x);
      // body.setLoginName("zhjecclient");
      // body.setLoginPassword("zhjecclient");
      // SGIPMessageHead head = new SGIPMessageHead();
      // SGIPSequenceNo sno = new SGIPSequenceNo();
      // sno.setNode(1);
      // sno.setTime(999444);
      // sno.setNumber(999);
      //
      // head.setCommandID(1);
      // head.setSequenceNo(sno);
      // head.setMessageLength(body.getLength() + head.getLength());
      //
      // SGIPBind bind = new SGIPBind();
      // bind.setHead(head);
      // bind.setBody(body);

      SGIPSubmit submit = new SGIPSubmit();

      // submit.getBody().se

      submit.getBody().setSPNumber("1065592210");
      submit.getBody().setChargeNumber("8615606503343");
      submit.getBody().setUserCount(1);
      //            submit.getBody().setUserNumber("8613157191037");	// 用户手机(胡越婷)
      //          submit.getBody().setUserNumber("8613282115303");	// 用户手机(胡越婷的另外一张杭州联通卡)
      //            submit.getBody().setUserNumber("8615657179130");	// 用户手机(罗鹏武)
      //            submit.getBody().setUserNumber("8615657176869");	// 用户手机(郭延磊)
      submit.getBody().setUserNumber("8613045700413"); // 用户手机(衢州联通)
      submit.getBody().setUserNumber("8613018973871"); // 郭延磊测试SIM卡

      submit.getBody().setCorpId("61167");
      submit.getBody().setFeeType(1);
      submit.getBody().setFeeValue("4");
      submit.getBody().setGivenValue("000807");
      submit.getBody().setAgentFlag(0);
      submit.getBody().setMorelatetoMTFlag(0);
      submit.getBody().setPriority(0);
      submit.getBody().setExpireTime("");
      submit.getBody().setScheduleTime("");
      submit.getBody().setReportFlag(1);
      submit.getBody().setTP_pid(1);
      submit.getBody().setTP_udhi(1); // 启用发长短信
      submit.getBody().setMessageCoding(8);
      submit.getBody().setMessageType(0);
      //            submit.getBody().setMessageContent("Test".getBytes());

      submit.getBody().setReserve("dd");

      SGIPRsp rsphandler6 = null;

      //            String msgContent =
      // "小胡童鞋,了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信了信【长短信完】";
      String msgContent =
          "小胡童鞋,了信1234567890abc1234567890abc1234567890abc小胡童鞋,1234567890abc1234567890abc1234567890abc【长短信完】";
      //            String msgContent =
      // "拆分短信的时候是直接将短信的内容根据字符数来拆分,第一条、第二条后面的每一条都是公平的,不会存在第一条160,第二条146的情况,只会都是153,除了其最后一条可能小于153.这里笔者想表达的含义是拆分与统计是两码事,拆分是将短信内容根据规定拆分成具体的短短信,是在短信的发送流程中进行的。统计是在用户输入字符的时候提示给用户的,统计只是为了方便用户知道当前长短信拆分后的数量以及输入字符数的限制等。【长短信完】";
      //            String msgContent =
      // "拆分短信的时候是直接将短信的内容根据字符数来拆分,第一条、第二条后面的每一条都是公平的,不会存在第一条160,第二条146的情况,只会都是153,除了其最后一条可能小于153.这里笔者想表达的含义是拆分与统计是两码事,拆分是将短信内容根据规定拆分成具体的短短信,是在短信的发送流程中进行的。统计是在用户输入字符的时候提示给用户的,统计只是为了方便用户知道当前长短信拆分后的数量以及输入字符数的限制等。【长短信完】拆分短信的时候是直接将短信的内容根据字符数来拆分,第一条、第二条后面的每一条都是公平的,不会存在第一条160,第二条146的情况,只会都是153,除了其最后一条可能小于153.这里笔者想表达的含义是拆分与统计是两码事,拆分是将短信内容根据规定拆分成具体的短短信,是在短信的发送流程中进行的。统计是在用户输入字符的时候提示给用户的,统计只是为了方便用户知道当前长短信拆分后的数量以及输入字符数的限制等。【长短信完】";
      //            String msgContent =
      // "小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信小胡童鞋,这是一条长短信,ABCabc123!@#$%^&*()兰蔻电影大赏:催人泪下的人狗奇缘——《忠犬八公的故事》:ABCabc123!@#$%^&*()本片讲述了一只叫Hatchi“小八”的秋田犬,与主人之前相互信任与守候的故事ABCabc123!@#$%^&*()。【长短信完】";
      //            String msgContent = "小胡童鞋【长短信完】";
      System.out.println("短信长度=" + msgContent.getBytes("UnicodeBigUnmarked").length);

      // 测试发标准短信
      if (true) {

        rsphandler6 = new SGIPRsp();
        submit.getHead().setSequenceNo(new SGIPSequenceNo());

        submit.getBody().setMessageContent(msgContent.getBytes("UnicodeBigUnmarked"));
        //
        // submit.getBody().setMessageContent(("尊敬的七年级学生家长,你好!接上级通知精神,今年七年级夏令营暂停,请家长于8月29日登陆玉海实验中学网站或到玉海实验中学(本部)宣传栏查看七年级分班结果。8月31日上午8:30学生分别到本部或公园路校区报到注册、领取校服、始业教育、班容布置等。谢谢!【瑞安市玉海实验中学】").getBytes("UnicodeBigUnmarked"));
        //              submit.getBody().setMessageContent(("方经理,请回复汉字英文数字混合内容的短信," + dateStr +
        // "进入校门=" + (i+1)).getBytes("GBK"));
        client.sendSubmit(submit, rsphandler6);
        SGIPSubmitResp rsp6 = rsphandler6.waitForSGIPSubmitResp();
        System.out.println(rsp6.getBody().getResult());
        System.out.println(rsp6.getBody().getLength());
        System.out.println(rsp6.getBody().toString());
        System.out.println(
            "消息数==" + new String(submit.getBody().getMessageContent(), "UnicodeBigUnmarked"));
      }

      byte[] byMsgContent = msgContent.getBytes();
      System.out.println(byMsgContent.length);

      Date date1 = new Date();

      SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
      String dateStr = format.format(new Date());

      rsphandler6 = new SGIPRsp();
      submit.getHead().setSequenceNo(new SGIPSequenceNo());

      List msgList = new ArrayList();
      while (msgContent.length() > 68) {
        msgList.add(msgContent.substring(0, 68));
        msgContent = msgContent.substring(68);
      }
      msgList.add(msgContent);

      // 计算总条数
      byte totalMsg = (byte) msgList.size();

      // 本条长短信的序列号
      byte bySeq = (byte) (new Random().nextInt(254) + 1);

      for (int i = 0; i < msgList.size(); i++) {
        String msg = (String) msgList.get(i);
        byte[] byArr = {0x05, 0x00, 0x03, bySeq, totalMsg, (byte) (i + 1)};

        byte[] bb = msg.getBytes("UnicodeBigUnmarked");
        byte[] bb_arr = new byte[bb.length + 6];
        System.arraycopy(byArr, 0, bb_arr, 0, 6);
        System.arraycopy(bb, 0, bb_arr, 6, bb_arr.length - 6);

        submit.getBody().setMessageContent(bb_arr);
        //
        // submit.getBody().setMessageContent(("尊敬的七年级学生家长,你好!接上级通知精神,今年七年级夏令营暂停,请家长于8月29日登陆玉海实验中学网站或到玉海实验中学(本部)宣传栏查看七年级分班结果。8月31日上午8:30学生分别到本部或公园路校区报到注册、领取校服、始业教育、班容布置等。谢谢!【瑞安市玉海实验中学】").getBytes("UnicodeBigUnmarked"));
        //                      submit.getBody().setMessageContent(("方经理,请回复汉字英文数字混合内容的短信," +
        // dateStr + "进入校门=" + (i+1)).getBytes("GBK"));
        client.sendSubmit(submit, rsphandler6);
        SGIPSubmitResp rsp6 = rsphandler6.waitForSGIPSubmitResp();
        System.out.println(rsp6.getBody().getResult());
        System.out.println(rsp6.getBody().getLength());
        System.out.println(rsp6.getBody().toString());
        System.out.println(
            "消息数==" + new String(submit.getBody().getMessageContent(), "UnicodeBigUnmarked"));
      }

      //                    for (int i=0; i<byMsgContent.length; i+=67)
      //                    {
      //                    	bCnt++;
      //
      //                        byte [] byArr = {0x05,  0x00, 0x03, 0x02, totalMsg, bCnt};
      //
      //                        String s = new String (byMsgContent, i, (i+67<byMsgContent.length ?
      // 67 : byMsgContent.length-i));
      //                        byte [] bb = s.getBytes("UnicodeBigUnmarked");
      //                        byte [] bb_arr = new byte [bb.length + 6];
      //                        System.arraycopy(byArr, 0, bb_arr, 0, 6);
      //                        System.arraycopy(bb, 0, bb_arr, 6, bb_arr.length-6);
      //
      //                        submit.getBody().setMessageContent(bb_arr);
      ////
      // submit.getBody().setMessageContent(("尊敬的七年级学生家长,你好!接上级通知精神,今年七年级夏令营暂停,请家长于8月29日登陆玉海实验中学网站或到玉海实验中学(本部)宣传栏查看七年级分班结果。8月31日上午8:30学生分别到本部或公园路校区报到注册、领取校服、始业教育、班容布置等。谢谢!【瑞安市玉海实验中学】").getBytes("UnicodeBigUnmarked"));
      ////                      submit.getBody().setMessageContent(("方经理,请回复汉字英文数字混合内容的短信," +
      // dateStr + "进入校门=" + (i+1)).getBytes("GBK"));
      //                      client.sendSubmit(submit, rsphandler6);
      //                      SGIPSubmitResp rsp6 = rsphandler6.waitForSGIPSubmitResp();
      //                      System.out.println(rsp6.getBody().getResult());
      //                      System.out.println(rsp6.getBody().getLength());
      //                      System.out.println(rsp6.getBody().toString());
      //                      System.out.println("消息数==" + new
      // String(submit.getBody().getMessageContent(), "UnicodeBigUnmarked"));
      //
      //
      //                    }

      //					List <String>tmpList = new ArrayList();
      //					while (content.length()>200)
      //					{
      //						tmpList.add(content.substring(0, 200));
      //						content = content.substring(200);
      //					}
      //					tmpList.add(content);

      System.out.println("start time:" + date1.toString());
      System.out.println("end time:" + (new Date()).toString());

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  private void sendSmsBySGIP(TSmsend tSmsend) throws IOException {
    // 该短信发起者的标识号,默认为空,表示是系统短信,如考勤短信
    String srcNo = (null == tSmsend.getSrcnbr()) ? "" : tSmsend.getSrcnbr();

    // 如果长度不足11位,也将转换为系统短信,即设置为默认
    // substring(1) 表示取手机号后10位,用户回复时,再前补1,拼成完整手机号
    srcNo = (11 != srcNo.length()) ? "" : srcNo.substring(1);

    // 如果不是系统短信(如考勤短信),比如老师发送家庭作业等,则追加短信发起者的编号到106xxx后,用于处理用户回复短信 (t_jcxx_accout.id)
    if ("".equalsIgnoreCase(srcNo) && null != tSmsend.getCenterId()) {
      List<TJcxxTeacherinfo> tJcxxTeacherinfoList =
          this.tJcxxTeacherinfoDao.findByTeacherId(tSmsend.getCenterId());

      if (0 < tJcxxTeacherinfoList.size()) {
        TJcxxTeacherinfo tJcxxTeacherinfo = tJcxxTeacherinfoList.get(0);

        if (null != tJcxxTeacherinfo.getMobile()) {
          srcNo = tJcxxTeacherinfo.getMobile().substring(1);
        }
      }
    }

    // 贵州联通不支持通道扩展号
    srcNo = "";

    String content = tSmsend.getMsgcontent();
    content = null == content ? "" : content;

    if (true) {
      // MHJ 2013.11.11
      // 因使用 ZTE 提供的 SGIP 短信发送包<br>
      // 在浙江联通出现僵死现象,返回-3<br>
      // 在广东联通,出现无法连接,返回-5现象<br>
      // 故联系广东联通,获取金鹏SGIP短信开发包<br>

      // 以下是使用金鹏开发包发送短信

      // 以下是发送短信的代码(可多线程调用)
      //			System.out.println("检测浙江联通短信行业网关是否提交短信超时 sendMessage (" + tSmsend.getId() + "/" +
      // tSmsend.getDestnbr()  + ")(" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
      // + ")");
      SendResult[] results = this.mtClient.sendMessage(srcNo, tSmsend.getDestnbr(), content, null);

      //			if ("8618606709366".equalsIgnoreCase(tSmsend.getDestnbr()))
      //					this.mtClient.sendMessage(srcNo, tSmsend.getDestnbr(), content, null);
      //			else
      //				this.mtClient.sendMessage(tSmsend.getDestnbr(), content);

      //			System.out.println("检测浙江联通短信行业网关是否提交短信超时 sendMessage (" + tSmsend.getId() + "/" +
      // tSmsend.getDestnbr()  + ")(" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
      // + ")");
      for (SendResult reslut : results) {
        //				log.info("发送短信,短信序号为:"+ Arrays.toString(reslut.getFlowId()) +
        // "发送结果:"+reslut.getResult());

        // 保存短信发送状态:SGIP返回0,表示短信已成功发送,需将状态设置为1,保存到数据库备查。
        tSmsend.setFlag(new Integer(0 == reslut.getResult() ? 1 : reslut.getResult()));
      }
    } else {
      // 以下是使用中兴开发包发送短信

      SGIPRsp rspHandler = new SGIPRsp();
      SGIPSubmitResp rsp = null;

      this.submit.getHead().setSequenceNo(new SGIPSequenceNo());
      submit.getBody().setSPNumber(this.spNumber + srcNo);
      this.submit.getBody().setUserNumber(tSmsend.getDestnbr());

      // 如果短信内容长度不超过127个字符,则使用标准短信方式发送短信
      if (127 >= content.length()) {
        this.submit.getBody().setTP_udhi(0); // 启用发标准短信

        this.submit.getBody().setMessageContent(content.getBytes("UnicodeBigUnmarked")); // 要发送的短信内容

        System.out.println(
            "检测浙江联通短信行业网关是否提交短信超时 普通短信 sendSubmit ("
                + tSmsend.getId()
                + "/"
                + tSmsend.getDestnbr()
                + ")("
                + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                + ")");
        this.client.sendSubmit(submit, rspHandler);
        System.out.println(
            "检测浙江联通短信行业网关是否提交短信超时 普通短信 waitForSGIPSubmitResp ("
                + tSmsend.getId()
                + "/"
                + tSmsend.getDestnbr()
                + ")("
                + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                + ")");
        rsp = rspHandler.waitForSGIPSubmitResp();
        System.out.println(
            "检测浙江联通短信行业网关是否提交短信超时 普通短信 over ("
                + tSmsend.getId()
                + "/"
                + tSmsend.getDestnbr()
                + ")("
                + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                + ")");
      } else {
        // 短信内容超过127个字符,使用长短信方式,发送短信
        this.submit.getBody().setTP_udhi(1); // 启用发标准短信

        // 因使用长短信方式时,需将原短信,拆分成多条小短信,每条小短信,长度不超过67个字符,
        // 因采用 UnicodeBigUnmarked 编码格式,每个字符,不管英文还是中文,都占用2个字节,
        // 故每小条短信的长度均为67个字符(在Java里),加上短信头6个字节,一共等于140个字节。

        List msgList = new ArrayList();
        while (content.length() > 67) {
          msgList.add(content.substring(0, 67));
          content = content.substring(67);
        }
        msgList.add(content);

        // 计算总条数
        byte totalMsg = (byte) msgList.size();

        // 本条长短信的(随机)序列号
        byte by_seq = (byte) (new Random().nextInt(254) + 1);

        for (int i = 0; i < msgList.size(); i++) {
          String msg = (String) msgList.get(i);
          byte[] byArr = {0x05, 0x00, 0x03, by_seq, totalMsg, (byte) (i + 1)};

          byte[] bb = msg.getBytes("UnicodeBigUnmarked");
          byte[] bb_arr = new byte[bb.length + 6];
          System.arraycopy(byArr, 0, bb_arr, 0, 6);
          System.arraycopy(bb, 0, bb_arr, 6, bb_arr.length - 6);

          this.submit.getBody().setMessageContent(bb_arr); // 每小条要发送的短信内容

          System.out.println(
              "检测浙江联通短信行业网关是否提交短信超时 sendSubmit 长短信 ("
                  + tSmsend.getId()
                  + "/"
                  + tSmsend.getDestnbr()
                  + ")("
                  + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                  + ")");
          this.client.sendSubmit(submit, rspHandler);
          System.out.println(
              "检测浙江联通短信行业网关是否提交短信超时 waitForSGIPSubmitResp 长短信 ("
                  + tSmsend.getId()
                  + "/"
                  + tSmsend.getDestnbr()
                  + ")("
                  + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                  + ")");
          rsp = rspHandler.waitForSGIPSubmitResp();
          System.out.println(
              "检测浙江联通短信行业网关是否提交短信超时 over 长短信 ("
                  + tSmsend.getId()
                  + "/"
                  + tSmsend.getDestnbr()
                  + ")("
                  + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                  + ")");
        }
      }

      // 保存短信发送状态:SGIP返回0,表示短信已成功发送,需将状态设置为1,保存到数据库备查。
      tSmsend.setFlag(new Integer(0 == rsp.getBody().getResult() ? 1 : rsp.getBody().getResult()));
    }

    // 保存提交短信发送成功的时间。
    tSmsend.setFinaldate(new Timestamp(System.currentTimeMillis()));

    //        System.out.println(new String(this.submit.getBody().getMessageContent(),
    // "UnicodeBigUnmarked"));
    // 保存短信发送状态
    this.tSmsendDao.getHibernateTemplate().update(tSmsend);
  }