簡體   English   中英

套接字獲取輸入流幾次讀取錯誤的值

[英]Socket get input stream reading wrong values few times

我有一個Java Modbus / TCP應用程序,該應用程序不斷從設備讀取數據。

這正常工作99.9%的時間,但是在周末工作后,它可能會以一種奇怪的模式進入,在這種模式下,幾秒鍾后,我的“讀取多個保持寄存器”功能得到了假值。

我已經使用Modscan應用程序進行了檢查,並且虛假值出現在客戶端站點上,這意味着服務器設備正在正確應答。

我可以得到的答案是一個字節數組,填充了0、1和某些其他隨機值。

這是我的Modbus / TCP答案閱讀:

private byte[] getModbusReply(){
    byte[] reply = null;
    int transactionId;
    int protocol;
    int tcpLen;
    int id;

    int replyCode;
    int mbLen = 1;

    try{
        InputStream is = socket.getInputStream();
        transactionId = (is.read()<<8)+is.read();
        protocol = (is.read()<<8)+is.read();
        tcpLen = (is.read()<<8)+is.read();
        id = is.read();
        replyCode = is.read();

        if(replyCode>0x3F){
            mbLen = 1;
        }else{
            switch(replyCode){
            case 0x03:
            case 0x04:
                mbLen = is.read();
                break;
            case 0x10:
            case 0x06:
                mbLen = 4;
                break;
            default://unsupported Modbus Methods
                return null;
            }
        }

        reply = new byte[mbLen+1];
        reply[0] = (byte)replyCode;
        for(int i=1;i<reply.length;i++){
            int res=is.read();
            if(res<0){
                //Modbus Stream Reading is returning -1
                return null;
            }
            reply[i] = (byte)res;
        }

    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
    return reply;
}

返回null將在函數外部作為錯誤異常處理。

我添加了2個保護措施:

  • read()方法在EOF之后返回-1,因此我添加:

      int res=is.read(); if(res<0){ //Modbus Stream Reading is returning -1 return null; } 
  • 對於不受支持的Modbus / TCP方法,返回null:

      default:///unsupported Modbus Methods return null; 

也許我在流閱讀中缺少更多我沒有保護的東西。

  1. 僅在出現錯誤或收到不了解的內容時僅返回null並不足夠。 這樣,您只是使連接處於打開狀態並且處於非同步狀態,因此您沒有理由相信下一個字節是新消息的開頭。 因此,從那時起,您將閱讀難以理解的垃圾。 您需要關閉連接並重新打開它。 或者,實施協議的其余部分。

  2. 您不會從流水線中讀取的十個點中的九點檢查流的結束。

  3. 您還應該對DataInputStream有所了解。 它已經完成了您已經很難完成的所有工作。 特別要注意readShort()readFully()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM