精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

91九色在线播放| 一级黄色录像大片| 国产剧情一区| 欧美日韩在线一区二区| 激情五月六月婷婷| 你懂的好爽在线观看| 美腿丝袜亚洲三区| 欧美精品福利视频| 1024手机在线观看你懂的| 亚洲国产中文在线二区三区免| 精品久久久久久久久久ntr影视| 视频一区二区三| 囯产精品久久久久久| 日本伊人色综合网| 国内外成人免费激情在线视频 | 视频欧美精品| 精品久久久一区二区| 在线看成人av电影| 天天摸天天碰天天爽天天弄| 久久99蜜桃精品| 欧美中文字幕视频| 好吊色视频在线观看| 国产亚洲一区二区三区啪 | 午夜福利理论片在线观看| 美女在线视频一区| 奇米四色中文综合久久| 波多野结衣不卡视频| 欧美久久精品一级c片| 精品播放一区二区| 8x8x成人免费视频| 免费看av不卡| 性做久久久久久| 欧美大片免费播放| 日本中文在线观看| 久久麻豆一区二区| 精品亚洲欧美日韩| 黄色福利在线观看| 国产成人久久精品77777最新版本| 日本成人免费在线| 免费看日韩毛片| 亚洲激情另类| 欧美丰满少妇xxxx| 印度午夜性春猛xxx交| 国产精品久久久久久久久久10秀| 亚洲热线99精品视频| 亚洲中文字幕无码一区| 91大神精品| a视频在线观看| 国产亚洲欧美中文| 欧美日韩另类丝袜其他| 手机在线观看毛片| a美女胸又www黄视频久久| 福利视频久久| 亚洲黄色片视频| 成人亚洲一区二区一| 国产精品露出视频| 蜜桃av中文字幕| youjizz久久| 国产一区二区免费在线观看| 日本激情一区二区| 成人动漫在线一区| 国产亚洲第一区| 五月激情丁香婷婷| 久久综合九色综合欧美就去吻 | 中文字幕在线不卡一区二区三区| 亚洲7777| 麻豆tv入口在线看| 亚洲精品国产一区二区精华液 | av日韩国产| 亚洲成av人**亚洲成av**| 蜜桃传媒一区二区三区| 国模私拍一区二区国模曼安| 天天做天天摸天天爽国产一区| 老太脱裤子让老头玩xxxxx| 自由日本语热亚洲人| 色美美综合视频| 怡红院亚洲色图| 久久久久久久久久久久电影| 日韩精品专区在线影院观看| 你懂得在线视频| 国产尤物久久久| 色综合亚洲精品激情狠狠| 一区二区成人免费视频| 制服诱惑一区二区| 国产精品福利网| 国产尤物视频在线观看| 99久久婷婷国产| 欧美最新大片在线看| 欧美一区二区三区精美影视| 永久免费在线观看视频| 一区二区三区成人| 精品www久久久久奶水| 伊人久久大香| 日韩精品极品在线观看播放免费视频 | 不卡的免费av| 石原莉奈在线亚洲二区| 91精品久久久久久蜜桃| 日韩欧美亚洲系列| 1区2区3区国产精品| 五十路熟女丰满大屁股| www.精品国产| 亚洲大尺度美女在线| 欧美老女人性生活视频| 99精品视频免费| 国产精品视频精品| 日本xxxxxwwwww| 中文字幕av一区 二区| 欧美久久在线观看| 日韩毛片免费看| 日韩精品在线观看网站| 欧美成人777| 久久天堂成人| 国产美女精品在线观看| 麻豆免费在线观看| 一本高清dvd不卡在线观看| 91亚洲一区二区| 成人影院在线| 青青青国产精品一区二区| 99久久一区二区| 中文字幕成人网| 能在线观看的av| www.丝袜精品| 久久久精品2019中文字幕神马| 久久精品无码av| 成人亚洲精品久久久久软件| 浴室偷拍美女洗澡456在线| 亚洲欧美在线成人| 亚洲国产天堂久久综合| 久久久久久久福利| 国内成人自拍视频| 四虎影院一区二区三区 | 亚洲国产精品久久久男人的天堂| 潘金莲激情呻吟欲求不满视频| 亚洲美女久久| 911国产网站尤物在线观看| 亚洲毛片欧洲毛片国产一品色| 国产精品久久久久久久久动漫| 国产日韩一区二区在线观看| 老牛精品亚洲成av人片| 欧美激情视频一区| 成人福利小视频| 日韩理论片在线| gogogo高清免费观看在线视频| 免费看av成人| 国产91亚洲精品| 欧洲免费在线视频| 色综合天天综合狠狠| 日本一区二区三区网站| 美女国产精品| 免费看成人片| 国产精品高清乱码在线观看| 国产午夜精品久久久| www欧美在线| 久久久99久久| 无人在线观看的免费高清视频| 久久99青青| 国产精品久久久久久久久久久久久久 | 色午夜这里只有精品| 中文字幕制服诱惑| 国产精品视频一二三区| 超碰超碰在线观看| 偷偷www综合久久久久久久| 2014亚洲精品| 电影k8一区二区三区久久| 亚洲成人精品av| 日本中文字幕在线| 国产欧美一区二区在线| 高潮一区二区三区| 中文字幕午夜精品一区二区三区 | 九热视频在线观看| 色琪琪久久se色| 91网在线免费观看| 黄色污污视频在线观看| 日韩av综合网| 久久国产香蕉视频| 成人免费在线播放视频| 中文字幕18页| 日韩影院在线观看| 裸体裸乳免费看| 久久精品66| 国产精品免费电影| 性欧美video高清bbw| 日韩高清有码在线| www.久久视频| 亚洲精品国产成人久久av盗摄 | 中文字幕一区日韩精品欧美| 少妇性l交大片7724com| 国产农村妇女精品一区二区| 亚洲激情一区二区三区| 一本色道69色精品综合久久| 全亚洲最色的网站在线观看| 好操啊在线观看免费视频| 精品国产百合女同互慰| 艳妇乳肉豪妇荡乳av无码福利| 亚洲女同一区二区| 18禁裸乳无遮挡啪啪无码免费| 另类小说综合欧美亚洲| 久操网在线观看| 超碰成人久久| 激情伦成人综合小说| 日韩三级一区| 日本高清不卡在线| 四虎影视国产在线视频| 伊是香蕉大人久久| 欧美一区二区黄片| 欧美日韩国产影片| 9i看片成人免费看片| 一区二区三区四区中文字幕| 国产午夜精品久久久久久久久| 成人性生交大合| www.色欧美| 日韩成人一级片| 欧美日韩在线一| 欧美在线视屏| 亚洲精品在线视频观看| 在线日韩一区| 国产日韩亚洲精品| 欧美黄视频在线观看| 国产精品亚洲欧美导航| 成人av免费电影网站| 久久久久久久久久国产| 麻豆tv入口在线看| 深夜福利国产精品| 精品美女视频在线观看免费软件| 精品久久久久久综合日本欧美| 国产精品毛片一区二区在线看舒淇| 一本一道久久a久久精品综合蜜臀| 国产亚洲第一页| 亚洲少妇中出一区| 成人一级黄色大片| 中文字幕精品在线不卡| 丰满少妇高潮一区二区| 91视频观看视频| 网站免费在线观看| 成人午夜av电影| 性猛交╳xxx乱大交| 国产成人亚洲综合a∨婷婷图片| 色婷婷.com| 免费在线观看不卡| 日本美女高潮视频| 秋霞电影一区二区| 五月婷婷激情久久| 日本欧美一区二区三区| 国产v亚洲v天堂无码久久久 | 日本一二区免费| 蜜桃视频在线观看一区| 国产一二三区av| 蜜臀久久久久久久| 亚洲77777| 久久se精品一区二区| 黄大色黄女片18第一次| 久久精品国产99| 中文字幕在线观看日| 国内精品伊人久久久久av一坑| 五月天婷婷亚洲| 国产一区二三区好的| 一卡二卡三卡四卡五卡| 成人一区二区三区视频| 亚洲成人av免费在线观看| 91最新地址在线播放| 白白色免费视频| 国产精品久久三| 黑鬼狂亚洲人videos| 一区二区三区免费| 国产奶水涨喷在线播放| 欧美日韩另类视频| 免费在线观看av的网站| 欧美精品久久99久久在免费线| 国产探花精品一区二区| 欧美精品一区男女天堂| 精品成人一区二区三区免费视频| 在线观看欧美日韩| 国产秀色在线www免费观看| 欧美高清videos高潮hd| 天堂√8在线中文| 国产精品久久久久久久久免费看 | 黄页网站大全在线免费观看| 97久久久免费福利网址| 日韩久久一区二区三区| 成人在线视频网站| 精品按摩偷拍| 天天久久人人| 欧美午夜国产| 蜜臀av午夜一区二区三区 | 91精品国产综合久久久久久久久| 久久精品九色| 欧美精品一区二区三区在线看午夜| 精品国产精品| 男人添女荫道口喷水视频| 久久夜色精品| www.欧美com| 国产视频一区不卡| 欧美极品aaaaabbbbb| 日韩欧美成人免费视频| 国产女人18毛片水18精| 日韩激情在线视频| 成人在线app| 日韩暖暖在线视频| 中文无码日韩欧| 日韩一区二区三区资源| 亚洲国产1区| 亚洲欧洲日本精品| av高清久久久| 日本一级二级视频| 91福利在线看| 亚洲欧美综合一区二区| 久久精品人人做人人爽| 一二三四视频在线中文| 91免费版黄色| 成人女性视频| 国内外成人激情视频| 成人网在线免费视频| 午夜爽爽爽男女免费观看| 色婷婷久久久综合中文字幕 | 成人久久网站| 精品视频一区二区三区四区| 欧美成人综合| 特黄视频免费观看| 久久久精品免费网站| 欧美片一区二区| 在线电影一区二区三区| 国产福利第一视频在线播放| 久久久伊人欧美| 精品视频一区二区三区| 亚洲精品国产系列| 爽好久久久欧美精品| 日韩成人av一区二区| 一区二区三区中文字幕| 国产剧情精品在线| 色黄久久久久久| 日本一区二区电影| 欧美日韩一区二区三区在线观看免| 亚洲高清不卡| 最新版天堂资源在线| 亚洲综合图片区| 国产日本精品视频| 久久影院免费观看| 日韩午夜视频在线| 在线观看日本一区| 久久99久久99精品免视看婷婷 | 国产精品久久久久91| 奇米亚洲欧美| 成年人黄色片视频| 国产无一区二区| 日韩国产成人在线| 亚洲日本欧美中文幕| 日本成人三级电影| 深夜福利成人| 六月丁香婷婷色狠狠久久| 婷婷国产成人精品视频| 欧美日本韩国一区二区三区视频| eeuss影院www在线播放| 国产精品一区二区三区在线播放 | 亚洲 日韩 国产第一| 美女精品视频在线| 久久免费一级片| 国产a精品视频| 亚洲黄色一区二区| 亚洲欧美日韩精品| 99久久婷婷国产综合精品首页| 翔田千里亚洲一二三区| 精品影视av免费| 欧美日韩三级在线观看| 亚洲国产精品电影| 成人香蕉视频| 亚洲午夜精品一区二区| 国产一区二区免费视频| 久久久国产精品人人片| 亚洲国模精品一区| 色8久久影院午夜场| 一本一本a久久| 丰满白嫩尤物一区二区| 亚洲日本韩国在线| 在线免费看av不卡| 久久综合偷偷噜噜噜色| 男女啪啪免费视频网站| 国产亚洲一二三区| 国产免费的av| 57pao国产精品一区| 久久网站免费观看| 少妇精品无码一区二区| 福利一区视频在线观看| yes4444视频在线观看| 亚洲中国色老太| 亚洲欧美视频| 黄色录像二级片| 亚洲国产欧美一区二区丝袜黑人 | 在线播放91灌醉迷j高跟美女 | 国产精品丝袜久久久久久不卡| 一区二区影院| 成年人在线观看av| 3d动漫精品啪啪| 香蕉伊大人中文在线观看| 亚洲资源在线网| 99精品国产视频| 国产男男gay体育生网站| 青草成人免费视频| 亚洲天天影视网| 亚洲国产天堂av| 欧美精品一区二区在线播放|