uniApp 对接安卓平板刷卡器, 读取串口数据

背景:

设备: 鸿合 电子班牌 刷卡对接 WS-B22CS, 安卓11;

需求: 将刷卡器的数据传递到自己的App中, 作为上下岗信息使用, 以完成业务;

对接方式:

1. 厂家技术首先推荐使用 接收自定义广播的方式来获取, 参考代码如下

 对应到uniApp 中的实现如下

<template>
	<view class="content">
		<text class="title">内容: {
   
   {cardnumber}}</text>
	</view>
</template>

<script>
	var main, receiver, filter;
	export default {
		name: 'GetCardNumber',
		data() {
			return {
				cardnumber: ''
			}
		},
		created: function(option) {
			this.init();
			setTimeout(() => {
				this.start();
			}, 2000)
		},
		onHide: function() {
			this.stop();
		},
		destroyed: function() {
			this.stop();
		},
		methods: {
			init() {
				let _this = this;
				main = plus.android.runtimeMainActivity(); //获取activity  
				var IntentFilter = plus.android.importClass('android.content.IntentFilter');
				filter = new IntentFilter();
				filter.addAction("android.intent.action.getcardnumber"); // 换你的广播动作 
				receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
					onReceive: function(context, intent) {
						plus.android.importClass(intent);
						let code = intent.getStringExtra("cardnumber"); // 换你的广播标签  
						console.log('code', code)
						_this.cardnumber = code
					}
				});
			},
			start() {
				main.registerReceiver(receiver, filter);
			},
			stop() {
				main.unregisterReceiver(receiver);
			},
		}
	}
</script>

2. 使用uniApp 市场的 Fvv-UniSerialPort  插件实现与设备串口交互, 读取数据并转换

https://github.com/looooooooooooooooooooooool/UniSerialPort/tree/master/uni-app/nativeplugins/Fvv-UniSerialPort

安卓串口通信 Fvv-UniSerialPort - DCloud 插件市场

<template>
	<view class="content">
		<text class="title">读取到的内容: {
   
   {cardnumber}}</text>
	</view>
</template>

<script>
	const serialPort = uni.requireNativePlugin('Fvv-UniSerialPort')


	export default {
		name: 'GetCardNumber',
		data() {
			return {
				cardnumber: '1111111111'
			}
		},
		created: function(option) {
			serialPort.getAllDeviceList(res => {
				console.log('//设备列表', res)
			})
			serialPort.getAllDevicePath(res => {
					console.log('//路径列表', res)
				}),
				setTimeout(() => {
					serialPort.setPath('/dev/ttyS3')
					serialPort.setBaudRate(9600)
					serialPort.open(res => {
						if (!res.status) {
							uni.showToast({
								title: res.msg,
								duration: 2000,
								icon: "none"
							});
							return
						}
						uni.showToast({
							title: "已打开",
							duration: 2000,
						});

						serialPort.onMessageHex(rec => {
							console.log(rec)
							this.cardnumber += rec + "\r\n"
						}, send => {
							console.log(send)
						})
					})
				}, 10000)
		},
	}
</script>

注意事项:

1. 使用 Fvv-UniSerialPort 插件时, 控制台一直报错

==> 因为你编辑完代码就直接调试的原因, 你编辑完代码重启app再调试就可以了, 而且串口不要多次打开和关闭,直接在全局的地方打开一次,不用关闭的

2. 读卡出来内容不完整或不一样

==> 指令要按照设备的文档来处理分割和拼接之后再使用

附一张设备实物图