0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony BLE藍牙連接教程

OpenHarmony技術社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-04-17 10:11 ? 次閱讀

OpenHarmony 藍牙模塊提供了基礎的傳統(tǒng)藍牙能力以及 BLE 的掃描、廣播等功能。

這里將介紹如何通過 OpenHarmony 提供的 @ohos.bluetooth (藍牙接口)打開當前設備的藍牙,關閉藍牙,以及連接 BLE 藍牙設備。

設備與環(huán)境:

設備:九聯(lián) s905l3a 機頂盒、開鴻智谷學生卡 BLE 藍牙設備

系統(tǒng):OpenHarmony 3.2 beta2

SDK:9

邏輯流程

首先機頂盒在開始的時候獲取藍牙相關權限,然后通過 OpenHarmony 提供的藍牙接口打開藍牙。

3b736820-dc25-11ed-bfe3-dac502259ad0.png

接著訂閱發(fā)現(xiàn) BLE 設備發(fā)現(xiàn)事件,然后通過 OpenHarmony 提供的藍牙接口開啟 BLE 設備掃描。

當發(fā)現(xiàn)到了 BLE 藍牙設備后,進行上報,BLE 設備發(fā)現(xiàn)事件觸發(fā),獲取到來自 BLE 設備的廣播信息包,然后進行 BLE 藍牙連接。

實現(xiàn)過程

①獲取藍牙相關權限

在使用藍牙接口之前,首先要讓設備獲取一下權限:

ohos.permission.USE_BLUETOOTH //:允許應用查看藍牙的配置。

ohos.permission.DISCOVER_BLUETOOTH //:允許應用配置本地藍牙,查找遠端設備且與之配對連接。

ohos.permission.LOCATION //:允許應用獲取設備位置信息。

ohos.permission.MANAGE_BLUETOOTH //:允許應用配對藍牙設備,并對設備的電話簿或消息進行訪問。

打開 DevEco Studio 3.1.0.200,創(chuàng)建新的 Stage 項目,在項目中的 module.json 文件中添加相關權限:

"requestPermissions":[
{
"name":"ohos.permission.USE_BLUETOOTH",
"reason":"$string:grant_use_bluetooth",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
},
{
"name":"ohos.permission.DISCOVER_BLUETOOTH",
"reason":"$string:grant_discovery_bluetooth",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
},
{
"name":"ohos.permission.LOCATION",
"reason":"$string:grant_location",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
},
{
"name":"ohos.permission.MANAGE_BLUETOOTH",
"reason":"$string:grant_manage_bluetooth",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
}
]

②打開設備的藍牙

首先,通過調用 bluetooth.getState()藍牙接口來獲取當前設備藍牙是否打開,并設置藍牙開關的標識位 isOn。

asyncaboutToAppear(){
//等待獲取藍牙權限
awaitglobalThis.abilityContext.requestPermissionsFromUser(['ohos.permission.USE_BLUETOOTH','ohos.permission.DISCOVER_BLUETOOTH','ohos.permission.LOCATION','ohos.permission.MANAGE_BLUETOOTH'])
logger.info(TAG,`獲取權限grantPermission,requestPermissionsFromUser,PermissionRequestResult`)
//獲取藍牙狀態(tài)
letstate=bluetooth.getState()
//判斷當前設備藍牙是否打開
if(state===bluetooth.BluetoothState.STATE_ON){
this.isOn=true
}
if(state===bluetooth.BluetoothState.STATE_OFF){
this.isOn=false
}
}

如果當前設備藍牙未打開,則通過調用 bluetooth.enableBluetooth()藍牙接口來打開藍牙。

//打開藍牙函數(shù)
initBluetooth(){
this.enable=bluetooth.enableBluetooth()
//判斷藍牙是否成功打開
if(this.enable==true){
prompt.showToast({
message:'Openbluetooth'+this.enable,
duration:2000,
});
}
}

③注冊發(fā)現(xiàn) BLE 設備監(jiān)聽器

在設備打開藍牙之后,通過調用 bluetooth.BLE.on('BLEDeviceFind')藍牙接口來訂閱 BLE 設備發(fā)現(xiàn)上報事件。 該接口參數(shù)如下:

3b83a37a-dc25-11ed-bfe3-dac502259ad0.png

通過注冊發(fā)現(xiàn) BLE 設備監(jiān)聽器,可以得到發(fā)現(xiàn)設備的集合,BLE 設備的廣播包、地址、信號強度 rssi。

在這里發(fā)現(xiàn)獲取連接 BLE 設備名字的接口 getDeviceName 無法成功調用,所以自己通過解析廣播包來獲取設備名字。

//訂閱BLE設備發(fā)現(xiàn)上報事件
//獲取到的data包括BLE設備的廣播包、地址、信號強度rssi
bluetooth.BLE.on('BLEDeviceFind',(data)=>{
logger.info(TAG,`enteronbluetoothBLEDeviceFind`)
logger.info("rgytl 開始掃描設備地址! 1")
if(data!==null&&data.length>0){
logger.info("rgytl 開始掃描設備地址! 2")
if(this.discoveryBleList.indexOf(data[0])===-1){
//把發(fā)現(xiàn)的設備地址存入列表
this.discoveryBleList.push(data[0].deviceId)
logger.info("rgytl----discoveryBleList="+JSON.stringify(this.discoveryBleList))
//讀取廣播包,解析廣播包,得到設備名字,并存入設備列表
vari=0;
varx=data[0].data[i]
vary=data[0].data[i+1]
while(y!=0x09&&i+x+2
 

④開啟 BLE 設備掃描

在完成訂閱 BLE 設備發(fā)現(xiàn)上報事件后,通過調用 bluetooth.BLE.startBLEScan 接口去開啟 BLE 設備掃描。 通過該接口,可以對掃描 BLE 設備進行過濾,可以過濾的參數(shù)有:BLE 設備的地址、名字、以及服務的 UUID 等。

3b9886e6-dc25-11ed-bfe3-dac502259ad0.png

在這里,我設置只掃描包含我 BLE 設備名字的 BLE 設備,這樣子就不會說掃描到一大堆其他的 BLE 設備,影響使用,只需要開啟一次掃描和訂閱一次 BLE 設備發(fā)現(xiàn)上報事件就可以了,使用的時候只要沒有關閉,就不需要重復調用。

//設置藍牙BLE掃描模式(根據(jù)名字掃描)
bluetooth.BLE.startBLEScan(
[{
deviceId:null,
name:"bleslavetest",
serviceUuid:null
}],
{
interval:0,
dutyMode:bluetooth.ScanDuty.SCAN_MODE_LOW_POWER,
matchMode:bluetooth.MatchMode.MATCH_MODE_AGGRESSIVE,
}
)

⑤連接 BLE 設備

在掃描到 BLE 設備之后,可以通過 on(‘BLEConnectionStateChange’)來訂閱獲取 BLE 設備的連接狀態(tài)變化事件。 在使用該接口之前,要先通過 bluetooth.BLE.createGattClientDevice('XXXXXX:XX')接口創(chuàng)建一個可使用的 GattClientDevice 實例。

3bafac36-dc25-11ed-bfe3-dac502259ad0.png

//訂閱BEL狀態(tài)變化
if(this.BleOnflag){
//只創(chuàng)建一個GattClient對象
this.BleOnflag=false
this.BLEDevice=bluetooth.BLE.createGattClientDevice(item);
//訂閱獲取BLE設備的連接狀態(tài)變化事件
this.BLEDevice.on('BLEConnectionStateChange',(data)=>{
console.log('bluetoothconnectStatestatechanged');
letconnectState=data.state;
//根據(jù)不通的連接狀態(tài),提示不同的信息
if(JSON.stringify(connectState)==0){
logger.info(`connectState=${JSON.stringify(connectState)},斷開連接`)
prompt.showToast({
message:'斷開連接',
duration:2000,
});
}elseif(JSON.stringify(connectState)==2){
logger.info(`connectState=${JSON.stringify(connectState)},連接成功`)
prompt.showToast({
message:'連接成功',
duration:2000,
});
}elseif(JSON.stringify(connectState)==1){
logger.info(`connectState=${JSON.stringify(connectState)},正在連接`)
}else{
logger.info(`connectState=${JSON.stringify(connectState)},正在斷連`)
}
logger.info(`connectState=${JSON.stringify(connectState)}`);
})
}
在前面通過 bluetooth.BLE.createGattClientDevice(item)創(chuàng)建一個 GattClientDevice 實例 BLEDevice 后,我們可以通過該實例去調用 connect()方法連接 BLE 設備。

注意,GattClientDevice 實例只需要創(chuàng)建一個就可以。

3bc0a270-dc25-11ed-bfe3-dac502259ad0.png

//連接藍牙
letBLEConnect=this.BLEDevice.connect()
//如果連接成功,則把BLE設備存入連接成功列表
if(BLEConnect){
this.deviceBleList.push(item)
}

⑥結尾處理

當不連接 BLE 設備的時候,要記得關閉 BLE 設備掃描,取消訂閱設備發(fā)現(xiàn)事件。

取消 BLE 設備連接,通過之前創(chuàng)建的 GattClientDevice 實例 BLEDevice 調用 disconnect()方法斷開連接 BLE 設備。

Button("斷開")
.alignSelf(ItemAlign.Center)
.onClick(()=>{
AlertDialog.show({
title:$r('app.string.disconnect'),
message:'此操作將會斷開該設備的連接',
primaryButton:{
value:$r('app.string.cancel'),
action:()=>{
}
},
secondaryButton:{
value:$r('app.string.confirm'),
action:()=>{
//斷開連接BLE設備
letBLEdisConnect=this.BLEDevice.disconnect()
if(BLEdisConnect){
logger.info(`connectStateBLEdisConnect=${JSON.stringify(BLEdisConnect)},斷開連接`)
//移出BLE設備連接列表
this.deviceBleList.pop(item)
}
}
}
})
})
在斷開連接、關閉藍牙之后,可以通過 off(‘connectStateChange’)取消訂閱 BLE 連接狀態(tài)變化事件、bluetooth.BLE.stopBLEScan 停止 BLE 掃描、以及 bluetooth.BLE.off(‘BLEDeviceFind’)取消訂閱 BLE 設備發(fā)現(xiàn)上報事件。

最后通過 bluetooth.disableBluetooth()關閉藍牙:

.onChange((isOn:boolean)=>{
if(isOn){
this.isOn=true
this.initBluetooth()
}else{
this.isOn=false
bluetooth.BLE.off('BLEDeviceFind',()=>{
logger.info("rgytl 取消BLE設備發(fā)現(xiàn)訂閱!")
})
bluetooth.BLE.stopBLEScan()
this.disable=bluetooth.disableBluetooth()
this.discoveryList=[]
this.BleInfo=[]
this.BleRssi=[]
if(this.disable==true){
prompt.showToast({
message:'Closebluetooth'+this.disable,
duration:2000,
});
}
}
})

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8968

    瀏覽量

    153369
  • BLE
    BLE
    +關注

    關注

    12

    文章

    696

    瀏覽量

    60485
  • 藍牙模塊
    +關注

    關注

    30

    文章

    604

    瀏覽量

    56546
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1068

    瀏覽量

    47869
  • OpenHarmony
    +關注

    關注

    28

    文章

    3841

    瀏覽量

    18279

原文標題:OpenHarmony BLE藍牙連接

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    BLE連接技術對比與應用

    BLE連接技術在現(xiàn)實生活場景中其實有很多應用,例如在電表中,藍牙支持多主多從的工作模式,能被采集器、自動化終端設備、手持設備主機連接的同時,與多個從機(外置負荷開關、報警裝置、各類傳
    的頭像 發(fā)表于 04-27 00:24 ?5098次閱讀

    電腦端BLE藍牙助手

    電腦端BLE藍牙助手
    的頭像 發(fā)表于 06-14 10:34 ?3416次閱讀
    電腦端<b class='flag-5'>BLE</b><b class='flag-5'>藍牙</b>助手

    FCC & CE認證 藍牙5.1協(xié)議 主從并存 低功耗藍牙模塊BLE5101# 藍牙

    BLE藍牙模塊
    思為無線
    發(fā)布于 :2023年10月12日 09:31:13

    BLE低功耗藍牙模塊為何如此受歡迎?

    BLE低功耗藍牙模塊為何如此受歡迎? BLE 低功耗藍牙模塊一般是指藍牙4.0模塊,BLE
    發(fā)表于 12-01 15:11 ?18次下載

    經(jīng)驗分享:如何選擇適合的BLE藍牙模塊

    物聯(lián)網(wǎng)應用中,成功連接設備的過程,連接性的角色至關重要,選擇范圍也很廣:如Wi-Fi、低功耗藍牙BLE)、RFID、NFC等等。根據(jù)市占率估計,在2021年前,將有60%的無線裝置使
    的頭像 發(fā)表于 06-11 15:26 ?1.2w次閱讀

    如何利用API增加BLE連接

    本視頻中,我們將回顧API如何配合低功耗藍牙(BLE)設備工作。我們將了解如何利用API方便、快捷地為應用增加BLE連接性。
    的頭像 發(fā)表于 10-09 04:04 ?3465次閱讀

    BLE藍牙的角色功能

    藍牙設備之間進行通訊時,必須有一個為主機,一個為從機,才能進行通信。通信時,也必須由主機進行查找,并發(fā)起配對,建立連接后,雙方即可收發(fā)數(shù)據(jù)。BLE藍牙的角色主要包括:主機、從機、主從一
    的頭像 發(fā)表于 10-30 18:45 ?4076次閱讀

    盤點BLE低功耗藍牙和傳統(tǒng)藍牙之間的五大區(qū)別

    下兼容。相較于傳統(tǒng)的藍牙,BLE藍牙的優(yōu)點就是快速搜索、快速連接、超低功耗、保持連接和傳輸數(shù)據(jù),弱點就是傳輸速率低,物理寬帶只有1M,而實際
    發(fā)表于 07-24 14:42 ?6627次閱讀

    BLE藍牙模塊選型表介紹

    BLE藍牙模塊的功能著手,簡單介紹藍牙模塊的物聯(lián)網(wǎng)應用。 SKYLAB的藍牙模塊根據(jù)支持的藍牙協(xié)議分為B
    的頭像 發(fā)表于 07-27 16:39 ?5279次閱讀
    <b class='flag-5'>BLE</b><b class='flag-5'>藍牙</b>模塊選型表介紹

    BLE藍牙的具體優(yōu)勢以及BLE藍牙智能門鎖的應用

    一、BLE藍牙的具體優(yōu)勢: 1、BLE藍牙的待機時間超長, 市面上的藍牙智能鎖基本都是使用干電池供電,而
    發(fā)表于 08-17 14:03 ?3425次閱讀
    <b class='flag-5'>BLE</b><b class='flag-5'>藍牙</b>的具體優(yōu)勢以及<b class='flag-5'>BLE</b><b class='flag-5'>藍牙</b>智能門鎖的應用

    藍牙BLE(低功耗藍牙)的區(qū)別是什么

    來源:羅姆半導體社區(qū)? 藍牙BLE藍牙低功耗)是無線個人局域網(wǎng)(WPAN)標準。藍牙低功耗藍牙旨在處理發(fā)送小塊數(shù)據(jù)的問題。它旨在使用紐扣
    的頭像 發(fā)表于 02-02 17:54 ?7098次閱讀

    藍牙模塊有哪些種類?BLE低功耗藍牙模塊有什么特點?

    Ble藍牙模塊是專為物聯(lián)網(wǎng)無線數(shù)據(jù)傳輸而生,ble藍牙模塊以其超低功耗、快速連接、容易交互等特點,已廣泛應用于物聯(lián)網(wǎng)
    的頭像 發(fā)表于 08-09 13:49 ?6432次閱讀
    <b class='flag-5'>藍牙</b>模塊有哪些種類?<b class='flag-5'>BLE</b>低功耗<b class='flag-5'>藍牙</b>模塊有什么特點?

    Telink BLE連接應用的SDK簡介

    本系列的幾篇文章主要講述"Bluetooth LE Multiple Connection",此SDK是Telink BLE連接應用的SDK,所謂的BLE連接就是
    的頭像 發(fā)表于 09-22 14:41 ?4684次閱讀

    帶你深入了解BLE藍牙模塊工作模式

    藍牙是一種新興無線通訊技術是一個標準的無線通訊協(xié)議,可實現(xiàn)無線數(shù)據(jù)和語音通信?;诘统杀驹O備的收發(fā)器芯片,可做近距離的無線連接,為固定和移動設備監(jiān)理通信環(huán)境的一種近距離無線連接技術。其中,BL
    的頭像 發(fā)表于 07-16 13:54 ?1888次閱讀
    帶你深入了解<b class='flag-5'>BLE</b><b class='flag-5'>藍牙</b>模塊工作模式

    芯知識 BLE(低功耗藍牙模塊)和SPP(傳統(tǒng)藍牙模塊)的對比

    BLE藍牙低功耗適用于長時間運行設備,數(shù)據(jù)傳輸速率低,連接范圍??;SPP藍牙串口協(xié)議功耗高,傳輸速率快,連接范圍廣。選擇
    的頭像 發(fā)表于 02-13 15:06 ?522次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品