|
|
- class Bluetooth {
- // 构造函数
- constructor() {
- this.isOpenBle = false;
- this.isStop = false;
- this.deviceList = [];
- this.deviceId = "";
- this.serviceId = "";
- this.readId = "";
- this.writeId = "";
- this.notifyId = "";
- this.indicateId = "";
- this.valueChangeData = {};
- // this.openBluetoothAdapter();
- }
- // 弹出框封装
- showToast(title) {
- uni.showToast({
- title: title,
- icon: 'none',
- 'duration': 2000
- });
- }
- // 判断初始化蓝牙状态
- initTypes(code, errMsg) {
- switch (code) {
- case 10000:
- this.showToast('未初始化蓝牙适配器');
- break;
- case 10001:
- this.showToast('请打开蓝牙后重试');
- break;
- case 10002:
- this.showToast('没有找到指定设备');
- break;
- case 10003:
- this.showToast('连接失败');
- break;
- case 10004:
- this.showToast('没有找到指定服务');
- break;
- case 10005:
- this.showToast('没有找到指定特征值');
- break;
- case 10006:
- this.showToast('当前连接已断开');
- break;
- case 10007:
- this.showToast('当前特征值不支持此操作');
- break;
- case 10008:
- this.showToast('其余所有系统上报的异常');
- break;
- case 10009:
- this.showToast('Android 系统特有,系统版本低于 4.3 不支持 BLE');
- break;
- default:
- this.showToast(errMsg);
- }
- }
- // 初始化蓝牙模块
- openBluetoothAdapter(callback) {
- uni.openBluetoothAdapter({
- success: res => {
- console.log('初始化>>>res', res)
- this.isOpenBle = true;
- this.initTypes(0, "初始化蓝牙模块成功");
- if (typeof callback == "function")
- this.onBluetoothDeviceFound(callback);
- },
- fail: err => {
- console.log('初始化>>>err', err)
- this.initTypes(err.errCode);
- }
- });
- }
- // 关闭蓝牙模块
- closeBluetoothAdapter() {
- uni.closeBluetoothAdapter({
- success: res => {
- console.log(res)
- }
- });
- }
- // 获取本机蓝牙适配器状态
- getBluetoothAdapterState() {
- return new Promise((resolve, reject) => {
- uni.getBluetoothAdapterState({
- success: res => {
- console.log(JSON.stringify(res));
- // this.adapterState = res;
- resolve(res);
- },
- fail: err => {
- console.log('获取本机蓝牙适配器状态失败,错误码:' + err.errCode);
- reject(err);
- }
- });
- });
- }
- // 搜索蓝牙设备
- startBluetoothDevicesDiscovery() {
- if (!this.isOpenBle) {
- this.showToast(`初始化蓝牙模块失败`)
- return;
- }
-
- let self = this;
- uni.showLoading({
- title: '蓝牙搜索中'
- })
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- uni.startBluetoothDevicesDiscovery({
- success: res => {
- resolve(res)
- },
- fail: res => {
- self.showToast(`搜索设备失败` + JSON.stringify(err));
- reject(err);
- }
- })
- }, 300);
- });
- }
- // 停止搜索蓝牙设备
- stopBluetoothDevicesDiscovery() {
- uni.stopBluetoothDevicesDiscovery({
- fail: err => {
- this.showToast(`停止搜索蓝牙设备失败` + JSON.stringify(err));
- },
- complete: res => {
- uni.hideLoading();
- }
- })
- }
- // 发现外围设备
- onBluetoothDeviceFound(callback) {
- console.log('发现外围设备')
- // 侦听发现的设备
- uni.onBluetoothDeviceFound(devices => {
- console.log('开始监听寻找到新设备的事件');
- this.getBluetoothDevices(callback);
- });
- }
- // 获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。
- getBluetoothDevices(callback) {
- uni.getBluetoothDevices({
- success: res => {
- // self.newDeviceLoad = false;
- console.log('获取蓝牙设备成功:', res);
- this.deviceList = res.devices;
- callback();
- },
- fail: err => {
- console.log('获取蓝牙设备错误,错误码:', err);
- if (err.errCode !== 0) {
- this.initTypes(err.errCode);
- }
- }
- });
- }
- //获取蓝牙设备所有服务(service)
- getBLEDeviceServices(callback) {
- let _serviceList = [];
- let deviceId = this.deviceId;
- let self = this;
- setTimeout(() => { //解决app不能得到服务的bug,500-1000
- uni.getBLEDeviceServices({
- deviceId,
- success: res => {
- for (let service of res.services) {
- if (service.isPrimary) {
- _serviceList.push(service);
- }
- }
- // console.log("_serviceList: " + JSON.stringify(_serviceList));
- if (typeof callback == "function") callback(_serviceList)
- },
- fail: err => {
- self.showToast(`获取设备Services失败:` + JSON.stringify(err));
- },
- complete: res => {
- uni.hideLoading();
- }
- });
- }, 500);
- }
- //获取蓝牙设备某个服务中所有特征值(characteristic)
- getBLEDeviceCharacteristics(serviceId) {
- let deviceId = this.deviceId;
- this.serviceId = serviceId;
-
- let self = this;
- return new Promise((resolve, reject) => {
- uni.getBLEDeviceCharacteristics({
- deviceId,
- serviceId,
- success: res => {
- for (let _obj of res.characteristics) {
- //获取readId
- if (_obj.properties.read) {
- self.readId = _obj.uuid;
- } else {
- self.readId = ''
- }
- // uni.setStorageSync('readId', self.readId);
- //获取writeId
- if (_obj.properties.write) {
- self.writeId = _obj.uuid;
- } else {
- self.writeId = ''
- }
- // uni.setStorageSync('writeId', self.writeId);
- //获取notifyId
- if (_obj.properties.notify) {
- self.notifyId = _obj.uuid;
- } else {
- self.notifyId = ''
- }
- // uni.setStorageSync('notifyId', self.notifyId);
- //获取indicateId
- if (_obj.properties.indicate) {
- self.indicateId = _obj.uuid;
- } else {
- self.indicateId = ''
- }
- // uni.setStorageSync('indicateId', self.indicateId);
- }
- let result = {
- 'readId': self.readId,
- 'writeId': self.writeId,
- 'notifyId': self.notifyId,
- 'indicateId': self.indicateId
- };
- resolve(result)
- },
- fail: err => {
- self.showToast(`getBLEDeviceCharacteristics` + JSON.stringify(err));
- reject(err);
- }
- })
- });
- }
- // 连接低功耗蓝牙
- createBLEConnection(deviceId, callback) {
- let self = this;
- this.deviceId = deviceId;
- this.isStop = false;
-
- uni.showLoading({
- mask: true,
- title: '设备连接中,请稍候...'
- })
- uni.createBLEConnection({
- deviceId,
- success: res => {
- if (typeof callback == "function") callback();
- // this.onBLEConnectionStateChange(callback)
- },
- fail: err => {
- self.showToast(`连接蓝牙设备失败` + JSON.stringify(err));
- },
- complete: res => {
- uni.hideLoading();
- }
- })
- }
- // 断开与低功耗蓝牙设备的连接
- closeBLEConnection() {
- let deviceId = this.deviceId;
- this.isStop = true;
- uni.closeBLEConnection({
- deviceId,
- success(res) {
- console.log(res)
- }
- })
- }
- // 监听低功耗蓝牙连接状态的改变事件。包括开发者主动连接或断开连接,设备丢失,连接异常断开等等
- onBLEConnectionStateChange(callback) {
- uni.onBLEConnectionStateChange(res => {
- // 该方法回调中可以用于处理连接意外断开等异常情况
- console.log(`蓝牙连接状态 -------------------------->`);
- console.log(JSON.stringify(res));
- if (!res.connected) {
- if (this.isStop) return;
- console.log('断开低功耗蓝牙成功:');
- // this.searchLoad = false;
- // this.equipment = [];
- // this.servicesData = [];
- // this.characteristicsData = [];
- this.valueChangeData = {};
- this.showToast('已经断开当前蓝牙连接');
- if (typeof callback == "function") callback();
- }
- });
- }
- // 监听低功耗蓝牙设备的特征值变化事件。必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。
- onBLECharacteristicValueChange() {
- // 必须在这里的回调才能获取
- uni.onBLECharacteristicValueChange(characteristic => {
- console.log('监听低功耗蓝牙设备的特征值变化事件成功');
- console.log(JSON.stringify(characteristic));
- this.valueChangeData = characteristic;
- });
- }
- // 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用
- readBLECharacteristicValue() {
- let deviceId = this.deviceId;
- let serviceId = this.serviceId;
- let characteristicId = this.notifyId;
- 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) {
- this.initTypes(e.errCode);
- }
- }
- });
- this.onBLECharacteristicValueChange();
- }
- // 向低功耗蓝牙设备特征值中写入二进制数据
- writeBLECharacteristicValue(buffer) {
- let deviceId = this.deviceId;
- let serviceId = this.serviceId;
- let characteristicId = this.notifyId;
-
- // console.log("this: " + JSON.stringify(this));
- return new Promise((resolve, reject) => {
- uni.writeBLECharacteristicValue({
- deviceId,
- serviceId,
- characteristicId,
- value: buffer,
- success: res => {
- console.log('message发送成功:)', JSON.stringify(res));
- resolve(res);
- },
- fail: err => {
- console.log('message发送失败:(', JSON.stringify(err));
- reject(err);
- }
- });
- });
- }
- // 启用低功耗蓝牙设备特征值变化时的 notify 功能
- notifyBLECharacteristicValue() {
- let deviceId = this.deviceId;
- let serviceId = this.serviceId;
- let characteristicId = this.notifyId;
-
- uni.notifyBLECharacteristicValueChange({
- state: true, // 启用 notify 功能
- deviceId,
- serviceId,
- characteristicId,
- success: res => {
- uni.onBLECharacteristicValueChange((res) => {
- console.log('特征值变化:', res)
- });
- },
- fail: res => {
- console.log('notifyBLECharacteristicValueChange 失败:' + res.errMsg);
- }
- });
- }
- //若APP在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需进行搜索操作。
- reconnect() {
- (async () => {
- try {
- this.deviceId = this.deviceId || uni.getStorageSync("deviceId");
- this.serviceId = this.serviceId || uni.getStorageSync("serviceId");
-
- let result1 = await this.createBLEConnection();
- console.log("createBLEConnection: " + JSON.stringify(result1));
-
- let result2 = await this.getBLEDeviceServices();
- console.log("getBLEDeviceServices: " + JSON.stringify(result2));
-
- let result3 = await this.getBLEDeviceCharacteristics();
- console.log("getBLEDeviceCharacteristics: " + JSON.stringify(result3));
-
- // this.writeId = uni.getStorageSync("writeId");
- // this.notifyId = uni.getStorageSync("notifyId");
- } catch (err) {
- console.log("err: " + JSON.stringify(err));
- }
-
- })();
- }
- }
-
- export default Bluetooth;
|