• 13
  • 13
分享
  • 手机APP智能硬件开发蓝牙连接测试——软件测试圈
  • 恬恬圈 2021-12-10 14:16:51 字数 5900 阅读 1668 收藏 13

目前APP同硬件模块通信的方式主要有几种模式: 蓝牙连接模式、WiFi 连接模式(Socket 或 HTTP server)、DLNA 音视频共享 (iOS端还可使用AirPlay)。最近 点个赞科技项目中测试了 A PP与外设 通 过 蓝牙方式 实现 硬件 连 接 的功能,对相关的开发实现和测试方法进行一些整理, 在此分享给大家。

1、蓝牙基础知识

  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。特征就是具体键值对,提供数据的地方。每个特征属性分为读、写、通知等几种方式;

  5. central通过peripheral 的 Characteristic 来读写外设的数据,和获取通知。 Peripheral广播自己的Service和characteristic,Central订阅某一个具体的characteristic,Peripheral就和Central之间通过characteristic建立了一个双向的数据通道;

  6. 外设peripheral、服务Service、特征characteristic之间的关系;

  7. UUID: 蓝牙上的唯一标示符,为了区分不同服务和特征,就用UUID来表示。

2、蓝牙的两种工作模式

  • 中心模式

  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)。

  • 外设模式

  1. 启动一个 Peripheral 管理对象;

  2. 本地 Peripheral 设置服务,特性,描述,权限等等;

  3. Peripheral 发送广播;

  4. 设置处理订阅、取消订阅、读 characteristic、写 characteristic 的委托方法。

  • 蓝牙设备的工作状态

  1. 准备(standby)

  2. 广播(advertising)

  3. 监听扫描(Scanning

  4. 发起连接(Initiating)

  5. 已连接(Connected)

1.jpg

3、蓝牙连接的开发实现

这里以手机端作为central,以蓝牙设备作为peripheral,蓝牙设备连接的开发实现主要包括以下步骤:

1.导入苹果系统蓝牙框架

#import

2.遵循两个蓝牙框架相关的协议

<cbcentralmanagerdelegate,cbperipheraldelegate>
</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*)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扫描设备

  • 手机端蓝牙不同设置下是否能正常扫描:蓝牙打开、蓝牙关闭;

  • 蓝牙设备被扫描到并出现在可连接设备列表的条件:蓝牙设备名称与可连接的设备列表中的名称匹配、设备处于广播状态;

蓝牙设备与可连接的设备列表中名称是否匹配:匹配、不匹配;

蓝牙设备状态(视具体硬件而定):待机状态、广播状态、已连接状态、蓝牙设备操作中、数据传输中、关机状态;

测试以上各种组合场景下,蓝牙设备是否能正常扫描且出现在可连接设备列表;

  • 不同场景下,是否正常扫描:

一个手机同时扫描多个设备;

多个手机同时扫描同一个设备;

多个手机同时扫描多个设备;

  • 扫描过程中取消;

  • 扫描结果:扫描超时;未扫描到可连接设备,是否支持重试;扫描失败;扫描成功;

2. 连接设备(APP端点击可连接设备列表,连接蓝牙设备)

  • 测试蓝牙设备状态变化后,不同状态下是否可正常连接:待机状态、广播状态、已连接状态、蓝牙设备操作中、数据传输中、关机状态;

  • 连接结果的处理:连接成功、连接失败、连接超时等;

  • 连接成功后的操作:APP其他操作、连接中断、退到后台、杀掉APP等;

  • 其他场景:扫描到多个设备;

3. 断开连接

  • 设备端断开:设备关机、设备电量耗尽;

  • APP端断开:手动断开、其他操作断开连接;

4. 其他交互操作

  • 切换其他蓝牙设备,是否正常连接;

  • 蓝牙断开后重新打开,支持自动连接;

  • 距离超出蓝牙可检测范围,是否会断开连接,再恢复到可检测范围,能否自动连接;

  • 手机端连接多个不同蓝牙设备,各个设备功能是否都正常使用;

5. 连接成功后的数据传输

  • 功能上,APP端和蓝牙设备端是否符合正常使用需求;

  • 性能上,APP与蓝牙设备的交互是否满足需求;


作者:ccit0519

原文链接:http://blog.itpub.net/31421468/viewspace-2701096/

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   最近在看单元测试的东西,想跟大家聊聊我的感受。单元测试这块说实在的,我并不太熟悉,我几乎不写单元测试,也不太爱写单元测试。  当我推广消息推送平台austin的时候,有过批评我整个项目没有单元测试,也有过让我补上单元测试的。  01、单元测试(UNIT TEST)  我有个前同事进了外企,他说进了外企以后学习了很多新名词,刚进去时都不知道他们讲的是什么...  他问我:UT你知道是什么意思吗?  我说:不知道啊。  他说:UT是Unit Test,单元测试  我说:你们现在都要写单元测试吗?  他说:是啊  后来,我在群里闲聊的时候,发现有个企鹅上班的大哥也不知道UT是什么意思,那我就放心...
            0 0 1198
            分享
          •   1-Wapiti  Wapiti作为一个高效的web项目安全测试工具,它支持用户对web应用程序进行评估。运用“黑盒测试”技术,它可以在Web应用中检查出可能存在的缺陷漏洞。  在测试过程中,Wapiti会对网页进行扫描,并注入测试数据来查找安全隐患。Wapiti支持GET和POST方法的HTTP攻击,可确认多种类型的安全漏洞,比如:  ·文件泄露(File disclosure)  · 数据库注入(Database Injection)  · 跨站脚本注入(XSS Injection)  · 命令执行探测(Command Execution Detectio...
            0 0 3391
            分享
          • 软件性能测试中有一类很重要的测试——负载测试,包括并发测试和容量测试。负载测试的重要工作在于找到系统的性能拐点。在并发测试中我们不断地增加事物的用户并发数,观察系统所可以接受的并发数是否与设置的并发数保持一致,或者在增加并发数的时候观察系统的响应时间是否在可接受的范围之内(比如<3秒》)。当并发数少的时候,实际并发数与设置并发数是一致的,当系统并发数达到一定的数量后,实际并发数保持恒定,不会受到设置并发数的增加而增加了。或者系统的响应时间会超过设定的目标值。如图一所示,A即为我们找到的并发测试的拐点。图一:负载测试的拐点同样,在容量测试中,我们不断地往数据库中灌入数据,在开始数据量比较少...
            0 0 2337
            分享
          •   提起外包公司,很多小伙伴都不是很看好,觉得外包公司没啥发展前途、受限很多、没有自主权......也因此认为在外包公司没办法让测试新手提高技能。  但这些担忧,真的都有道理吗?换句话说,这些担忧都是有根据的吗?今天,我们就来聊聊这个话题。  我的外包企业工作经历  在这个外包公司这个问题上,我认为主要还是取决于外包企业所服务的甲方公司究竟是谁。也就是说,外包和外包还是有区别的。根据这几年我在外包公司工作的经验来看,外包公司主要有这么两类:  人力外包企业  如果你所在的是人力外包公司,负责的是一家开放且重技术的甲方公司,就会让你觉得,你就是在甲方本公司工作。  不仅不会让你觉得没有前途、发展...
            0 0 1125
            分享
          • 1.数据准备已事先准备好5个不同用户账号2.设置线程并发数ramp-up period 指 JMeter 用于执行全部请求的时间 如果设置了 100 个线程,并且 ramp-up period 是 2 秒,那么 JMeter 将在 2 秒钟 之内启动 100 个线程.如果循环次数是 2,那么 jmeter 将在 2 秒之内发送 200 个 请求(100*2) 如果循环次数设置为永远,那么 jmeter 将以最大可能去发送请求,以此测试出 最大并发数此处采用5个并发数作为测试演示设置为5个用户并发访问注意,若设置5个用户并发访问时,需在线程组中设定,用于模拟多用户同时测试的线程数为5个。如果线程...
            0 0 2649
            分享
      • 51testing软件测试圈微信