目前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]系统蓝牙框架

  #import

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:(NSDictionaryNSLog(@"%@====",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];//连接外设

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端连接蓝牙设备的功能,蓝牙设备连接完成后,还可以对设备进行数据读写,包括:获取外围设备服务和特征;从外围设备读取数据;向外围设备发送(写入)数据等操作。这里暂不具体展开。

APP链接蓝牙设备的测试关注点

介绍了蓝牙的基础知识、APP连接蓝牙设备的开发实现,接下来将介绍APP连接蓝牙设备这一过程测试中需要关注的测试点(由于每种蓝牙设备连接需求不同,开发实现上也会有细小差别,实际测试中可视具体开发逻辑进行调整):

1. APP扫描设备
①手机端蓝牙不同设置下是否能正常扫描:蓝牙打开、蓝牙关闭;
②蓝牙设备被扫描到并出现在可连接设备列表的条件:蓝牙设备名称与可连接的设备列表中的名称匹配、设备处于广播状态;
蓝牙设备与可连接的设备列表中名称是否匹配:匹配、不匹配;
蓝牙设备状态(视具体硬件而定):待机状态、广播状态、已连接状态、蓝牙设备操作中、数据传输中、关机状态;
测试以上各种组合场景下,蓝牙设备是否能正常扫描且出现在可连接设备列表;
③不同场景下,是否正常扫描:
一个手机同时扫描多个设备;
多个手机同时扫描同一个设备;
多个手机同时扫描多个设备;
④扫描过程中取消;
⑤扫描结果:扫描超时;未扫描到可连接设备,是否支持重试;扫描失败;扫描成功。

2. 连接设备(APP端点击可连接设备列表,连接蓝牙设备)
①测试蓝牙设备状态变化后,不同状态下是否可正常连接:待机状态、广播状态、已连接状态、蓝牙设备操作中、数据传输中、关机状态;
②连接结果的处理:连接成功、连接失败、连接超时等;
③连接成功后的操作:APP其他操作、连接中断、退到后台、杀掉APP等;
④其他场景:扫描到多个设备。

3. 断开连接
①设备端断开:设备关机、设备电量耗尽;
②APP端断开:手动断开、其他操作断开连接。

4. 其他交互操作
①切换其他蓝牙设备,是否正常连接;
②蓝牙断开后重新打开,支持自动连接;
③距离超出蓝牙可检测范围,是否会断开连接,再恢复到可检测范围,能否自动连接;
④手机端连接多个不同蓝牙设备,各个设备功能是否都正常使用。

5. 连接成功后的数据传输
①功能上,APP端和蓝牙设备端是否符合正常使用需求;
②性能上,APP与蓝牙设备的交互是否满足需求。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:938856006资料在裙里,需要可以自取

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

❤既然都看到这里啦,请你帮个忙:

1、点赞,让更多小伙伴看到;

2、关注我,持续更新测试干货。

测试技术之APP蓝牙连接测试相关推荐

  1. APP测试技术:ADB——安卓手机测试一座神奇的“桥”

    前言: 近年移动互联网好比IT界的一条浩瀚银河,安卓手机测试可谓其中最璀璨的一颗明珠,这里有一座你不得不熟悉的桥--ADB 曾见过不少相关的文章或培训,不乏空谈多,实战少:期望大,效果差.也见过很多测 ...

  2. 计算机辅助测试技术最近的发展,计算机辅助测试技术演示文稿.PPT

    计算机辅助测试技术演示文稿.PPT 第8章 计算机辅助测试技术 3. 数字信号分析方法 ■ 谱分析 谱分析指的是把时域动态信号通过傅里叶变换变换到频域进行分析,其数学基础是傅里叶变换.具体分析方法有: ...

  3. 一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析

    指标背景 流畅度,顾名思义是用户感知使用App页面时的流畅情况. "App卡不卡",这是用户最直接的感受. 但是要用量化之后的数据衡量流畅度,在Android平台这边并没有直接有效 ...

  4. 《Kali Linux高级渗透测试原书第2版》网络渗透测试技术书 无线网络渗透测试详解 黑客攻击与防范实战从入门到精通书

    内容简介: KaliLinux面向专业的渗透测试和审计,集成了大量挑选的检测工具.本书在KaliLinux平台上从一个攻击者的角度来审视网络框架,详细介绍了攻击者"杀链"采取的具体 ...

  5. 徕卡全站仪蓝牙android,App蓝牙连接莱卡系列全站仪Geocom

    TZ12.TS16.TS60.TS11.TS15.TS50.TM50.TPS1200.TS30.TM30 第一节 查看仪器是否开通Geocom 仪器需开通Geocom,不开通App无法控制仪器旋转.瞄 ...

  6. 如何进行app的兼容性测试?需要考虑哪些方面?

    考虑的方面: 1. 系统 a. Android 1). 官方版:官方发型的版本 数据来源:https://mta.qq.com/mta/data/device/os 2). 定制版:华为.魅族.小米. ...

  7. [转]web测试技术经典案例

    本文转自:http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20655.html 1. 概述 随着web应用的增多,新的模式解决方案中以web为 ...

  8. 端到端测试_端到端测试的滥用–测试技术2

    端到端测试 我的上一个博客是有关测试代码方法的一系列博客中的第一篇,概述了使用一种非常常见的模式从数据库检索地址的简单方案: -并描述了一种非常通用的测试技术: 不编写测试 , 而是手动进行所有操作. ...

  9. 存根类 测试代码 java_为旧版代码创建存根-测试技术6

    存根类 测试代码 java 任何阅读此博客的人都可能已经意识到,目前我正在开发一个项目,其中包含大量的旧代码,这些旧代码庞大,扩展且编写时从未进行过任何测试. 在使用此遗留代码时,有一个行为非常差的类 ...

最新文章

  1. 用电脑自带画图工具加字方法
  2. Docker 入门到实践笔记2
  3. svn git 导入本地文件到远程服务器 import
  4. 用jQuery预加载图像
  5. 微信小程序制作-随笔2
  6. python 迷宫边界,用python解决迷宫
  7. 《剑指offer》第1~11题:刷题week1[C++题解]
  8. middleware generic错误处理机制
  9. CONTINUE...? ZOJ - 4033
  10. 在Matplotlib图中插入LaTex公式
  11. Windows 10 下使用 VMPlayer 16 新建 CentOS 7 64位 虚拟机
  12. lottie动画android,Lottie动画简介
  13. flash发布html快捷键,flash快捷键大全
  14. centos7安装mysql5.7步骤(图解版)
  15. 快递物流行业总结(一)中国快递行业生命周期理论
  16. 免费Web托管公司000Webhost被黑 1350万明文密码泄露
  17. 只能打单面的打印机如何打双面
  18. 易经六十四卦详解白话文解释——易经64卦全解(上)
  19. IDEA重置配置设定
  20. [附源码]Java计算机毕业设计SSM鞍山丘比特房屋租赁管理系统

热门文章

  1. python获取某地铁站经纬度_python基于百度地图获取指定的经纬度信息
  2. win10在Anaconda3下面安装caffe框架(CPU)Python2.7从入门到放弃
  3. 在线绘画,在线画图,在线涂鸦画板
  4. 教你如何在win7中安装cygwin64
  5. SSIMLoss的用法(CoRRN)
  6. 外贸企业如何做EDM邮件营销
  7. 腾讯优图实验室AI手语识别研究白皮书
  8. 紫光中标中国移动7000万颗eSIM晶圆大单!紫光是家怎样的企业
  9. 奇安信2022秋招面经-技术支持岗
  10. mysql如何查询上下级机构