| | |
| | | <template> |
| | | <view> |
| | | <page-head :title="title"></page-head> |
| | | <view class="uni-padding-wrap uni-common-mt"> |
| | | <view> |
| | | 本蓝牙协议只支持低功耗蓝牙协议ble。如果想连接非ble蓝牙设备,请在社区搜索 Native.js 蓝牙。 |
| | | <view class="content"> |
| | | <view> |
| | | <view class="bluetoothConnected"> |
| | | <view class="bluetoothList" v-for="(item,index) in GET_CONNECTBLEDATA" :key="index" @tap="confirm_bluetooth(item)"> |
| | | <view class="bluetoothList-name">名称:{{item.name}}</view> |
| | | <view class="bluetoothList-mac">地址:{{item.mac}}</view> |
| | | </view> |
| | | </view> |
| | | <view class="uni-btn-v"> |
| | | <button type="primary" :disabled="disabled[0]" @click="openBluetoothAdapter"> |
| | | 初始化蓝牙模块 |
| | | </button> |
| | | <view v-if="!adapterState.available"> |
| | | {{ '蓝牙适配器不可用,请初始化蓝牙模块' }} |
| | | <button type="default" @click="search_bluetooth">搜索蓝牙</button> |
| | | <button @click="senBleLabel">打印</button> |
| | | <view class="bluetoothItem" v-if="GET_INFODATA"> |
| | | <view class="bluetoothList" v-for="(item,index) in GET_INFODATA" :key="index" @tap="confirm_bluetooth(item)"> |
| | | <view class="bluetoothList-name">名称:{{item.name}}</view> |
| | | <view class="bluetoothList-mac">地址:{{item.mac}}</view> |
| | | </view> |
| | | <button |
| | | type="primary" |
| | | :loading="searchLoad" |
| | | :disabled="disabled[1]" |
| | | @click="startBluetoothDevicesDiscovery" |
| | | > |
| | | 开始搜索蓝牙设备 |
| | | </button> |
| | | <button |
| | | type="primary" |
| | | :disabled="disabled[2]" |
| | | @click="stopBluetoothDevicesDiscovery(false)" |
| | | > |
| | | 停止搜索蓝牙设备 |
| | | </button> |
| | | <button |
| | | type="primary" |
| | | :loading="newDeviceLoad" |
| | | :disabled="disabled[3]" |
| | | @click="queryDevices" |
| | | > |
| | | 选择设备 |
| | | </button> |
| | | <view v-if="equipment.length > 0"> |
| | | {{ |
| | | (connected ? '已连接设备' : '已选择设备') + |
| | | ' : ' + |
| | | equipment[0].name + |
| | | ' (' + |
| | | equipment[0].deviceId + |
| | | ')' |
| | | }} |
| | | </view> |
| | | <button type="primary" :disabled="disabled[4]" @click="createBLEConnection"> |
| | | 连接蓝牙设备 |
| | | </button> |
| | | <button type="primary" :disabled="disabled[5]" @click="getBLEDeviceServices"> |
| | | 选择设备服务 |
| | | </button> |
| | | <view v-if="servicesData.length > 0">已选服务uuid:{{ servicesData[0].uuid }}</view> |
| | | <button type="primary" :disabled="disabled[6]" @click="getBLEDeviceCharacteristics"> |
| | | 获取服务的特征值 |
| | | </button> |
| | | <view v-if="characteristicsData.length > 0"> |
| | | <view class="uni-list_name">uuid:{{ characteristicsData[0].uuid }}</view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 read 操作:{{ characteristicsData[0].properties.read }} |
| | | </view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 write 操作:{{ characteristicsData[0].properties.write }} |
| | | </view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 notify 操作:{{ characteristicsData[0].properties.notify }} |
| | | </view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 indicate 操作:{{ characteristicsData[0].properties.indicate }} |
| | | </view> |
| | | </view> |
| | | <!-- <button type="primary" :disabled="disabled[7]" @click="readBLECharacteristicValue"> |
| | | 读取特征值数据 |
| | | </button> |
| | | <view v-if="valueChangeData.serviceId"> |
| | | <view class="list-name"> |
| | | 特征值最新的值:{{ valueChangeData.value || '还没有最新值' }} |
| | | </view> |
| | | </view> --> |
| | | <!-- <button type="primary" :disabled="disabled[8]" @click="w">写入特征值数据</button> --> |
| | | <button type="primary" :disabled="disabled[9]" @click="closeBLEConnection"> |
| | | 断开蓝牙设备 |
| | | </button> |
| | | <button type="primary" :disabled="disabled[10]" @click="closeBluetoothAdapter"> |
| | | 关闭蓝牙模块 |
| | | </button> |
| | | </view> |
| | | </view> |
| | | <!-- 遮罩 --> |
| | | <view v-if="maskShow" class="uni-mask" @touchmove.stop.prevent="moveHandle" @click="maskclose"> |
| | | <scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" @click.stop="moveHandle"> |
| | | <view class="uni-title"> |
| | | 已经发现{{ list.length }}{{ showMaskType === 'device' ? '台设备' : '个服务' }}: |
| | | </view> |
| | | <view |
| | | class="uni-list-box" |
| | | v-for="(item, index) in list" |
| | | :key="index" |
| | | @click="tapQuery(item)" |
| | | > |
| | | <view v-if="showMaskType === 'device'"> |
| | | <view class="uni-list_name">{{ item.name || item.localName }}</view> |
| | | <view class="uni-list_item">信号强度:{{ item.RSSI }}dBm</view> |
| | | <view class="uni-list_item">UUID:{{ item.deviceId }}</view> |
| | | <!-- <view class="list-item" v-if="showMaskType === 'device'"> |
| | | Service数量:{{ item.advertisServiceUUIDs.length }} |
| | | </view> --> |
| | | </view> |
| | | <view v-if="showMaskType === 'service'"> |
| | | <view class="uni-list_item" style="line-height:2.2;"> |
| | | UUID: {{ item.uuid }} |
| | | <text v-if="showMaskType === 'service'"> |
| | | {{ item.isPrimary ? '(主服务)' : '' }} |
| | | </text> |
| | | </view> |
| | | </view> |
| | | <view v-if="showMaskType === 'characteristics'"> |
| | | <view class="uni-list_name">uuid:{{ item.uuid }}</view> |
| | | <view class="uni-list_item">是否支持 read 操作:{{ item.properties.read }}</view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 write 操作:{{ item.properties.write }} |
| | | </view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 notify 操作:{{ item.properties.notify }} |
| | | </view> |
| | | <view class="uni-list_item"> |
| | | 是否支持 indicate 操作:{{ item.properties.indicate }} |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | title: 'bluetooth', |
| | | disabled: [false, true, true, true, true, true, true, true, true, true, true], |
| | | newDeviceLoad: false, |
| | | searchLoad: false, |
| | | maskShow: false, |
| | | equipment: [], |
| | | adapterState: { |
| | | discovering: false, |
| | | available: false |
| | | import printConnect from "@/common/print.js"; //引入打印机模板文件 |
| | | let _this = null; |
| | | import { |
| | | mapGetters, |
| | | mapActions |
| | | } from 'vuex'; |
| | | import { |
| | | GET_INFODATA, |
| | | GET_CONNECTBLEDATA |
| | | } from "@/store/gettersType.js"; |
| | | import { |
| | | SET_CONNECTBLEDATA |
| | | } from '@/store/actionsType.js'; |
| | | // #ifdef APP-PLUS |
| | | const HanyinPlugin = uni.requireNativePlugin('Hanyin-Plugin'); //汉印 |
| | | // #endif |
| | | let print; |
| | | export default { |
| | | data() { |
| | | return { |
| | | bArray: [], //用于搜索蓝牙去重用的 |
| | | no_match_list: [], //没有配对的蓝牙列表 |
| | | match_list: "", //已连接蓝牙打印机 |
| | | val: "", |
| | | dateTimer: "", |
| | | valArr: [], |
| | | print_data: '', |
| | | mat: '', |
| | | time: '', |
| | | // 巴枪参数 |
| | | // broadcase_actions: "com.android.receive_scan_action", |
| | | // broadcast_flag: "data" |
| | | }; |
| | | }, |
| | | computed: { |
| | | ...mapGetters([GET_INFODATA, GET_CONNECTBLEDATA]) |
| | | }, |
| | | onShow() { |
| | | uni.hideLoading(); |
| | | //检查是否已连接蓝牙 |
| | | // this.$check_bluetooth_connect(); |
| | | console.log('onShow'); |
| | | }, |
| | | onHide() { |
| | | console.log('onHide'); |
| | | }, |
| | | onUnload() { |
| | | console.log('onUnload'); |
| | | }, |
| | | onLoad(options) { |
| | | _this = this; |
| | | this.$init_bluetooth(); |
| | | let that = this |
| | | const eventChannel = this.getOpenerEventChannel(); |
| | | eventChannel.on('data1', function(data1) { |
| | | that.mat = data1.data |
| | | that.time = data1.time |
| | | console.log(data1); |
| | | }) |
| | | }, |
| | | methods: { |
| | | ...mapActions([SET_CONNECTBLEDATA]), |
| | | senBleLabel() { |
| | | // console.log(this.$Mock.order_data); |
| | | if(!print) return; |
| | | console.log(this.mat); |
| | | this.print_data = this.$Mock.order_data |
| | | this.print_data.MATNR = this.mat.matnr |
| | | this.print_data.MAKTX = this.mat.maktx |
| | | this.print_data.MODI_TIME = this.time |
| | | print.startPrint(this.print_data); |
| | | }, |
| | | connected: false, |
| | | showMaskType: 'device', |
| | | servicesData: [], |
| | | characteristicsData: [], |
| | | valueChangeData: {}, |
| | | isStop:true , |
| | | list: [] |
| | | }; |
| | | }, |
| | | onLoad() { |
| | | this.onBLEConnectionStateChange(); |
| | | }, |
| | | methods: { |
| | | moveHandle() {}, |
| | | /** |
| | | * 关闭遮罩 |
| | | */ |
| | | maskclose(){ |
| | | this.maskShow = false; |
| | | }, |
| | | /** |
| | | * 选择设备 |
| | | */ |
| | | queryDevices() { |
| | | // this.newDeviceLoad = true; |
| | | this.showMaskType = 'device'; |
| | | this.maskShow = true; |
| | | }, |
| | | tapQuery(item) { |
| | | if (this.showMaskType === 'device') { |
| | | this.$set(this.disabled, 4, false); |
| | | if (this.equipment.length > 0) { |
| | | this.equipment[0] = item; |
| | | } else { |
| | | this.equipment.push(item); |
| | | } |
| | | this.newDeviceLoad = false; |
| | | } |
| | | if (this.showMaskType === 'service') { |
| | | this.$set(this.disabled, 6, false); |
| | | if (this.servicesData.length > 0) { |
| | | this.servicesData[0] = item; |
| | | } else { |
| | | this.servicesData.push(item); |
| | | } |
| | | } |
| | | if (this.showMaskType === 'characteristics') { |
| | | this.$set(this.disabled, 7, false); |
| | | if (this.characteristicsData.length > 0) { |
| | | this.characteristicsData[0] = item; |
| | | } else { |
| | | this.characteristicsData.push(item); |
| | | } |
| | | } |
| | | this.maskShow = false; |
| | | }, |
| | | /** |
| | | * 初始化蓝牙设备 |
| | | */ |
| | | openBluetoothAdapter() { |
| | | uni.openBluetoothAdapter({ |
| | | success: e => { |
| | | console.log('初始化蓝牙成功:' + e.errMsg); |
| | | console.log(JSON.stringify(e)); |
| | | this.isStop = false ; |
| | | this.$set(this.disabled, 0, true); |
| | | this.$set(this.disabled, 1, false); |
| | | this.$set(this.disabled, 10, false); |
| | | this.getBluetoothAdapterState(); |
| | | }, |
| | | fail: e => { |
| | | console.log(e) |
| | | console.log('初始化蓝牙失败,错误码:' + (e.errCode || e.errMsg)); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode,e.errMsg); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 开始搜索蓝牙设备 |
| | | */ |
| | | startBluetoothDevicesDiscovery() { |
| | | uni.startBluetoothDevicesDiscovery({ |
| | | success: e => { |
| | | console.log('开始搜索蓝牙设备:' + e.errMsg); |
| | | this.searchLoad = true; |
| | | this.$set(this.disabled, 1, true); |
| | | this.$set(this.disabled, 2, false); |
| | | this.$set(this.disabled, 3, false); |
| | | this.onBluetoothDeviceFound(); |
| | | }, |
| | | fail: e => { |
| | | console.log('搜索蓝牙设备失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 停止搜索蓝牙设备 |
| | | */ |
| | | stopBluetoothDevicesDiscovery(types) { |
| | | uni.stopBluetoothDevicesDiscovery({ |
| | | success: e => { |
| | | console.log('停止搜索蓝牙设备:' + e.errMsg); |
| | | if (types) { |
| | | this.$set(this.disabled, 1, true); |
| | | } else { |
| | | this.$set(this.disabled, 1, false); |
| | | } |
| | | this.$set(this.disabled, 2, true); |
| | | // this.$set(this.disabled, 3, true); |
| | | this.searchLoad = false; |
| | | }, |
| | | fail: e => { |
| | | console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 发现外围设备 |
| | | */ |
| | | onBluetoothDeviceFound() { |
| | | uni.onBluetoothDeviceFound(devices => { |
| | | console.log('开始监听寻找到新设备的事件'); |
| | | // this.$set(this.disabled, 3, false); |
| | | this.getBluetoothDevices(); |
| | | }); |
| | | }, |
| | | /** |
| | | * 获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。 |
| | | */ |
| | | getBluetoothDevices() { |
| | | uni.getBluetoothDevices({ |
| | | success: res => { |
| | | this.newDeviceLoad = false; |
| | | console.log('获取蓝牙设备成功:' + res.errMsg); |
| | | // console.log(JSON.stringify(res)) |
| | | this.list = res.devices; |
| | | }, |
| | | fail: e => { |
| | | console.log('获取蓝牙设备错误,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 获取本机蓝牙适配器状态 |
| | | */ |
| | | getBluetoothAdapterState() { |
| | | console.log('--->'); |
| | | uni.getBluetoothAdapterState({ |
| | | success: res => { |
| | | console.log(JSON.stringify(res)); |
| | | this.adapterState = res; |
| | | }, |
| | | fail: e => { |
| | | console.log('获取本机蓝牙适配器状态失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 连接低功耗蓝牙 |
| | | */ |
| | | createBLEConnection() { |
| | | let deviceId = this.equipment[0].deviceId; |
| | | uni.showToast({ |
| | | title: '连接蓝牙...', |
| | | icon: 'loading', |
| | | duration: 99999 |
| | | }); |
| | | uni.createBLEConnection({ |
| | | // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 |
| | | deviceId, |
| | | success: res => { |
| | | // 连接打印机 |
| | | confirm_bluetooth(item) { |
| | | let { |
| | | name, |
| | | mac |
| | | } = item; |
| | | //判断蓝牙是否打开 |
| | | this.$check_bluetooth_open().then(res => { |
| | | console.log(res); |
| | | console.log('连接蓝牙成功:' + res.errMsg); |
| | | // 连接设备后断开搜索 并且不能搜索设备 |
| | | this.stopBluetoothDevicesDiscovery(true); |
| | | uni.hideToast(); |
| | | uni.showToast({ |
| | | title: '连接成功', |
| | | icon: 'success', |
| | | duration: 2000 |
| | | }); |
| | | this.$set(this.disabled, 3, true); |
| | | this.$set(this.disabled, 4, true); |
| | | this.$set(this.disabled, 5, false); |
| | | this.$set(this.disabled, 9, false); |
| | | this.connected = true; |
| | | }, |
| | | fail: e => { |
| | | console.log('连接低功耗蓝牙失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | //进行打印机连接 |
| | | if (res) { |
| | | print =new printConnect(item); //打印机连接 |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 断开与低功耗蓝牙设备的连接 |
| | | */ |
| | | closeBLEConnection() { |
| | | let deviceId = this.equipment[0].deviceId; |
| | | uni.closeBLEConnection({ |
| | | deviceId, |
| | | success: res => { |
| | | console.log(res); |
| | | console.log('断开低功耗蓝牙成功:' + res.errMsg); |
| | | this.$set(this.disabled, 1, false); |
| | | this.$set(this.disabled, 3, true); |
| | | this.$set(this.disabled, 4, true); |
| | | this.$set(this.disabled, 5, true); |
| | | this.$set(this.disabled, 6, true); |
| | | this.$set(this.disabled, 7, true); |
| | | this.$set(this.disabled, 8, true); |
| | | this.$set(this.disabled, 9, true); |
| | | this.equipment = []; |
| | | this.servicesData = []; |
| | | this.characteristicsData = []; |
| | | }, |
| | | fail: e => { |
| | | console.log('断开低功耗蓝牙成功,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | }) |
| | | }, |
| | | //搜索没匹配的蓝牙设备 |
| | | search_bluetooth(address) { |
| | | let _this = this; |
| | | //检查蓝牙是否开启 |
| | | this.$check_bluetooth_open().then(ores => { |
| | | if (ores) { |
| | | console.log(ores); |
| | | //搜索蓝牙 |
| | | _this.$search_bluetooth().then(bres => { |
| | | console.log(bres); |
| | | if (bres.code) { |
| | | _this.$search_pipei().then(pres => { |
| | | console.log(pres); |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 获取所有服务 |
| | | */ |
| | | getBLEDeviceServices() { |
| | | let deviceId = this.equipment[0].deviceId; |
| | | console.log('获取所有服务的 uuid:' + deviceId); |
| | | |
| | | uni.getBLEDeviceServices({ |
| | | // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 |
| | | deviceId, |
| | | success: res => { |
| | | console.log(JSON.stringify(res.services)); |
| | | console.log('获取设备服务成功:' + res.errMsg); |
| | | this.$set(this.disabled, 7, true); |
| | | this.$set(this.disabled, 8, true); |
| | | this.showMaskType = 'service'; |
| | | this.list = res.services; |
| | | |
| | | this.characteristicsData = []; |
| | | if (this.list.length <= 0) { |
| | | toast('获取服务失败,请重试!'); |
| | | return; |
| | | } |
| | | this.maskShow = true; |
| | | }, |
| | | fail: e => { |
| | | console.log('获取设备服务失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 获取某个服务下的所有特征值 |
| | | */ |
| | | getBLEDeviceCharacteristics() { |
| | | let deviceId = this.equipment[0].deviceId; |
| | | let serviceId = this.servicesData[0].uuid; |
| | | console.log(deviceId); |
| | | console.log(serviceId); |
| | | uni.getBLEDeviceCharacteristics({ |
| | | // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 |
| | | deviceId, |
| | | // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 |
| | | serviceId, |
| | | success: res => { |
| | | console.log(JSON.stringify(res)); |
| | | console.log('获取特征值成功:' + res.errMsg); |
| | | this.$set(this.disabled, 7, true); |
| | | this.valueChangeData = {}; |
| | | this.showMaskType = 'characteristics'; |
| | | this.list = res.characteristics; |
| | | if (this.list.length <= 0) { |
| | | toast('获取特征值失败,请重试!'); |
| | | return; |
| | | } |
| | | this.maskShow = true; |
| | | }, |
| | | fail: e => { |
| | | console.log('获取特征值失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 监听低功耗蓝牙连接状态的改变事件。包括开发者主动连接或断开连接,设备丢失,连接异常断开等等 |
| | | */ |
| | | onBLEConnectionStateChange() { |
| | | uni.onBLEConnectionStateChange(res => { |
| | | // 该方法回调中可以用于处理连接意外断开等异常情况 |
| | | console.log(`蓝牙连接状态 -------------------------->`); |
| | | console.log(JSON.stringify(res)); |
| | | if (!res.connected) { |
| | | if(this.isStop) return ; |
| | | console.log('断开低功耗蓝牙成功:'); |
| | | this.$set(this.disabled, 1, false); |
| | | this.$set(this.disabled, 3, true); |
| | | this.$set(this.disabled, 4, true); |
| | | this.$set(this.disabled, 5, true); |
| | | this.$set(this.disabled, 6, true); |
| | | this.$set(this.disabled, 7, true); |
| | | this.$set(this.disabled, 8, true); |
| | | this.$set(this.disabled, 9, true); |
| | | this.searchLoad = false; |
| | | this.equipment = []; |
| | | this.servicesData = []; |
| | | this.characteristicsData = []; |
| | | this.valueChangeData = {}; |
| | | toast('已经断开当前蓝牙连接'); |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用 |
| | | */ |
| | | readBLECharacteristicValue() { |
| | | let deviceId = this.equipment[0].deviceId; |
| | | let serviceId = this.servicesData[0].uuid; |
| | | let characteristicId = this.characteristicsData[0].uuid; |
| | | console.log(deviceId); |
| | | console.log(serviceId); |
| | | console.log(characteristicId); |
| | | uni.readBLECharacteristicValue({ |
| | | // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 |
| | | deviceId, |
| | | // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 |
| | | serviceId, |
| | | // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 |
| | | characteristicId, |
| | | success: res => { |
| | | console.log('读取设备数据值成功'); |
| | | console.log(JSON.stringify(res)); |
| | | this.notifyBLECharacteristicValueChange(); |
| | | }, |
| | | fail(e) { |
| | | console.log('读取设备数据值失败,错误码:' + e.errCode); |
| | | if (e.errCode !== 0) { |
| | | initTypes(e.errCode); |
| | | } |
| | | } |
| | | }); |
| | | this.onBLECharacteristicValueChange(); |
| | | }, |
| | | /** |
| | | * 监听低功耗蓝牙设备的特征值变化事件。必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。 |
| | | */ |
| | | onBLECharacteristicValueChange() { |
| | | // 必须在这里的回调才能获取 |
| | | uni.onBLECharacteristicValueChange(characteristic => { |
| | | console.log('监听低功耗蓝牙设备的特征值变化事件成功'); |
| | | console.log(JSON.stringify(characteristic)); |
| | | this.valueChangeData = characteristic; |
| | | }); |
| | | }, |
| | | /** |
| | | * 订阅操作成功后需要设备主动更新特征值的 value,才会触发 uni.onBLECharacteristicValueChange 回调。 |
| | | */ |
| | | notifyBLECharacteristicValueChange() { |
| | | let deviceId = this.equipment[0].deviceId; |
| | | let serviceId = this.servicesData[0].uuid; |
| | | let characteristicId = this.characteristicsData[0].uuid; |
| | | let notify = this.characteristicsData[0].properties.notify; |
| | | console.log(deviceId); |
| | | console.log(serviceId); |
| | | console.log(characteristicId); |
| | | console.log(notify); |
| | | uni.notifyBLECharacteristicValueChange({ |
| | | state: true, // 启用 notify 功能 |
| | | // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 |
| | | deviceId, |
| | | // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 |
| | | serviceId, |
| | | // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 |
| | | characteristicId, |
| | | success(res) { |
| | | console.log('notifyBLECharacteristicValueChange success:' + res.errMsg); |
| | | console.log(JSON.stringify(res)); |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * 断开蓝牙模块 |
| | | */ |
| | | closeBluetoothAdapter(OBJECT) { |
| | | uni.closeBluetoothAdapter({ |
| | | success: res => { |
| | | console.log('断开蓝牙模块成功'); |
| | | this.isStop = true ; |
| | | this.$set(this.disabled, 0, false); |
| | | this.$set(this.disabled, 1, true); |
| | | this.$set(this.disabled, 2, true); |
| | | this.$set(this.disabled, 3, true); |
| | | this.$set(this.disabled, 4, true); |
| | | this.$set(this.disabled, 5, true); |
| | | this.$set(this.disabled, 6, true); |
| | | this.$set(this.disabled, 7, true); |
| | | this.$set(this.disabled, 8, true); |
| | | this.$set(this.disabled, 9, true); |
| | | this.$set(this.disabled, 10, true); |
| | | this.equipment = []; |
| | | this.servicesData = []; |
| | | this.characteristicsData = []; |
| | | this.valueChangeData = {}; |
| | | this.adapterState = []; |
| | | this.searchLoad =false; |
| | | toast('断开蓝牙模块'); |
| | | } |
| | | }); |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * 判断初始化蓝牙状态 |
| | | */ |
| | | function initTypes(code, errMsg) { |
| | | switch (code) { |
| | | case 10000: |
| | | toast('未初始化蓝牙适配器'); |
| | | break; |
| | | case 10001: |
| | | toast('未检测到蓝牙,请打开蓝牙重试!'); |
| | | break; |
| | | case 10002: |
| | | toast('没有找到指定设备'); |
| | | break; |
| | | case 10003: |
| | | toast('连接失败'); |
| | | break; |
| | | case 10004: |
| | | toast('没有找到指定服务'); |
| | | break; |
| | | case 10005: |
| | | toast('没有找到指定特征值'); |
| | | break; |
| | | case 10006: |
| | | toast('当前连接已断开'); |
| | | break; |
| | | case 10007: |
| | | toast('当前特征值不支持此操作'); |
| | | break; |
| | | case 10008: |
| | | toast('其余所有系统上报的异常'); |
| | | break; |
| | | case 10009: |
| | | toast('Android 系统特有,系统版本低于 4.3 不支持 BLE'); |
| | | break; |
| | | default: |
| | | toast(errMsg); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 弹出框封装 |
| | | */ |
| | | function toast(content, showCancel = false) { |
| | | uni.showModal({ |
| | | title: '提示', |
| | | content, |
| | | showCancel |
| | | }); |
| | | } |
| | | </script> |
| | | |
| | | <style> |
| | | |
| | | .uni-title { |
| | | /* width: 100%; */ |
| | | /* height: 80rpx; */ |
| | | text-align: center; |
| | | } |
| | | |
| | | .uni-mask { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | display: flex; |
| | | align-items: center; |
| | | width: 100%; |
| | | background: rgba(0, 0, 0, 0.6); |
| | | padding: 0 30rpx; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .uni-scroll_box { |
| | | height: 70%; |
| | | background: #fff; |
| | | border-radius: 20rpx; |
| | | } |
| | | .uni-list-box { |
| | | margin: 0 20rpx; |
| | | padding: 15rpx 0; |
| | | border-bottom: 1px #f5f5f5 solid; |
| | | box-sizing: border-box; |
| | | } |
| | | .uni-list:last-child { |
| | | border: none; |
| | | } |
| | | .uni-list_name { |
| | | font-size: 30rpx; |
| | | color: #333; |
| | | } |
| | | .uni-list_item { |
| | | font-size: 24rpx; |
| | | color: #555; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | .uni-success_box { |
| | | position: absolute; |
| | | left: 0; |
| | | bottom: 0; |
| | | min-height: 100rpx; |
| | | width: 100%; |
| | | background: #fff; |
| | | box-sizing: border-box; |
| | | border-top: 1px #eee solid; |
| | | } |
| | | .uni-success_sub { |
| | | /* width: 100%%; */ |
| | | height: 100rpx; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 0 30rpx; |
| | | } |
| | | .uni-close_button { |
| | | padding: 0 20rpx; |
| | | height: 60rpx; |
| | | line-height: 60rpx; |
| | | background: #ce3c39; |
| | | color: #ffffff; |
| | | border-radius: 10rpx; |
| | | } |
| | | .uni-success_content { |
| | | height: 600rpx; |
| | | margin: 30rpx; |
| | | margin-top: 0; |
| | | border: 1px #eee solid; |
| | | padding: 30rpx; |
| | | } |
| | | .uni-content_list { |
| | | padding-bottom: 10rpx; |
| | | border-bottom: 1px #f5f5f5 solid; |
| | | } |
| | | .uni-tips { |
| | | text-align: center; |
| | | font-size: 24rpx; |
| | | color: #666; |
| | | } |
| | | <style lang="scss"> |
| | | .bluetoothItem { |
| | | width: 100%; |
| | | height: 100%; |
| | | |
| | | .bluetoothList { |
| | | display: flex; |
| | | flex-direction: column; |
| | | padding: 20rpx; |
| | | border-bottom: 1rpx solid #BEBEBE; |
| | | font-size: 18rpx; |
| | | } |
| | | } |
| | | </style> |