51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1075|回复: 0
打印 上一主题 下一主题

[转贴] 测试技术之APP蓝牙连接测试

[复制链接]
  • TA的每日心情
    无聊
    14 小时前
  • 签到天数: 1051 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-7-7 10:45:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    目前APP与硬件模块之间的通信有几种模式:蓝牙连接模式、WiFi连接模式(Socket或HTTP服务器)、DLNA音视频共享(iOS上也可以使用AirPlay)。最近在项目中,测试了APP通过蓝牙与外设硬件连接的功能,整理了一些相关的开发、实现和测试方法,在这里与大家分享。
    蓝牙基础知识
      1. iOS台下蓝牙开发可以使用 MFI(ExternalAccessory 框架) 或 BLE (CoreBluetooth 框架) 进行,但实际开发中基本都使用 CoreBluetooth 框架,因为它功能更强大,支持蓝牙4.0标准。
      2. 蓝牙4.0 BLE (Bluetooth low energy) :它的优点在于传输快,耗电低,但传输数据有限,虽然这个传输字节大小硬件工程师可调,但也不会太大。
      3. CoreBluetooth框架的核心是peripheral和 central, 可以理解成外设和中心,发起连接的是central,被连接的设备为 peripheral,它们是一组相对概念。比如,当[url=]手机[/url]去连接控制蓝牙耳机时,你的手机就是central,当手机蓝牙被另一个手机连接并为其提供服务时就是peripheral。
      4. Service和Characteristic:蓝牙设备通过GATT协议定义的数据通讯方式。一个 peripheral可以提供多种 服务Service,一种Service 又可以包含多个不同的 特征Characteristic。特征就是具体键值对,提供数据的地方。每个特征属性分为读、写、通知等几种方式。
      5. central通过peripheral 的 Characteristic 来读写外设的数据,和获取通知。Peripheral广播自己的Service和characteristic,Central订阅某一个具体的characteristic,Peripheral就和Central之间通过characteristic建立了一个双向的数据通道。
      6. 外设peripheral、服务Service、特征characteristic之间的关系:


    7. UUID:蓝牙上的唯一标示符,为了区分不同服务和特征,就用UUID来表示。
      蓝牙的两种工作模式
      1. 中心模式
      ·  建立中心
      ·  扫描外设(discover)
      ·  连接外设(connect) 连接失败、连接断开、连接成功
      扫描外设中的服务和特征(discover):
      · 获取外设的 services
      ·  获取外设的 Characteristics,获取Characteristics的值,获 Characteristics的 Descriptor 和Descriptor 的值
      ·  与外设做数据交互(explore and interact)
      ·  订阅 Characteristic 的通知
      ·  断开连接(disconnect)
      2. 外设模式
      ·  启动一个 Peripheral 管理对象
      ·  本地 Peripheral 设置服务,特性,描述,权限等等
      ·  Peripheral 发送广播
      ·  设置处理订阅、取消订阅、读 characteristic、写 characteristic 的委托方法
      蓝牙设备的工作状态
      ·  准备(standby)
      ·  广播(advertising)
      ·  监听扫描(Scanning
      ·  发起连接(Initiating)
      ·  已连接(Connected)
      ·  蓝牙连接的开发实现
      这里以手机端作为central,以蓝牙设备作为peripheral,蓝牙设备连接的开发实现主要包括以下步骤:
      1. 导入[url=]苹果[/url]系统蓝牙框架
    1.   #import
    复制代码
    2. 遵循两个蓝牙框架相关的协议
    1. <cbcentralmanagerdelegate,cbperipheraldelegate>
    复制代码
    3. 新建两个实例属性,一个特征属性
    1. @property (nonatomic, strong) CBCentralManager*centralManager; //中心管理者
    2.   @property (nonatomic, strong) CBPeripheral *peripheral; //连接到的外设
    3.   @property (nonatomic, strong) CBCharacteristic*characteristic; //特征
    复制代码
    4. 初始化CBCentralManager,进行蓝牙管理
    1.  - (void)viewDidLoad {
    2.   [superviewDidLoad];
    3.   self.centralManager= [[CBCentralManager alloc] initWithDelegate:selfqueue:dispatch_get_main_queue()]; //创建实例进行蓝牙管理
    4.   }
    5.   //若中心管理者初始化之后就会触发下面这个代理方法。该代理方法是用来判断手机蓝牙的状态的
    6.   -(void)centralManagerDidUpdateState:(CBCentralManager *)central {
    7.   //蓝牙可用,开始扫描外设
    8.   if(central.state == CBManagerStatePoweredOn) {
    9.   NSLog(@"蓝牙可用");
    10.   //在中心管理者成功开启之后再进行一些操作
    11.   //搜索扫描外设
    12.   //根据SERVICE_UUID来扫描外设,如果不设置SERVICE_UUID,则扫描所有蓝牙设备
    13.   //[self.centralManagerstartAdvertising:@{CBAdvertisementDataServiceUUIDsKey:
    14.   @[[CBUUIDUUIDWithString:SERVICE_UUID]]}];
    15.   [centralscanForPeripheralsWithServices:nil options:nil];
    16.   }
    17.   if(central.state== CBManagerStateUnsupported) {
    18.   NSLog(@"该设备不支持蓝牙");
    19.   if(central.state == CBManagerStatePoweredOff) {
    20.   NSLog(@"蓝牙已关闭");
    21.   if(central.state == CBManagerStateUnknown) {
    22.   NSLog(@"蓝牙当前状态不明确");
    23.   if(central.state == CBManagerStateUnauthorized) {
    24.   NSLog(@"蓝牙未被授权");
    复制代码
    5. 搜索外围设备
    1. //执行扫描动作之后,如果扫描到外设了,就会自动回调下面的协议方法
    2.   /** 发现符合要求的外设,回调 */
    3.   - (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral *)peripheraladvertisementData:(NSDictionary
    4.   NSLog(@"%@====",peripheral.name);
    5.   //根据外设名字有选择性的筛选连接蓝牙设备
    6.   if([peripheral.name hasPrefix:@"TEAMOSA"]) {
    7.   //在这里对外设携带的广播数据进行进一步的处理
    8.   if([self.peripheraNames containsObject:peripheral.name]) {
    9.   //如果数组中包含了就不再添加
    10.   return;
    11.   }
    12.   //添加到外设名字数组中
    13.   [self.peripheraNamesaddObject:peripheral.name];
    14.   //标记外设,让它的生命周期与控制器的一致
    15.   self.peripheral= peripheral;
    16.   //可以根据外设名字来过滤外设
    17.   //[central connectPeripheral:peripheral options:nil];
    18.   //连接外设
    复制代码
    6. 连接外围设备
    1.  //连接外围设备,中心管理者连接外设成功,如果连接成功就会回调这个协议方法
    2.   /** 连接成功 */
    3.   - (void)centralManager:(CBCentralManager*)central didConnectPeripheral:(CBPeripheral *)peripheral{
    4.   //连接成功之后,可以进行服务和特性的发现。停止中心管理设备的扫描动作,要不然在你和已经连接好的外设进行数据沟通时,如果又有一个外设进行广播且符合你的连接条件,那么你的iOS设备也会去连接这个设备(因为iOS BLE4.0是支持一对多连接的),导致数据的混乱。
    5.   //停止扫描动作
    6.   [self.centralManagerstopScan];
    7.   //设置外设的代理
    8.   peripheral.delegate= self;
    9.   //根据UUID来寻找服务
    10.   //[peripheral discoverServices:@[[CBUUID UUIDWithString:SERVICE_UUID]]];
    11.   //外设发现服务,传nil代表不过滤,一次性读出外设的所有服务
    12.   [peripheraldiscoverServices:nil];
    13.   NSLog(@"%s,line = %d, %@=连接成功", __FUNCTION__, __LINE__,peripheral.name);
    14.   //外设连接失败
    15.   /** 连接失败的回调 */
    16.   - (void)centralManager:(CBCentralManager*)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError*)error {
    17.   NSLog(@"%s,line = %d, %@=连接失败", __FUNCTION__, __LINE__,peripheral.name);
    18.   //丢失连接 掉线
    19.   /** 断开连接 */
    20.   - (void)centralManager:(CBCentralManager*)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullableNSError *)error {
    21.   NSLog(@"%s,line = %d, %@=断开连接", __FUNCTION__, __LINE__,peripheral.name);
    22.   //断开连接可以设置重新连接
    23.   [centralconnectPeripheral:peripheral options:nil];
    复制代码
    以上,已经实现了APP端连接蓝牙设备的功能,蓝牙设备连接完成后,还可以对设备进行数据读写,包括:获取外围设备服务和特征;从外围设备读取数据;向外围设备发送(写入)数据等操作。这里暂不具体展开。
      APP链接蓝牙设备的测试关注点
      介绍了蓝牙的基础知识、APP连接蓝牙设备的开发实现,接下来将介绍APP连接蓝牙设备这一过程测试中需要关注的测试点(由于每种蓝牙设备连接需求不同,开发实现上也会有细小差别,实际测试中可视具体开发逻辑进行调整):
      1. APP扫描设备
      ①手机端蓝牙不同设置下是否能正常扫描:蓝牙打开、蓝牙关闭;
      ②蓝牙设备被扫描到并出现在可连接设备列表的条件:蓝牙设备名称与可连接的设备列表中的名称匹配、设备处于广播状态;
      蓝牙设备与可连接的设备列表中名称是否匹配:匹配、不匹配;
      蓝牙设备状态(视具体硬件而定):待机状态、广播状态、已连接状态、蓝牙设备操作中、数据传输中、关机状态;
      测试以上各种组合场景下,蓝牙设备是否能正常扫描且出现在可连接设备列表;
      ③不同场景下,是否正常扫描:
      一个手机同时扫描多个设备;
      多个手机同时扫描同一个设备;
      多个手机同时扫描多个设备;
      ④扫描过程中取消;
      ⑤扫描结果:扫描超时;未扫描到可连接设备,是否支持重试;扫描失败;扫描成功。
      2. 连接设备(APP端点击可连接设备列表,连接蓝牙设备)
      ①测试蓝牙设备状态变化后,不同状态下是否可正常连接:待机状态、广播状态、已连接状态、蓝牙设备操作中、数据传输中、关机状态;
      ②连接结果的处理:连接成功、连接失败、连接超时等;
      ③连接成功后的操作:APP其他操作、连接中断、退到后台、杀掉APP等;
      ④其他场景:扫描到多个设备。
      3. 断开连接
      ①设备端断开:设备关机、设备电量耗尽;
      ②APP端断开:手动断开、其他操作断开连接。
      4. 其他交互操作
      ①切换其他蓝牙设备,是否正常连接;
      ②蓝牙断开后重新打开,支持自动连接;
      ③距离超出蓝牙可检测范围,是否会断开连接,再恢复到可检测范围,能否自动连接;
      ④手机端连接多个不同蓝牙设备,各个设备功能是否都正常使用。
      5. 连接成功后的数据传输
      ①功能上,APP端和蓝牙设备端是否符合正常使用需求;
      ②性能上,APP与蓝牙设备的交互是否满足需求。


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 23:56 , Processed in 0.066304 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表