由於我原先使用過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...