UNIAPP實現物聯網中BLE藍牙的數據交互




前言: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 if (res.services[i].uuid == this.uuid.service) {
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 if (res.services[i].uuid == this.uuid.service) {
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 setTimeout(() => {
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



聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 日韩欧美一区二区三区在线| 2022欧美高清中文字幕在线看| 亚洲欧洲另类春色校园网站| 七仙女欲春2一级裸片免费观看 | h视频在线观看免费| 美女扒开内裤无遮挡网站| 狠狠人妻久久久久久综合蜜桃| 成人欧美一区二区三区黑人| 处破痛哭A√18成年片免费| 国产思思99re99在线观看| 亚洲中久无码永久在线观看同| 18禁无遮挡无码网站免费| 水蜜桃无码视频在线观看| 天天做人人爱夜夜爽2020毛片| 免费成人在线网站| va天堂va亚洲va影视中文字幕| 精品久久久久久久九九九精品| 恋恋视频2mm极品写真| 四虎国产精品永久免费网址 | 污软件app下载| 在线观看免费大黄网站| 国产aa免费视频| 亚洲人av高清无码| 99精品热这里只有精品| 狠狠色狠狠色综合网| 在线无码午夜福利高潮视频 | 中文字幕动漫精品专区| 亚洲国产激情在线一区| 欧美一级高清片在线| 夜夜揉揉日日人人青青| 亚洲精品无码乱码成人| 777精品视频| 欧美69vivohd| 国产国语在线播放视频| 亚洲欧洲日产国码久在线观看 | 色多多视频在线观看| 最近高清中文在线国语视频完整版 | 久久亚洲精品中文字幕| 老师让我她我爽了好久视频| 性欧美18-19sex性高清播放| 亚洲高清中文字幕综合网|