Skip to content

Repository files navigation

Modbus4Android

Modbus的Android实现,添加对Android串口(RTU)的支持

APPTCP

不了解Modbus的,可以阅读一下 MODBUS通讯协议

参考

https://github.com/infiniteautomation/modbus4j

https://github.com/zgkxzx/Modbus4Android

使用

添加依赖

allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation('com.github.licheedev:Modbus4Android:3.0.0') {
// 解决"commons-logging"冲突问题
exclude group: 'commons-logging', module: 'commons-logging'
}
}
<manifest ...>
<application ...>
<!-- 解决"commons-logging"冲突问题 -->
<uses-libraryandroid:name="org.apache.http.legacy"android:required="false" />
</application>
</manifest>

创建管理类单例

publicclassModbusManagerextendsModbusWorker {
privatestaticvolatileModbusManagersInstance;
publicstaticModbusManagerget() {
ModbusManagermanager = sInstance;
if (manager == null) {
synchronized (ModbusManager.class) {
manager = sInstance;
if (manager == null) {
manager = newModbusManager();
sInstance = manager;
}
}
}
returnmanager;
}
privateModbusManager() {
}
/** * 释放整个ModbusManager,单例会被置null */publicsynchronizedvoidrelease() {
super.release();
sInstance = null;
}
}

开启设备

ModbusParamparam;
if (mMode == MODE_SERIAL) {
// 串口Stringpath = mDevicePaths[mDeviceIndex];
intbaudrate = mBaudrates[mBaudrateIndex];
mDeviceConfig.updateSerialConfig(path, baudrate);
param = SerialParam.create(path, baudrate) // 串口地址和波特率
.setDataBits(mDataBits) // 数据位
.setParity(mParity) // 校验位
.setStopBits(mStopBits) // 停止位
.setTimeout(1000).setRetries(0); // 不重试
} else {
// TCPStringhost = mEtHost.getText().toString().trim();
intport = 0;
try {
port = Integer.parseInt(mEtPort.getText().toString().trim());
} catch (NumberFormatExceptione) {
//e.printStackTrace();
}
param = TcpParam.create(host, port)
.setTimeout(1000)
.setRetries(0)
.setEncapsulated(false)
.setKeepAlive(true);
}
ModbusManager.get().closeModbusMaster(); // 先关闭一下ModbusManager.get().init(serialParam, newModbusCallback<ModbusMaster>() {
@OverridepublicvoidonSuccess(ModbusMastermodbusMaster) {
showOneToast("打开成功");
}
@OverridepublicvoidonFailure(Throwabletr) {
showOneToast("打开失败");
}
@OverridepublicvoidonFinally() {
// todo updateDeviceSwitchButton();
}
});

可选配置

// 启用rtu的crc校验(默认就启用)ModbusConfig.setEnableRtuCrc(true);
// 打印数据log(默认全禁用)// System.out: MessagingControl.send: 01030000000305cb// System.out: MessagingConnection.read: 010306000100020000bd75ModbusConfig.setEnableDataLog(true, true);

功能码操作示例

普通用法

// 普通写法ModbusManager.get()
.readHoldingRegisters(mSalveId, mOffset, mAmount,
newModbusCallback<ReadHoldingRegistersResponse>() {
@OverridepublicvoidonSuccess(
ReadHoldingRegistersResponsereadHoldingRegistersResponse) {
byte[] data = readHoldingRegistersResponse.getData();
mTvConsole.append("F03读取:" + ByteUtil.bytes2HexStr(data) + "\n");
}
@OverridepublicvoidonFailure(Throwabletr) {
appendError("F03", tr);
}
@OverridepublicvoidonFinally() {
}
});

其他功能码的用法,可以参考Demo的MainActivity.java

RxJava用法(2.0,其他版本按需修改)

复制rxjava相关文件到自己的项目中

// 修改实现方式//public class ModbusManager extends ModbusWorker {}publicclassModbusManagerextendsRxModbusWorker {}
// Rx写法ModbusManager.get()
.rxReadHoldingRegisters(mSalveId, mOffset, mAmount)
.observeOn(AndroidSchedulers.mainThread())
.compose(this.<ReadHoldingRegistersResponse>bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(newModbusObserver<ReadHoldingRegistersResponse>() {
@OverridepublicvoidonSuccess(
ReadHoldingRegistersResponsereadHoldingRegistersResponse) {
byte[] data = readHoldingRegistersResponse.getData();
mTvConsole.append("F03读取:" + ByteUtil.bytes2HexStr(data) + "\n");
}
@OverridepublicvoidonFailure(Throwabletr) {
appendError("F03", tr);
}
});

Kotlin协程用法

复制ModbusWorkers.kt文件到自己的项目中

// 协程写法
lifecycleScope.launch {
try {
val response =ModbusManager.get().awaitReadHoldingRegisters(mSalveId, mOffset, mAmount)
val data:ByteArray= response.data
appendText("F03读取:"+ByteUtil.bytes2HexStr(data) +"\n")
} catch (e:Exception) {
appendError("F03", e)
}
}

截图

F01F02F03F04F05F06F15F16

About

基于modbus4j的Modbus的Android实现,添加对Android串口(RTU)的支持

Resources

Stars

272 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages