my.onBLECharacteristicValueChange

2020-09-15 15:20 更新

版本需求:支付寶客戶端 10.0.18 或更高版本,若版本較低,建議做 兼容處理。支持 iOS 客戶端,Android 5.0 及以上版本客戶端。

注意:IDE 模擬器暫不支持調試,請以真機調試結果為準。

監(jiān)聽低功耗藍牙設備的特征值變化的事件。

使用說明:為防止多次事件監(jiān)聽導致一次事件多次回調的情況,建議每次調用 on 方法監(jiān)聽事件之前,先調用 off 方法,關閉之前的事件監(jiān)聽。

掃碼體驗

藍牙.jpeg

效果示例

開啟取消監(jiān)聽.png

示例代碼

/* .acss */
.help-info {
  padding:10px;
  color:#000000;
}
.help-title {
  padding:10px;
  color:#FC0D1B;
}
// .json
{
    "defaultTitle": "Bluetooth"
}
<!-- .axml-->
<view class="page">
  <view class="page-description">藍牙 API</view>
  <view class="page-section">
    <view class="page-section-title">本機藍牙開關狀態(tài)</view>
    <view class="page-section-demo">
       <button type="primary" onTap="openBluetoothAdapter">初始化藍牙</button>
       <button type="primary" onTap="closeBluetoothAdapter">關閉本機藍牙</button>
       <button type="primary" onTap="getBluetoothAdapterState">獲取藍牙狀態(tài)</button>
    </view>
    <view class="page-section-title">掃描藍牙設備</view>
    <view class="page-section-demo">
       <button type="primary" onTap="startBluetoothDevicesDiscovery">開始搜索</button>
       <button type="primary" onTap="getBluetoothDevices">所有搜索到的設備</button>
       <button type="primary" onTap="getConnectedBluetoothDevices">所有已連接的設備</button>
       <button type="primary" onTap="stopBluetoothDevicesDiscovery">停止搜索</button>
    </view>
    <view class="page-section-title">連接設備</view>
    <view class="page-section-demo">
       <input class="input" onInput="bindKeyInput" type="{{text}}" placeholder="輸入要連接的設備的deviceId"></input>
       <button type="primary" onTap="connectBLEDevice">連接設備</button>
       <button type="primary" onTap="getBLEDeviceServices">獲取設備服務</button>
       <button type="primary" onTap="getBLEDeviceCharacteristics">獲取讀寫特征</button>
       <button type="primary" onTap="disconnectBLEDevice">斷開設備連接</button>
    </view>
     <view class="page-section-title">讀寫數據</view>
     <view class="page-section-demo">
       <button type="primary" onTap="notifyBLECharacteristicValueChange">監(jiān)聽特征值數據變化</button>
       <button type="primary" onTap="readBLECharacteristicValue">讀取數據</button>
       <button type="primary" onTap="writeBLECharacteristicValue">寫入數據</button>
       <button type="primary" onTap="offBLECharacteristicValueChange">取消特征值監(jiān)聽</button>
    </view>
     <view class="page-section-title">其他事件</view>
     <view class="page-section-demo">
       <button type="primary" onTap="bluetoothAdapterStateChange">本機藍牙狀態(tài)變化</button>
       <button type="primary" onTap="offBluetoothAdapterStateChange">取消本機藍牙狀態(tài)監(jiān)聽</button>
       <button type="primary" onTap="BLEConnectionStateChanged">藍牙連接狀態(tài)變化</button>
       <button type="primary" onTap="offBLEConnectionStateChanged">取消藍牙連接狀態(tài)監(jiān)聽</button>

       
    </view>
  </view>
</view>
// .js
Page({
  data: {
    devid: '0D9C82AD-1CC0-414D-9526-119E08D28124',
    serid: 'FEE7',
    notifyId: '36F6',
    writeId: '36F5',
    charid: '',
    alldev: [{ deviceId: '' }],
  },


  //獲取本機藍牙開關狀態(tài)
  openBluetoothAdapter() {
    my.openBluetoothAdapter({
      success: res => {
        if (!res.isSupportBLE) {
          my.alert({ content: '抱歉,您的手機藍牙暫不可用' });
          return;
        }
        my.alert({ content: '初始化成功!' });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },
  closeBluetoothAdapter() {
    my.closeBluetoothAdapter({
      success: () => {
        my.alert({ content: '關閉藍牙成功!' });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },
  getBluetoothAdapterState() {
    my.getBluetoothAdapterState({
      success: res => {
        if (!res.available) {
          my.alert({ content: '抱歉,您的手機藍牙暫不可用' });
          return;
        }
        my.alert({ content: JSON.stringify(res) });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },


  //掃描藍牙設備
  startBluetoothDevicesDiscovery() {
    my.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
      success: () => {
        my.onBluetoothDeviceFound({
          success: res => {


            // my.alert({content:'監(jiān)聽新設備'+JSON.stringify(res)});
            var deviceArray = res.devices;
            for (var i = deviceArray.length - 1; i >= 0; i--) {
              var deviceObj = deviceArray[i];


              //通過設備名稱或者廣播數據匹配目標設備,然后記錄deviceID后面使用
              if (deviceObj.name == this.data.name) {
                my.alert({ content: '目標設備被找到' });
                my.offBluetoothDeviceFound();
                this.setData({
                  deviceId: deviceObj.deviceId,
                });
                break;
              }
            }
          },
          fail: error => {
            my.alert({ content: '監(jiān)聽新設備失敗' + JSON.stringify(error) });
          },
        });
      },
      fail: error => {
        my.alert({ content: '啟動掃描失敗' + JSON.stringify(error) });
      },
    });
  },


  //停止掃描
  stopBluetoothDevicesDiscovery() {
    my.stopBluetoothDevicesDiscovery({
      success: res => {
        my.offBluetoothDeviceFound();
        my.alert({ content: '操作成功!' });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },


  //獲取正在連接中的設備
  getConnectedBluetoothDevices() {
    my.getConnectedBluetoothDevices({
      success: res => {
        if (res.devices.length === 0) {
          my.alert({ content: '沒有在連接中的設備!' });
          return;
        }
        my.alert({ content: JSON.stringify(res) });
        devid = res.devices[0].deviceId;
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },


  //獲取所有搜索到的設備
  getBluetoothDevices() {
    my.getBluetoothDevices({
      success: res => {
        my.alert({ content: JSON.stringify(res) });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },


  bindKeyInput(e) {
    this.setData({
      devid: e.detail.value,
    });
  },


  //連接設備
  connectBLEDevice() {
    my.connectBLEDevice({
      deviceId: this.data.devid,
      success: res => {
        my.alert({ content: '連接成功' });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },


  //斷開連接
  disconnectBLEDevice() {
    my.disconnectBLEDevice({
      deviceId: this.data.devid,
      success: () => {
        my.alert({ content: '斷開連接成功!' });
      },
      fail: error => {
        my.alert({ content: JSON.stringify(error) });
      },
    });
  },


  //獲取連接設備的server,必須要再連接狀態(tài)狀態(tài)之下才能獲取
  getBLEDeviceServices() {
    my.getConnectedBluetoothDevices({
      success: res => {
        if (res.devices.length === 0) {
          my.alert({ content: '沒有已連接的設備' });
          return;
        }
        my.getBLEDeviceServices({
          deviceId: this.data.devid,
          success: res => {
            my.alert({ content: JSON.stringify(res) });
            this.setData({
              serid: res.services[0].serviceId,
            });
          },
          fail: error => {
            my.alert({ content: JSON.stringify(error) });
          },
        });
      },
    });
  },


  //獲取連接設備的charid,必須要再連接狀態(tài)狀態(tài)之下才能獲?。ㄟ@里分別篩選出讀寫特征字)
  getBLEDeviceCharacteristics() {
    my.getConnectedBluetoothDevices({
      success: res => {
        if (res.devices.length === 0) {
          my.alert({ content: '沒有已連接的設備' });
          return;
        }
        this.setData({
          devid: res.devices[0].deviceId,
        });
        my.getBLEDeviceCharacteristics({
          deviceId: this.data.devid,
          serviceId: this.data.serid,
          success: res => {
            my.alert({ content: JSON.stringify(res) });


            //特征字對象屬性見文檔,根據屬性匹配讀寫特征字并記錄,然后后面讀寫使用
            this.setData({
              charid: res.characteristics[0].characteristicId,
            });
          },
          fail: error => {
            my.alert({ content: JSON.stringify(error) });
          },
        });
      },
    });
  },


  //讀寫數據
  readBLECharacteristicValue() {
    my.getConnectedBluetoothDevices({
      success: res => {
        if (res.devices.length === 0) {
          my.alert({ content: '沒有已連接的設備' });
          return;
        }
        this.setData({
          devid: res.devices[0].deviceId,
        });
        my.readBLECharacteristicValue({
          deviceId: this.data.devid,
          serviceId: this.data.serid,
          characteristicId: this.data.notifyId,


          //1、安卓讀取服務
          // serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
          // characteristicId:'00002a38-0000-1000-8000-00805f9b34fb',
          success: res => {
            my.alert({ content: JSON.stringify(res) });
          },
          fail: error => {
            my.alert({ content: '讀取失敗' + JSON.stringify(error) });
          },
        });
      },
    });
  },


  writeBLECharacteristicValue() {
    my.getConnectedBluetoothDevices({
      success: res => {
        if (res.devices.length === 0) {
          my.alert({ content: '沒有已連接的設備' });
          return;
        }
        this.setData({
          devid: res.devices[0].deviceId,
        });


        my.writeBLECharacteristicValue({
          deviceId: this.data.devid,
          serviceId: this.data.serid,
          characteristicId: this.data.charid,


          //安卓寫入服務
          //serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
          //characteristicId:'00002a39-0000-1000-8000-00805f9b34fb',
          value: 'ABCD',
          success: res => {
            my.alert({ content: '寫入數據成功!' });
          },
          fail: error => {
            my.alert({ content: JSON.stringify(error) });
          },
        });
      },
    });
  },
  notifyBLECharacteristicValueChange() {
    my.getConnectedBluetoothDevices({
      success: res => {
        if (res.devices.length === 0) {
          my.alert({ content: '沒有已連接的設備' });
          return;
        }
        this.setData({
          devid: res.devices[0].deviceId,
        });


        my.notifyBLECharacteristicValueChange({
          state: true,
          deviceId: this.data.devid,
          serviceId: this.data.serid,
          characteristicId: this.data.notifyId,
          success: () => {


            //監(jiān)聽特征值變化的事件
            my.onBLECharacteristicValueChange({
              success: res => {


                //  my.alert({content: '特征值變化:'+JSON.stringify(res)});
                my.alert({ content: '得到響應數據 = ' + res.value });
              },
            });
            my.alert({ content: '監(jiān)聽成功' });
          },
          fail: error => {
            my.alert({ content: '監(jiān)聽失敗' + JSON.stringify(error) });
          },
        });
      },
    });
  },
  offBLECharacteristicValueChange() {
    my.offBLECharacteristicValueChange();
  },


  //其他事件
  bluetoothAdapterStateChange() {
    my.onBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
  },
  onBluetoothAdapterStateChange() {
    if (res.error) {
      my.alert({ content: JSON.stringify(error) });
    } else {
      my.alert({ content: '本機藍牙狀態(tài)變化:' + JSON.stringify(res) });
    }
  },
  offBluetoothAdapterStateChange() {
    my.offBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
  },
  getBind(name) {
    if (!this[`bind${name}`]) {
      this[`bind${name}`] = this[name].bind(this);
    }
    return this[`bind${name}`];
  },
  BLEConnectionStateChanged() {
    my.onBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
  },
  onBLEConnectionStateChanged(res) {
    if (res.error) {
      my.alert({ content: JSON.stringify(error) });
    } else {
      my.alert({ content: '連接狀態(tài)變化:' + JSON.stringify(res) });
    }
  },
  offBLEConnectionStateChanged() {
    my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
  },
  onUnload() {
    this.offBLEConnectionStateChanged();
    this.offBLECharacteristicValueChange();
    this.offBluetoothAdapterStateChange();
    this.closeBluetoothAdapter();
  },
});

入參

Function 類型。callback 回調函數入參為 Object 類型,屬性如下:

名稱 類型 描述
deviceId String 藍牙設備 ID,參考 device 對象。
connected Boolean 連接目前的狀態(tài)。
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號