skyouc
2024-12-21 c9c263dc43ad90f95f24a036cee9e6b47afb596c
common/bluetooth.js
@@ -1,310 +1,310 @@
import Vue from 'vue';
let main, Context, BManager, BluetoothAdapter, BAdapter, BluetoothDevice, IntentFilter;
import {SET_INFODATA,SET_CONNECTBLEDATA} from '@/store/actionsType.js';
import {GET_CONNECTBLEDATA} from '@/store/gettersType.js';
/**
 * 蓝牙初始化和注册
 */
Vue.prototype.$init_bluetooth = function(){
   console.log('蓝牙初始化');
   let _this = this;
   //获取android应用Activity活动对象
   main = plus.android.runtimeMainActivity();
   //引入Context类
   Context = plus.android.importClass("android.content.Context");
    // Context.BLUETOOTH_SERVICE  获取Context类的静态常量(蓝牙服务,获取BluetoothManager,以使用蓝牙)
   BManager = main.getSystemService(Context.BLUETOOTH_SERVICE);
   //获取蓝牙适配器对象类
   BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
   //蓝牙本地适配器(对象)
   BAdapter = BluetoothAdapter.getDefaultAdapter();
   //引入蓝牙设备类(创建与相应设备的连接或查询有关该设备的信息,例如名称,地址,类和绑定状态)
   BluetoothDevice = plus.android.importClass('android.bluetooth.BluetoothDevice');
   //引入过滤器类 (IntentFilter可以匹配Intent中的动作,类别,数据)
   IntentFilter = plus.android.importClass('android.content.IntentFilter');
}
/**
 * 检查蓝牙是否开启
 * 1.用户没有开启,提示开启
 * 2.用户蓝牙已经开启
 */
Vue.prototype.$check_bluetooth_open = function(){
   let _this = this;
   /**
    * BAdapter.isEnabled(); 判断蓝牙是否打开
    * BAdapter.enable();  //开启蓝牙
    * BAdapter.disable();  //关闭蓝牙
    */
   return new Promise((resolve,reject)=>{
      if (!BAdapter.isEnabled()) {
         //蓝牙未打开
         uni.showModal({
            title:"提示",
            content:"蓝牙未开启,是否开启蓝牙~",
            success:function(res){
               if (res.confirm) {
                  //开启蓝牙
                  BAdapter.enable();
                  resolve(true);
               }else if(res.cancel){
                  resolve(false);
               }
            }
         })
         // 后续提示框提示或用户手动打开
      } else {
         //蓝牙已打开
         resolve(true);
      }
   })
}
/**
 * 检测手机是否已经连接蓝牙设备
 */
Vue.prototype.$check_bluetooth_connect = function(){
   let _this = this;
   // 先清空vuex原来已有的数据
   _this.$store.dispatch(SET_CONNECTBLEDATA,[]);
   return new Promise((resolve,reject)=>{
      // 获取android应用已配对的蓝牙设备类
      let lists = BAdapter.getBondedDevices();
      // 引入类
      plus.android.importClass(lists);
      // 获取已配对蓝牙设备的个数
      let len = lists.size();
      // iterator()  把一个容器的所有对象,做成一个线性表(List),而iterator本身是一个指针
      let iterator = lists.iterator();
      // console.log(iterator.hasNext());
      plus.android.importClass(iterator);
      /**
       * iterator.hasNext()  true如果迭代具有更多元素
       * iterator.next() 放回迭代中的下一个元素
       * iterator.remove() 从基础集合中移除此迭代器返回的最后一个元素(可选操作)
       */
      while (iterator.hasNext()) {
         let d = iterator.next();
         plus.android.importClass(d);
         let matchList = {
            name: d.getName(),
            mac: d.getAddress()
         }
         console.log(matchList);
         _this.$store.dispatch(SET_CONNECTBLEDATA,matchList);
         resolve({code:true,msg:matchList});
      }
       //获取一个已连接的设备
      // plus.android.importClass(BManager); //引入相关的method函数
      // //蓝牙适配器
      // let BAdapter = BManager.getAdapter();
      // // console.log(BAdapter);
      // plus.android.importClass(BAdapter); //引入相关的method函数,这样之后才会有isEna;
      // let lists = BAdapter.getBondedDevices();
      // // console.log(lists);
      // plus.android.importClass(lists);
      // let iterator = lists.iterator();
      // // console.log(iterator);
      // plus.android.importClass(iterator);
      // // console.log(iterator.hasNext());
      // if(iterator.hasNext()){   //判断下一个元素的有无
      //    let d = iterator.next();
      //    plus.android.importClass(d);
      //    //已连接蓝牙的数据
      //    // console.log(d.getAddress());
      //    console.log(d.getAddress() + "----" + d.getName());
      //    // _this.match_list = {
      //    //    name: d.getName(),
      //    //    mac: d.getAddress()
      //    // };
      //    let matchList = {
      //       name: d.getName(),
      //       mac: d.getAddress()
      //    }
      //    _this.$store.dispatch(SET_CONNECTBLEDATA,matchList);
      //    // console.log(_this.$store.getters.GET_CONNECTBLEDATA)
      //    /**
      //     * 连接打印机
      //     */
      //     resolve({code:true,msg:matchList});
      // }else{
      //    resolve({code:false})
      // }
   })
}
/**
 * 打开蓝牙
 */
Vue.prototype.$open_bluetooth = function(){
   let _this = this;
   return new Promise((resolve,reject)=>{
      if (!BAdapter.isEnabled()) {
         BAdapter.enable(); //启动蓝牙
         uni.showToast({
            icon: "none",
            title: '蓝牙已打开',
            duration: 3000
         })
         resolve(true);
      }
   })
}
/**
 * 关闭蓝牙
 */
Vue.prototype.$close_bluetooth = function (){
   let _this = this;
   if (BAdapter.isEnabled()) {
      BAdapter.disable(); //关闭蓝牙
      uni.showToast({
         icon: "none",
         title: '蓝牙已关闭',
         duration: 2000
      })
   } else {
      uni.showToast({
         icon: "none",
         title: '蓝牙已关闭',
         duration: 2000
      })
   }
}
/**
 * 搜索蓝牙设备
 */
Vue.prototype.$search_bluetooth = function(){
   let _this = this;
   let obj = {};
   return new Promise((resolve,reject)=>{
      // console.log(BAdapter.isEnabled());
      // console.log(JSON.stringify(_this.$store.getters));
      // BAdapter.isconnect("DC:1D:30:7C:74:96");
      //判断蓝牙是否开启
      if(!BAdapter.isEnabled()) {
         uni.showModal({
            title:"提示",
            content:"蓝牙未开启,是否开启蓝牙~",
            success:function(res){
               if (res.confirm) {
                  console.log('用户点击确定');
                  obj.code = false;  //用户点击确定,开启蓝牙
                  obj.msg = "蓝牙未开启";
                  resolve(obj);
                  // _this.$open_bluetooth();
               }else if(res.cancel){
                  // resolve()
                  obj.code = null;
                  resolve(obj);
               }
            }
         })
      }else{
         obj.code = true;
         obj.msg = "开启搜索蓝牙";
         resolve(obj);
      }
   })
}
/**
 * 监听蓝牙设备信息
 */
Vue.prototype.$search_pipei=function(){
   let timer = null;
   let _this = this;
   //提示蓝牙开启权限访问
   uni.openBluetoothAdapter({
      success(res) {
         if (res.errMsg === "openBluetoothAdapter:ok") {
            //这里是开启蓝牙搜寻
            uni.startBluetoothDevicesDiscovery({
               success: (res) => {
                  console.log('startBluetoothDevicesDiscovery success', res)
                  uni.showLoading({
                     title: "蓝牙搜索中...",
                     mask: true
                  })
                  //每次搜索都把之前的清空
                  // _this.bArray = [];
                  // _this.no_match_list = [];
                  _this.$store.dispatch(SET_INFODATA,[]);
                  let bArray = [];  //用于蓝牙去重
                  let filter = new IntentFilter();   //实例化过滤器类
                  let BDevice = new BluetoothDevice();  //实例化蓝牙设备类
                  // let connect = _this.$store.state.Bluetooth.connectBLEData;
                  // console.log("已连接:" + JSON.stringify(connect));
                  BAdapter.startDiscovery(); //开启搜索
                  let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
                     onReceive: function(context, intent) { //回调
                        try {
                                  plus.android.importClass(intent);
                           if (intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
                               main.unregisterReceiver(receiver); //取消监听
                           } else {
                              // Intent中获取设备对象
                             BDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                             console.log(BDevice.getName() + "---" + BDevice.getAddress());
                             // 判断如果蓝牙没有名称则不显示
                             if (BDevice.getName() !== null) {
                              //蓝牙去重
                              let address = BDevice.getAddress();
                              //已经连接的蓝牙
                              if(bArray.indexOf(address) == -1){
                                 bArray.push(address);
                                 _this.$store.dispatch(SET_INFODATA,{
                                    name: BDevice.getName(),
                                    mac: BDevice.getAddress()
                                 })
                              }
                             }
                             //如果intent为空则取消蓝牙监听
                             if (BDevice == null) {
                                main.unregisterReceiver(receiver); //取消监听
                                uni.hideLoading()
                                //获取已匹配的蓝牙
                                // that.bluetooth_list()
                                return;
                             }
                             if(timer != null){
                                clearTimeout(timer);
                             }
                             timer = setTimeout(()=>{
                                main.unregisterReceiver(receiver); //取消监听
                                uni.hideLoading();
                             },3000);
                           }
                        } catch (e) {
                            uni.showToast({
                               icon: "none",
                               title: "蓝牙搜寻错误~",
                               duration: 3000,
                               mask: true
                            })
                        }
                     }
                  });
                  filter.addAction(BDevice.ACTION_FOUND);   //可发现
                  filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
                  filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);  //搜索结果
                  filter.addAction(BAdapter.ACTION_STATE_CHANGED);
                  main.registerReceiver(receiver, filter); //注册监听
               },
               fail: (err) => {
                  uni.showToast({
                     icon: "none",
                     title: "蓝牙搜寻失败~",
                     duration: 3000,
                     mask: true
                  })
               }
            })
         }
      },
      fail(err) {
         uni.showToast({
            icon: "none",
            title: "蓝牙搜索失败"
         })
      }
   })
}
import Vue from 'vue';
let main, Context, BManager, BluetoothAdapter, BAdapter, BluetoothDevice, IntentFilter;
import {SET_INFODATA,SET_CONNECTBLEDATA} from '@/store/actionsType.js';
import {GET_CONNECTBLEDATA} from '@/store/gettersType.js';
/**
 * 蓝牙初始化和注册
 */
Vue.prototype.$init_bluetooth = function(){
   console.log('蓝牙初始化');
   let _this = this;
   //获取android应用Activity活动对象
   main = plus.android.runtimeMainActivity();
   //引入Context类
   Context = plus.android.importClass("android.content.Context");
    // Context.BLUETOOTH_SERVICE  获取Context类的静态常量(蓝牙服务,获取BluetoothManager,以使用蓝牙)
   BManager = main.getSystemService(Context.BLUETOOTH_SERVICE);
   //获取蓝牙适配器对象类
   BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
   //蓝牙本地适配器(对象)
   BAdapter = BluetoothAdapter.getDefaultAdapter();
   //引入蓝牙设备类(创建与相应设备的连接或查询有关该设备的信息,例如名称,地址,类和绑定状态)
   BluetoothDevice = plus.android.importClass('android.bluetooth.BluetoothDevice');
   //引入过滤器类 (IntentFilter可以匹配Intent中的动作,类别,数据)
   IntentFilter = plus.android.importClass('android.content.IntentFilter');
}
/**
 * 检查蓝牙是否开启
 * 1.用户没有开启,提示开启
 * 2.用户蓝牙已经开启
 */
Vue.prototype.$check_bluetooth_open = function(){
   let _this = this;
   /**
    * BAdapter.isEnabled(); 判断蓝牙是否打开
    * BAdapter.enable();  //开启蓝牙
    * BAdapter.disable();  //关闭蓝牙
    */
   return new Promise((resolve,reject)=>{
      if (!BAdapter.isEnabled()) {
         //蓝牙未打开
         uni.showModal({
            title:"提示",
            content:"蓝牙未开启,是否开启蓝牙~",
            success:function(res){
               if (res.confirm) {
                  //开启蓝牙
                  BAdapter.enable();
                  resolve(true);
               }else if(res.cancel){
                  resolve(false);
               }
            }
         })
         // 后续提示框提示或用户手动打开
      } else {
         //蓝牙已打开
         resolve(true);
      }
   })
}
/**
 * 检测手机是否已经连接蓝牙设备
 */
Vue.prototype.$check_bluetooth_connect = function(){
   let _this = this;
   // 先清空vuex原来已有的数据
   _this.$store.dispatch(SET_CONNECTBLEDATA,[]);
   return new Promise((resolve,reject)=>{
      // 获取android应用已配对的蓝牙设备类
      let lists = BAdapter.getBondedDevices();
      // 引入类
      plus.android.importClass(lists);
      // 获取已配对蓝牙设备的个数
      let len = lists.size();
      // iterator()  把一个容器的所有对象,做成一个线性表(List),而iterator本身是一个指针
      let iterator = lists.iterator();
      // console.log(iterator.hasNext());
      plus.android.importClass(iterator);
      /**
       * iterator.hasNext()  true如果迭代具有更多元素
       * iterator.next() 放回迭代中的下一个元素
       * iterator.remove() 从基础集合中移除此迭代器返回的最后一个元素(可选操作)
       */
      while (iterator.hasNext()) {
         let d = iterator.next();
         plus.android.importClass(d);
         let matchList = {
            name: d.getName(),
            mac: d.getAddress()
         }
         console.log(matchList);
         _this.$store.dispatch(SET_CONNECTBLEDATA,matchList);
         resolve({code:true,msg:matchList});
      }
       //获取一个已连接的设备
      // plus.android.importClass(BManager); //引入相关的method函数
      // //蓝牙适配器
      // let BAdapter = BManager.getAdapter();
      // // console.log(BAdapter);
      // plus.android.importClass(BAdapter); //引入相关的method函数,这样之后才会有isEna;
      // let lists = BAdapter.getBondedDevices();
      // // console.log(lists);
      // plus.android.importClass(lists);
      // let iterator = lists.iterator();
      // // console.log(iterator);
      // plus.android.importClass(iterator);
      // // console.log(iterator.hasNext());
      // if(iterator.hasNext()){   //判断下一个元素的有无
      //    let d = iterator.next();
      //    plus.android.importClass(d);
      //    //已连接蓝牙的数据
      //    // console.log(d.getAddress());
      //    console.log(d.getAddress() + "----" + d.getName());
      //    // _this.match_list = {
      //    //    name: d.getName(),
      //    //    mac: d.getAddress()
      //    // };
      //    let matchList = {
      //       name: d.getName(),
      //       mac: d.getAddress()
      //    }
      //    _this.$store.dispatch(SET_CONNECTBLEDATA,matchList);
      //    // console.log(_this.$store.getters.GET_CONNECTBLEDATA)
      //    /**
      //     * 连接打印机
      //     */
      //     resolve({code:true,msg:matchList});
      // }else{
      //    resolve({code:false})
      // }
   })
}
/**
 * 打开蓝牙
 */
Vue.prototype.$open_bluetooth = function(){
   let _this = this;
   return new Promise((resolve,reject)=>{
      if (!BAdapter.isEnabled()) {
         BAdapter.enable(); //启动蓝牙
         uni.showToast({
            icon: "none",
            title: '蓝牙已打开',
            duration: 3000
         })
         resolve(true);
      }
   })
}
/**
 * 关闭蓝牙
 */
Vue.prototype.$close_bluetooth = function (){
   let _this = this;
   if (BAdapter.isEnabled()) {
      BAdapter.disable(); //关闭蓝牙
      uni.showToast({
         icon: "none",
         title: '蓝牙已关闭',
         duration: 2000
      })
   } else {
      uni.showToast({
         icon: "none",
         title: '蓝牙已关闭',
         duration: 2000
      })
   }
}
/**
 * 搜索蓝牙设备
 */
Vue.prototype.$search_bluetooth = function(){
   let _this = this;
   let obj = {};
   return new Promise((resolve,reject)=>{
      // console.log(BAdapter.isEnabled());
      // console.log(JSON.stringify(_this.$store.getters));
      // BAdapter.isconnect("DC:1D:30:7C:74:96");
      //判断蓝牙是否开启
      if(!BAdapter.isEnabled()) {
         uni.showModal({
            title:"提示",
            content:"蓝牙未开启,是否开启蓝牙~",
            success:function(res){
               if (res.confirm) {
                  console.log('用户点击确定');
                  obj.code = false;  //用户点击确定,开启蓝牙
                  obj.msg = "蓝牙未开启";
                  resolve(obj);
                  // _this.$open_bluetooth();
               }else if(res.cancel){
                  // resolve()
                  obj.code = null;
                  resolve(obj);
               }
            }
         })
      }else{
         obj.code = true;
         obj.msg = "开启搜索蓝牙";
         resolve(obj);
      }
   })
}
/**
 * 监听蓝牙设备信息
 */
Vue.prototype.$search_pipei=function(){
   let timer = null;
   let _this = this;
   //提示蓝牙开启权限访问
   uni.openBluetoothAdapter({
      success(res) {
         if (res.errMsg === "openBluetoothAdapter:ok") {
            //这里是开启蓝牙搜寻
            uni.startBluetoothDevicesDiscovery({
               success: (res) => {
                  console.log('startBluetoothDevicesDiscovery success', res)
                  uni.showLoading({
                     title: "蓝牙搜索中...",
                     mask: true
                  })
                  //每次搜索都把之前的清空
                  // _this.bArray = [];
                  // _this.no_match_list = [];
                  _this.$store.dispatch(SET_INFODATA,[]);
                  let bArray = [];  //用于蓝牙去重
                  let filter = new IntentFilter();   //实例化过滤器类
                  let BDevice = new BluetoothDevice();  //实例化蓝牙设备类
                  // let connect = _this.$store.state.Bluetooth.connectBLEData;
                  // console.log("已连接:" + JSON.stringify(connect));
                  BAdapter.startDiscovery(); //开启搜索
                  let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
                     onReceive: function(context, intent) { //回调
                        try {
                                  plus.android.importClass(intent);
                           if (intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
                               main.unregisterReceiver(receiver); //取消监听
                           } else {
                              // Intent中获取设备对象
                             BDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                             console.log(BDevice.getName() + "---" + BDevice.getAddress());
                             // 判断如果蓝牙没有名称则不显示
                             if (BDevice.getName() !== null) {
                              //蓝牙去重
                              let address = BDevice.getAddress();
                              //已经连接的蓝牙
                              if(bArray.indexOf(address) == -1){
                                 bArray.push(address);
                                 _this.$store.dispatch(SET_INFODATA,{
                                    name: BDevice.getName(),
                                    mac: BDevice.getAddress()
                                 })
                              }
                             }
                             //如果intent为空则取消蓝牙监听
                             if (BDevice == null) {
                                main.unregisterReceiver(receiver); //取消监听
                                uni.hideLoading()
                                //获取已匹配的蓝牙
                                // that.bluetooth_list()
                                return;
                             }
                             if(timer != null){
                                clearTimeout(timer);
                             }
                             timer = setTimeout(()=>{
                                main.unregisterReceiver(receiver); //取消监听
                                uni.hideLoading();
                             },3000);
                           }
                        } catch (e) {
                            uni.showToast({
                               icon: "none",
                               title: "蓝牙搜寻错误~",
                               duration: 3000,
                               mask: true
                            })
                        }
                     }
                  });
                  filter.addAction(BDevice.ACTION_FOUND);   //可发现
                  filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
                  filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);  //搜索结果
                  filter.addAction(BAdapter.ACTION_STATE_CHANGED);
                  main.registerReceiver(receiver, filter); //注册监听
               },
               fail: (err) => {
                  uni.showToast({
                     icon: "none",
                     title: "蓝牙搜寻失败~",
                     duration: 3000,
                     mask: true
                  })
               }
            })
         }
      },
      fail(err) {
         uni.showToast({
            icon: "none",
            title: "蓝牙搜索失败"
         })
      }
   })
}