前言:UNI-APP是一個使用 Vue.js 開發所有前端應用的框架,開發者編寫一套代碼,可發布到iOS、Android、Web(響應式)、以及各種小程序(微信/支付寶/百度/頭條/飛書/QQ/快手/釘釘/淘寶)、快應用等多個平臺。愛掏網 - it200.com即使你不需要發布到那么多的平臺,UNI-APP也是一個不錯的微信小程序的開發框架
UNI-APP的官網
錯誤碼 | 錯誤信息 | 說明 |
---|---|---|
0 | ok | 正常 |
10000 | not init | 未初始化藍牙適配器 |
10001 | not available | 當前藍牙適配器不可用 |
10002 | no device | 沒有找到指定設備 |
10003 | connection fail | 連接失敗 |
10004 | no service | 沒有找到指定服務 |
10005 | no characteristic | 沒有找到指定特征值 |
10006 | no connection | 當前連接已斷開 |
10007 | property not support | 當前特征值不支持此操作 |
10008 | system error | 其余所有系統上報的異常 |
10009 | system not support | Android 系統特有,系統版本低于 4.3 不支持 BLE |
10012 | operate time out | 連接超時 |
10013 | invalid_data | 連接 deviceId 為空或者是格式不正確 |
uni.openBluetoothAdapter(OBJECT)
- 其他藍牙相關 API 必須在這個方法調用之后使用。愛掏網 - it200.com否則 API 會返回錯誤(errCode=10000)。愛掏網 - it200.com
- 在用戶藍牙開關未開啟或者手機不支持藍牙功能的情況下,調用這個方法會返回錯誤(errCode=10001),表示手機藍牙功能不可用。愛掏網 - it200.com
- 初始化完成后,可通過
uni.onBluetoothAdapterStateChange
監聽手機藍牙狀態的改變,也可以調用藍牙模塊的所有API。愛掏網 - it200.com
示例代碼
uni.openBluetoothAdapter({
success: (res) => {
if (res.errMsg == 'openBluetoothAdapter:ok') {}
}
})
uni.onBluetoothAdapterStateChange(CALLBACK)
CALLBACK 返回參數
屬性 | 類型 | 說明 |
---|---|---|
available | boolean | 藍牙適配器是否可用 |
discovering | boolean | 藍牙適配器是否處于搜索狀態 |
示例代碼
uni.onBLEConnectionStateChange((res) => {
if (res.cOnnected== false) {
this.cut = true
uni.showModal({
title: "藍牙連接斷開",
content: "是否重新搜索",
success: (res) => {
if (res.confirm) this.search()
}
})
}
})
uni.startBluetoothDevicesDiscovery(OBJECT)
- App 端目前僅支持發現ble藍牙設備
- 開始搜尋附近的藍牙外圍設備。愛掏網 - it200.com此操作比較耗費系統資源,請在搜索并連接到設備后調用
uni.stopBluetoothDevicesDiscovery
方法停止搜索。愛掏網 - it200.com
OBJECT 參數說明
屬性 | 類型 | 默認值 | 必填 | 說明 |
---|---|---|---|---|
services | Array | 否 | 要搜索但藍牙設備主 service 的 uuid 列表。愛掏網 - it200.com某些藍牙設備會廣播自己的主 service 的 uuid。愛掏網 - it200.com如果設置此參數,則只搜索廣播包有對應 uuid 的主服務的藍牙設備。愛掏網 - it200.com建議主要通過該參數過濾掉周邊不需要處理的其他藍牙設備。愛掏網 - it200.com | |
allowDuplicatesKey | boolean | false | 否 | 是否允許重復上報同一設備。愛掏網 - it200.com如果允許重復上報,則 uni.onBlueToothDeviceFound 方法會多次上報同一設備,但是 RSSI 值會有不同。愛掏網 - it200.com |
interval | number | 0 | 否 | 上報設備的間隔。愛掏網 - it200.com0 表示找到新設備立即上報,其他數值根據傳入的間隔上報。愛掏網 - it200.com |
success | function | 否 | 接口調用成功的回調函數 | |
fail | function | 否 | 接口調用失敗的回調函數 | |
complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
示例代碼
uni.startBluetoothDevicesDiscovery({
allowDuplicatesKey: true, //是否允許重復上報同一設備
interval: 0, //搜索間隔
success: (res2) => {
if (res2.errMsg == 'startBluetoothDevicesDiscovery:ok') {
this.monitor()
}
}
})
uni.onBluetoothDeviceFound(CALLBACK)
CALLBACK 返回參數
屬性 | 類型 | 說明 |
---|---|---|
devices | Array | 新搜索到的設備列表 |
devices 的結構
屬性 | 類型 | 說明 |
---|---|---|
name | string | 藍牙設備名稱,某些設備可能沒有 |
deviceId | string | 用于區分設備的 id |
RSSI | number | 當前藍牙設備的信號強度 |
advertisData | ArrayBuffer | 當前藍牙設備的廣播數據段中的 ManufacturerData 數據段 |
advertisServiceUUIDs | Array | 當前藍牙設備的廣播數據段中的 ServiceUUIDs 數據段 |
localName | string | 當前藍牙設備的廣播數據段中的 LocalName 數據段 |
serviceData | Object | 當前藍牙設備的廣播數據段中的 ServiceData 數據段 |
- 若在
uni.onBluetoothDeviceFound
回調了某個設備,則此設備會添加到uni.getBluetoothDevices
(有興趣的話的查找一下)接口獲取到的數組中。愛掏網 - it200.com
示例代碼
uni.onBluetoothDeviceFound((res) => {
res.devices.forEach(result => {
if ((result.name != '') && (result.localName != '')) {
let idx = util.inArray(this.booth.list, 'deviceId', result.deviceId)
if (idx === -1) {
this.booth.list.push(result)
} else {
this.booth.list[idx] = result
}
}
})
})
uni.stopBluetoothDevicesDiscovery(OBJECT)
- 搜索藍牙是很費資源的行為,若已經找到需要的藍牙設備并不需要繼續搜索時,建議調用該接口停止藍牙搜索。愛掏網 - it200.com
OBJECT 參數說明
屬性 | 類型 | 說明 |
---|---|---|
success | function | 接口調用成功的回調函數 |
fail | function | 接口調用失敗的回調函數 |
complete | function | 接口調用結束的回調函數(調用成功、失敗都會執行) |
示例代碼
stopSearch() {
uni.stopBluetoothDevicesDiscovery()
}
uni.createBLEConnection(OBJECT)
- 若APP在之前已有搜索過某個藍牙設備,并成功建立連接,可直接傳入之前搜索獲取的 deviceId 直接嘗試連接該設備,無需進行搜索操作。愛掏網 - it200.com
- 藍牙連接隨時可能斷開,建議監聽
uni.onBLEConnectionStateChange
回調事件,當藍牙設備斷開時按需執行重連操作 - 若對未連接的設備或已斷開連接的設備調用數據讀寫操作的接口,會返回 10006 錯誤,建議進行重連操作。愛掏網 - it200.com
- 盡量成對的調用連接和斷開的接口,如果多次調用連接接口,有可能導致系統持有同一設備多個連接的實例,導致調用斷開接口失效
OBJECT 參數說明
屬性 | 類型 | 必填 | 說明 |
---|---|---|---|
deviceId | string | 是 | 用于區分設備的 id |
timeout | number | 否 | 超時時間,單位ms,不填表示不會超時 |
success | function | 否 | 接口調用成功的回調函數 |
fail | function | 否 | 接口調用失敗的回調函數 |
complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
示例代碼
uni.createBLEConnection({
deviceId: this.uuid.deviceId,
success: (res) => {
if (res.errMsg == 'createBLEConnection:ok') {
setTimeout(() => {
this.Service()
this.BLEChange()
}, 2000)
}
}
})
uni.getBLEDeviceServices(OBJECT)
- 這里有一個坑,連接設備成功后,不能立即調用
uni.getBLEDeviceServices(OBJECT)
,否則獲取不到任何服務。愛掏網 - it200.com解決方法:連接成功后,等個幾秒(看設備的情況)在調用uni.getBLEDeviceServices(OBJECT)
OBJECT 參數說明
屬性 | 類型 | 必填 | 說明 |
---|---|---|---|
deviceId | string | 是 | 藍牙設備 id |
success | function | 否 | 接口調用成功的回調函數 |
fail | function | 否 | 接口調用失敗的回調函數 |
complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
success 返回參數說明
屬性 | 類型 | 說明 |
---|---|---|
services | Array | 設備服務列表 |
res.services 的結構
屬性 | 類型 | 說明 |
---|---|---|
uuid | string | 藍牙設備服務的 uuid |
isPrimary | boolean | 該服務是否為主服務 |
示例代碼
uni.getBLEDeviceServices({
deviceId: this.uuid.deviceId,
success: (res) => {
if (res.services.length == 0) {
util.showError("找不到服務")
} else {
let booth = true
for (let i = 0; i
booth = false
this.Character()
break;
}
}
if (booth) util.showError("服務uuid錯誤")
}
}
})
uni.getBLEDeviceCharacteristics(OBJECT)
OBJECT 參數說明
屬性 | 類型 | 必填 | 說明 |
---|---|---|---|
deviceId | string | 是 | 藍牙設備 id |
serviceId | string | 是 | 藍牙服務 uuid,需要使用getBLEDeviceServices 獲取 |
success | function | 否 | 接口調用成功的回調函數 |
fail | function | 否 | 接口調用失敗的回調函數 |
complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
success 返回參數說明
屬性 | 類型 | 說明 |
---|---|---|
characteristics | Array | 設備服務列表 |
res.characteristics 的結構
屬性 | 類型 | 說明 |
---|---|---|
uuid | string | 藍牙設備特征值的 uuid |
properties | Object | 該特征值支持的操作類型 |
properties 的結構
屬性 | 類型 | 說明 |
---|---|---|
uuid | string | 藍牙設備特征值的 uuid |
read | boolean | 該特征值是否支持 read 操作 |
write | boolean | 該特征值是否支持 write 操作 |
notify | boolean | 該特征值是否支持 notify操作 |
indicate | boolean | 該特征值是否支持 indicate操作 |
- read:讀取操作
- write:寫入操作
示例代碼
uni.getBLEDeviceServices({
deviceId: this.uuid.deviceId,
success: (res) => {
if (res.services.length == 0) {
util.showError("找不到服務")
} else {
let booth = true
for (let i = 0; i
booth = false
this.Character()
break;
}
}
if (booth) util.showError("服務uuid錯誤")
}
}
})
uni.notifyBLECharacteristicValueChange(OBJECT)
- 必須設備的特征值支持 notify 或者 indicate 才可以成功調用
- 訂閱操作成功后需要設備主動更新特征值的 value,才會觸發
uni.onBLECharacteristicValueChange
(后續監聽設備的返回消息)回調 - 安卓平臺上,在調用
notifyBLECharacteristicValueChange
成功后立即調用```writeBLECharacteristicValue``(向設備發送信息)接口,在部分機型上會發生 10008 系統錯誤 - 自此,連接藍牙設備的過程
OBJECT 參數說明
屬性 | 類型 | 必填 | 說明 |
---|---|---|---|
deviceId | string | 是 | 藍牙設備 id |
serviceId | string | 是 | 藍牙特征值對應服務的 uuid |
characteristicId | string | 是 | 藍牙特征值的 uuid |
state | boolean | 是 | 是否啟用 notify |
success | function | 否 | 接口調用成功的回調函數 |
fail | function | 否 | 接口調用失敗的回調函數 |
complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
示例代碼
uni.notifyBLECharacteristicValueChange({
deviceId: this.uuid.deviceId,
serviceId: this.uuid.service,
characteristicId: this.uuid.character,
state: true,
success: (res) => {
if (res.errMsg == 'notifyBLECharacteristicValueChange:ok') {
uni.hideLoading();
this.cut = false
this.BLEValue()
}
}
})
uni.onBLECharacteristicValueChange(CALLBACK)
- 監聽低功耗藍牙設備的特征值變化事件。愛掏網 - it200.com必須先啟用
notifyBLECharacteristicValueChange
接口才能接收到設備推送的 notification。愛掏網 - it200.com - 有些藍牙設備發送的信息是多段發送的,需要特殊處理
CALLBACK 返回參數
屬性 | 類型 | 說明 |
---|---|---|
deviceId | string | 藍牙設備 id |
serviceId | string | 藍牙特征值對應服務的 uuid |
characteristicId | string | 藍牙特征值的 uuid |
value | ArrayBuffer | 特征值最新的值 |
- 接收設備發送過來的信息,需要對value字段進行處理才能獲取到信息
- 漢字的編碼格式也需要進行特殊處理
###示例代碼
uni.onBLECharacteristicValueChange((res) => {
let caseoff = this.operation.Receive + util.ab2Str(res.value)
let len = caseoff.length - 1
let i = caseoff.charCodeAt(len)
if (i this.operation.Receive = ""
caseoff = util.gbkStrToUtf16Str(caseoff)
this.operation.receive += caseoff
} else {
if (caseoff.charCodeAt(len - 1) > 127) {
this.operation.Receive = ""
caseoff = util.gbkStrToUtf16Str(caseoff)
this.operation.receive += caseoff
} else {
this.operation.Receive = caseoff
}
}
})
uni.writeBLECharacteristicValue(OBJECT)
- 必須設備的特征值支持 write 才可以成功調用。愛掏網 - it200.com
- 并行調用多次會存在寫失敗的可能性。愛掏網 - it200.com
- APP不會對寫入數據包大小做限制,但系統與藍牙設備會限制藍牙4.0單次傳輸的數據大小,超過最大字節數后會發生寫入錯誤,建議每次寫入不超過20字節。愛掏網 - it200.com
- 若單次寫入數據過長,iOS 上存在系統不會有任何回調的情況(包括錯誤回調)。愛掏網 - it200.com
- 安卓平臺上,在調用
notifyBLECharacteristicValueChange
成功后立即調用writeBLECharacteristicValue
接口,在部分機型上會發生 10008 系統錯誤
OBJECT 參數說明
屬性 | 類型 | 必填 | 說明 |
---|---|---|---|
deviceId | string | 是 | 藍牙設備 id |
serviceId | string | 是 | 藍牙特征值對應服務的 uuid |
characteristicId | string | 是 | 藍牙特征值的 uuid |
value | ArrayBuffer | 是 | 藍牙設備特征值對應的二進制值 |
success | function | 否 | 接口調用成功的回調函數 |
fail | function | 否 | 接口調用失敗的回調函數 |
complete | function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
示例代碼
let j = 0;
for (let i = 0; i
let setData = SendStr.substring(j, j + 20)
setData = new Uint8Array(util.stringToBytes(setData)).buffer
j = j + 20
uni.writeBLECharacteristicValue({
deviceId: this.uuid.deviceId,
serviceId: this.uuid.service,
characteristicId: this.uuid.write,
value: setData,
fail: (err) => {
util.showError("發生錯誤")
}
})
}, i * 300)
}
以上就是UNI-APP連接藍牙設備的內容了,如有不理解的地方或者需要碼源的小伙可以聯系我。愛掏網 - it200.com