• Stars
    star
    221
  • Rank 179,773 (Top 4 %)
  • Language
    Java
  • Created over 5 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

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

Modbus4Android

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

APP TCP

不了解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:2.0.2'
}

创建管理类单例

public class ModbusManager extends ModbusWorker {

    private static volatile ModbusManager sInstance;

    public static ModbusManager get() {
        ModbusManager manager = sInstance;
        if (manager == null) {
            synchronized (ModbusManager.class) {
                manager = sInstance;
                if (manager == null) {
                    manager = new ModbusManager();
                    sInstance = manager;
                }
            }
        }
        return manager;
    }

    private ModbusManager() {
    }

    /**
     * 释放整个ModbusManager,单例会被置null
     */
    public synchronized void release() {
        super.release();
        sInstance = null;
    }
}

开启设备

ModbusParam param;

if (mMode == MODE_SERIAL) {
    // 串口
    String path = mDevicePaths[mDeviceIndex];
    int baudrate = mBaudrates[mBaudrateIndex];

    mDeviceConfig.updateSerialConfig(path, baudrate);
    param = SerialParam.create(path, baudrate) // 串口地址和波特率
        .setDataBits(mDataBits) // 数据位
        .setParity(mParity) // 校验位
        .setStopBits(mStopBits) // 停止位
        .setTimeout(1000).setRetries(0); // 不重试
} else {
    // TCP
    String host = mEtHost.getText().toString().trim();
    int port = 0;
    try {
        port = Integer.parseInt(mEtPort.getText().toString().trim());
    } catch (NumberFormatException e) {
        //e.printStackTrace();
    }
    param = TcpParam.create(host, port)
        .setTimeout(1000)
        .setRetries(0)
        .setEncapsulated(false)
        .setKeepAlive(true);
}

ModbusManager.get().closeModbusMaster(); // 先关闭一下
ModbusManager.get().init(serialParam, new ModbusCallback<ModbusMaster>() {
    @Override
    public void onSuccess(ModbusMaster modbusMaster) {
        showOneToast("打开成功");
    }

    @Override
    public void onFailure(Throwable tr) {
        showOneToast("打开失败");
    }

    @Override
    public void onFinally() {
        // todo updateDeviceSwitchButton();
    }
});

可选配置

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

功能码操作示例

// 普通写法
ModbusManager.get()
    .readHoldingRegisters(mSalveId, mOffset, mAmount,
        new ModbusCallback<ReadHoldingRegistersResponse>() {
            @Override
            public void onSuccess(
                ReadHoldingRegistersResponse readHoldingRegistersResponse) {
                byte[] data = readHoldingRegistersResponse.getData();
                mTvConsole.append("F03读取:" + ByteUtil.bytes2HexStr(data) + "\n");
            }

            @Override
            public void onFailure(Throwable tr) {
                appendError("F03", tr);
            }

            @Override
            public void onFinally() {

            }
        });

// Rx写法
ModbusManager.get()
    .rxReadHoldingRegisters(mSalveId, mOffset, mAmount)
    .observeOn(AndroidSchedulers.mainThread())
    .compose(this.<ReadHoldingRegistersResponse>bindUntilEvent(ActivityEvent.DESTROY))
    .subscribe(new ModbusObserver<ReadHoldingRegistersResponse>() {
        @Override
        public void onSuccess(
            ReadHoldingRegistersResponse readHoldingRegistersResponse) {
            byte[] data = readHoldingRegistersResponse.getData();
            mTvConsole.append("F03读取:" + ByteUtil.bytes2HexStr(data) + "\n");
        }

        @Override
        public void onFailure(Throwable tr) {
            appendError("F03", tr);
        }
    });

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

截图

F01 F02 F03 F04 F05 F06 F15 F16

More Repositories

1

Android-SerialPort-API

Fork自Google开源的Android串口通信Demo,修改成Android Studio项目
Java
1,096
star
2

Android-SerialPort-Tool

Android串口调试助手
Java
602
star
3

SerialWorker

Android串口库的进一步封装,简化线程方面的管理。你只需要关注如何实现硬件协议。
Java
79
star
4

CommonSize

Android通用屏幕适配方案
Java
53
star
5

Custom-Glide-ModelLoader-Demo

自定义Glide ModelLoader,直接通过特定类型的数据源来加载图片
Java
49
star
6

SmallestWidthDimens

Android SmallestWidth屏幕适配方案
Java
18
star
7

AdaptScreen

屏幕适配工具,增加了适配较长/较短边功能。修改自 https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md#adaptscreen-%E7%9B%B8%E5%85%B3---adaptscreenutilsjava---demo
Java
16
star
8

BlurViewDemo

实现高斯模糊控件
Java
12
star
9

Android_Studio_Useful_Keymap_on_Win_and_macOS

Andorid Studio常用快捷键(Windows macOS双平台对比)
9
star
10

FindSerialPortTool

找出哪个串口能用
Kotlin
7
star
11

MessageSend

一个聊天输入框。
Java
3
star
12

Handle-IM-APP-IME-Demo

处理即时通信应用,底部“功能区”与“软键盘”的展示逻辑
Java
3
star
13

IME-Quick-Setting

状态栏增加一个快速切换输入法的开关
Java
1
star
14

Glide-Issue

Java
1
star
15

hexo-theme-lightgreen

Personal Hexo Theme
CSS
1
star
16

MyOkhttpLoggingInterceptor

自定义Okhttp日志拦截器
Kotlin
1
star
17

alfred-env-workflow

Alfred 3 Workflow——加载环境变量并运行mac应用,解决mac上直接运行app,出现找不到环境变量,找不到文件或命令的问题。
1
star
18

LiveDataExtension

基于LiveData的一些扩展类。解决LiveData数据倒灌,提供类似onSuccss、onFailure等多状态异步回调方法。
Kotlin
1
star
19

licheetec.com

老博客地址,新地址为 http://www.licheedev.com
1
star
20

licheedev.github.io

我的博客
HTML
1
star
21

RM2100-Padavan-build

Padavan 自动编译
1
star