本文以modbus为例。
1.新建项目,添加android平台。
plugman create --name [插件名] --plugin_id [插件id] --plugin_version [插件版本]
plugman create --name testPluginDemo --plugin_id cordova-plugin-testPlugin --plugin_version 1.0.0
plugman platform add --platform_name android
2.在plugin.xml文件中添加如下内容:
<?xml version='1.0' encoding='utf-8'?>
<plugin id="cordova-plugin-testPlugin" version="1.0.0"
xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>testPluginDemo</name>
<!-- js调用模块:src 为调用插件的js文件路径 -->
<js-module name="testPluginDemo" src="www/testPluginDemo.js">
<!-- target 为插件安装后的调用方法前缀,如:cordova.plugins.testPluginDemo.[插件方法名] -->
<!-- <clobbers target="cordova.plugins.testPluginDemo" /> -->
<!-- 可以自定义,调用时:testPluginDemo.[插件方法名] -->
<clobbers target="testPluginDemo" />
</js-module>
<!-- android 环境配置项 -->
<platform name="android">
<!-- 插件配置 target为插件安装时,cordova项目android环境配置文件的位置 -->
<!-- 插件安装时会将 config-file 标签中的内容添加到res/xml/config.xml 文件中 -->
<config-file parent="/*" target="res/xml/config.xml">
<!-- name 为对应 www/testPluginDemo.js文件中的调用名称 -->
<feature name="testPluginDemo">
<!-- value 为插件安装到项目中后 testPluginDemo.java文件路径,即:包路径 -->
<!-- 此处修改一下,将其改为通用cordova插件的安装目录 -->
<!-- 没改之前的: -->
<!-- <param name="android-package" value="cordova-plugin-testPluginDemo.testPluginDemo" /> -->
<param name="android-package" value="org.apache.cordova.testPluginDemo.testPluginDemo" />
</feature>
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest">
<uses-permission android:name="android.permission.INTERNET"/>
</config-file>
<!-- src 为插件目录中java源文件路径,target-dir为插件安装到项目中后源文件路径 -->
<source-file src="src/android/testPluginDemo.java" target-dir="src/org/apache/cordova/testPluginDemo" />
<source-file src="src/android/modbus4j-3.0.3.jar" target-dir="libs"/>
<source-file src="src/android/Modbus4jUtils.java" target-dir="src/org/apache/cordova/testPluginDemo"/>
<source-file src="src/android/Modbus4jWriteUtils.java" target-dir="src/org/apache/cordova/testPluginDemo"/>
</platform>
</plugin>
3.项目中引入modbus4j.jar,在src/android目录下
testPluginDemo.js内容如下:
var exec = require('cordova/exec');
//exports.showToast 的showToast为插件安装后 js调用的方法名,其中传递的参数可以为任意多个
exports.modbus = function(arg0,success,error){
// success error 为成功回调 失败回调
// testPluginDemo 为 plugin.xml中配置的feature的name名
// 参数中的"showToast" 给testPluginDemo.java 判断的action参数
//[arg0] 参数是一个
//arg0 参数是多个 传参这样传过来["a",1]
//[] 无参数
exec(success,error,'testPluginDemo','modbus',arg0);
}
4. testPluginDemo.java内容如下
//注意:包名必须写,不写不能正常调用
package org.apache.cordova.testPluginDemo;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import android.content.Context;
import android.util.Log;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.PluginResult;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.exception.ErrorResponseException;
/**
* This class echoes a string called from JavaScript.
*/
public class testPluginDemo extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("modbus")) {
this.modbus(callbackContext);
return true;
}
return false;
}
public ModbusMaster master;
private void modbus(CallbackContext callbackContext) {
try {
master = Modbus4jUtils.getMaster("192.168.10.71", 502);
Boolean result = Modbus4jUtils.readCoilStatus(master, 1, 0);
callbackContext.success("modbus结果(成功):" + String.valueOf(result));
} catch (ModbusInitException e) {
e.printStackTrace();
}catch (ModbusTransportException e) {
e.printStackTrace();
} catch (ErrorResponseException e) {
e.printStackTrace();
}
}
}
5.Modbus4jUtils.java 内容如下:
package org.apache.cordova.testPluginDemo;
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import java.util.ArrayList;
public class Modbus4jUtils {
/**
* 工厂。
*/
static ModbusFactory modbusFactory;
static {
if (modbusFactory == null) {
modbusFactory = new ModbusFactory();
}
}
/**
* 获取master
*
* @return
* @throws ModbusInitException
*/
public static ModbusMaster getMaster(String host, int port) throws ModbusInitException {
IpParameters params = new IpParameters();
params.setHost(host);
params.setPort(port);
//
// modbusFactory.createRtuMaster(wapper); //RTU 协议
// modbusFactory.createUdpMaster(params);//UDP 协议
// modbusFactory.createAsciiMaster(wrapper);//ASCII 协议
ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议
master.init();
return master;
}
/**
* 读取[01 Coil Status 0x]类型 开关数据
*
* @param slaveId slaveId
* @param offset 位置
* @return 读取值
* @throws ModbusTransportException 异常
* @throws ErrorResponseException 异常
* @throws ModbusInitException 异常
*/
public static Boolean readCoilStatus(ModbusMaster master, int slaveId, int offset)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 01 Coil Status
BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset);
Boolean value = master.getValue(loc);
return value;
}
/**
* 读取[02 Input Status 1x]类型 开关数据
*
* @param slaveId
* @param offset
* @return
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static Boolean readInputStatus(ModbusMaster master, int slaveId, int offset) throws ModbusTransportException, ErrorResponseException {
// 02 Input Status
BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);
Boolean value = master.getValue(loc);
return value;
}
/**
* 读取[03 Holding Register类型 2x]模拟量数据
*
* @param slaveId slave Id
* @param offset 位置
* @param dataType 数据类型,来自com.serotonin.modbus4j.code.DataType
* @return
* @throws ModbusTransportException 异常
* @throws ErrorResponseException 异常
* @throws ModbusInitException 异常
*/
public static Number readHoldingRegister(ModbusMaster master, int slaveId, int offset, int dataType)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 03 Holding Register类型数据读取
BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
Number value = master.getValue(loc);
return value;
}
/**
* 读取[04 Input Registers 3x]类型 模拟量数据
*
* @param slaveId slaveId
* @param offset 位置
* @param dataType 数据类型,来自com.serotonin.modbus4j.code.DataType
* @return 返回结果
* @throws ModbusTransportException 异常
* @throws ErrorResponseException 异常
* @throws ModbusInitException 异常
*/
public static Number readInputRegisters(ModbusMaster master, int slaveId, int offset, int dataType)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 04 Input Registers类型数据读取
BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);
Number value = master.getValue(loc);
return value;
}
/**
* 批量读取使用方法
*
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static void batchRead(ModbusMaster master, ArrayList data) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
BatchRead<Integer> batch = new BatchRead<Integer>();
batch.addLocator(0, BaseLocator.holdingRegister(1, 1, DataType.FOUR_BYTE_FLOAT));
batch.addLocator(1, BaseLocator.inputStatus(1, 0));
batch.setContiguousRequests(false);
BatchResults<Integer> results = master.send(batch);
System.out.println(results.getValue(0));
System.out.println(results.getValue(1));
}
}
注:
要引用org.apache.commons.lang3包
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
否则调用modbus读取(03)方法,会出现org.apache.commons.lang3.ArrayUtils 找不到异常。