在Android上获取CommPortIdentifier的实例

时间:2017-05-15 09:01:14

标签: java android modbus securitymanager

我正在使用Jamod 1.2在Android设备和PLC之间建立Modbus TCP连接。一切都很好,直到我被要求迁移到Modbus RTU(通过USB连接)。 Jamod有可以使用Modbus RTU的课程,但我遇到了一个特定的问题。 要建立Modbus RTU连接,必须进行以下简单操作:

SerialParameters params = new SerialParameters();
params.setPortName(portname);
...
SerialConnection connection = new SerialConnection(params);
connection.open();

但由于以下障碍,连接无法打开:

public class SerialConnection implements SerialPortEventListener {
    ...
    public void open() throws Exception {
            try {
                this.m_PortIdentifier = CommPortIdentifier.getPortIdentifier(this.m_Parameters.getPortName());
            } catch (NoSuchPortException var2) {
                if(Modbus.debug) {
                    System.out.println(var2.getMessage());
                }

                throw new Exception(var2.getMessage());
            }
    ...
    }
...
}

这里的lib试图用静态方法CommPortIdentifier.getPortIdentifier(String portname)获取CommPortIdentifier的实例。更进一步:

public class CommPortIdentifier {
    public static CommPortIdentifier getPortIdentifier(String var0) throws NoSuchPortException {
        SecurityManager var1 = System.getSecurityManager();
        if(var1 != null) {
            var1.checkDelete(propfilename);
        }
    ...
    }
...
}

这是邪恶的根源 - System.getSecurityManager()。它总是在Android中返回null。 official doc

最后,问题:有没有办法在Android上生成CommPortIdentifier?或者可能有人可以想到问题的另一种解决方案?

P.S。我想避免用其他东西替换Jamod或者编写我自己的Modbus RTU包装器,因为很多代码都依赖于lib。除非没有其他选择。

1 个答案:

答案 0 :(得分:0)

结束为Android编写自己的Modbus RTU包装器。它的基本实现可以在这里找到:https://github.com/dh-28/ModbusRtuConnect