2013-02-20 67 views
1

我編寫了一個程序使用applet通過rxtxComm.jar訪問串口,我更改了java.policy,這樣applet就可以訪問串口而無需簽名。當程序運行在 窗口時,它是有效的。但在Ubuntu上有一些執行(java.lang.reflect.InvocationTargetException和「npobject上的錯誤調用方法」)。爲了解決這個問題,我花了很多次到谷歌,我無法解決。是否有人有同樣的問題?這裏是關於這個程序的代碼。如何使用applet通過rxtxComm.jar發送數據到串口在ubuntu上

print.html

function print() { 
    var zplText = $("#zplText").val(); 
    document.printApplet.print(zplText); 
} 



<textarea rows="5" cols="6" id="zplText"></textarea> 
<a href="#" onClick="print()">print</a> 
<applet id="printApplet" alt="" codebase=.. code="zpl/ZplPrint.class"> 
    <PARAM NAME="archive" VALUE="../lib/RXTXcomm.jar"> 
</applet> 

ZplPrint.java

public class ZplPrint extends Applet { 
static String zpl; 
static CommPortIdentifier portId; 
static CommPort commPort; 
static SerialPort serialPort; 
@SuppressWarnings("rawtypes") 
static Enumeration portList; 
static OutputStream out; 

public void print(String zplText) { 
    zpl = zplText; 
    if (zpl == null) { 
     return; 
    } 
    byte[] zplByte = zpl.getBytes(); 

    portList = CommPortIdentifier.getPortIdentifiers(); 
    while (portList.hasMoreElements()) { 
     portId = (CommPortIdentifier) portList.nextElement(); 
     if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 

      try { 

       commPort = portId.open(portId.getName(), 2000); 
       serialPort = (SerialPort) commPort; 

       serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, 
         SerialPort.PARITY_NONE); 
       out = serialPort.getOutputStream(); 
       out.write(zplByte); 
       commPort.close(); 
      } catch (PortInUseException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedCommOperationException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 

      System.out.println("Find CommPort: " + portId.getName()); 
     } 
    } 

} 

的java.policy

  • 許可java.lang.RuntimePermission「 loadLibrary.rxtxSerial「;
  • permission java.io.FilePermission「$ {java.home} $ {/} lib $ {/} ext $ {/} x86 $ {/} rxtxSerial.dll」,「read」;
  • permission java.util.PropertyPermission「gnu.io.log.mode」,「read」;
  • permission java.util.PropertyPermission「gnu.io.SerialPorts」,「write,read」;
  • permission java.util.PropertyPermission「gnu.io.rxtx.SerialPorts」,「read,write」;
  • permission java.util.PropertyPermission「gnu.io.ParallelPorts」,「read」;
  • permission java.util.PropertyPermission「gnu.io.rxtx.ParallelPorts」,「read」;
  • permission java.lang.RuntimePermission「modifyThreadGroup」;
  • permission java.lang.RuntimePermission「modifyThread」;

的第一行和第二距離的ubuntu,當ubuntu的不同的是:

  • 許可java.lang.RuntimePermission 「loadLibrary.librxtxSerial」;
  • permission java.io.FilePermission「$ {java.home} $ {/} lib $ {/} amd64 $ {/} librxtxSerial.so」,「read」;
+0

*「我改變的java.policy,所以小程序訪問串口沒有簽署」 *鑑於你不能改變用戶機(S)的政策文件,建議對部署該應用程序的唯一可行辦法。是數字簽名的。 – 2013-02-21 11:50:09

+0

感謝您的建議。因爲該程序僅在我們公司的少量PC上運行,而簽名則很麻煩。 – htwj1998 2013-02-22 01:15:49

回答

1

我已經解決了我自己。

permission java.lang.RuntimePermission "loadLibrary.rxtxSerial"; 

    permission java.io.FilePermission "${java.home}${/}lib${/}ext${/}amd64${/}librxtxSerial.so", "read"; 

    permission java.io.FilePermission "${java.home}${/}lib${/}ext${/}librxtxSerial.so", "read"; 

    permission java.io.FilePermission "${/}dev", "read"; 

    permission java.util.PropertyPermission "gnu.io.log.mode", "read"; 

    permission java.util.PropertyPermission "gnu.io.SerialPorts", "write,read"; 

    permission java.util.PropertyPermission "gnu.io.rxtx.SerialPorts", "read,write"; 

    permission java.util.PropertyPermission "gnu.io.ParallelPorts", "read"; 

    permission java.util.PropertyPermission "gnu.io.rxtx.ParallelPorts", "read"; 

    permission java.lang.RuntimePermission "modifyThreadGroup"; 

    permission java.lang.RuntimePermission "modifyThread";