GSM java短信二次开发出现问题

查看数: 7863 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2014-11-5 17:06

正文摘要:

这个是什么问题,怎么解决

回复

admin
发表于 2014-12-13 13:43:25
看看是否下面这个问题导致只能发送1条,第2条就提示端口被占用

前些天在弄短信收发设备时出现一种情况,即只能发送一条信息,再次发送时就报端口占用错误。我用的是官方提供的代码 如下:
public void doIt() throws Exception
     {
          Service srv;
          OutboundMessage msg;
          OutboundNotification outboundNotification = new OutboundNotification();
          System.out.println("Example: Send message from a serial gsm modem.");
          System.out.println(Library.getLibraryDescription());
          System.out.println("Version: " + Library.getLibraryVersion());
          srv = new Service();
         
          SerialModemGateway gateway = new SerialModemGateway("modem.com1", "COM1", 115200, "wavecom", "17254");//115200是波特率,一般为9600。可以通过超级终端测试出来
          gateway.setInbound(true);
          gateway.setOutbound(true);
          gateway.setSimPin("0000");
          gateway.setOutboundNotification(outboundNotification);
          srv.addGateway(gateway);
          srv.startService();
          System.out.println("Modem Information:");
          System.out.println("  Manufacturer: " + gateway.getManufacturer());
          System.out.println("  Model: " + gateway.getModel());
          System.out.println("  Serial No: " + gateway.getSerialNo());
          System.out.println("  SIM IMSI: " + gateway.getImsi());
          System.out.println("  Signal Level: " + gateway.getSignalLevel() + "%");
          System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");
          System.out.println();
          // Send a message synchronously.
         
          msg = new OutboundMessage("13152195134", "这个是用java发的中文短信!");
          msg.setEncoding(MessageEncodings.ENCUCS2);//这句话是发中文短信必须的
          srv.sendMessage(msg);
          System.out.println(msg);
          System.out.println("Now Sleeping - Hit <enter> to terminate.");
          System.in.read();
          srv.stopService();
     }
我的程序中把这个方法放到servlet中,每次点击页面按钮时调用这个方法。但第二次点击时就报端口被占用的错误。开始认为是端口没有关闭,但后面加上removeGateway(gateway)或gateway.stopGateway()都不行。
最后一想:短信收发设备接上电脑即建立了连接,执行srv.startService()相当于保持一个长连接,不能用程序断开!最后把srv设为静态属性,每次点击按钮只调用 srv.sendMessage(msg)方法,就实现连续发送短信了。
修改后代码如下:
public static Service srv;
       static {
             try {
                   init();
            } catch (Exception e) {
                   // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }
       public static void init() throws Exception{
            OutboundNotification outboundNotification = new OutboundNotification();
            System. out .println("Example: Send message from a serial gsm modem.");
            System. out .println(System.getProperty( "java.version" ));
            System. out .println(Library.getLibraryDescription());
            System. out .println("Version: " + Library.getLibraryVersion());
             srv = new Service();
            SerialModemGateway gateway = new SerialModemGateway("modem.com4" ,
                         "COM3" , 9600, "wavecom" , "17254" );// 115200是波特率,一般为9600。可以通过超级终端测试出来
            gateway.setInbound( true );
            gateway.setOutbound( true );
            gateway.setOutboundNotification(outboundNotification);
             srv .addGateway(gateway);
             srv .startService();
            System. out .println("Modem Information:" );
            System. out .println("  Manufacturer: " + gateway.getManufacturer());
            System. out .println("  Model: " + gateway.getModel());
            System. out .println("  Serial No: " + gateway.getSerialNo());
            System. out .println("  SIM IMSI: " + gateway.getImsi());
            System. out .println("  Signal Level: " + gateway.getSignalLevel() + "%" );
            System. out .println("  Battery Level: " + gateway.getBatteryLevel()
                        + "%" );
            System. out .println();
      }
      
       public void doIt(String PhoneNum, String Mesg) throws Exception {
            OutboundMessage msg;
            msg = new OutboundMessage(PhoneNum, Mesg);
            msg.setEncoding(MessageEncodings. ENCUCS2 );// 这句话是发中文短信必须的
             srv .sendMessage(msg);
            System. out .println(msg);
            System. out .println("send message success!stopService." );
      }
admin 发表于 2014-11-20 17:09:22
jqkj 发表于 2014-11-7 07:11
你知道怎么发多条短信,我调用程序只能发送一条

这个文章6楼说的方法,能否帮到你解决1条短信问题?http://bbs.csdn.net/topics/390510221
jqkj 发表于 2014-11-7 15:11:28
admin 发表于 2014-11-7 09:57
下面的文章和你的问题类似,你可以参考下:

最近在Linux环境下利用开源组件SMSLib,开发短信猫应用,经常 ...

你知道怎么发多条短信,我调用程序只能发送一条
admin 发表于 2014-11-7 09:57:06
下面的文章和你的问题类似,你可以参考下:

最近在Linux环境下利用开源组件SMSLib,开发短信猫应用,经常遇到这个错误,发现网上也有很多朋友遇到过这个问题,现在将解决这个问题的方案分享给大家。

开发环境:
            Linux ReadHat5.4   64位,内核:2.6.33.20 ,JDK1.6,SMSServer-3.5.2.jar

异常信息:

图1-1

解决方案:
遇到这个异常时,请检查以下二个方面:
1、是否启用轮循模式?
方式1)、在jvm中,添加-Dsmslib.serial.polling启动参数
方式2)、在JAVA代码中,在调用startService之前,显示启用轮循模式
  1. Service.getInstance().S.SERIAL_POLLING = true;  //启用轮循模式  
复制代码

2、创建串口网关对象时,是否设置了正确的短信猫设备生产厂商?
  1. SerialModemGateway gateway = new SerialModemGateway("modem.com1", "/dev/ttyUSB1", 9600, "Wavecom", "型号");  
复制代码

参数说明:
modem.com1:网关ID(即短信猫端口ID,多个短信猫时,用于标识是由哪个口发出的短信)
/dev/ttyUSB1:串口名称(USB转串口,短信猫中的所有端口自动被操作系统映射到/dev/目录下,以ttyUSB*开头的文件上,前提是系统预装有USB转串口的驱动),注:Linux下2.6.32以上内核已预装USB串口设备驱动,如果低版本的内核,未检测到USB设备,则需要自己安装驱动或升级内核。
9600:波特率,根据二次开发包中的CommTest.java测试程序,检测你的设备所支持的波特率。
Wavecom:生产厂商名称,必须设置正确,否则SMSLib在初始设备时,会报No response from Device异常,原因是SMSLib为不同的生产厂商,有相应的AT指定接口实现,见下图:

图1-2
在“图1-1“中,是因为我在创建串口网关对象是,指定了厂商名称为“HuaWei“,所以报了如图1-3所示异常:

图1-3
型号:可以不用指定,如果指定了型号,SMSLib在初始化设备的时候,会找特定型号的AT指令实现类,如果没找到有可能会出现初始化设备异常,但据我测试,如果没有找到指定厂商指定的型号的AT指令实现,会去指定厂商的通用实现接口
    以上异常是基于SMSServer-3.5.2在Linux环境下开发所遇到的一些问题,和大家分享,Window上也会有相类似的问题,可参考上面的解决思路去寻找解决方案,另外短信猫二次开发包还有其它的厂商进行了底层AT指令的封装,比如:jindiJavaSms(金笛)开发包,用它时,我也遇到了类似的问题,解决方式也和上面差不多,只不过可能参数有些不同,在这里不做详细介绍,如有遇到同样问题的朋友,欢迎大家讨论!
本文转自CSDN:http://blog.csdn.net/xyang81/article/details/7492161

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-11-23 01:28 , Processed in 0.065903 second(s), 29 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)