0

我正在开发一个 Java 应用程序来使用 USB 调制解调器发送短信(我的是华为 E173)。我尝试了 SMSLib,它的示例代码成功发送了短信。但是当它连接到互联网时,它会给出异常

org.smslib.GatewayException: Comm library exception: java.lang.RuntimeException: javax.comm.PortInUseException: Port currently owned by Unknown Windows Application
    at org.smslib.modem.SerialModemDriver.connectPort(SerialModemDriver.java:102)
    at org.smslib.modem.AModemDriver.connect(AModemDriver.java:114)
    at org.smslib.modem.ModemGateway.startGateway(ModemGateway.java:189)
    at org.smslib.Service$1Starter.run(Service.java:277)

有没有办法在连接到互联网时发送短信?我是否必须通过我的 Java 应用程序本身建立连接,如果需要,如何建立?

编辑:这是我发送短信的完整代码(从 smslib.org 下载,我更改了 SMSC 号码和发件人号码)

// SendMessage.java - Sample application.
//
// This application shows you the basic procedure for sending messages.
// You will find how to send synchronous and asynchronous messages.
//
// For asynchronous dispatch, the example application sets a callback
// notification, to see what's happened with messages.

package sms;

import org.smslib.AGateway;
import org.smslib.IOutboundMessageNotification;
import org.smslib.Library;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;

public class SendMessage
{
        public void doIt() throws Exception
        {
                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());
                SerialModemGateway gateway = new SerialModemGateway("modem.com3", "COM3", 115200, "Huawei", "");
                gateway.setInbound(true);
                gateway.setOutbound(true);
                gateway.setSimPin("0000");
                // Explicit SMSC address set is required for some modems.
                // Below is for VODAFONE GREECE - be sure to set your own!
                gateway.setSmscNumber("+947500001");
                Service.getInstance().setOutboundMessageNotification(outboundNotification);
                Service.getInstance().addGateway(gateway);
                Service.getInstance().startService();
                System.out.println();
                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() + " dBm");
                System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");
                System.out.println();
                // Send a message synchronously.
                OutboundMessage msg = new OutboundMessage("0094757599108", "Hello from SMSLib!");
                Service.getInstance().sendMessage(msg);
                System.out.println(msg);
                // Or, send out a WAP SI message.
                //OutboundWapSIMessage wapMsg = new OutboundWapSIMessage("306974000000",  new URL("http://www.smslib.org/"), "Visit SMSLib now!");
                //Service.getInstance().sendMessage(wapMsg);
                //System.out.println(wapMsg);
                // You can also queue some asynchronous messages to see how the callbacks
                // are called...
                //msg = new OutboundMessage("309999999999", "Wrong number!");
                //srv.queueMessage(msg, gateway.getGatewayId());
                //msg = new OutboundMessage("308888888888", "Wrong number!");
                //srv.queueMessage(msg, gateway.getGatewayId());
                System.out.println("Now Sleeping - Hit <enter> to terminate.");
                System.in.read();
                Service.getInstance().stopService();
        }

        public class OutboundNotification implements IOutboundMessageNotification
        {
                public void process(AGateway gateway, OutboundMessage msg)
                {
                        System.out.println("Outbound handler called from Gateway: " + gateway.getGatewayId());
                        System.out.println(msg);
                }
        }

        public static void main(String args[])
        {
                SendMessage app = new SendMessage();
                try
                {
                        app.doIt();
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
        }
}
4

1 回答 1

1

如果调制解调器正在用于“连接到 Internet”,则已经有一个电话正在进行中。然后你不能用它来拨打第二个号码来发送短信。可能的解决方案:

  1. 使用不同的方法连接到互联网,释放调制解调器
  2. 获得第二条电话线和第二个调制解调器
  3. 使用电子邮件到 SMS 服务并通过 Internet 通过电子邮件发送消息。例如,对于 AT&T,您可以向 [phone-number]@txt.att.net 发送电子邮件以向手机发送 SMS。

如果您正在尝试专门调试通过调制解调器发送 SMS 的程序,那么选项 1 或 2 可能是唯一的解决方案。

于 2013-09-03T06:18:45.723 回答