精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙BLE藍牙通信開發(fā)總結(jié)

原創(chuàng)
系統(tǒng) OpenHarmony
通過BLE掃描和廣播提供的開放能力,可以根據(jù)指定狀態(tài)獲取外圍設(shè)備、啟動或停止BLE掃描、廣播、數(shù)據(jù)交互。

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://harmonyos.51cto.com??

目標

通過BLE掃描和廣播提供的開放能力,可以根據(jù)指定狀態(tài)獲取外圍設(shè)備、啟動或停止BLE掃描、廣播、數(shù)據(jù)交互。

關(guān)于BLE藍牙的掃描和廣播你可以查看官方文檔

效果

藍牙介紹

藍牙是短距離無線通信的一種方式,支持藍牙的兩個設(shè)備必須配對后才能通信。HarmonyOS藍牙主要分為傳統(tǒng)藍牙和低功耗藍牙(通常稱為BLE,Bluetooth Low Energy)。傳統(tǒng)藍牙指的是藍牙版本3.0以下的藍牙,低功耗藍牙指的是藍牙版本4.0以上的藍牙。

如果你對藍牙感興趣,可以看看 HarmonyOS 藍牙介紹或者我前面寫的一篇文章:鴻蒙關(guān)于藍牙的那些事

概念

在進入實戰(zhàn)之前,先說明一個BLE藍牙的通信協(xié)議,GATT【Generic Attribute Profile】,GATT 是一個在藍牙連接之上的發(fā)送和接收很短的數(shù)據(jù)段的通用規(guī)范,這些很短的數(shù)據(jù)段被稱為屬性(Attribute)。在說明GATT之前還需要知道一個GAP【Generic Access Profile】。

GAP包含:搜索藍牙設(shè)備(Discovery)、管理連接(Link establishment),還有不同的安全等級(Security)。以及從用戶層面訪問一些參數(shù)的方式。GAP給設(shè)備定義了若干角色,其中主要的兩個是:外圍設(shè)備(Peripheral)和中心設(shè)備(Central)。

  • 外圍設(shè)備:這一般就是非常小或者簡單的低功耗設(shè)備,用來提供數(shù)據(jù),并連接到一個更加相對強大的中心設(shè)備,例如:藍牙手環(huán)。
  • 中心設(shè)備:中心設(shè)備相對比較強大,用來連接其他外圍設(shè)備,例如手機。

GATT定義兩個BLE設(shè)備通過叫做Service和Characteristic的東西進行通信,他使用了ATT(Attribute Protocol)協(xié)議,需要說明的是,GATT連接必需先經(jīng)過GAP協(xié)議。

另外,特別注意的是:GATT連接是獨占的。也就是一個BLE外設(shè)同時只能被一個中心設(shè)備連接。一旦外設(shè)被連接,它就會馬上停止廣播,這樣它就對其他設(shè)備不可見了。當設(shè)備斷開,它又開始廣播。中心設(shè)備和外設(shè)需要雙向通信的話,唯一的方式就是建立GATT連接。

GATT連接的網(wǎng)絡(luò)拓撲

一個外設(shè)只能連接一個中心設(shè)備,而一個中心設(shè)備可以連接多個外設(shè)。中心設(shè)備負責(zé)掃描外圍設(shè)備、發(fā)現(xiàn)廣播。外圍設(shè)備負責(zé)發(fā)送廣播。

前置條件

一、前期準備

說明:如果需要完成藍牙間的通信則需要借助藍牙中的服務(wù),如何獲取BLE藍牙相關(guān)的MAC地址和服務(wù)編號【uuid】可以參看我前面寫的一篇文章:鴻蒙關(guān)于藍牙的那些事

1.1、獲取外圍藍牙設(shè)備的MAC

本此講解的實戰(zhàn)中使用到的相關(guān)設(shè)備MAC

MAC:E2:xx:xx:xx:xx:EB

1.2、獲取服務(wù)編號【uuid】

本此講解的實戰(zhàn)中使用到的相關(guān)設(shè)備UUID

  • Service:6e40xxxx-xxxx-xxxx-e0a9-e50e24dcca9e
  • Notify:6e40xxxx-xxxx-xxxx-e0a9-e50e24dcca9e

業(yè)務(wù)邏輯梳理

權(quán)限問題,首先需要注冊藍牙相關(guān)權(quán)限;

搜索藍牙,應(yīng)用啟動后可以手動的開啟和關(guān)閉藍牙掃描;

連接藍牙,根據(jù)藍牙的mac地址,調(diào)用connect進行連接;

遍歷藍牙特征,在藍牙連接成功后,獲取藍牙的服務(wù)特征,設(shè)置指定GATT特征通知;

通知數(shù)據(jù),將數(shù)據(jù)通過藍牙服務(wù)中的通知屬性發(fā)送;

接受通知,中心設(shè)備通過characteristicChangedEvent接收通知數(shù)據(jù),并顯示在屏幕上;

關(guān)閉藍牙,在應(yīng)用推出后,需要釋放資源,斷開連接。

實戰(zhàn):BLE藍牙設(shè)備間的數(shù)據(jù)交互–中心設(shè)備接收外圍設(shè)備的通知數(shù)據(jù)

一、創(chuàng)建項目

說明:通過DevEco Studio創(chuàng)建Application項目(java)。

二、權(quán)限

2.1、聲明權(quán)限

說明:在項目的config.json中聲明操作藍牙必要的權(quán)限。

  • ohos.permission.USE_BLUETOOTH:允許應(yīng)用查看藍牙的配置。
  • ohos.permission.DISCOVER_BLUETOOTH:允許應(yīng)用配置本地藍牙,并允許其查找遠端設(shè)備且與之配對連接。
  • ohos.permission.LOCATION:允許應(yīng)用在前臺運行時獲取位置信息。

代碼如下:

 "reqPermissions": [
{
"name": "ohos.permission.USE_BLUETOOTH"
},
{
"name": "ohos.permission.DISCOVER_BLUETOOTH"
},
{
"name": "ohos.permission.LOCATION",
"reason": "$string:permreason_location",
"usedScene": {
"ability": [
".MainAbility"
],
"when": "inuse"
}
}
],

2.2、顯式聲明敏感權(quán)限

說明:ohos.permission.LOCATION屬于敏感權(quán)限,需要在代碼中顯式聲明。在MainAbility中動態(tài)申請權(quán)限,代碼如下:

 private final String PERMISSION_LOCATION = "ohos.permission.LOCATION";
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(MainAbilitySlice.class.getName());
// 判斷權(quán)限是否已授予
if (verifySelfPermission(PERMISSION_LOCATION) != IBundleManager.PERMISSION_GRANTED) {
// 應(yīng)用未被授權(quán)
if (canRequestPermission(PERMISSION_LOCATION)) {
// 是否可以申請彈窗授權(quán)
requestPermissionsFromUser(new String[]{PERMISSION_LOCATION}, 0);
} else {
// 顯示應(yīng)用需要權(quán)限的理由,提示用戶進入設(shè)置授權(quán)
new ToastDialog(getContext()).setText("請進入系統(tǒng)設(shè)置進行授權(quán)").show();
}
}
}

三、啟動藍牙

說明:如果藍牙處于關(guān)閉狀態(tài),請求將設(shè)備的藍牙開啟,代碼如下:

BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(this);
if (bluetoothHost.getBtState() != BluetoothHost.STATE_ON) {
bluetoothHost.enableBt();
}

四、中心設(shè)備進行BLE掃描

4.1、API說明

4.1.1、BLE中心設(shè)備管理類:BleCentralManager

4.1.2、中心設(shè)備管理回調(diào)類:BleCentralManagerCallback

4.2、掃描回調(diào)的處理

BLE掃描之前要先實現(xiàn)掃描回調(diào):BleCentralManagerCallback的接口,在scanResultEvent回調(diào)中可以獲取你需要的外圍設(shè)備實例,代碼如下:

BlePeripheralDevice mPeripheralDevice = null;
/**
* 實現(xiàn)中心設(shè)備管理回調(diào)
*/
public class MyBleCentralManagerCallback implements BleCentralManagerCallback {
/**
* 掃碼結(jié)果回調(diào)
* @param bleScanResult 掃碼結(jié)果
*/
@Override
public void scanResultEvent(BleScanResult bleScanResult) {
// 根據(jù)掃碼結(jié)果獲取外圍設(shè)備實例
mPeripheralDevice = bleScanResult.getPeripheralDevice();
}

/**
* 掃描失敗回調(diào)
* @param i
*/
@Override
public void scanFailedEvent(int i) {

}

/**
* 組掃描成功回調(diào)
* @param list 組信息
*/
@Override
public void groupScanResultsEvent(List<BleScanResult> list) {
}
}

4.3、獲取中心設(shè)備管理對象

調(diào)用BleCentralManager(BleCentralManagerCallback callback)接口獲取中心設(shè)備管理對象。代碼如下:

MyBleCentralManagerCallback myCentralManagerCallback = new MyBleCentralManagerCallback();
BleCentralManager mCentralManager = new BleCentralManager(this, myCentralManagerCallback);

4.4、啟動掃描

調(diào)用startScan()開始掃描BLE設(shè)備,在回調(diào)【BleCentralManagerCallback】中獲取掃描到的BLE設(shè)備。

值得一提的是,啟動掃描接口中,可以傳入藍牙掃描過濾器【BleScanFilter】,如果過濾器為空,則不過濾。

下面使用指定的MAC地址進行過濾啟動藍牙掃描,代碼如下:

// 開始掃描(過濾器指定的)設(shè)備
BleScanFilter bleScanFilter = new BleScanFilter();
bleScanFilter.setPeripheralAddress("E2:XX:XX:XX:XX:EB");// 替換你需要過濾的MAC
mFilters.add(bleScanFilter);
mCentralManager.startScan(mFilters);

五、藍牙連接

5.1、API

5.1.1、BLE藍牙外圍設(shè)備操作類:BlePeripheralDevice相關(guān)接口說明

5.1.2、BLE藍牙外圍設(shè)備操作回調(diào)類:BlePeripheralCallback相關(guān)接口說明

5.2、實現(xiàn)外圍設(shè)備操作回調(diào):BlePeripheralCallback,部分代碼如下:

/**
* 實現(xiàn)外圍設(shè)備操作回調(diào)
* 中心設(shè)備作為GattService的客戶端
*/
private class MyBlePeripheralCallback extends BlePeripheralCallback {
// TODO 回調(diào)接口實現(xiàn)包括:connectionStateChangeEvent、servicesDiscoveredEvent、characteristicChangedEvent等
}

在回調(diào)的接口中可以做三件事。

1、在connectionStateChangeEvent回調(diào)接口中,如果GATT連接成功,則可以調(diào)用mPeripheralDevice.discoverServices()獲取外圍設(shè)備支持的 Services、Characteristics 等特征值,在回調(diào) servicesDiscoveredEvent(int status) 中獲取外圍設(shè)備支持的服務(wù)和特征值,并根據(jù) UUID 判斷是什么服務(wù)。代碼如下:

 /**
* 連接狀態(tài)變更
* 連接成功后可以在中心設(shè)備上(客戶端)發(fā)現(xiàn)GattService
* @param connectionState
*/
@Override
public void connectionStateChangeEvent(int connectionState) {
super.connectionStateChangeEvent(connectionState);
HiLog.info(label, "connectionState:" + connectionState);
if (connectionState == ProfileBase.STATE_CONNECTED && !isConnected) {
isConnected = true;
mPeripheralDevice.discoverServices();// 與外圍設(shè)備連接成功,發(fā)現(xiàn)GattService
setText(mTvStatus, "連接狀態(tài):已連接");
} else if (connectionState == ProfileBase.STATE_DISCONNECTED) {
// 斷開連接
setText(mTvStatus, "連接狀態(tài):未連接");
}
}

2、在servicesDiscoveredEvent回調(diào)接口中,如果Service獲取成功,則根據(jù)獲取到的服務(wù)和特征值,調(diào)用 setNotifyCharacteristic設(shè)置指定GATT特征通知。代碼如下:

 /**
* 在中心設(shè)備上發(fā)現(xiàn)服務(wù)(GattService外圍設(shè)備)的回調(diào)
* @param status 狀態(tài)
*/
@Override
public void servicesDiscoveredEvent(int status) { // 外圍設(shè)備服務(wù)發(fā)生更新觸發(fā)的回調(diào)。
if (status == BlePeripheralDevice.OPERATION_SUCC) {
HiLog.info(label, "servicesDiscoveredEvent OPERATION_SUCC");
List<GattService> services = mPeripheralDevice.getServices(); // 獲取Service成功后獲服務(wù)列表
for (GattService service : services) {
// 對每個服務(wù)進行相應(yīng)操作
if (service.getUuid().equals(UUID.fromString(Constant.SERVICE_UUID))) {
HiLog.info(label, "servicesDiscoveredEvent 找到服務(wù)");
mPeripheralDevice.setNotifyCharacteristic
(service.getCharacteristic(UUID.fromString(Constant.NOTIFY_CHARACTER_UUID)).get(), true);
}
}
}
}

3、在characteristicChangedEvent回調(diào)接口中處理外圍設(shè)備特征的通知,可以從中獲取到通知的數(shù)據(jù)。代碼如下:

/**
* 特性變更的回調(diào)
* 接受外圍設(shè)備發(fā)送的數(shù)據(jù)
* @param characteristic
*/
@Override
public void characteristicChangedEvent(GattCharacteristic characteristic) {
super.characteristicChangedEvent(characteristic);
// 更新外圍設(shè)備發(fā)送的數(shù)據(jù)
String msg = new String(characteristic.getValue());
HiLog.info(label, "characteristicChangedEvent msg=" + msg);
setText(mTvData, msg);
}

5.3、設(shè)備藍牙連接

說明:中心設(shè)備與外圍設(shè)備建立連接,調(diào)用connect(boolean isAutoConnect, BlePeripheraCallback callback)建立與外圍BLE設(shè)備的GATT連接,boolean參數(shù)isAutoConnect用于設(shè)置是否允許設(shè)備在可發(fā)現(xiàn)距離內(nèi)自動建立GATT連接。代碼如下:

MyBlePeripheralCallback mPeripheralCallback = new MyBlePeripheralCallback();
mPeripheralDevice.connect(false, mPeripheralCallback);

六、常量

說明:Constant是用于定義常量類,其中定義了業(yè)務(wù)中需要使用的常量。其中"X"需要替換成你的藍牙設(shè)備信息。

public static final String PERIPHERAL_ADDRESS = "E2:XX:XX:XX:XX:EB";// 藍牙MAC
public static final String SERVICE_UUID = "6eXXXXXX-XXXX-XXXX-XXXX-e50e24dcca9e";// 藍牙的服務(wù)編號
public static final String NOTIFY_CHARACTER_UUID = "6eXXXXXX-XXXX-XXXX-XXXX-e50e24dcca9e";// 藍牙特性通知屬性的編號

到目前為止,就完成了中心設(shè)備與外圍設(shè)備的連接和相關(guān)的監(jiān)聽回調(diào),當外圍設(shè)備通過NOTIFY_CHARACTER_UUID發(fā)送的通知在外圍設(shè)備操作回調(diào)接口characteristicChangedEvent中就能監(jiān)聽到變更,在參數(shù)GattCharacteristic中就可以獲取到通知中的數(shù)據(jù)內(nèi)容。

七、代碼

7.1、BLE藍牙中心設(shè)備的完整代碼

package xxx;

import com.nlscan.bluetoothassistant.ResourceTable;
import com.nlscan.bluetoothassistant.common.Constant;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.*;
import ohos.agp.utils.LayoutAlignment;
import ohos.agp.window.dialog.ToastDialog;
import ohos.agp.window.service.WindowManager;
import ohos.bluetooth.ProfileBase;
import ohos.bluetooth.ble.*;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener{
private static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "BleCentralAbilitySlice");
public BlePeripheralDevice mPeripheralDevice;// 外圍設(shè)備實例
public GattCharacteristic mWriteCharacteristic;
private MyBlePeripheralCallback mPeripheralCallback;// 外圍設(shè)備操作回調(diào)
private MyBleCentralManagerCallback myCentralManagerCallback;// 中心設(shè)備管理器回調(diào)
private BleCentralManager mCentralManager;// 中心設(shè)備管理器
private List<BleScanFilter> mFilters;// 掃描過濾器
public boolean isConnected = false;// 是否已連接
private boolean isScanning = false;// 是否正在掃描
// 容器
private Text mTvStatus;// 狀態(tài)
private Text mTvData;// 數(shù)據(jù)
private Text mTvDevice;// 設(shè)備
private Button mBtnScan;// 掃描
private Button mBtnConnect;// 連接
private Button mBtnSend;// 發(fā)送
private TextField mTfInput;// 內(nèi)容輸入框
private Text mTvName;// 設(shè)備名稱
private Image mIvBle;// 藍牙圖標
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
// 隱藏狀態(tài)欄、設(shè)置狀態(tài)欄和導(dǎo)航欄透明
getWindow().addFlags(WindowManager.LayoutConfig.MARK_FULL_SCREEN|
WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS|
WindowManager.LayoutConfig.MARK_TRANSLUCENT_NAVIGATION);
initData();
initComponent();
initListener();
}
private void initData() {
mPeripheralCallback = new MyBlePeripheralCallback();
myCentralManagerCallback = new MyBleCentralManagerCallback();
mCentralManager = new BleCentralManager(this, myCentralManagerCallback);
mFilters = new ArrayList<>();
}

private void initComponent() {
mTvDevice = (Text) findComponentById(ResourceTable.Id_device_info);
mBtnScan = (Button) findComponentById(ResourceTable.Id_scan);
mTvStatus = (Text) findComponentById(ResourceTable.Id_status);
mBtnConnect = (Button) findComponentById(ResourceTable.Id_connect);
mTvData = (Text) findComponentById(ResourceTable.Id_data);
mBtnSend = (Button) findComponentById(ResourceTable.Id_send);
mTfInput = (TextField) findComponentById(ResourceTable.Id_input);
mTvName = (Text) findComponentById(ResourceTable.Id_device_name);
mIvBle = (Image) findComponentById(ResourceTable.Id_ble_image);
}
private void initListener() {
mBtnScan.setClickedListener(this);
mBtnConnect.setClickedListener(this);
mBtnSend.setClickedListener(this);
}
@Override
public void onClick(Component component) {
int viewId = component.getId();
if (viewId == ResourceTable.Id_scan) {
// 處理掃描
disposeScan();
} else if (viewId == ResourceTable.Id_connect) {
// 處理連接
disposeConnect();
} else if (viewId == ResourceTable.Id_send) {
// 向外圍設(shè)備發(fā)送消息
disposeSend();
}
}
/**
* 處理掃描
*/
private void disposeScan() {
if (!isScanning) {
isScanning = true;
mBtnScan.setText("停止掃描");
mTvDevice.setText("設(shè)備mac:正在掃描...");
mTvName.setText("設(shè)備名稱:暫無設(shè)備");
// 開始掃描(過濾器指定的)設(shè)備
BleScanFilter bleScanFilter = new BleScanFilter();
bleScanFilter.setPeripheralAddress(Constant.PERIPHERAL_ADDRESS);
mFilters.add(bleScanFilter);
mCentralManager.startScan(mFilters);
} else {
isScanning = false;
mBtnScan.setText("開始掃描");
// 停止掃描
mCentralManager.stopScan();
}
}
/**
* 處理連接
*/
private void disposeConnect() {
if (mPeripheralDevice == null) {
// 外圍設(shè)備對象未連接
mTvStatus.setText("連接狀態(tài):請先掃描獲取設(shè)備信息");
return;
}
if (!isConnected) {
mBtnConnect.setText("斷開連接");
mTvStatus.setText("連接狀態(tài):連接中...");
// 發(fā)起連接
mPeripheralDevice.connect(false, mPeripheralCallback);
} else {
isConnected = false;
mBtnConnect.setText("連接設(shè)備");
mTvStatus.setText("連接狀態(tài):未連接");
mTvDevice.setText("設(shè)備mac:暫無設(shè)備");
mTvName.setText("設(shè)備名稱:暫無設(shè)備");
setBleImage();
// 發(fā)起斷開連接
mPeripheralDevice.disconnect();
mPeripheralDevice = null;
}
}
/**
* 處理向外圍設(shè)備發(fā)送消息
*/
private void disposeSend() {
String msg = mTfInput.getText().toString();
if (msg.isEmpty() || mPeripheralDevice == null || !isConnected) {
return;
}
// 向外圍設(shè)備發(fā)送用戶輸入的數(shù)據(jù)
mWriteCharacteristic.setValue(msg.getBytes());
boolean result = mPeripheralDevice.writeCharacteristic(mWriteCharacteristic);
HiLog.info(label, "發(fā)送內(nèi)容:" + msg + "發(fā)送結(jié)果:" + result);
String sendResult = result ? "發(fā)送成功": "發(fā)送失敗";
showToast(sendResult);
}
/**
* 實現(xiàn)外圍設(shè)備操作回調(diào)
* 中心設(shè)備作為GattService的客戶端
*/
private class MyBlePeripheralCallback extends BlePeripheralCallback {
/**
* 在中心設(shè)備上發(fā)現(xiàn)服務(wù)(GattService外圍設(shè)備)的回調(diào)
* @param status 狀態(tài)
*/
@Override
public void servicesDiscoveredEvent(int status) { // 外圍設(shè)備服務(wù)發(fā)生更新觸發(fā)的回調(diào)。
if (status == BlePeripheralDevice.OPERATION_SUCC) {
HiLog.info(label, "servicesDiscoveredEvent OPERATION_SUCC");
List<GattService> services = mPeripheralDevice.getServices(); // 獲取Service成功后獲服務(wù)列表
for (GattService service : services) {
// 對每個服務(wù)進行相應(yīng)操作
if (service.getUuid().equals(UUID.fromString(Constant.SERVICE_UUID))) {
HiLog.info(label, "servicesDiscoveredEvent 找到服務(wù)");
mPeripheralDevice.setNotifyCharacteristic(service.getCharacteristic(UUID.fromString(Constant.NOTIFY_CHARACTER_UUID)).get(), true);
}
}
}
}
/**
* 連接狀態(tài)變更
* 連接成功后可以在中心設(shè)備上(客戶端)發(fā)現(xiàn)GattService
* @param connectionState
*/
@Override
public void connectionStateChangeEvent(int connectionState) {
super.connectionStateChangeEvent(connectionState);
HiLog.info(label, "connectionState:" + connectionState);
if (connectionState == ProfileBase.STATE_CONNECTED && !isConnected) {
isConnected = true;
mPeripheralDevice.discoverServices();// 與外圍設(shè)備連接成功,發(fā)現(xiàn)GattService
setText(mTvStatus, "連接狀態(tài):已連接");
} else if (connectionState == ProfileBase.STATE_DISCONNECTED) {
// 斷開連接
setText(mTvStatus, "連接狀態(tài):未連接");
}
}
/**
* 特性變更的回調(diào)
* 接受外圍設(shè)備發(fā)送的數(shù)據(jù)
* @param characteristic
*/
@Override
public void characteristicChangedEvent(GattCharacteristic characteristic) {
super.characteristicChangedEvent(characteristic);
// 更新外圍設(shè)備發(fā)送的數(shù)據(jù)
String msg = new String(characteristic.getValue());
HiLog.info(label, "characteristicChangedEvent msg=" + msg);
setText(mTvData, msg);
}
}
/**
* 實現(xiàn)中心設(shè)備管理回調(diào)
*/
public class MyBleCentralManagerCallback implements BleCentralManagerCallback{
/**
* 掃碼結(jié)果回調(diào)
* @param bleScanResult 掃碼結(jié)果
*/
@Override
public void scanResultEvent(BleScanResult bleScanResult) {
// 根據(jù)掃碼結(jié)果獲取外圍設(shè)備實例
if (mPeripheralDevice == null) {
String deviceAddr = bleScanResult.getPeripheralDevice().getDeviceAddr();
String deviceName = bleScanResult.getPeripheralDevice().getDeviceName().get();
HiLog.info(label, "設(shè)備mac:" + deviceAddr);
if (Constant.PERIPHERAL_ADDRESS.equals(deviceAddr)) {
mPeripheralDevice = bleScanResult.getPeripheralDevice();
setText(mTvDevice, "設(shè)備mac:" + deviceAddr);
setText(mTvName, "設(shè)備名稱:" + deviceName);
}
}
}
/**
* 掃描失敗回調(diào)
* @param i
*/
@Override
public void scanFailedEvent(int i) {
setText(mTvDevice, "設(shè)備mac:掃描失敗,請重新掃描");
setText(mTvName, "設(shè)備名稱:暫無設(shè)備");
}
/**
* 組掃描成功回調(diào)
* @param list 組信息
*/
@Override
public void groupScanResultsEvent(List<BleScanResult> list) {
}
}
/**
* 設(shè)置Text的內(nèi)容
* @param text 容器
* @param content 內(nèi)容
*/
private void setText(Text text, final String content) {
getUITaskDispatcher().syncDispatch(new Runnable() {
@Override
public void run() {
text.setText(content);
}
});
}
private void showToast(String msg) {
ToastDialog toastDialog = new ToastDialog(this);
toastDialog.setAlignment(LayoutAlignment.CENTER).setText(msg).show();
}
@Override
protected void onStop() {
super.onStop();
if (mPeripheralDevice != null) {
mPeripheralDevice.disconnect();
mPeripheralDevice = null;
}
}
private void setBleImage() {
if (isConnected) {
mIvBle.setPixelMap(ResourceTable.Media_icon_ble_ling);
} else {
mIvBle.setPixelMap(ResourceTable.Media_icon_ble_black);
}
}
}

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://harmonyos.51cto.com??

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2015-09-22 11:04:24

藍牙4.0開發(fā)

2023-03-08 21:30:33

2015-02-27 16:03:26

Android源碼Bluetooth_4BLE藍牙通信

2021-10-30 07:55:00

BLE 藍牙開發(fā)

2021-08-24 14:57:27

鴻蒙HarmonyOS應(yīng)用

2023-04-17 16:10:14

鴻蒙藍牙

2024-12-24 07:38:44

C#串口通信

2022-11-17 15:26:06

低功耗藍牙鴻蒙

2018-08-03 18:15:40

物聯(lián)網(wǎng)通信架構(gòu)IOT

2011-06-08 12:42:08

Android 藍牙

2009-09-03 17:42:07

C#開發(fā)CF藍牙模塊

2010-07-30 13:40:59

Flex開發(fā)

2013-09-12 15:37:09

iOS開發(fā)流程

2011-08-22 13:46:15

iPhone開發(fā)GameKit 藍牙

2023-09-19 15:58:13

Zigbee藍牙

2021-06-30 09:27:58

鴻蒙HarmonyOS應(yīng)用

2015-06-17 10:28:10

WebAPP開發(fā)技巧

2015-06-04 10:44:59

WebAPP開發(fā)技巧

2011-08-15 10:45:11

iPhone開發(fā)delegate

2011-08-15 10:35:43

iPhone開發(fā)Atomicnonatomic
點贊
收藏

51CTO技術(shù)棧公眾號

欧美成人aaaaⅴ片在线看| 国产玉足脚交久久欧美| 加勒比在线一区| 91视频精品| 日韩精品一区二区三区视频 | 成人乱码一区二区三区| 在线午夜精品| 久久精品国产欧美亚洲人人爽| 麻豆免费在线观看视频| 日韩毛片免费观看| 亚洲激情第一区| 女女同性女同一区二区三区91| 自拍偷拍第八页| 影音先锋一区| 日韩在线小视频| 国产精品手机在线观看| 福利一区二区三区视频在线观看| 一区二区视频在线看| 欧洲精品一区色| 国产福利资源在线| 免费在线观看视频一区| 久久久精品中文字幕| 黑人巨大精品欧美| 亚洲乱码一区| av丝袜在线| 美女视频网站久久| 97视频在线观看视频免费视频| 舐め犯し波多野结衣在线观看| 久久综合给合| 欧美性xxxxx极品少妇| 日韩av新片网| 少妇av在线| 亚洲欧美在线视频| 日韩精品欧美在线| 四虎影视精品成人| 国产精品综合一区二区| 国产精品一区二区三区成人| 午夜影院免费在线观看| 红桃视频国产一区| 久久久精品亚洲| 狂野欧美性猛交| 欧美日韩xxxx| 国产偷国产偷亚洲清高网站| av不卡中文字幕| 精品国产欧美| 91精品午夜视频| 日本人视频jizz页码69| 亚洲一区二区三区四区| 欧美天天综合色影久久精品| 三上悠亚久久精品| 国产不卡人人| 婷婷中文字幕一区三区| 青青草国产精品视频| 国产深夜视频在线观看| 一区二区在线观看免费| 欧美日韩精品高清| 久久精品国产一区二区三区日韩| 亚洲伦理在线观看| 国产精品一区二区三区99| 国产欧美一区二区三区久久| 欧美视频xxxx| 人人精品人人爱| 国产精品视频永久免费播放| 在线观看毛片网站| 麻豆精品久久久| 国产日本欧美视频| 国产精品久久久久久久久久久久久久久久| 日本视频在线一区| 国产精品久久久久久久久粉嫩av | 在线中文字幕不卡| 日韩中文字幕组| 日韩欧美精品一区二区综合视频| 欧美图片一区二区三区| 男操女免费网站| 婷婷丁香久久| 欧美大胆一级视频| 日韩av一二区| av在线不卡免费观看| 日韩有码在线电影| 国产在线一卡二卡| 亚洲激情婷婷| 国产成人综合av| 国产精品无码久久av| 国产成人精品免费一区二区| 国产精品露出视频| 毛片网站在线| 国产精品久久久久久久久久免费看| 一区不卡字幕| 久久av色综合| 日本高清成人免费播放| 欧美视频亚洲图片| 猫咪成人在线观看| 中文字幕免费精品一区| 精品在线视频免费观看| 免费日韩一区二区| 精品播放一区二区| 国产成人精品一区二区在线| 国产三级av片| 久久99精品久久久久| 99在线视频免费观看| 天天综合在线视频| 中文字幕一区视频| www国产精品内射老熟女| 高清亚洲高清| 亚洲精品成a人在线观看| 伊人影院综合网| 激情综合自拍| 国产人妖伪娘一区91| 丝袜+亚洲+另类+欧美+变态| 中文字幕制服丝袜一区二区三区 | 伊人精品成人久久综合软件| 国产a∨精品一区二区三区不卡| 国产男女猛烈无遮挡| 久久综合狠狠综合久久激情| 特色特色大片在线| 成人自拍视频网| 精品国产一区二区三区四区四 | 黑森林精品导航| 福利片一区二区| 久久精品视频免费播放| 69xxxx国产| av一区二区不卡| 亚洲第一综合网站| 91欧美精品| 亚洲欧美三级在线| 日产电影一区二区三区| 国产一区亚洲一区| 神马影院我不卡午夜| 超碰91在线观看| 欧美一区二区福利视频| 国产毛片欧美毛片久久久| 亚洲精品裸体| 国产精品18毛片一区二区| 丝袜美腿美女被狂躁在线观看| 欧美午夜影院在线视频| 日韩综合第一页| 欧美午夜电影在线观看 | 精品国偷自产在线视频| 国产女主播喷水视频在线观看 | 成人免费视频网站| www久久日com| 欧美精品自拍偷拍| 精品一区二区在线观看视频| www.午夜激情| 极品美女销魂一区二区三区免费| 蜜桃麻豆www久久国产精品| jizz一区二区三区| 欧美大片在线观看一区二区| 国产av无码专区亚洲av毛网站| 蜜桃视频第一区免费观看| 蜜桃视频在线观看91| 免费看男女www网站入口在线 | 国产女18毛片多18精品| 欧美激情中文字幕一区二区| 国产偷人视频免费| 一区二区三区视频免费观看| 青青草国产精品一区二区| 手机福利在线| 日韩欧美福利视频| 受虐m奴xxx在线观看| 久久精品日产第一区二区 | 色丁香婷婷综合久久| 亚洲一区在线免费观看| 亚洲欧洲日韩综合| 在线观看视频日韩| 九九九九精品九九九九| 中文在线免费二区三区| 亚洲网址你懂得| 中国老头性行为xxxx| 国产精品久久久久aaaa| 波多野结衣网页| 一区在线观看| 久久综合婷婷综合| 国产精品原创视频| 美日韩精品视频免费看| 欧美 日韩 人妻 高清 中文| 欧美日韩激情美女| 国产精品色午夜在线观看| 国产成人无码精品久在线观看| 99re热这里只有精品免费视频| 北条麻妃69av| 欧美mv日韩| 亚洲伊人久久大香线蕉av| aa级大片免费在线观看| 亚洲免费一级电影| 亚洲最大成人av| 一区二区三区国产| 3d动漫精品啪啪一区二区下载 | 久久久精品三级| 99久久亚洲精品蜜臀| av资源站久久亚洲| 国产精品极品美女在线观看| xxxx性欧美| 天天综合天天色| 欧美裸体一区二区三区| 日韩欧美亚洲视频| 中文字幕一区二区三区在线观看| 日本成人在线免费| 久久久久久穴| japanese在线播放| 国产探花一区在线观看| 亚洲最大成人在线| 婷婷激情一区| 97久久精品人人澡人人爽缅北| 国产三级在线看| 精品日韩在线一区| 中文字幕一区二区三区人妻四季 | 不卡视频一区| 操喷在线视频| xxxx欧美18另类的高清| 男女av在线| 亚洲成人网在线| 国产免费一区二区三区最新不卡 | 亚洲一区二区三区高清视频| 亚洲成人久久影院| 91精品少妇一区二区三区蜜桃臀| 99精品视频一区| 中文字幕人妻无码系列第三区| 久久婷婷影院| 国产成人无码a区在线观看视频| 日韩国产专区| 欧美亚洲另类久久综合| 99re8这里有精品热视频8在线| 国产精品精品视频一区二区三区| 91福利在线免费| 久久6免费高清热精品| 丝袜美腿美女被狂躁在线观看| 亚洲另类xxxx| 亚洲av成人无码久久精品老人 | 68精品国产免费久久久久久婷婷 | 欧美疯狂xxxx大交乱88av| 啊v在线视频| 亚洲人在线视频| 水莓100在线视频| 亚洲成人精品视频| 99久久精品无免国产免费| 欧美日韩精品一区二区三区四区| 免费黄色网址在线| 婷婷国产在线综合| 精品午夜福利在线观看| 亚洲在线一区二区三区| 日韩在线观看视频一区二区| 五月婷婷六月丁香| 精品久久久久久久大神国产| 欧美国产精品一二三| 中文字幕日韩av资源站| 成年人在线免费看片| 久久精品夜色噜噜亚洲aⅴ| 一起草在线视频| jiyouzz国产精品久久| 国产一卡二卡三卡四卡| 成人99免费视频| 成人手机在线免费视频| 91在线精品一区二区三区| 亚洲综合自拍网| 91在线丨porny丨国产| 老司机免费视频| 91视频在线观看免费| 麻豆精品国产传媒av| 99国产精品久久久久久久久久| 国模无码视频一区| 99久久综合色| 中文字幕一区二区三区人妻不卡| 久久久久久亚洲综合影院红桃| 在哪里可以看毛片| 亚洲国产精品成人综合色在线婷婷| 国产一级黄色录像| 久久久久久久国产精品影院| аⅴ天堂中文在线网| 一区在线观看免费| 国产一级免费av| 亚洲一区二区三区视频在线播放| 欧美成人aaaaⅴ片在线看| 懂色av一区二区三区| 亚洲成人av网址| 欧美二区三区的天堂| 亚洲伦理在线观看| 亚洲日韩欧美视频| 午夜免费福利在线观看| 蜜臀久久99精品久久久久久宅男| 免费男女羞羞的视频网站在线观看| 国模视频一区二区| 日韩av一级| 91嫩草免费看| 欧美xxxx在线| 亚洲高清视频一区| 狠狠88综合久久久久综合网| 777久久久精品一区二区三区 | 日韩欧美中文视频| av亚洲精华国产精华| 69视频在线观看免费| 欧美人动性xxxxz0oz| 98视频在线噜噜噜国产| 国产经典一区| 99在线高清视频在线播放| 色老板在线视频一区二区| 亚洲一区二区高清视频| 亚洲精品社区| 亚洲美女性囗交| 99精品视频在线播放观看| 欧美性x x x| 色噜噜狠狠成人中文综合| 国产情侣在线播放| 亚洲欧洲免费视频| 国内在线视频| 成人黄色av网| 国产日产一区| 浮妇高潮喷白浆视频| 狠狠网亚洲精品| 亚洲综合色一区| 亚洲国产综合人成综合网站| 亚洲一区二区视频在线播放| 日韩成人高清在线| 成人av福利| 国产精品久久精品| 乱亲女h秽乱长久久久| 一区二区三区四区久久| 免费日韩av片| 制服丝袜av在线| 亚洲精品成人少妇| 一级片视频网站| 伊人久久大香线蕉av一区二区| gogo高清午夜人体在线| 91久久久久久久一区二区| 精品产国自在拍| 国产亚洲欧美在线视频| 岛国av在线一区| 亚洲成人生活片| 在线播放91灌醉迷j高跟美女 | 中文字幕一精品亚洲无线一区| 69av成人| 国产精品一区二区欧美| 欧美日韩国产综合网| 五月六月丁香婷婷| 亚洲欧洲中文字幕| 国产日本欧美一区二区三区| 天美av一区二区三区久久| 加勒比成人在线| 成人天堂资源www在线| 欧美毛片在线观看| 91精品国产综合久久福利 | 久久婷婷国产| 国产91av视频在线观看| 蜜桃精品视频在线| 性久久久久久久久久| 欧美视频在线视频| 色视频在线观看免费| 欧美亚洲国产日本| 网友自拍一区| 国产亚洲天堂网| 久久久久久久网| 91视频久久久| 尤物tv国产一区| 成人国产精品| 影音欧美亚洲| 国产一区二区在线视频| 免费在线观看一级片| 精品少妇一区二区三区在线播放 | 97精品免费视频| 色婷婷精品视频| 免费在线观看的毛片| 国产日产亚洲精品系列| 亚洲中文一区二区三区| 欧美成aaa人片在线观看蜜臀| 亚洲一区二区三区在线免费| 美女黄色免费看| 久久天堂av综合合色蜜桃网| 国产免费www| 久热精品视频在线观看| youjizz欧美| 亚洲色成人一区二区三区小说| 国产蜜臀97一区二区三区| 一级片一区二区三区| 久久久久久久国产| 狼人天天伊人久久| 热久久精品免费视频| 亚洲色大成网站www久久九九| 亚洲精品一区二区三区新线路| 97婷婷大伊香蕉精品视频| 国语产色综合| 黄色一级片免费播放| 亚洲不卡av一区二区三区| 你懂的在线视频| 91人成网站www| 国产欧美91| 亚洲欧美卡通动漫| 亚洲精品97久久| 色999久久久精品人人澡69| 日本黄色片一级片| 久久精品在线观看| 国内毛片毛片毛片毛片| 欧洲一区二区视频| 一级毛片免费高清中文字幕久久网| 国产综合内射日韩久| 91国偷自产一区二区开放时间 | 成人国产精品视频| 日本一区免费看| 精产国品一二三区| 成人美女视频在线观看18| 国产免费一级视频|