SM MODEM不能关闭服务,串口占用,gun.io.PortInUseException:Port curre
分享
GSM MODEM发短信调用串口发短信时,第一条可以正常发送,第二条的时候就报错了!大致意思是端口被占用,没有可用或找不到串口。
分析:其主要原因是,GSM MODEM接上电脑即建立了连接,执行service.startService()相当于保持一个长连接,不能用程序断开!最后把srv设为静态属性,每次点击按钮只调用 service.sendMessage(msg)方法,就实现连续发送短信了。
短信设备二次开发
2022-04-08
0
0
分析:其主要原因是,GSM MODEM接上电脑即建立了连接,执行service.startService()相当于保持一个长连接,不能用程序断开!最后把srv设为静态属性,每次点击按钮只调用 service.sendMessage(msg)方法,就实现连续发送短信了。
没有改造之前的代码:
package com.amc.sggk.toSendSMS; import javax.jws.WebService; import javax.xml.ws.Endpoint; import org.smslib.AGateway; import org.smslib.IOutboundMessageNotification; import org.smslib.Library; import org.smslib.Message.MessageEncodings; import org.smslib.OutboundMessage; import org.smslib.Service; import org.smslib.modem.SerialModemGateway; @WebService public class SendMessage { public String doIt( String phone , String center) { try { OutboundNotification outboundNotification = new OutboundNotification(); System.out.println("开启服务"); System.out.println(Library.getLibraryDescription()); System.out.println("Version: " + Library.getLibraryVersion()); /* modem.com1:网关ID(即短信猫端口编号) COM4:串口名称(在window中以COMXX表示端口名称,在linux,unix平台下以ttyS0-N或ttyUSB0-N表示端口名称),通过端口检测程序得到可用的端口 115200:串口每秒发送数据的bit位数,必须设置正确才可以正常发送短信,可通过程序进行检测。常用的有115200、9600 Huawei:短信猫生产厂商,不同的短信猫生产厂商smslib所封装的AT指令接口会不一致,必须设置正确.常见的有Huawei、wavecom等厂商 最后一个参数表示设备的型号,可选 */ SerialModemGateway gateway = new SerialModemGateway("modem.com3", "COM3", 115200, "Quectel", "EC20"); gateway.setInbound(true); //设置true,表示该网关可以接收短信,根据需求修改 gateway.setOutbound(true);//设置true,表示该网关可以发送短信,根据需求修改 gateway.setSimPin("0000");//sim卡锁,一般默认为0000或1234 gateway.setSmscNumber("+8613010180500");//短信服务中心号码 Service.getInstance().setOutboundMessageNotification(outboundNotification); //发送短信成功后的回调函方法 Service.getInstance().addGateway(gateway); //将网关添加到短信猫服务中 Service.getInstance().S.SERIAL_POLLING = true; System.out.println("启动服务,进入短信发送就绪状态"); Service.getInstance().startService(); //启动服务,进入短信发送就绪状态 OutboundMessage msg = new OutboundMessage(phone, center); //参数1:手机号码 参数2:短信内容 msg.setEncoding(MessageEncodings.ENCUCS2);//这句话是发中文短信必须的 Service.getInstance().sendMessage(msg); //执行发送短信 /*System.in.read();*/ Service.getInstance().stopService(); System.out.println("关闭服务"); return "发送成功!"; } catch (Exception e) { e.printStackTrace(); return "短信模块调用失败!"; } } /* 短信发送成功后,调用该接口。并将发送短信的网关和短信内容对象传给process接口 */ public class OutboundNotification implements IOutboundMessageNotification { public void process(AGateway gateway, OutboundMessage msg) { System.out.println("短信发送成功!"); System.out.println(msg); } } /*public static void main(String args[]) { SendMessage app = new SendMessage(); try { app.doIt("15652194735","ceshi"); } catch (Exception e) { e.printStackTrace(); } }*/ public static void main(String[] args) { /** * 参数1:服务的发布地址(http://192.168.43.173/SendMsnService) * 参数2:服务的实现者 */ Endpoint.publish("http://192.168.4.52:8080/toSendMsn", new SendMessage()); } }
改造好的代码:
package com.amc.sggk.toSendSMS; import java.io.IOException; import javax.jws.WebService; import javax.xml.ws.Endpoint; import org.smslib.AGateway; import org.smslib.GatewayException; import org.smslib.IOutboundMessageNotification; import org.smslib.Library; import org.smslib.Message.MessageEncodings; import org.smslib.OutboundMessage; import org.smslib.Service; import org.smslib.TimeoutException; import org.smslib.modem.SerialModemGateway; @WebService public class SendMessage { public static Service service; static { try { init(); } catch (Exception e) { e.printStackTrace(); } } public static void init() throws Exception { //配置信息只加载一遍 OutboundNotification outboundNotification = new OutboundNotification(); SerialModemGateway gateway = new SerialModemGateway("modem.com3", "COM3", 115200, "Quectel", "EC20"); gateway.setInbound(true); //设置true,表示该网关可以接收短信,根据需求修改 gateway.setOutbound(true);//设置true,表示该网关可以发送短信,根据需求修改 gateway.setSimPin("0000");//sim卡锁,一般默认为0000或1234 gateway.setSmscNumber("+8613010180500");//短信服务中心号码 service.getInstance().setOutboundMessageNotification(outboundNotification); //发送短信成功后的回调函方法 service.getInstance().addGateway(gateway); //将网关添加到短信猫服务中 service.getInstance().S.SERIAL_POLLING = true; System.out.println("启动服务,进入短信发送就绪状态"); service.getInstance().startService(); //启动服务,进入短信发送就绪状态 } //调用发短信 public void doIt( String phone , String center) throws Exception { OutboundMessage msg = new OutboundMessage(phone, center); //参数1:手机号码 参数2:短信内容 msg.setEncoding(MessageEncodings.ENCUCS2);//这句话是发中文短信必须的 service.getInstance().sendMessage(msg); //执行发送短信 System.out.println("发送成功"); //service.getInstance().stopService(); } /*public static void main(String[] args) { try { doIt("15652194735","123"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/ /* 短信发送成功后,调用该接口。并将发送短信的网关和短信内容对象传给process接口 */ public static class OutboundNotification implements IOutboundMessageNotification { public void process(AGateway gateway, OutboundMessage msg) { System.out.println("短信发送成功!"); System.out.println(msg); } } public static void main(String[] args) { /** * 参数1:服务的发布地址(http://192.168.43.173/SendMsnService) * 参数2:服务的实现者 */ Endpoint.publish("http://192.168.4.52:8080/toSendMsn", new SendMessage()); } }
回帖 ( 0 )