MINA框架中的Serial串列埠通訊

2021-06-29 05:15:42 字數 1962 閱讀 7329

由於我原先使用過rxtx做過串列埠開發測試,環境並無問題,windows7 64位下建立了兩個虛擬串列埠用於串列埠除錯,linux下也是使用xgcom串列埠除錯工具,其環境問題不在贅述。

slf4j: failed to load class 「org.slf4j.impl.staticloggerbinder」.

slf4j: defaulting to no-operation (nop) logger implementation

slf4j: see for further details.

解決方法可參考另一博文:

下面即可開始serial通訊開發,根據官網介紹,串列埠開發只有客戶端,不存在服務端**,即:

ioconnector connector = new serialconnector();

//新增資料解析filter

connector.getfilterchain().addlast("codec", new protocolcodecfilter(new messagecodecfactory()));

//新增事件處理handler

connector.sethandler(new serialhandler());

serialaddress portaddress = new serialaddress("com1", 9600, databits.databits_8, stopbits.bits_1, parity.none, flowcontrol.none);

connectfuture future = connector.connect(portaddress);

future.await();

iosession session = future.getsession();

session.write("00");

這裡除部分serial位址設定方法不同外,其餘與mina框架客戶端開發並無不同,編寫自己的處理方法即可,不了解mina框架的處理方式可參考另一篇博文

串列埠通訊的注意點:

1.需正確新增serialaddress引數值,可參考rxtx中的串列埠獲得。

2.在我測試的串列埠通訊中,原先使用的textlinecodecfactory filter並不適用,原因為串列埠通訊中多數使用指定協議(如modbus協議),使用byte傳輸16進製制命令,形如「01 03 00 01 00 01 d5 ca」。

可使用自定義iofilter用於資料的編碼和解碼:

定義編碼工廠類:

public

class

messagecodecfactory

implements

protocolcodecfactory

@override

public protocoldecoder getdecoder(iosession session) throws exception

@override

public protocolencoder getencoder(iosession session) throws exception

}

編碼器(向串列埠傳送資料時的資料編碼加工):

public class messageencoder extends protocolencoderadapter 

}}

解碼器(接收串列埠資料時的資料解碼加工):

public class messagedecoder extends cumulativeprotocoldecoder ", byteutil.tohexstring(input));

...out.write(...);

...return true;

}return false;

}

具體處理按照專案要求,不再貼詳細**

使用mina框架記憶體溢位的問題

第一次寫部落格,也不知道怎麼寫好,就簡單說說我使用mina框架的時候存在的問題以及解決辦法吧。第一次簡單的使用mina框架,業務也不難,可是每當socket連線增多,就會造成記憶體和cpu使用大幅度地增長,整個服務速度變慢,http請求也變慢了。而且記憶體下降速度極慢。重啟tomcat後又恢復正常。...

Mina中的粘包處理

mina框架雖然已經老了,不過還是比較常用的,遇到解碼粘包問題時,就需要繼承乙個特定的解碼器了 cumulativeprotocoldecoder。顧名思義,這個解碼器本身就是作為累積資料用的,為什麼這麼說呢?因為 在decode 方法返回false時,此解碼器會把接收到的資料累積性地快取至iobu...

用MINA開發中遇到的問題

connectfuture connfuture connector.connect new inetsocketaddress 192.168.0.1 12315 發生連線異常時該行不會拋異常 connfuture.awaituninterruptibly 1000 如果不加這句,則連線異常時ge...