UTS编写RFID插件

一、背景介绍

公司最近做一款固定资产盘点的项目,需要使用RFID进行盘点操作。结合硬件,RFID终端使用的是一款DT50U的扫描终端,可以进行RFID扫描识别。这就要求我们去对接相关的硬件SDK。DT50U使用的是Android系统,我们开发则使用uniapp进行了业务功能的书写。uniapp如果想要使用RFID功能则必须得进行原生插件的开发。
由于没有接触过原生插件开发的内容,首先参考文档去看了uniapp原生插件开发的内容,按照教程去开发了一遍。测试的时候,相对比较麻烦,需要先进行原生工程代码开发,然后再去打包uniapp,应用到示例工程,然后去调试,最终也没有调试成功。尝试失败。经过各种查看官网文档学习,最终选择了使用uts插件开发,经过不懈的努力,最终成功将插件开发完成。

二、UTS介绍

uts 是什么 ?

uts,全称 uni type script,是一门跨平台的、高性能的、强类型的现代编程语言。
它可以被编译为不同平台的编程语言,如:

  • web平台,编译为JavaScript
  • Android平台,编译为Kotlin
  • iOS平台,编译Swift

uts 采用了与 ts 基本一致的语法规范,支持绝大部分 ES6 API。但为了跨端,uts进行了一些约束和特定平台的增补。具体语法可以参考uniapp 官方网站进行查看学习。

uts插件调用原理

在这里插入图片描述

uts插件和原生插件的区别

在这里插入图片描述

uts插件的优势:

统一了编程语言(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目录结构的使用。

  • 至此,插件就已经创建成功,接下来就需要写入我们自己的业务逻辑在里边。

四、原生业务逻辑的写法

  • 我们可以通过下边这个引入 UTSAndroid来获取上下文 对应Android中的Context或者
import { UTSAndroid } from "io.dcloud.uts";
const uniActiivity = UTSAndroid.getUniActivity()
const context = UTSAndroid.getAppContext();
  • 然后import的方式将第三方sdk中的类进行引入,就可以操作里边的方法了。
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";
  • 因为我们要将方法写好后给uniapp H5调用,所以我们要将方法或者类进行export
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 {
		
	}
	
}
  • 我们正常来说和h5交互可以通过入参和返回值进行
export function test1(a:string):string{
	return "这是一个测试方法"+a
}
  • 如果我们原生插件中存在异步问题,那我们就需要封装callback方法,来进行和h5交互。
/**
*我们可以定义一个返回类型
*/
type Callback = {
	result: (res:string) => void;
};
/*
*然后再需要返回的地方进行引用
*/
export function test2(callback:Callback){
	callback.result("测试返回");
}
  • h5段调用的时候可以这样去写
import * as UTSRfid from "../../../../uni_modules/uts-rfid";
/**
* 非异步返回情况
*/
console.log(UTSRfid.test1('非异步返回'));

/**
*异步返回
*/
UTSRfid.test2({
	result: (msg) => {
		console.log(msg)
})

五、下边是UTS部分源码

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 {
		
	}
	
}

六、调试

  • 普通的uts插件,可以直接通过页面或者真机运行进行调试。
  • 如果涉及到第三方sdk,jar,aar,so等内容时,则需要先进行app运行制作自定义基座可以自行学习下,这里就不展开了。打包之后真机运行时选择对应的基座,然后运行就可以进行调试,相比原生插件开发要方便很多。
    在这里插入图片描述
    在这里插入图片描述

七、插件发布

插件开发完成后,可以通过Hbuildx进行插件发布,填写插件的相关信息。插件发布之后,你就可以在任意项目中去下载安装使用插件了。当然uts开发的原生插件是不支持收费的。
在这里插入图片描述
在这里插入图片描述

八、附上插件地址,仅供学习

uts-rfid

https://ext.dcloud.net.cn/plugin?id=11245

插件地址中加入了示例工程,大家可以参考学习,如果写的不完善的地方也可以评论指正,共同学习。

也可以学习下官方的DEMO工程: https://gitcode.net/dcloud/hello-uts

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在uniapp开发中使用RFID功能需要进行原生插件的开发。根据引用\[1\]中的描述,您可以参考uniapp官方文档中关于原生插件开发的内容,按照教程进行开发。首先,您需要了解uniapp原生插件开发的基本流程和要求。然后,根据您使用的硬件和RFID终端的要求,选择合适的插件开发方式。 在插件开发过程中,您需要根据硬件SDK的要求进行相关配置。根据引用\[2\]中的示例,您可以在package.json文件中配置插件的名称、ID、版本等信息,并在dependencies参数中引入第三方SDK的依赖。 另外,您还需要在manifest.json文件中获取到appid,并在uniapp开发者后台的应用管理中生成证书。根据引用\[3\]的描述,您可以在uniapp开发者后台的证书管理中创建证书,并等待生成成功。 总结来说,uniapp开发RFID功能需要进行原生插件的开发,并根据硬件SDK的要求进行相关配置。您可以参考uniapp官方文档和相关示例进行开发,并确保正确配置插件的名称、ID、版本等信息,以及获取并生成证书。 #### 引用[.reference_title] - *1* [UTS编写RFID插件](https://blog.csdn.net/andywangzhen_ai/article/details/129722152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [uniapp集成Android原生sdk](https://blog.csdn.net/cuper_/article/details/127993632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

andywangzhen_ai

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

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

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

打赏作者

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

抵扣说明:

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

余额充值