赞
踩
公司最近做一款固定资产盘点的项目,需要使用RFID进行盘点操作。结合硬件,RFID终端使用的是一款DT50U的扫描终端,可以进行RFID扫描识别。这就要求我们去对接相关的硬件SDK。DT50U使用的是Android系统,我们开发则使用uniapp进行了业务功能的书写。uniapp如果想要使用RFID功能则必须得进行原生插件的开发。
由于没有接触过原生插件开发的内容,首先参考文档去看了uniapp原生插件开发的内容,按照教程去开发了一遍。测试的时候,相对比较麻烦,需要先进行原生工程代码开发,然后再去打包uniapp,应用到示例工程,然后去调试,最终也没有调试成功。尝试失败。经过各种查看官网文档学习,最终选择了使用uts插件开发,经过不懈的努力,最终成功将插件开发完成。
uts,全称 uni type script,是一门跨平台的、高性能的、强类型的现代编程语言。
它可以被编译为不同平台的编程语言,如:
uts 采用了与 ts 基本一致的语法规范,支持绝大部分 ES6 API。但为了跨端,uts进行了一些约束和特定平台的增补。具体语法可以参考uniapp 官方网站进行查看学习。
统一了编程语言(uts),一种语言开发所有平台,真正大前端。
统一了开发工具(HBuilderX),免除搭建复杂的原生开发环境。
插件封装中要理解的概念更少。 传统原生语言插件需要在js和原生层处理通信,使用各种特殊转换,使用特殊语法导入,注意事项很多。uts统一为纯前端概念,简单清晰。
uts 下前端和原生可以统一在 HBuilderX 中联调。而传统原生语言插件需要在多个开发工具间切换,联调复杂。
创建一个uniapp工程 ,至于如何创建这里不再介绍,可以去uniapp学习下
工程创建完成后,确保可以正常编译,可以先用浏览器进行测试运行效果。
创建uts插件
在 uni-app 的项目工程下,提供了独立的目录 utssdk,来存放 uts 插件。当然官方更推荐使用 uni_modules 方式,这是更好的包管理方案。首先确保项目根目录存在 uni_modules 文件夹,如果不存在,需要手动创建一个。
右键uni_modules 选择新建uni_modules
选择uts插件 ,填写名称等信息就会在uni_modules下生成uts-rfid的文件夹。
生成文件的目录结构
其中package.json记录了插件的信息以及版本号
下边是我的结构,和官方有点差别,因为我这边只需要Android的内容。
此处需要注意的是.so 文件的使用,可以具体参考uts官方写法,配置config文件,以及abi目录结构的使用。
至此,插件就已经创建成功,接下来就需要写入我们自己的业务逻辑在里边。
import { UTSAndroid } from "io.dcloud.uts";
const uniActiivity = UTSAndroid.getUniActivity()
const context = UTSAndroid.getAppContext();
import USDKManager from "com.ubx.usdk.USDKManager";
import RfidManager from "com.ubx.usdk.rfid.RfidManager";
import IRfidCallback from "com.ubx.usdk.rfid.aidl.IRfidCallback";
import QueryMode from "com.ubx.usdk.util.QueryMode";
import SoundTool from "com.ubx.usdk.util.SoundTool";
export function initRfid(callBack: Callback) {
initCallBack = callBack;
SoundTool.getInstance(context);
USDKManager.getInstance().init(context,new InitRfidListener());
}
/** * 注册盘存监听 */ class InventoryRfidListener implements IRfidCallback { override onInventoryTag(epc:string,tid:string,rsssid:string):void{ if(tagListener != null) { tagListener!.result({ epc:epc, tid:tid, rssid:rsssid }); } } override onInventoryTagEnd():void { } }
export function test1(a:string):string{
return "这是一个测试方法"+a
}
/**
*我们可以定义一个返回类型
*/
type Callback = {
result: (res:string) => void;
};
/*
*然后再需要返回的地方进行引用
*/
export function test2(callback:Callback){
callback.result("测试返回");
}
import * as UTSRfid from "../../../../uni_modules/uts-rfid";
/**
* 非异步返回情况
*/
console.log(UTSRfid.test1('非异步返回'));
/**
*异步返回
*/
UTSRfid.test2({
result: (msg) => {
console.log(msg)
})
import { UTSAndroid } from "io.dcloud.uts"; import USDKManager from "com.ubx.usdk.USDKManager"; import RfidManager from "com.ubx.usdk.rfid.RfidManager"; import IRfidCallback from "com.ubx.usdk.rfid.aidl.IRfidCallback"; import QueryMode from "com.ubx.usdk.util.QueryMode"; import SoundTool from "com.ubx.usdk.util.SoundTool"; type Callback = { result: (res:string) => void; }; type InventoryCallback = { result: (data:object) => void; }; const power: Byte = 30; const context = UTSAndroid.getAppContext(); let mRfidManager:RfidManager | null = null; let initCallBack: Callback | null = null; let tagListener: InventoryCallback | null = null; export function initRfid(callBack: Callback) { initCallBack = callBack; SoundTool.getInstance(context); USDKManager.getInstance().init(context,new InitRfidListener()); } export function listenInventoryTags(callback: InventoryCallback){ tagListener = callback; if(mRfidManager != null) { mRfidManager!.registerCallback(new InventoryRfidListener()); } } /** * 销毁实例 */ export function destroyRfid(callback:Callback){ SoundTool.getInstance(context).release(); if(mRfidManager!=null){ mRfidManager!.disConnect(); mRfidManager!.release(); } callback.result("设备实例销毁"); } /** * 开始盘存 */ export function startInventory(callback:Callback){ let btNumber: Byte = 0; if (mRfidManager != null){ mRfidManager!.startInventory(btNumber); callback.result("开始盘存"); }else{ callback.result("盘存失败,当前设备未初始化,如需使用请先进行初始化"); } } /** * 停止盘存 */ export function stopInventory(callback:Callback){ if (mRfidManager!=null){ mRfidManager!.stopInventory(); callback.result("停止盘存"); }else{ callback.result("当前设备未初始化,无需进行停止,如需使用请先进行初始化"); } } /** * 测试交互联通方法 */ export function testRfidH5(callback:Callback){ callback.result("测试成功,UTS插件可联通"); } /** * 初始化设备监听 */ class InitRfidListener implements USDKManager.InitListener { override onStatus(status:USDKManager.STATUS):void{ if (status == USDKManager.STATUS.SUCCESS){ mRfidManager = USDKManager.getInstance().getRfidManager(); if(mRfidManager != null) { mRfidManager!.setOutputPower(power); mRfidManager!.setQueryMode(QueryMode.EPC_TID); mRfidManager!.setScanInterval(5000); if(initCallBack != null) { initCallBack!.result("Rfid模块初始化成功"); } }else{ if(initCallBack != null) { initCallBack!.result("Rfid模块初始化失败"); } } }else{ if(initCallBack != null) { initCallBack!.result("Rfid模块初始化失败"); } } } }; /** * 注册盘存监听 */ class InventoryRfidListener implements IRfidCallback { override onInventoryTag(epc:string,tid:string,rsssid:string):void{ if(tagListener != null) { tagListener!.result({ epc:epc, tid:tid, rssid:rsssid }); } } override onInventoryTagEnd():void { } }
插件开发完成后,可以通过Hbuildx进行插件发布,填写插件的相关信息。插件发布之后,你就可以在任意项目中去下载安装使用插件了。当然uts开发的原生插件是不支持收费的。
https://ext.dcloud.net.cn/plugin?id=11245
插件地址中加入了示例工程,大家可以参考学习,如果写的不完善的地方也可以评论指正,共同学习。
也可以学习下官方的DEMO工程: https://gitcode.net/dcloud/hello-uts
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。