|
@@ -0,0 +1,723 @@
|
|
|
+<template>
|
|
|
+ <view>
|
|
|
+ <page-head :title="title"></page-head>
|
|
|
+ <view class="uni-padding-wrap uni-common-mt">
|
|
|
+ <view>
|
|
|
+ 本蓝牙协议只支持低功耗蓝牙协议ble。如果想连接非ble蓝牙设备,请在社区搜索 Native.js 蓝牙。
|
|
|
+ </view>
|
|
|
+ <view class="uni-btn-v">
|
|
|
+ <button type="primary" :disabled="disabled[0]" @click="openBluetoothAdapter">
|
|
|
+ 初始化蓝牙模块
|
|
|
+ </button>
|
|
|
+ <view v-if="!adapterState.available">
|
|
|
+ {{ '蓝牙适配器不可用,请初始化蓝牙模块' }}
|
|
|
+ </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
|
|
|
+ },
|
|
|
+ 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 => {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 断开与低功耗蓝牙设备的连接
|
|
|
+ */
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ * 获取所有服务
|
|
|
+ */
|
|
|
+ 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>
|