APP與硬件交互-藍牙鏈接測試

前言數組

        目前APP同硬件模塊通訊的方式主要有幾種模式:藍牙鏈接模式、WiFi 鏈接模式(Socket 或 HTTP server)、DLNA 音視頻共享 (iOS端還可以使用AirPlay)。最近小編項目中測試了APP與外設藍牙方式實現硬件的功能,對相關的開發實現和測試方法進行一些整理,在此分享給你們。微信

1. 藍牙基礎知識app

1. iOS平臺下藍牙開發可使用 MFI(ExternalAccessory 框架) 或 BLE (CoreBluetooth 框架) 進行,但實際開發中基本都使用 CoreBluetooth 框架,由於它功能更強大,支持藍牙4.0標準。框架

2. 藍牙4.0 BLE (Bluetooth low energy) :它的優勢在於傳輸快,耗電低,但傳輸數據有限,雖然這個傳輸字節大小硬件工程師可調,但也不會太大。性能

3. CoreBluetooth框架的核心是peripheral和 central, 能夠理解成外設和中心,發起鏈接的是central,被鏈接的設備爲 peripheral,它們是一組相對概念。好比,當手機去鏈接控制藍牙耳機時,你的手機就是central,當手機藍牙被另外一個手機鏈接併爲其提供服務時就是peripheral。測試

4. Service和Characteristic:藍牙設備過GATT協義的數據通信方式。一個 peripheral能夠提供多種 服務Service,一種Service 又能夠包含多個不一樣的 特徵Characteristic。特徵就是具體鍵值對,提供數據的地方。每一個特徵屬性分爲讀、寫、通知等幾種方式。atom

5. central經過peripheral 的 Characteristic 來讀寫外設的數據,和獲取通知。Peripheral廣播本身的Service和characteristic,Central訂閱某一個具體的characteristic,Peripheral就和Central之間經過characteristic創建了一個雙向的數據通道spa

6. 外設peripheral、服務Service、特徵characteristic之間的關係:.net


7. UUID:藍牙上的惟一標示符,爲了區分不一樣服務和特徵,就用UUID來表示。代理

2. 藍牙的兩種工做模式

1.    中心模式

1. 創建中心

2. 掃描外設(discover

3. 鏈接外設(connect) 鏈接失敗、鏈接斷開、鏈接成功

4. 掃描外設中的服務和特徵(discover)

- 4.1 獲取外設的 services

- 4.2 獲取外設的 Characteristics,獲取Characteristics的值,獲 Characteristics Descriptor Descriptor 的值

5. 與外設作數據交互(explore and interact)

6. 訂閱 Characteristic 的通知

7. 斷開鏈接(disconnect)

2.    外設模式

1. 啓動一個 Peripheral 管理對象

2. 本地 Peripheral 設置服務,特性,描述,權限等等

3. Peripheral 發送廣播

4. 設置處理訂閱、取消訂閱、讀 characteristic、寫 characteristic 的委託方法

3.    藍牙設備的工做狀態

1. 準備(standby)

2. 廣播(advertising)

3. 監聽掃描(Scanning

4. 發起鏈接(Initiating)

5. 已鏈接(Connected)

3. 藍牙鏈接的開發實現

        這裏以手機端做爲central,以藍牙設備做爲peripheral,藍牙設備鏈接的開發實現主要包括如下步驟:

1.    導入蘋果系統藍牙框架

#import<CoreBluetooth/CoreBluetooth.h>

2.    遵循兩個藍牙框架相關的協議

<CBCentralManagerDelegate,CBPeripheralDelegate>

3.    新建兩個實例屬性,一個特徵屬性

@property (nonatomic, strong) CBCentralManager*centralManager; //中心管理者

@property (nonatomic, strong) CBPeripheral *peripheral; //鏈接到的外設

@property (nonatomic, strong) CBCharacteristic*characteristic; //特徵

4.    初始化CBCentralManager,進行藍牙管理

- (void)viewDidLoad {

       [superviewDidLoad];

       self.centralManager= [[CBCentralManager alloc] initWithDelegate:selfqueue:dispatch_get_main_queue()];     //建立實例進行藍牙管理

}

 //若中心管理者初始化以後就會觸發下面這個代理方法。該代理方法是用來判斷手機藍牙的狀態

-(void)centralManagerDidUpdateState:(CBCentralManager *)central {

       //藍牙可用,開始掃描外設

       if(central.state == CBManagerStatePoweredOn) {

       NSLog(@"藍牙可用");

       //在中心管理者成功開啓以後再進行一些操做

       //搜索掃描外設

       //根據SERVICE_UUID來掃描外設,若是不設置SERVICE_UUID,則掃描全部藍牙設備

       //[self.centralManagerstartAdvertising:@{CBAdvertisementDataServiceUUIDsKey:@[[CBUUIDUUIDWithString:SERVICE_UUID]]}];

       [centralscanForPeripheralsWithServices:nil options:nil];

       }

       if(central.state== CBManagerStateUnsupported) {

       NSLog(@"該設備不支持藍牙");

       }

       if(central.state == CBManagerStatePoweredOff) {

       NSLog(@"藍牙已關閉");

       }

       if(central.state == CBManagerStateUnknown) {

       NSLog(@"藍牙當前狀態不明確");

       }

       if(central.state == CBManagerStateUnauthorized) {

       NSLog(@"藍牙未被受權");

       }

}

5.    搜索外圍設備

//執行掃描動做以後,若是掃描到外設了,就會自動回調下面的協議方法

/** 發現符合要求的外設,回調 */

- (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral *)peripheraladvertisementData:(NSDictionary<NSString *, id> *)advertisementDataRSSI:(NSNumber *)RSSI {

       NSLog(@"%@====",peripheral.name);

       //根據外設名字有選擇性的篩選鏈接藍牙設備

       if([peripheral.name hasPrefix:@"TEAMOSA"]) {

              //在這裏對外設攜帶的廣播數據進行進一步的處理

              if([self.peripheraNames containsObject:peripheral.name]) {

              //若是數組中包含了就再也不添加

              return;

              }

                           

       //添加到外設名字數組中

       [self.peripheraNamesaddObject:peripheral.name];

 

       //標記外設,讓它的生命週期與控制器的一致

       self.peripheral= peripheral;

 

       //能夠根據外設名字來過濾外設

       //[central connectPeripheral:peripheral options:nil];

      

       }

       //鏈接外設

       //[central connectPeripheral:peripheral options:nil];

}

6.    鏈接外圍設備

//鏈接外圍設備,中心管理者鏈接外設成功,若是鏈接成功就會回調這個協議方法

 

/** 鏈接成功 */­­­

- (void)centralManager:(CBCentralManager*)central didConnectPeripheral:(CBPeripheral *)peripheral{

 

       //鏈接成功以後,能夠進行服務和特性的發現。中止中心管理設備的掃描動做,要否則在你和已經鏈接好的外設進行數據溝通時,若是又有一個外設進行廣播且符合你的鏈接條件,那麼你的iOS設備也會去鏈接這個設備(由於iOS BLE4.0是支持一對多鏈接的),致使數據的混亂。

       //中止掃描動做

       [self.centralManagerstopScan];

 

       //設置外設的代理

       peripheral.delegate= self;

 

       //根據UUID來尋找服務

       //[peripheral discoverServices:@[[CBUUID UUIDWithString:SERVICE_UUID]]];

 

       //外設發現服務,傳nil表明不過濾,一次性讀出外設的全部服務

       [peripheraldiscoverServices:nil];

 

       NSLog(@"%s,line = %d, %@=鏈接成功", __FUNCTION__, __LINE__,peripheral.name);

}

 

//外設鏈接失敗

/** 鏈接失敗的回調 */

- (void)centralManager:(CBCentralManager*)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError*)error {

       NSLog(@"%s,line = %d, %@=鏈接失敗", __FUNCTION__, __LINE__,peripheral.name);

}

 

//丟失鏈接 掉線

/** 斷開鏈接 */

- (void)centralManager:(CBCentralManager*)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullableNSError *)error {

       NSLog(@"%s,line = %d, %@=斷開鏈接", __FUNCTION__, __LINE__,peripheral.name);

       //斷開鏈接能夠設置從新鏈接

       [centralconnectPeripheral:peripheral options:nil];

}

        以上,已經實現了APP端鏈接藍牙設備的功能,藍牙設備鏈接完成後,還能夠對設備進行數據讀寫,包括:獲取外圍設備服務和特徵;從外圍設備讀取數據;向外圍設備發送(寫入)數據等操做。這裏暫不具體展開。

4. APP鏈接藍牙設備的測試關注點

介紹了藍牙的基礎知識、APP鏈接藍牙設備的開發實現,接下來將介紹APP鏈接藍牙設備這一過程測試中須要關注的測試點(因爲每種藍牙設備鏈接需求不一樣,開發實現上也會有細小差異,實際測試中可視具體開發邏輯進行調整):

1. APP掃描設備

 1)手機端藍牙不一樣設置下是否能正常掃描:藍牙打開、藍牙關閉;

 2)藍牙設備被掃描到並出如今可鏈接設備列表的條件:藍牙設備名稱與可鏈接的設備列表中的名稱匹配、設備處於廣播狀態;

藍牙設備與可鏈接的設備列表中名稱是否匹配:匹配、不匹配;

藍牙設備狀態(視具體硬件而定):待機狀態、廣播狀態、已鏈接狀態、藍牙設備操做中、數據傳輸中、關機狀態;

測試以上各類組合場景下,藍牙設備是否能正常掃描且出如今可鏈接設備列表;

3)不一樣場景下,是否正常掃描:

一個手機同時掃描多個設備;

多個手機同時掃描同一個設備;

多個手機同時掃描多個設備;

4)掃描過程當中取消;

5)掃描結果:掃描超時;未掃描到可鏈接設備,是否支持重試;掃描失敗;掃描成功;

2. 鏈接設備(APP端點擊可鏈接設備列表,鏈接藍牙設備)

1)測試藍牙設備狀態變化後,不一樣狀態下是否可正常鏈接:待機狀態、廣播狀態、已鏈接狀態、藍牙設備操做中、數據傳輸中、關機狀態;

2)鏈接結果的處理:鏈接成功、鏈接失敗、鏈接超時等;

3)鏈接成功後的操做:APP其餘操做、鏈接中斷、退到後臺、殺掉APP等;

4)其餘場景:掃描到多個設備;

3. 斷開鏈接

1)設備端斷開:設備關機、設備電量耗盡;

2)APP端斷開:手動斷開、其餘操做斷開鏈接;

4. 其餘交互操做

1)切換其餘藍牙設備,是否正常鏈接;

2)藍牙斷開後從新打開,支持自動鏈接;

3)距離超出藍牙可檢測範圍,是否會斷開鏈接,再恢復到可檢測範圍,可否自動鏈接;

4)手機端鏈接多個不一樣藍牙設備,各個設備功能是否都正常使用;

5. 鏈接成功後的數據傳輸

1)功能上,APP端和藍牙設備端是否符合正常使用需求;

 2)性能上,APP與藍牙設備的交互是否知足需求;

(本文只討論了藍牙設備鏈接部分,具體數據傳輸部分的用例,你們可自行擴展)


本文分享自微信公衆號 - 搜狗測試(SogouQA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索