全部產品
Search
文件中心

Mobile Platform as a Service:藍芽 API 列表

更新時間:Jul 13, 2024

說明

  • mPaaS 10.1.60 及以上版本支援藍芽介面。

  • 目前不支援在開發人員工具上進行調試,需要使用真機才能正常調用小程式藍芽介面。

my.openBluetoothAdapter

初始化小程式藍芽模組,生效周期為調用 my.openBluetoothAdapter 至調用 my.closeBluetoothAdapter 或小程式被銷毀為止。在小程式藍芽適配器模組生效期間,開發人員可以正常調用下面的小程式 API,並會收到藍芽模組相關的 on 事件回調。

入參

名稱

類型

必填

描述

autoClose

Boolean

表示是否在離開當前頁面時自動斷開藍芽,不傳的話預設是 true

重要

目前僅支援 Android 系統。

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

success 傳回值

名稱

類型

描述

isSupportBLE

Boolean

是否支援 BLE

錯誤碼描述

error

描述

解決方案

12

藍芽未開啟

請嘗試開啟藍芽

13

與系統服務的連結暫時丟失

請嘗試重新串連

14

未授權用戶端使用藍芽功能

請授權用戶端使用藍芽功能

15

未知錯誤

-

程式碼範例

<!-- .axml-->
<view class="page">
  <view class="page-description">藍芽 API</view>
  <view class="page-section">
    <view class="page-section-title">本機藍芽開關狀態</view>
    <view class="page-section-demo">
       <button type="primary" onTap="openBluetoothAdapter">初始化藍芽</button>
       <button type="primary" onTap="closeBluetoothAdapter">關閉本機藍芽</button>
       <button type="primary" onTap="getBluetoothAdapterState">擷取藍芽狀態</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">監聽特徵值資料變化</button>
       <button type="primary" onTap="readBLECharacteristicValue">讀取資料</button>
       <button type="primary" onTap="writeBLECharacteristicValue">寫入資料</button>
       <button type="primary" onTap="offBLECharacteristicValueChange">取消特徵值監聽</button>
    </view>

     <view class="page-section-title">其他事件</view>
     <view class="page-section-demo">
       <button type="primary" onTap="bluetoothAdapterStateChange">本機藍芽狀態變化</button>
       <button type="primary" onTap="offBluetoothAdapterStateChange">取消本機藍芽狀態監聽</button>
       <button type="primary" onTap="BLEConnectionStateChanged">藍芽串連狀態變化</button>
       <button type="primary" onTap="offBLEConnectionStateChanged">取消藍芽串連狀態監聽</button>

    </view>
  </view>
</view>
// .js
Page({
  data: {
    devid: '0D9C82AD-1CC0-414D-9526-119E08D28124',
    serid: 'FEE7',
    notifyId: '36F6',
    writeId: '36F5',
    charid: '',
    alldev: [{ deviceId: '' }],
  },
  //擷取本機藍芽開關狀態
  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:'監聽新裝置'+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: '監聽新裝置失敗' + 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,必須要再串連狀態之下才能擷取
  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,必須要再串連狀態之下才能擷取(這裡分別篩選出讀寫特徵字)
  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: () => {
            //監聽特徵值變化的事件
            my.onBLECharacteristicValueChange({
              success: res => {
                //  my.alert({content: '特徵值變化:'+JSON.stringify(res)});
                my.alert({ content: '得到響應資料 = ' + res.value });
              },
            });
            my.alert({ content: '監聽成功' });
          },
          fail: error => {
            my.alert({ content: '監聽失敗' + 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: '本機藍芽狀態變化:' + 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: '串連狀態變化:' + JSON.stringify(res) });
    }
  },
  offBLEConnectionStateChanged() {
    my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
  },
  onUnload() {
    this.offBLEConnectionStateChanged();
    this.offBLECharacteristicValueChange();
    this.offBluetoothAdapterStateChange();
    this.closeBluetoothAdapter();
  },
});

Bug & Tip

  • Bug:在使用者藍芽開關未開啟或者手機不支援藍芽功能的情況下,調用 my.openBluetoothAdapter 會返回錯誤,錯誤碼見 藍芽 API 錯誤碼對照表;此時小程式藍芽模組已經初始化完成,可通過 my.onBluetoothAdapterStateChange 監聽手機藍芽狀態的改變。

  • Tip:在調用 my.openBluetoothAdapter API 之前,調用小程式其它藍芽模組相關 API,API 會返回錯誤。

    • 錯誤碼:10000

    • 錯誤描述:未初始化藍芽適配器

    • 解決方案:請調用 my.openBluetoothAdapter

my.closeBluetoothAdapter

關閉本機藍芽模組。

入參

名稱

類型

必填

描述

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.closeBluetoothAdapter({
  success: (res) => {
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:調用該方法將斷開所有已建立的藍芽串連並釋放系統資源。

  • Tip:建議在結束小程式藍芽流程時調用,與 my.openBluetoothAdapter 成對調用。

  • Tip:調用 my.closeBluetoothAdapter 釋放資源為非同步作業,不建議使用 my.closeBluetoothAdaptermy.openBluetoothAdapter 作為異常處理流程(相當於先關閉再開啟,重新初始化,效率低,易發生線程同步問題)。

my.getBluetoothAdapterState

擷取本機藍芽模組狀態。

入參

名稱

類型

必填

描述

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

success 傳回值

名稱

類型

描述

discovering

Boolean

是否正在搜尋裝置

available

Boolean

藍芽模組是否可用(需支援 BLE 並且藍芽是開啟狀態)

程式碼範例

my.getBluetoothAdapterState({
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

my.startBluetoothDevicesDiscovery

開始搜尋附近的藍芽外圍裝置。搜尋結果將在 my.onBluetoothDeviceFound 事件中返回。

入參

名稱

類型

必填

描述

services

Array

藍牙裝置主 service 的 uuid 列表。

allowDuplicatesKey

Boolean

是否允許重複上報同一裝置, 如果允許重複上報,則 onBluetoothDeviceFound 方法會多次上報同一裝置,但是 RSSI 值會有不同。

interval

Integer

上報裝置的間隔,預設為 0,即找到新裝置立即上報,否則根據傳入的間隔上報。

success

Function

調用成功的回呼函數。

fail

Function

調用失敗的回呼函數。

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)。

程式碼範例

my.startBluetoothDevicesDiscovery({
  services: ['fff0'],
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:該操作比較耗費系統資源,請在搜尋並串連到裝置後調用 stop 方法停止搜尋。

my.stopBluetoothDevicesDiscovery

停止搜尋附近的藍芽外圍裝置。

入參

名稱

類型

必填

描述

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.stopBluetoothDevicesDiscovery({
  success: (res) => {
    console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

my.getBluetoothDevices

擷取所有已發現的藍牙裝置,包括已經和本機處於串連狀態的藍牙裝置。

入參

名稱

類型

必填

描述

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

success 傳回值

名稱

類型

描述

devices

Array

已發現的裝置列表

device 對象

名稱

類型

描述

name

String

藍牙裝置名稱,某些裝置可能沒有

deviceName(相容舊版本)

String

值與 name 一致

localName

String

廣播裝置名稱

deviceId

String

裝置識別碼

RSSI

Number

裝置訊號強度

advertisData

Hex String

裝置的廣播內容

manufacturerData

Hex String

裝置的 manufacturerData

程式碼範例

my.getBluetoothDevices({
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:模擬器可能無法擷取 advertisDataRSSI,請使用真機調試。

  • Tip:開發人員工具和 Android 上擷取到的 deviceId 為裝置 MAC 位址,iOS 上則為裝置 UUID。因此 deviceId 不能寫入程式碼到代碼中,需要分平台處理,iOS 可根據裝置屬性( localName/advertisData/manufacturerData 等屬性)進行動態匹配。

my.getConnectedBluetoothDevices

擷取處於已串連狀態的裝置。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.getConnectedBluetoothDevices({
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:若小程式在之前已有搜尋過某個藍牙裝置,即可直接傳入之前搜尋擷取的 deviceId 嘗試串連該裝置,無需進行搜尋操作。

  • Tip:若指定的藍牙裝置已經串連,重複串連將直接返回 success

my.connectBLEDevice

串連低功耗藍牙裝置。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.connectBLEDevice({
  // 這裡的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 介面中擷取
  deviceId: deviceId,
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:若小程式在之前已有搜尋過某個藍牙裝置,可直接傳入之前搜尋擷取的 deviceId 直接嘗試串連該裝置,無需進行搜尋操作。

  • Tip:若指定的藍牙裝置已經串連,重複串連直接返回成功。

  • Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。

my.disconnectBLEDevice

斷開與低功耗藍牙裝置的串連。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.disconnectBLEDevice({
  deviceId: deviceId,
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:藍芽串連隨時可能斷開,建議監聽 my.onBLEConnectionStateChanged 回調事件,當藍牙裝置斷開時按需執行重連操作。

  • Tip:若對未串連的裝置或已中斷連線的裝置調用資料讀寫操作的介面,會返回 10006 錯誤,詳見 藍芽 API 錯誤碼對照表,建議進行重連操作。

  • Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。

my.writeBLECharacteristicValue

向低功耗藍牙裝置特徵值中寫入資料。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

serviceId

String

藍芽特徵值對應 service 的 UUID

characteristicId

String

藍芽特徵值的 UUID

value

Hex String

藍牙裝置特徵值對應的值,16 進位字串,限制在 20 位元組內

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.writeBLECharacteristicValue({
  deviceId: deviceId,
  serviceId: serviceId,
  characteristicId: characteristicId,
  value: 'fffe',
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:裝置的特徵值必須支援 write 才可以成功調用,具體參照 characteristic 的 properties 屬性。

  • Tip:寫入的位元據需要進行 hex 編碼。

  • Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。

my.readBLECharacteristicValue

讀取低功耗藍牙裝置特徵值中的資料。調用後在 my.onBLECharacteristicValueChange() 事件中接收資料返回。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

serviceId

String

藍芽特徵值對應 service 的 uuid

characteristicId

String

藍芽特徵值的 uuid

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

success 傳回值

名稱

類型

描述

characteristic

Object

裝置特徵值資訊

characteristic 對象

藍牙裝置 characteristic(特徵值)資訊。

名稱

類型

描述

characteristicId

String

藍牙裝置特徵值的 UUID

serviceId

String

藍牙裝置特徵值對應服務的 UUID

value

Hex String

藍牙裝置特徵值的 value

程式碼範例

my.readBLECharacteristicValue({
  deviceId: deviceId,
  serviceId: serviceId,
  characteristicId: characteristicId,
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:裝置的特徵值必須支援 read 才可以成功調用,具體參照 characteristic 的 properties 屬性。

  • Tip:並行多次調用讀寫介面存在讀寫失敗的可能性。

  • Tip:如果讀取逾時,錯誤碼 10015,my.onBLECharacteristicValueChange 介面之後可能返回資料,需要接入方酌情處理。錯誤碼資訊及解決方案請參見 藍芽 API 錯誤碼對照表

  • Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。

my.notifyBLECharacteristicValueChange

啟用低功耗藍牙裝置特徵值變化時的 notify 功能。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

serviceId

String

藍芽特徵值對應 service 的 UUID

characteristicId

String

藍芽特徵值的 UUID

descriptorId

String

notifydescriptor 的 uuid(只有 Android 會用到,非必填,預設值為 00002902-0000-10008000-00805f9b34fb)

state

Boolean

是否啟用 notify 或 indicate

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

程式碼範例

my.notifyBLECharacteristicValueChange({
  deviceId: deviceId,
  serviceId: serviceId,
  characteristicId: characteristicId,
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:裝置的特徵值必須支援 notify/indicate 才可以成功調用,具體參照 characteristicproperties 屬性。

  • Tip:必須先啟用 notify 才能監聽到裝置 characteristicValueChange 事件。

  • Tip:訂閱操作成功後需要裝置主動更新特徵值的 value,才會觸發 my.onBLECharacteristicValueChange

  • Tip:訂閱者式效率比較高,推薦使用訂閱代替 read 方式。

my.getBLEDeviceServices

擷取所有已發現的藍牙裝置,包括已經和本機處於串連狀態的裝置。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

success 傳回值

名稱

類型

描述

services

Array

已發現的裝置服務列表,詳見下表特徵值資訊

service對象

藍牙裝置 service(服務)資訊。

名稱

類型

描述

serviceId

String

藍牙裝置服務的 uuid

isPrimary

Boolean

該服務是否為主服務

  • true 為主服務

  • false 不是主服務

程式碼範例

 //擷取串連裝置的 server,必須要在串連狀態之下才能擷取
  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) });
          },
        });
      },
    });
  },

傳回值樣本

{
    "services": [{
        "isPrimary": true,
        "serviceId": "00001800-0000-1000-8000-00805f9b34fb"
    }, {
        "isPrimary": true,
        "serviceId": "00001801-0000-1000-8000-00805f9b34fb"
    }, {
        "isPrimary": true,
        "serviceId": "d0611e78-bbb4-4591-a5f8-487910ae4366"
    }, {
        "isPrimary": true,
        "serviceId": "9fa480e0-4967-4542-9390-d343dc5d04ae"
    }]
}

Bug & Tip

  • Tip:建立串連後先執行 my.getBLEDeviceServicesmy.getBLEDeviceCharacteristics 後再進行與藍牙裝置的資料互動。

  • Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。

my.getBLEDeviceCharacteristics

擷取藍牙裝置所有 characteristic(特徵值)。

入參

名稱

類型

必填

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

serviceId

String

藍芽特徵值對應 service 的 UUID

success

Function

調用成功的回呼函數

fail

Function

調用失敗的回呼函數

complete

Function

調用結束的回呼函數(調用成功、失敗都會執行)

success 傳回值

名稱

類型

描述

characteristics

Array

裝置特徵值列

characteristic 對象

藍牙裝置 characteristic(特徵值)資訊。

名稱

類型

描述

characteristicId

String

藍牙裝置特徵值的 uuid

serviceId

String

藍牙裝置特徵值對應服務的 uuid

value

Hex String

藍牙裝置特徵值對應的 16 進位值

properties

Object

該特徵值支援的操作類型

properties 對象

名稱

類型

描述

read

Boolean

該特徵值是否支援 read 操作

write

Boolean

該特徵值是否支援 write 操作

notify

Boolean

該特徵值是否支援 notify 操作

indicate

Boolean

該特徵值是否支援 indicate 操作

程式碼範例

my.getBLEDeviceCharacteristics({
  deviceId: deviceId,
  serviceId: serviceId,
  success: (res) => {
      console.log(res)
  },
  fail:(res) => {
  },
  complete: (res)=>{
  }
});

Bug & Tip

  • Tip:建立串連後先執行 my.getBLEDeviceServicesmy.getBLEDeviceCharacteristics 後再進行與藍牙裝置的資料互動。

  • Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。

my.onBluetoothDeviceFound(callback)

搜尋到新的藍牙裝置時觸發此事件。

入參

名稱

類型

必填

描述

callback

Function

事件發生時回調

callback 傳回值

名稱

類型

描述

devices

Array

新搜尋到的裝置列表

device 對象

名稱

類型

描述

name

String

藍牙裝置名稱,某些裝置可能沒有

deviceName(相容舊版本)

String

值與 name 一致

localName

String

廣播裝置名稱

deviceId

String

裝置識別碼

RSSI

Number

裝置訊號強度

advertisData

Hex String

裝置的廣播內容

程式碼範例

Page({
  onLoad() {
    this.callback = this.callback.bind(this);
    my.onBluetoothDeviceFound(this.callback);
  },
  onUnload() {
    my.offBluetoothDeviceFound(this.callback);
  },
  callback(res) {
    console.log(res);
  },
})

Bug & Tip

  • Tip:模擬器可能無法擷取 advertisDataRSSI ,請使用真機調試。

  • Tip:開發人員工具和 Android 上擷取到的 deviceId 為裝置 MAC 位址,iOS 上則為裝置 uuid。因此 deviceId 不能寫入程式碼到代碼中,需要分平台處理,iOS 可根據裝置屬性(localName/advertisData/manufacturerData 等)進行動態匹配。

  • Tip:若在 my.onBluetoothDeviceFound 回調中包含了某個藍牙裝置,則此裝置會添加到 my.getBluetoothDevices 介面擷取到的數組中。

my.offBluetoothDeviceFound

移除發現新的藍牙裝置事件的監聽。

程式碼範例

my.offBluetoothDeviceFound();

是否需要傳 callback 值

  • 不傳遞 callback 值,則會移除監聽所有的事件監聽回調。範例程式碼如下:

    my.offBluetoothDeviceFound();
  • 傳遞 callback 值,只移除對應的 callback 事件。範例程式碼如下:

    my.offBluetoothDeviceFound(this.callback);

Bug & Tip

  • Tip:為防止多次註冊事件監聽導致一次事件多次回調,建議每次調用 on 方法監聽事件之前,先調用 off 方法,關閉之前的事件監聽。

my.onBLECharacteristicValueChange(callback)

監聽低功耗藍牙裝置的特徵值變化的事件。

入參

名稱

類型

必填

描述

callback

Function

事件回呼函數

callback 傳回值

名稱

類型

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

connected

Boolean

串連目前的狀態

程式碼範例

Page({
  onLoad() {
    this.callback = this.callback.bind(this);
    my.onBLECharacteristicValueChange(this.callback);
  },
  onUnload() {
    my.offBLECharacteristicValueChange(this.callback);
  },
  callback(res) {
    console.log(res);
  },
})

Bug & Tip

  • Tip:為防止多次事件監聽導致一次事件多次回調的情況,建議每次調用 on 方法監聽事件之前,先調用 off 方法,關閉之前的事件監聽。

my.offBLECharacteristicValueChange

移除低功耗藍牙裝置的特徵值變化事件的監聽。

入參

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

屬性

類型

描述

deviceId

String

藍牙裝置 ID,參考 device 對象。

serviceId

String

藍芽特徵值對應 service 的 UUID。

characteristicId

String

藍芽特徵值的 UUID。

value

Hex String

特徵值最新的 16 進位值。

是否傳遞 callback 值樣本

  • 不傳遞 callback 值,則會移除監聽所有的事件監聽回調。範例程式碼如下:

    my.offBLECharacteristicValueChange();
  • 傳遞 callback 值,只移除對應的 callback 事件。範例程式碼如下:

    my.offBLECharacteristicValueChange(this.callback);

程式碼範例

Page({
  onLoad() {
    this.callback = this.callback.bind(this);
    my.onBLECharacteristicValueChange(this.callback);
  },
  onUnload() {
    my.offBLECharacteristicValueChange(this.callback);
  },
  callback(res) {
    console.log(res);
  },
})

my.onBLEConnectionStateChanged(callback)

監聽低功耗藍芽串連的錯誤事件,包括裝置丟失,串連異常斷開等。

入參

名稱

類型

必填

描述

callback

Function

事件回呼函數

callback 傳回值

名稱

類型

描述

deviceId

String

藍牙裝置 ID,參考 device 對象

connected

Boolean

串連目前的狀態

程式碼範例

/* .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">本機藍芽開關狀態</view>
    <view class="page-section-demo">
       <button type="primary" onTap="openBluetoothAdapter">初始化藍芽</button>
       <button type="primary" onTap="closeBluetoothAdapter">關閉本機藍芽</button>
       <button type="primary" onTap="getBluetoothAdapterState">擷取藍芽狀態</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">監聽特徵值資料變化</button>
       <button type="primary" onTap="readBLECharacteristicValue">讀取資料</button>
       <button type="primary" onTap="writeBLECharacteristicValue">寫入資料</button>
       <button type="primary" onTap="offBLECharacteristicValueChange">取消特徵值監聽</button>
    </view>

     <view class="page-section-title">其他事件</view>
     <view class="page-section-demo">
       <button type="primary" onTap="bluetoothAdapterStateChange">本機藍芽狀態變化</button>
       <button type="primary" onTap="offBluetoothAdapterStateChange">取消本機藍芽狀態監聽</button>
       <button type="primary" onTap="BLEConnectionStateChanged">藍芽串連狀態變化</button>
       <button type="primary" onTap="offBLEConnectionStateChanged">取消藍芽串連狀態監聽</button>

    </view>

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

  //擷取本機藍芽開關狀態
  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:'監聽新裝置'+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: '監聽新裝置失敗' + 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,必須要再串連狀態之下才能擷取
  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,必須要再串連狀態之下才能擷取(這裡分別篩選出讀寫特徵字)
  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: () => {
            //監聽特徵值變化的事件
            my.onBLECharacteristicValueChange({
              success: res => {
                //  my.alert({content: '特徵值變化:'+JSON.stringify(res)});
                my.alert({ content: '得到響應資料 = ' + res.value });
              },
            });
            my.alert({ content: '監聽成功' });
          },
          fail: error => {
            my.alert({ content: '監聽失敗' + 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: '本機藍芽狀態變化:' + 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: '串連狀態變化:' + JSON.stringify(res) });
    }
  },
  offBLEConnectionStateChanged() {
    my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
  },
  onUnload() {
    this.offBLEConnectionStateChanged();
    this.offBLECharacteristicValueChange();
    this.offBluetoothAdapterStateChange();
    this.closeBluetoothAdapter();
  },
});

Bug & Tip

  • Tip:為防止多次註冊事件監聽導致一次事件多次回調,建議每次調用 on 方法監聽事件之前,先調用 off 方法,關閉之前的事件監聽。

my.offBLEConnectionStateChanged

移除低功耗藍芽串連狀態變化事件的監聽。

程式碼範例

my.offBLEConnectionStateChanged();

是否需要傳 callback 值

  • 不傳遞 callback 值,則會移除監聽所有的事件監聽回調。範例程式碼如下:

    my.offBLEConnectionStateChanged();
  • 傳遞 callback 值,只移除對應的 callback 事件。範例程式碼如下:

    my.offBLEConnectionStateChanged(this.callback);

Bug & Tip

  • Tip:為防止多次註冊事件監聽導致一次事件多次回調,建議每次調用 on 方法監聽事件之前,先調用 off 方法,關閉之前的事件監聽。

my.onBluetoothAdapterStateChange(callback)

監聽本機藍芽狀態變化的事件。

入參

名稱

類型

必填

描述

callback

Function

事件回呼函數

callback 傳回值

名稱

類型

描述

available

Boolean

藍芽模組是否可用

discovering

Boolean

藍芽模組是否處於搜尋狀態

程式碼範例

/* .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">本機藍芽開關狀態</view>
    <view class="page-section-demo">
       <button type="primary" onTap="openBluetoothAdapter">初始化藍芽</button>
       <button type="primary" onTap="closeBluetoothAdapter">關閉本機藍芽</button>
       <button type="primary" onTap="getBluetoothAdapterState">擷取藍芽狀態</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">監聽特徵值資料變化</button>
       <button type="primary" onTap="readBLECharacteristicValue">讀取資料</button>
       <button type="primary" onTap="writeBLECharacteristicValue">寫入資料</button>
       <button type="primary" onTap="offBLECharacteristicValueChange">取消特徵值監聽</button>
    </view>

     <view class="page-section-title">其他事件</view>
     <view class="page-section-demo">
       <button type="primary" onTap="bluetoothAdapterStateChange">本機藍芽狀態變化</button>
       <button type="primary" onTap="offBluetoothAdapterStateChange">取消本機藍芽狀態監聽</button>
       <button type="primary" onTap="BLEConnectionStateChanged">藍芽串連狀態變化</button>
       <button type="primary" onTap="offBLEConnectionStateChanged">取消藍芽串連狀態監聽</button>

    </view>

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

  //擷取本機藍芽開關狀態
  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:'監聽新裝置'+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: '監聽新裝置失敗' + 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,必須要再串連狀態之下才能擷取
  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,必須要再串連狀態之下才能擷取(這裡分別篩選出讀寫特徵字)
  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: () => {

            //監聽特徵值變化的事件
            my.onBLECharacteristicValueChange({
              success: res => {

                //  my.alert({content: '特徵值變化:'+JSON.stringify(res)});
                my.alert({ content: '得到響應資料 = ' + res.value });
              },
            });
            my.alert({ content: '監聽成功' });
          },
          fail: error => {
            my.alert({ content: '監聽失敗' + 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: '本機藍芽狀態變化:' + 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: '串連狀態變化:' + JSON.stringify(res) });
    }
  },
  offBLEConnectionStateChanged() {
    my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
  },
  onUnload() {
    this.offBLEConnectionStateChanged();
    this.offBLECharacteristicValueChange();
    this.offBluetoothAdapterStateChange();
    this.closeBluetoothAdapter();
  },
});

my.offBluetoothAdapterStateChange

移除本機藍芽狀態變化的事件的監聽

程式碼範例

my.offBluetoothAdapterStateChange();

是否需要傳 callback 值

  • 不傳遞 callback 值,則會移除監聽所有的事件監聽回調。範例程式碼如下:

    my.offBluetoothAdapterStateChange();
  • 傳遞 callback 值,只移除對應的 callback 事件。範例程式碼如下:

    my.offBluetoothAdapterStateChange(this.callback);

Bug & Tip

  • Tip:為防止多次註冊事件監聽導致一次事件多次回調,建議每次調用 on 方法監聽事件之前,先調用 off 方法,關閉之前的事件監聽。