我正在使用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。除非没有其他选择。
答案 0 :(得分:0)
结束为Android编写自己的Modbus RTU包装器。它的基本实现可以在这里找到:https://github.com/dh-28/ModbusRtuConnect