最近刚完成的一个app记录下。
部分代码已传至github上(https://github.com/tywfeng/moniter-public)
需求是使用android设备(手机平板等),通过modbus RTU网络流转发或modbus TCP两种通讯协议实时采集现场数据,并以数值及图表形式在APP中呈现出来。(因为android手机没有串口所以现场设备会将modbus RTU数据使用TCP流转发方式传输至android端,这种流转发数据格式仍使用RTU数据帧格式(非modbus TCP数据帧格式))
开发前查了一些介绍资料,有包括Modbus4Android等多种android modbus库,但是最终还是决定使用JNI+NDK+libmodbus库的方式开发,主要原因:
- 需求中的modbus RTU网络流转发在Modbus4Android库中貌似不支持,因为libmodbus是开源库,所以可以针对需求增加对RTU网络流转发的支持。这是主要原因。
- 考虑到可能会做跨平台支持。
App功能设计上主要有以下几点:
- 数据采集+写值功能
- App前端数值+图表+告警呈现
- 参考组态软件,为增强适用性,随时方便设定采集/写的数据类型(例:bool,byte,short,word,long,dword,float,double,string等)
- 方便后续其他协议扩展(目前扩展了SiemensS7部分)
- 以及一些App前端连接/数据呈现/配置的辅助功能
程序大致流程:
采集:c/c++底层原始数据采集—>根据配置的数据类型解码(包括字节序调整及高低位转换)—>量程变换—>JNI回调至Java层—>存储/数值呈现/图表呈现/告警呈现
写入:将采集流程反向(写入时可区分输入类型:RawHex、SrcValue,ScaledValue等)