需求:要求蓝牙连接条码枪,接受条码枪扫描的数据
一、原理
- 蓝牙连接条码枪HID模式,其实就相当于一个键鼠输入设置,按下条码枪按钮,input的就自动显示输入的数据
- 蓝牙连接条码枪BLE模式,是蓝牙广播模式,需要主动接收广播,这一块我还没有实现出来,后续研究后再补上
二、代码
1. 获取已经连接上的蓝牙设备(原生native.js)
// 原生native.js蓝牙 获取已经连接的条码枪,这一步需要提前连接条码枪
search() {
var main = plus.android.runtimeMainActivity()
var Context = plus.android.importClass("android.content.Context")
var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE)
plus.android.importClass(BManager) // 引入相关的method函数
var BAdapter = BManager.getAdapter()
plus.android.importClass(BAdapter) // 引入相关的method函数,这样之后才会有isEna
var lists = BAdapter.getBondedDevices();
plus.android.importClass(lists)
var iterator = lists.iterator()
plus.android.importClass(iterator)
console.log('iterator')
console.log(iterator)
while(iterator.hasNext()) {
var d = iterator.next()
plus.android.importClass(d)
this.deviceId = d.getName()
this.state = 'working'
console.log(d)
console.log("名称:"+d.getName()+",地址:"+d.getAddress());
}
if(!this.deviceId) {
this.showToastInfo({ msg: '请确认已经连上扫码枪' })
}
}
2. input元素接收条码枪数据
<template>
<!- 条形码输入会显示在这个input里面,可以通过css将他隐藏->
<!- 要聚焦才可以扫描进来 ->
<input
class="unshow-input"
v-model="inputValue"
type="number"
:focus="isFocus"
placeholder="输入"
@focus="focus"
@confirm="confirm"
/>
</template>
3. 数据参数和方法
isFocus: true // 是否聚焦
// 输入框方法
focus() {
setTimeout(function(){
uni.hideKeyboard() // 隐藏软键盘:隐藏已经显示的软键盘,如果软键盘没有显示则不做任何操作
// plus.key.hideSoftKeybord() // 隐藏软键盘:隐藏已经显示的软键盘,如果软键盘没有显示则不做任何操作
}, 100);
},
async confirm(e) {
await this.saveRecords(e.detail.value)
this.inputValue = '' // 重置输入框内容
},
三、踩坑
- 一开始不知道条码枪其实是个键盘外设设备,其实代码很简单就可以实现
- HID模式和BLE模式是不同的接收方式
- 如果出现中文乱码,就是你的键盘输入设置为中文了,加个type=“number”,就可以解决了
- 后续我再研究下怎么用原生native.js连接HID模式