cordova插件开发(引用第三方jar包)

本文以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 找不到异常。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_Home

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值