收藏
评论

熊晨沣蓝牙实战--小程序蓝牙连接2.0

微信小程序蓝牙连接2.0说明:

1、本版本区分了ANDROID和IOS系统下蓝牙连接的不同方式。
2、兼容了更多情况下的链接包括

(1)未开启设备蓝牙,当监听到开启了蓝牙后自动开始连接。
(2)初始化蓝牙失败后每3000ms自动重新初始化蓝牙适配器。
(3)安卓端开启蓝牙适配器扫描失败,每3000ms自动重新开启。
(4)IOS端获取已连接蓝牙设备为空,每3000ms自动重新获取。
(5)安卓端蓝牙开始链接后中断扫描,连接失败了,重新开始扫描。
(6)IOS端开始连接设备后,停止获取已连接设备,连接失败自动重新开启获取。
(7)连接成功后,关闭系统蓝牙,蓝牙适配器重置。
(8)连接成功后,关闭系统蓝牙,再次打开蓝牙,自动重新开始连接。
(9)连接成功后,关闭目标蓝牙设备,自动重新开始扫描(获取)。
(10)连接成功后,最小化小程序(连接未中断),打开小程序显示已连接。
(11)连接成功后,杀掉小程序进程,连接关闭,自动重新开始扫描(获取)。

我的连接是在App.js中做的。在App.js中的onLaunch触发是调用 init()方法。

init代码:

init: function (n) {
    this.list = [];
    this.serviceId = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
    this.serviceId_2 = "00001803-0000-1000-8000-00805F9B34FB";
    this.serviceId_3 = "00001814-0000-1000-8000-00805F9B34FB";
    this.serviceId_4 = "00001802-0000-1000-8000-00805F9B34FB";
    this.serviceId_5 = "00001804-0000-1000-8000-00805F9B34FB";
    this.serviceId_6 = "00001535-1212-EFDE-1523-785FEABCD123";
    this.characterId_write = "6E400042-B5A3-F393-E0A9-E50E24DCCA9E";
    this.characterId_read = "6E400012-B5A3-F393-E0A9-E50E24DCCA9E";
    this.connectDeviceIndex = 0;
    this.isGettingConnected = false;
    this.isDiscovering = false;
    this.isConnecting = false;
    this.connectedDevice = {};
    console.log('init state', this.connectedDevice.state);
    if (!this.connectedDevice.state || n == 200) {
      this.connectedDevice.state = false;
      this.connectedDevice.deviceId = '';
      this.adapterHasInit = false
    }
    this.startConnect();
  }


说明:

1、 serviceId_2~6 是我已知的想要连接的蓝牙设备的serviceId可以只写一个。
2、characterId_write 是我已知的想要连接的蓝牙设备写入数据的特征值。
3、characterId_read是我已知的想要连接的蓝牙设备读取数据的特征值。
(以上3个都是为了做比对,真实的操作按照获取到的sericeid, characterid为准)。
4、connectedDevice 是已连接了的设备信息对象。

init完成后开始调用连接 startConnect();

startConnect代码:

startConnect: function () {    var that = this;    if (that.connectedDevice.state) return;
    that.connectedDevice.deviceId = "";
    that.connectedDevice.state = false;    // 如果适配器已经初始化不在调用初始化(重复初始化会报错)
    if (this.adapterHasInit == undefined || this.adapterHasInit) return;
    wx.showLoading({      title: '初始化蓝牙',      duration: 2000
    });    // 开启蓝牙适配器状态监听
    this.listenAdapterStateChange();    // 初始化蓝牙适配器状态(必须步骤,否则无法进行后续的任何操作)
    wx.openBluetoothAdapter({      success: function (res) {        console.log("初始化蓝牙适配器成功");
        that.getBluetoothAdapterState();
        that.adapterHasInit = true;
      },      fail: function (err) {        console.log(err);
        wx.showLoading({          title: '请开蓝牙',          icon: 'loading',          duration: 2000
        })
      }
    });
  }


在初始化蓝牙适配器状态成功后调用getBluetoothAdapterState()方法。

getBluetoothAdapterState代码:

getBluetoothAdapterState: function () {    var that = this;
    wx.getBluetoothAdapterState({      success: function (res) {        console.log(res);        var available = res.available;
        that.isDiscovering = res.discovering;        if (!available) {
          wx.showLoading({            title: '请开蓝牙',            icon: 'loading',            duration: 2000
          })
        } else {          if (!that.connectedDevice['state']) {
            that.judegIfDiscovering(res.discovering);
          }
        }
      },      fail: function (err) {        console.log(err);
      }
    })
  }

说明:此方法是用来获取当前蓝牙状态。

当检测到蓝牙可用时调用judegIfDiscovering方法。

judegIfDiscovering代码:

judegIfDiscovering: function (discovering) {    var that = this;    if (this.isConnectinng) return;
    wx.getConnectedBluetoothDevices({      services: [that.serviceId],      success: function (res) {        console.log("获取处于连接状态的设备", res);        var devices = res['devices'];        if (devices[0]) {          if (that.isAndroidPlatform) {
            wx.showToast({              title: '蓝牙连接成功',              icon: 'success',              duration: 2000
            });
          } else {
            that.getConnectedBluetoothDevices(256);
          }
        } else {          if (discovering) {
            wx.showLoading({              title: '蓝牙搜索中'
            })
          } else {            if (that.isAndroidPlatform) {
              that.startBluetoothDevicesDiscovery();
            } else {
              that.getConnectedBluetoothDevices(267);
            }
          }
        }
      },      fail: function (err) {        console.log('getConnectedBluetoothDevices err 264', err);        if (that.isAndroidPlatform) {
          that.startBluetoothDevicesDiscovery();
        } else {
          that.getConnectedBluetoothDevices(277);
        }
      }
    });
  }


说明:
1、此方法是用来判断是否正在扫描。
2、isAndroidPlatform 是通过小程序的getSystemInfo获取到的判断是安卓设备还是IOS设备。

如果是安卓设备调用startBluetoothDevicesDiscovery()开启扫描,如果是IOS设备调用getConnectedBluetoothDevices() 开启获取已配对的蓝牙设备。

作者:熊晨沣【极乐小程序社区(http://www.wxapp-union.com)博主

原文:http://www.wxapp-union.com/thread-116-1-1.html


最后一次编辑于  2018-02-07  (未经腾讯允许,不得转载)
赞 0
收藏

3 个评论

  • 备注
    备注
    2018-07-25

    你这个代码我试了但搜索到的蓝牙列表中为什么筛选掉了手机蓝牙设备(只有其他智能蓝牙设备,如蓝牙鼠标、小米手环等)?

    2018-07-25
    赞同
    回复
  • 要开心啊
    要开心啊
    2018-05-25

    你好,请问微信小程序可以做到控制电器吗,比如控制空调的开关和温度?

    2018-05-25
    赞同
    回复
  • 🍭
    🍭
    2018-03-26

    this.listenAdapterStateChange()  报错了

    2018-03-26
    赞同
    回复