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.closeBluetoothAdapter
和my.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 | 否 | 是否允許重複上報同一裝置, 如果允許重複上報,則 |
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 | 值與 |
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:模擬器可能無法擷取
advertisData
及RSSI
,請使用真機調試。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,參考 |
serviceId | String | 是 | 藍芽特徵值對應 |
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,參考 |
serviceId | String | 是 | 藍芽特徵值對應 |
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,參考 |
serviceId | String | 是 | 藍芽特徵值對應 |
characteristicId | String | 是 | 藍芽特徵值的 UUID |
descriptorId | String | 否 |
|
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 才可以成功調用,具體參照
characteristic
的properties
屬性。Tip:必須先啟用 notify 才能監聽到裝置
characteristicValueChange
事件。Tip:訂閱操作成功後需要裝置主動更新特徵值的 value,才會觸發
my.onBLECharacteristicValueChange
。Tip:訂閱者式效率比較高,推薦使用訂閱代替 read 方式。
my.getBLEDeviceServices
擷取所有已發現的藍牙裝置,包括已經和本機處於串連狀態的裝置。
入參
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 藍牙裝置 ID,參考 |
success | Function | 否 | 調用成功的回呼函數 |
fail | Function | 否 | 調用失敗的回呼函數 |
complete | Function | 否 | 調用結束的回呼函數(調用成功、失敗都會執行) |
success 傳回值
名稱 | 類型 | 描述 |
---|---|---|
services | Array | 已發現的裝置服務列表,詳見下表特徵值資訊 |
service對象
藍牙裝置 service(服務)資訊。
名稱 | 類型 | 描述 |
---|---|---|
serviceId | String | 藍牙裝置服務的 uuid |
isPrimary | Boolean | 該服務是否為主服務
|
程式碼範例
//擷取串連裝置的 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.getBLEDeviceServices
與my.getBLEDeviceCharacteristics
後再進行與藍牙裝置的資料互動。Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。
my.getBLEDeviceCharacteristics
擷取藍牙裝置所有 characteristic
(特徵值)。
入參
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 藍牙裝置 ID,參考 |
serviceId | String | 是 | 藍芽特徵值對應 |
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.getBLEDeviceServices
與my.getBLEDeviceCharacteristics
後再進行與藍牙裝置的資料互動。Tip:支援 iOS 用戶端,Android 5.0 及以上版本用戶端。
my.onBluetoothDeviceFound(callback)
搜尋到新的藍牙裝置時觸發此事件。
入參
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
callback | Function | 是 | 事件發生時回調 |
callback 傳回值
名稱 | 類型 | 描述 |
---|---|---|
devices | Array | 新搜尋到的裝置列表 |
device 對象
名稱 | 類型 | 描述 |
---|---|---|
name | String | 藍牙裝置名稱,某些裝置可能沒有 |
deviceName(相容舊版本) | String | 值與 |
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:模擬器可能無法擷取
advertisData
及RSSI
,請使用真機調試。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,參考 |
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,參考 |
serviceId | String | 藍芽特徵值對應 |
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,參考 |
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
方法,關閉之前的事件監聽。