如何通过java短信"猫"实现发送短信_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
4
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3384 | 回复: 3   主题: 如何通过java短信"猫"实现发送短信        下一篇 
masy
注册用户
等级:少校
经验:1234
发帖:182
精华:0
注册:2011-11-4
状态:离线
发送短消息息给masy 加好友    发送短消息息给masy 发消息
发表于: IP:您无权察看 2015-3-31 9:14:10 | [全部帖] [楼主帖] 楼主

短信"猫"可以实现无手机发送短信,和mas机比起来就是比较灵活点,不用那么多繁杂的步骤。

一般来说,对于信息的处理无外乎两种方式:一种是把任务保存到缓存队列中,然后去调度任务.优点就是速度快,缺点也很明显,如果任务处理的不好,很容出现任务无法执行或者等待.另一种就是保存到数据库中,短信发送和数据的处理分开处理,但是速度方面会有影响.这里说的第二种方法。

首先把任务的数据保存到数据库中,这块的话没有什么难度,就是普通的增删改查.

发送短信的单独分离出来运行,即web端和发送端分开.

首先需要初始化设备

  1. public static void initDriver() { 
  2.        if (!initDriver) { 
  3.              initDriver = true; 
  4.              String driverName = "com.sun.comm.Win32Driver"; 
  5.              String libname = "win32com"; 
  6.              CommDriver commDriver = null; 
  7.              try { 
  8.                    System.loadLibrary("win32com"); 
  9.                    log.info(libname + " Library Loaded"); 
  10.                   
  11.                    commDriver = (CommDriver) Class.forName(driverName) 
  12.                    .newInstance(); 
  13.                    commDriver.initialize(); 
  14.                    log.info("comm Driver Initialized"); 
  15.                   
  16.              } catch (Exception e) { 
  17.                    log.error(e.getMessage(), e); 
  18.              } 
  19.        } 
  20.  }


然后需要查找SMS设备

  1. public static List<String> findSMS() { 
  2.        TreeMap<String, String> portsMap = new TreeMap<String, String>(); 
  3.        log.info("GSM Modem 串行端口连接测试开始..."); 
  4.        Enumeration<?> en = CommPortIdentifier.getPortIdentifiers(); 
  5.        CommPortIdentifier portId; 
  6.        while (en.hasMoreElements()) { 
  7.              portId = (CommPortIdentifier) en.nextElement(); 
  8.              if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
  9.                    if (checkCommPortForSMS(portId.getName())) { 
  10.                          log.info(" 设备端口 : " + portId.getName() + " 满足短信<strong>发送</strong>要求"); 
  11.                          portsMap.put(portId.getName(), portId.getName()); 
  12.                    } 
  13.              } 
  14.        } 
  15.        log.info("GSM Modem 检查结束 ..."); 
  16.        return new Vector<String>(portsMap.keySet()); 
  17.  } 


  1. public static boolean checkCommPortForSMS(String portName) { 
  2.        portList = CommPortIdentifier.getPortIdentifiers(); 
  3.        while (portList.hasMoreElements()) { 
  4.              portId = (CommPortIdentifier) portList.nextElement(); 
  5.              if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL 
  6.              && portName.equals(portId.getName())) { 
  7.                    log.info("找到串口: " + portId.getName()); 
  8.                    for (int i = 0; i < bauds.length; i++) { 
  9.                          log.info(" Trying at " + bauds[i] + "..."); 
  10.                          try { 
  11.                                SerialPort serialPort; 
  12.                                InputStream inStream; 
  13.                                OutputStream outStream; 
  14.                                int c; 
  15.                                StringBuffer response = new StringBuffer(); 
  16.                                serialPort = (SerialPort) portId.open( 
  17.                                "SMSLibCommTester", 2000); 
  18.                                serialPort 
  19.                                .setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN); 
  20.                                serialPort.setSerialPortParams(bauds[i], 
  21.                                SerialPort.DATABITS_8, SerialPort.STOPBITS_1, 
  22.                                SerialPort.PARITY_NONE); 
  23.                                inStream = serialPort.getInputStream(); 
  24.                                outStream = serialPort.getOutputStream(); 
  25.                                serialPort.enableReceiveTimeout(1000); 
  26.                                c = inStream.read(); 
  27.                                while (c != -1) { 
  28.                                      c = inStream.read(); 
  29.                                } 
  30.                                outStream.write('A'); 
  31.                                outStream.write('T'); 
  32.                                outStream.write('\r'); 
  33.                                try { 
  34.                                      Thread.sleep(1000); 
  35.                                } catch (Exception e) { 
  36.                                      log.error(e.getMessage(), e); 
  37.                                } 
  38.                                c = inStream.read(); 
  39.                                while (c != -1) { 
  40.                                      response.append((char) c); 
  41.                                      c = inStream.read(); 
  42.                                } 
  43.                                if (response.indexOf("OK") >= 0) { 
  44.                                      log.info(" 正在检测设备:"); 
  45.                                      try { 
  46.                                            outStream.write('A'); 
  47.                                            outStream.write('T'); 
  48.                                            outStream.write('+'); 
  49.                                            outStream.write('C'); 
  50.                                            outStream.write('G'); 
  51.                                            outStream.write('M'); 
  52.                                            outStream.write('M'); 
  53.                                            outStream.write('\r'); 
  54.                                            response = new StringBuffer(); 
  55.                                            c = inStream.read(); 
  56.                                            while (c != -1) { 
  57.                                                  response.append((char) c); 
  58.                                                  c = inStream.read(); 
  59.                                            } 
  60.                                           
  61.                                            log.info(" 发现设备: " 
  62.                                            + response.toString().replaceAll( 
  63.                                            "(\\s+OK\\s+)|[\n\r]", "")); 
  64.                                            if (!"ERROR".equals(response.toString() 
  65.                                            .replaceAll("(\\s+OK\\s+)|[\n\r]", "") 
  66.                                            .trim())) { 
  67.                                                  serialPort.close(); 
  68.                                                  inStream.close(); 
  69.                                                  outStream.close(); 
  70.                                                  return true; 
  71.                                            } 
  72.                                            return false; 
  73.                                      } catch (Exception e) { 
  74.                                            log.info(" 检测设备失败,获取设备信息异常:" + e.getMessage()); 
  75.                                      } 
  76.                                } else { 
  77.                                log.info(" 检测设备失败,没有接收到响应结果!"); 
  78.                          } 
  79.                          serialPort.close(); 
  80.                    } catch (Exception e) { 
  81.                          log.info(" 检测设备失败,发生异常:" + e.getMessage()); 
  82.                    } 
  83.              } 
  84.        } 
  85.  } 
  86.  return false; 
  87.  }

调用结束后会返回当前计算机可用的端口号,然后就可以注册gateway了

  1. for (String portId : ports) { 
  2.        SerialModemGateway gateway = new SerialModemGateway( 
  3.        "modem.MAGUS" + portId, portId, 9600, "wavecom", ""); 
  4.        gateway.setInbound(true); 
  5.        gateway.setOutbound(true); 
  6.        smsService.addGateway(gateway); 
  7.  } 


然后需要设置smsService的各种监听事件了.这些都搞定之后就可以设置一个while(true)循环去不停的读取数据库发送短信了,但是有一点,需要设置一个安全的线程去执行,同时还要添加同步锁.保证当前只有一个工作在进行.

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
hei_nihao
注册用户
等级:少校
经验:1279
发帖:19
精华:0
注册:2015-4-17
状态:离线
发送短消息息给hei_nihao 加好友    发送短消息息给hei_nihao 发消息
发表于: IP:您无权察看 2015-4-28 9:15:47 | [全部帖] [楼主帖] 2  楼

不错,收藏了 北京联动北方科技有限公司



赞(0)    操作        顶端 
ainy
注册用户
等级:中士
经验:221
发帖:0
精华:0
注册:2015-4-27
状态:离线
发送短消息息给ainy 加好友    发送短消息息给ainy 发消息
发表于: IP:您无权察看 2015-4-28 22:07:54 | [全部帖] [楼主帖] 3  楼

这么爽哦 



赞(0)    操作        顶端 
yr
注册用户
等级:少校
经验:1085
发帖:5
精华:0
注册:2015-1-19
状态:离线
发送短消息息给yr 加好友    发送短消息息给yr 发消息
发表于: IP:您无权察看 2015-4-29 9:35:24 | [全部帖] [楼主帖] 4  楼

棒棒哒 北京联动北方科技有限公司



赞(0)    操作        顶端 
总帖数
4
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论