精华内容
下载资源
问答
  • 2022-02-15 21:15:24

    软件测试知识——APP测试专项知识

    1. 什么是 APP ?
      APP是英文单词 Application 的简称,现在的 APP 指代的是智能手机的第三方应用程序。目前国内互联网公司都会有自己的APP产品,比如淘宝、京东都有APP客户端。

    2. 什么是 APK ?
      APK 是 Android Package 的缩写,即 Android 安装包,我们可以从Andriod手机的应用商店进行下载。
      开发人员会将 Android App 项目源码进行编译、打包成APK包给到测试人员进行测试。

    3. 什么是 IPA ?
      IPA是苹果程序应用文件:iPhoneApplication 的缩写,即 iPhone 安装包。

    4. 什么是 APP 应用商店 ?
      应用商店其本质上是一个平台,用以展示、下载手机使用的应用软件(App),苹果手机用户可以在 Apple Store 进行下载,而安卓手机用户可以有很多的选择,比如:豌豆荚、应用宝等。

    5. 什么是 Native App ?
      移动端原生应用,基于手机操作系统如:iOS、Android,使用系统底层所提供的 API 编写运行的第三方应用程序。
      Android 端可以使用 Java、Koltin 语言进行开发,iOS端可以使用 Objective-C、Swift 进行开发。
      想要创建 Native App,开发者必须编写源代码,使用由操作系统开发上提供的工具。

    6. 什么是 Web App ?
      主要依靠浏览器进行访问,其属性决定了可以不需要修改就能直接运行在 Android 、iOS、PC 端。
      虽然看起来跟其他 app 没有什么区别,但其本质是 web 站变种然后打包了一个app壳,可以发布到各个平台上,比如:安卓、iOS、黑莓、win phone 等等。

    7. 什么是 Hybrid App ?
      混合应用是指同时使用前端技术与原生技术开发的App。
      通常由前端负责大部分界面开发和业务逻辑,原生负责封装原生功能供前端调用,二者以 Web-View(负责用来显示和渲染网页)作为媒介建立通信,从而既拥有Web开发的速度优势,又能拥有强大的原生能力。
      现在大部分应用都是采用的 Hybrid 开发模式,如:美团、爱奇艺、微信等。

    8. 什么是 React Native ?
      React Native(简称 RN)是 Facebook 于2015年4月开源的跨平台移动应用开发框架,是 Facebook 早先开源的JS框架React在原生移动应用平台的衍生产物,支持 iOS 和安卓两大平台。
      RN使用JavaScript 语言,类似于 HTML 的 JSX,以及 CSS 来开发移动应用,因此熟悉Web前端开发的技术人员只需很少的学习就可以进入移动应用开发领域。

    9. 什么是移动端 App 测试?
      App测试要通过各种手段和测试工具找出App中的BUG,判断App是否能够满足预期标准。
      移动端由于增加了终端、外设和网络等多项因素,因而测试内容和项目也相应增加了。
      在App开发过程中容易出现缺乏有效沟通,功能复杂、编程错误、需求不断变更、时间压力、缺乏文档的代码、App开发工具、SDK和人员的疏忽等原因引发的错误,通过测试能够发现、找出其中的错误,解决错误,从而提高App的质量。

    10. App 测试要点有哪些?
      包括功能测试、兼容性测试、用户体验测试、安全性测试、安装卸载升级测试、交叉事件测试、UI界面测试、性能测试等等。

    11. App 测试和 Web 测试区别?
      安装、卸载、更新方面:
      Web测试是基于浏览器的所以不必考虑。而App是客户端的,则必须测试安装、更新、卸载。
      兼容性测试方面:
      Web的兼容性主要关注:操作系统,浏览器类型。
      App的兼容性主要关注:不同品牌及型号,操作系统类型及版本,屏幕大小,分辨率。
      性能测试:
      Web客户端关注响应时间,CPU,内存,而App需要关心流量、电量、CPU、内存、FPS。
      App端专项测试:
      交叉时间测试、兼容性测试、电量测试、流量测试、弱网测试、稳定性测试、安全性测试等。

    12. 什么是 adb ?
      adb(Android Debug Bridge),是 Android SDK的一个工具。
      adb 是用来连接安卓手机和PC端的桥梁,可以让用户在电脑端对手机进行全面的操作。
      Android 的初衷是用adb这样的一个工具来协助开发人员在开发android应用的过程中更快更好的调试apk,adb具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行shell命令等功能。

    13. 什么是 Android SDK ?
      Android SDK(Software Development Kit,软件开发工具包)被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。
      它提供了 Android API 库和开发工具构建、测试和调试应用程序。简单来说,Android SDK可以看做用于开发和运行 Android 应用的一个软件。

    14. 什么是 App性能测试?
      用户在使用App会注意到一些情况,比如:这个App使用起来比较耗流量,又或者比较耗电,还有的是在切换一些页面的时候会存在卡顿的现象。
      作为测试人员,必须要提供有效的数据来去衡量 App的性能。
      一般会关注这些指标:CPU、内存、电量、页面响应速度、App启动时间等。

    15. 为什么需要 App 专项测试?
      测试人员在做完功能测试、自动化测试以及性能测试之后,App上线到达用户手中,还是会发现用户有很多问题反馈回来,比如:App崩溃、无响应、兼容性问题、App卡死等等,通过常规的测试方式难以发现问题,所以就引入了App专项测试。
      通常包括:兼容性测试、电量测试、流量测试、弱网测试、稳定性测试、安全测试等等。

    16. 什么是 App兼容性测试?
      兼容性测试是指测试软件在特定的硬件平台上、不同的应用软件之间、不同的操作系统平台上、不同的网络等环境中是否能够很友好的运行的测试。
      目前App碎片化十分严重,尤其是安卓的设备碎片化、品牌碎片化,大家熟知的安卓品牌都有好多家,每家可能还有定制的系统,除此之外还有系统版本碎片化、屏幕碎片化等等,这些都是需要去做兼容性测试来保证App的适配。

    17. 什么是 App 流量测试?
      目前的网络类型包含 2G\3G\4G\wifi,其中还有不同运营商的区分,我们在APP的使用过程中经常遇到大资源,重复请求,调用响应慢,调用失败等各种情况。
      在不同的网络类型之下,我们不仅要控制流量使用,还需要加快请求的响应,通过流量测试我们可以知道产品的流量耗用情况,并且以此指导开发进行资源和速度的优化。

    18. 什么是 App 电量测试?
      所谓的电量测试,是测试移动设备电量消耗快慢的一种测试方法。
      电量测试是通过不同的测试场景,找出APP高耗电的场景并进行优化,从而使APP的耗电量更低,提升用户的使用体验。

    19. 什么是 App 弱网测试?
      目前移动端产品所处的网络并非完全的流畅 WIFI 环境,仍有相当体量的用户主要使用 4G、3G、2G等网络,另外因移动端产品使用场景多变,如地铁、公交、电梯等,使得弱网测试显得尤为重要。
      弱网测试主要考虑到各种场景的客户端展示及容错,能极大提升产品印象和用户体验。

    20. 什么是 App 稳定性测试?
      现在的App长时间在手机系统前台/后台运行,用户对App的长时间使用的稳定性有了更高的要求,测试人员需要通过App稳定性测试来避免长时间运行下App出现的闪退、崩溃、内存泄漏等等问题。
      通常会选用Monkey等工具全自动遍历App。

    21. 什么是 Android App 安全测试?
      Android 系统由于其开源的特性,市场上针对开源代码定制的ROM参差不齐,在系统层面的安全防范和易损性都不一样。
      Android应用市场对App的审核相对 iOS 来说也比较宽松,这也为很多漏洞提供了可乘之机。
      安全测试要点包含如下:安装包安全性、数据安全性、软键盘劫持、账户安全性、通信安全性、备份检查等。

    22. 什么是云测平台?
      云测平台提供了远程租用真机的服务,通常是利用自动化框架来实现真机上的脚本自动化运行,或远程租用真机人工测试,或真人真机测试。
      由于 Android 端设备的种类众多,云测试服务在Android 端应用广泛。
      国内外都提供了多种云测试平台,比如国内有:testin、百度MTC、腾讯优测;国外有:Pefecto、TestDroid等。

    23. 什么是 App 埋点?
      埋点就是在APP中加入一些程序代码,用以收集和统计用户在App中的浏览、访问数据和应用使用情况,分析用户交互行为,从而帮助产品和运营进行后续优化。
      App上线后才能观察到相应的数据进行分析研究。数据埋点可以在自己的后台进行收集和统计,也可以借助第三方数据分析平台。

    24. App测试为什么以Android 为主?
      用户量大;
      Android 碎片化严重;
      iOS 相对于Android更为封闭,并且闭源(Android 是开发源代码的);
      App在Android系统上问题更多。

    25. 什么是 ANR ?
      在Android上,如果应用程序有一段时间响应不够灵敏,系统会向用户显式一个对话框,这个对话框称为应用程序无响应(ANR:Application Not Responding)对话框。
      用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

    26. ANR 异常日志获取?
      如果是第三方数据上报,或者测试人员测试时抓取了日志,我们可以直接查看日志,但如果是我们自己发现或者复现了问题可以用以下方式获取日志:
      1、traces.txt,获取方式: adb pull /data/anr/traces.txt
      2、applogcat-log,获取方式: adb pull /data/log/android_logs
      3、dropbox,获取方式: adb pull /data/system/dropbox

    27. 什么是 Appium ?
      Appium是一个自动化测试开源工具,支持 iOS 平台和 Android平台上的原生应用,web应用和混合应用。
      并且 Appium 是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了 iOS 和 Android 测试套件间代码的复用性。

    28. 什么是 App 上架?
      App开发完成,需要将应用发布到应用商店供用户下载。
      对于Android平台,国外只有 Google play,由于其开放性,导致国内有无数的应用平台,各平台要求不尽相同。而对于 iOS 平台,不管是国内还是国外,只有统一的入口——Apple Store。

    29. 如何打开Android的调试模式?
      各类型号手机存在细微区别,大概路径:打开手机设置->关于手机->连续点击5下版本号->返回上一级->点击开发者选项->打开USB调试模式->弹出框选择确定->认证框勾选->一律使用这台计算机进行调试(必勾选)。

    更多相关内容
  • 最近在项目中,测试了APP通过蓝牙与外设硬件连接的功能,整理了一些相关的开发、实现和测试方法,在这里与大家分享。 蓝牙基础知识‍ 1. iOS台下蓝牙开发可以使用 MFI(ExternalAccessory 框架) 或...

    目前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,它们是一组相对概念。比如,当手机去连接控制蓝牙耳机时,你的手机就是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.    中心模式

    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)

    蓝牙连接的开发实现‍

            这里以手机端作为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

           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];

          

           //连接外设

    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与蓝牙设备的交互是否满足需求;

    (本文只讨论蓝牙设备连接部分和具体数据传输部分的用例,大家可以扩展一下。)

    展开全文
  • 原标题:iOS App 连接外设的几种方式原创作者: Max_Marry文章地址: http://www.jianshu.com/p/852bf92c5c92随着近年来车联网和物联网的兴起,智能... iOS App 连接外设的常用方式可以分为三大类:网络端口建立 Socke...

    原标题:iOS App 连接外设的几种方式

    原创作者: Max_Marry

    文章地址: http://www.jianshu.com/p/852bf92c5c92

    随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App 被用来跟硬件设备进行来连接,获取硬件相关信息用以展示或者发送指令控制硬件来提供服务。

    iOS App 连接外设的常用方式可以分为三大类:

    网络端口

    建立 Socket 使用 TCP/IP 协议族进行通信,天然支持多通道,想要几个通道就建几个 Socket 就可以。它主要有三种方式,

    Wi-Fi 连接

    优点:

    简单,不需要集成 MFi 芯片

    只要对应的硬件有无线网卡,然后将手机和硬件连接到同一个局域网中就可以使用 Socket 通过网络协议通信

    缺点:

    无线连接信号容易受到干扰,不太稳定,容易断开

    如果硬件使用的场合没有公共 Wi-Fi,就需要手机自建热点共享,硬件进行热点接入,操作步骤较多,对用户来说学习使用成本较高,并且热点共享要求手机本身的数据移动网络是稳定的,在没有移动数据网络信号的地方,热点无法建立。USB 热点共享

    这个其实跟 Wi-Fi 中的热点共享非常类似,也不需要集成 MFi 芯片。

    优点:

    USB 热点共享,走的是有线,不容易受到干扰,更稳定,

    iPhone 可以边使用可以边充电

    缺点:

    操作步骤比较复杂,需要先打开个人热点共享NCM

    就是把 USB 端口虚拟成标准的网络端口,然后手机和外设就能通过有线网络直连了,可以理解成手机和外设通过一跟网线连起来了,然后就可以用 Socket 通过 TCP,UDP 进行通信了。

    优点:

    有线连接,非常稳定,带宽足够

    不依赖移动网络信号

    缺点:

    需要集成 MFi 芯片并进行 MFi 认证,有一定门槛

    除了 CarPlay,其他跟 iPhone 连接的外设都不能使用 NCM 的方式跟 iPhone 上的 App 进行连接和通信EAP

    EAP 全拼是 External Accessory Protocol,即外部设备协议。这个是苹果推荐使用的外设连接方式。需要外设集成 MFi 芯片进行 MFi 认证。手机端开发相对简单,只要集成 iOS 系统提供的一个框架 ExternalAccessory.framework,并且在 info.plist 中配置好协议字符串 (Supported external accessory protocols),当 iOS 设备通过 USB 或者蓝牙连接到对应硬件时,iOS 系统会把符合 MFi 认证要求的外设抽象成了一个流对象,App 通过指定的协议字符串来创建一个 EASession 类的实例来访问到该流对象,就能通过 NSInputStream 和 NSOutputStream 跟硬件件进行通信了。

    EASession 模式:它的带宽相对较低,但是允许同时通过多个协议字符串创建多个会话,也就是说直接支持多通道

    Native Transport 模式:它的带宽足够大,理论值是 100MB 以上,但是不支持多通道,如果业务层需要支持多数据通道的话需要 App 自己进行通道的复用与拆分,并且 Native Transport 需要 iPhone 工作在 USB Host 模式,硬件需要支持 USB 模式切换

    关于如何使用 EAP 跟外部设备进行通信,可以参考进行入门和学习。

    BLE

    BLE 即低功耗蓝牙,是 iOS7.0 以后才支持的连接方式。

    优点:不需要集成 MFi 芯片做认证,功耗低,手机端开发也相对简单,集成 iOS 系统提供的 CoreBluetooth.framework 即可

    缺点:带宽很低,一般适合于只需要传输少量数据的场景。比如各种智能硬件,像智能水杯,智能体重计,运动手环等,都是采用这种连接方式

    总结一下,图中带 MFi 字样的表示该连接方式需要硬件集成 MFi 芯片,做 MFi 认证。关于苹果的 MFi 认证,对 iOS 开发中来说其实是一个比较陌生并且繁琐的 Topic,原因如下:

    网上鲜有资料,Google 基本上查不到。 因为 MFi 认证是由硬件生产商主导进行的,苹果首先对硬件生产商的实力 (质量,信誉,生产规模) 有很苛刻的要求,满足要求的才有进行 MFi 认证的资格。满足 MFi 认证资格要求的硬件生产商,提交了 MFi 产品计划后才能得到苹果 MFi 开发的官方文档,这个文档是带水印的,不允许外泄

    MFi认证周期很长,过程也很复杂

    苹果官方沟通渠道很窄,电话打不通,邮件回复不及时关于 MFi 申请的一些事情

    什么是 MFi 认证?

    苹果 MFi 认证,是苹果公司(Apple Inc.)对其授权配件厂商生产的外置配件的一种标识使用许可,是 Apple 公司 “Made for iOS” 的英文缩写。

    为什么要做 MFi 认证?

    从苹果角度来看,为了更好的巩固苹果的生态圈,只有集成了有

    MFi 芯片,才能跟 iPhone、iPod,iPad 进行连接通信。而只有经过了 MFi 认证的企业才能批量购买 MFi 芯片,并且都 MFi 芯片的供销链条都有很严格的监督管理,所以这样苹果可以严格控制只有那些满足苹果规范和要求的外设才能加入到苹果生态圈。

    从生产厂商来看,经过苹果官方授权,配件产品能完美兼容苹果智能设备。提交 MFi 认证过程中,硬件设备需要经过苹果要求的

    ATS 自测以及苹果的严格测试,产品质量更有保证。消费者也更加信任经过了 MFi 认证授权的配件;最后成功获得 MFi 授权这也成为技术与质量实力的一种标志,因为 MFi 认证通过率仅 2%,其中大部分企业因为申请资格不符合直接被拒绝。

    从 iOS 开发人员来看,MFi 认证是由硬件生产商主导进行申请的,是苹果对外设配件的一种认证和授权。但是很多外设跟苹果进行连接,并不只是跟 iOS 设备硬件或者 iOS 系统配合就可以完成对应的功能 (比如充电、CarPlay、播放 iPod 音乐 (A2DP)、接听蓝牙电话 (HPF) 或者提供 GPS 输入源等)。很多时候为了实现特定的需求,需要由 iOS App 的配合,由 iOS App 跟对应外设进行连接和通信,传输相关的控制命令对外设进行控制,或者传输相关的外设数据进行展示。iOS App 跟外设的连接方式有网络、EAP 和 BLE,其中 EAP 是苹果官方推荐的跟外设连接的方式。只有经过 MFi 认证的外设才能使用 EAP 跟 App 进行通信。如何做 MFi 认证?

    MFi 认证的流程比较复杂,可以归纳总结为三个部分,如下图所示。

    其中黄色背景标注的部分是可能跟 iOS App 开发者相关的。

    一、申请人提交申请资料

    首先,收集公司资料信息,这些资料主要包括了认证负责人联系信息,企业情况介绍,公司组织架构、企业网站,物料品质控制以及 ISO 体系证书等资料。然后是在苹果 MFi 官网()上进行注册,并提交第一步收集到的公司资料,进行账号申请。

    接下来苹果会进行 MFi 体系审核。这个是非常关键的一个步骤。 主要考察公司对 MFi 芯片的管理体系,看公司是否有规范的流程和系统来管理 MFi 芯片,能有效防止转售芯片或者挪用芯片 (把芯片用到未通过 MFi 认知的项目上),苹果会安排专人或者代理公司来抽查。

    如果 MFi 体系审核过了,苹果还会对公司其他情况进行考察,来评估该公司是否满足 MFi 会员的资格。审核的标准主要看公司相关资质,是否有较大的生产规模;是否拥有自主品牌;品牌在业内是否有较高的地位 (主要表现为各类荣誉);是否曾为其他国际知名企业供货;研发人员是否达到苹果要求的人数等,申请者一定保证申报资料的真实性,苹果公司都会一一核实。

    如果这些条件都满足,恭喜你公司成为了 MFi 会员,能够有资格购买样品芯片,并且拿到苹果提供的 MFi 官方开发文档,该文档的每一页都是带有申请人姓名水印的,禁止对外公开,如果被发现,有可能会被取消 MFi 会员资格。据说大部分的企业都会被卡在会员资格审核这一步。

    二、提交产品计划,研发和自测

    如果你的公司是属于那幸运的那一小部分通过了 MFi 会员资格审核,拿到了苹果的 MFi 研发官方文档,也购买了 MFi 样品芯片,那么就可以提交产品计划,进行产品研发和自测了。

    提交产品计划是非常关键的一步,需要根据要研发的公司产品的形态、所用技术方案和需要支持的 iOS 设备、iOS 的相关信息都进行详细的描述,其中比较重要信息有。

    (1) 附件概览 (Accessory Overview)

    技术方案 (Technology) 如果你是做支持 CapPlay 的车机,那么就选择 CarPlay,否则都应该选择 iAP;如果你的硬件需要跟 iPhone 连接,并且处理相关业务,而不仅仅是充电线或者数据线,那么在 Components 里应该选择 Authentication coprocessor。

    (2) 固件和硬件 (Firmware & Hardware)

    现在所有的 MFi 认证的硬件都需要支持 iAP2 协议,所以必须要选

    iAP2 或者同时支持 iAP2 和 iAP1。然后外设硬件跟苹果设备是如何通信的,是使用 USB 的 Host 模式,还 USB 的 Devices 模式,还是串口或者蓝牙,这个需要根据产品的需求、特性进行选择。

    (3) 选择硬件所支持的 iAP2 的特性

    (4) 选择所支持的苹果设备型号

    根据产品的设计选择所需要支持的苹果设备型号,包括 iPad,iPhone 和 iPod 的各种型号。

    (5) App 相关的信息

    这部分也是 iOS 开发者需要重点关注的部分,包括 App 的版本号,BundleID 和协议字符串以及 iOS App 的主要功能特性描述,这部分信息需要跟最后送 MFi 审核时附带的 App 测试包的信息保持一致。提交了产品计划之后,就可以拿到 PPID (Product Plan ID)。这个 PPID 也是跟 iOS App 开发者需要关注的。当 App 开发完成,提交 AppStore 上线时,需要在版本审核备注信息里带上这个 PPID,否则审核是过不了的。

    接下来就可以进行产品研发了。主要是硬件生成商需要根据苹果提供的开发文档进行硬件和驱动认证程序的开发。而 iOS App 开发者则主要是需要成 iOS 系统提供的一个系统框架 ExternalAccessory.framework,并且在 info.plist 中配置好协议字符串 (Supported external accessory protocols)。当 iOS 设备通过

    USB 线或者蓝牙连接到对应硬件时,iOS 系统会把符合 MFi 认证要求的外设抽象成了一个流对象,App 通过指定的协议字符串来创建一个 EASession 类的实例来访问到该流对象,就能通过

    NSInputStream 和 NSOutputStream 跟硬件件进行通信了。这部分功能实现可以参考苹果官方的 进行入门和学习。

    产品研发完成后需要进行 ATS (Accessory Test System) 自测,并提供自测报告。ATS 自测苹果会提供 ATS Box 的测试工具和软件,主要是针对硬件进行电气特性相关的测试,包括各个节点的电压电流值是否满足苹果要求,然后传输带宽是否稳定,是否达到苹果要求等等。

    自测完成之后就可以把硬件和所配套的软件 (iOS App 的 ipa 安装包) 送到苹果指定的测试实验室进行认证测试。iOS 开发者在这个步骤需要关注的是如何打包 ipa 包。因为如果直接用开发证书打包,那么苹果测试人员的 iPhone 不在你开发证书的设备列表中,是无法安装的。如果用企业证书打包的话,可能 AppStore 发布证书对应的 BundleID 跟企业证书的 BundleID 不一致,所以也不可行。所以推荐的做法是,等到产品研发完成和自测之后,就带上产品计划中拿到的 PPID,提交 AppStore 进行审核。等审核通过之后,就可以直接从 AppStore 下载对应的 ipa 安装包,配合硬件一起送 MFi 认证测试了。

    三、测试审核和批量生产

    这个阶段也是硬件生产商主导进行的,跟 iOS App 开发者关系不大。当硬件的 MFi 认证送审通过之后,还需要对产品的包装也提交认证和审核。审核通过之后,就可以获得苹果授权进行 MFi 芯片的批量购买,然后根据销售计划进行硬件的批量生产和销售了。

    整个 MFi 认证的周期大概需要3个月到半年的时间,并且每次提交认证测试都需要支付一笔600美金的测试费用,所寄去测试的硬件测试样品苹果也是不会寄回来的。

    iOS 外设连接黑科技,不需要 MFi 认证,实现 USB 连接

    USBMuxd,利用这种连接方式不需要做 MFi 认证,支持 iPhone 上的 App 跟外设通过进行通信,非常方便。

    基本原理

    iPhone 的 iOS 系统中自带了 USBMuxd 服务,该服务能够实现

    USB-TCP 协议的转换,能够把 USB 的端口映射到本机 (localhost) 的 TCP 端 (基于 Unix Domain Socket )。只需要在外设端也实现一个 USBMuxd 服务,并指定端口映射关系, 那

    iPhone 的 App 和外设上的应用就可以使用 Socket 进行 TCP 进行通信了。

    一个开源实例

    开源项目 是一个完整的使用 USBMuxd 方式实现 iPhone App 跟 Mac App 进行 TCP 通信的例子。因为 Mac OS 系统中天生就自带了 USBMuxd 服务,所以 peertalk 的 Mac 端程序是比较简单的。外设一般都不会是 Mac 系统,而是 Android 或者 Linux 系统,那怎么办呢?那就自己在系统中集成 USBMuxd 服务,这里可以利用到 实现在外设上集成 USBMuxd 服务。

    MFi iOS App 端开发步骤

    与附件设备通讯的 App 需设备支持的协议,这些协议由设备制造商维护,可是自定义或标准协议,标准协议可与其他设备通信,iOS不负责这些协议的维护。

    为防止命名空间冲突,推荐使用反 DNS 形式命名协议,如

    com.apple.myProtocol、com.dji.video、com.dji.protocol、com.dji.common。

    1、编程步骤 1.1、引入框架与头文件

    外部附件框架 (ExternalAccessory.framework) 为 App 与附件设备通信提供了桥梁。因此,在 Xcode 项目中,需要为每个与附件设备通信相关的项目添加 ExternalAccessory.framework。

    下一步是引入头文件 #import 。

    1.2、声明App支持的协议

    不声明协议直接调用EA框架的类会崩溃。

    使用 UISupportedExternalAccessoryProtocols 键在 Info.plist 中声明支持的协议,值为数组,数组的元素为支持的协议,元素的顺序任意且不限数量。这些值只用于判断 App 与附件设备的通信能力。当App与设备通信时,具体通信协议由我们编程决定。

    当附件设备插入 iOS 设备时,系统才知道 App 可被新插入的设备启动。若当前已安装的 App 都没注册协议,则系统可能到 App Store 去搜索支持新设备声明的协议的 App。

    UISupportedExternalAccessoryProtocols 对应的值虽说可参考,实际此链接并没给出有帮助的信息,《MFi Accessory Interface Specification for Apple Devices》也没给出所谓标准协议的字符串值。

    1.3、开始通信

    创建 EASession。此对象管理与附件设备交互的情况,它与底层系统工作,在设备上来回传输数据。一旦会话建立,数据通过

    NSInputStream 和 NSOutputStream 的实例在 App 中传输。收发的数据包的格式由与附件设备通信的协议决定。

    接收数据。使用自定义委托对象,监视 NSInputStream 实例可从附件设备接收数据。

    发送数据。向 NSOutputStream 写入数据包即可发送至附件设备。1.4、一个读取外接设备的示例

    Info.plist 中加入 Supported external accessory protocols,值为 com.apple.p1。这个只是令系统认为我们的应用有能力与外接设备沟通,这里使用 Lightning USB Camera Adapter 测试。

    读取外接设备信息代码:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSMutableString *info = [[NSMutableString alloc] initWithCapacity:1024];

    EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];

    NSArray *accessArr = [manager connectedAccessories];

    for (EAAccessory *access in accessArr) {

    for (NSString *proStr in access.protocolStrings) {

    [info appendFormat:@"protocolString = %@n", proStr];

    }

    [info appendFormat:@"n"];

    [info appendFormat:@"manufacturer = %@n", access.manufacturer];

    [info appendFormat:@"name = %@n", access.name];

    [info appendFormat:@"modelNumber = %@n", access.modelNumber];

    [info appendFormat:@"serialNumber = %@n", access.serialNumber];

    [info appendFormat:@"firmwareRevision = %@n", access.firmwareRevision];

    [info appendFormat:@"hardwareRevision = %@n", access.hardwareRevision];

    [info appendFormat:@"dockType = %@n", access.dockType];

    }

    dispatch_async(dispatch_get_main_queue(), ^{

    label.text = info;

    });

    });

    运行结果为:

    manufacturer = Apple

    name = Apple USB Camera Adapter

    modelNumber = A1440

    serialNumber =

    firmwareRevision = 1.0.0

    hardwareRevision = 1.0.0

    dockType = (null)

    1.5、与外接设备交互数据的示例

    如下代码展示与 DXO One 相机通信。

    在非 UI 线程中打开设备,否则可能导致程序崩溃。

    EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];

    NSArray *accessArr = [manager connectedAccessories];

    if (accessArr.first) {

    EASession *session = [[EASession alloc] initWithAccessory:accessArr.firstObject forProtocol:@"com.dxo.one.protocol"];

    if (!session) return;

    NSInputStream *inputStream = [session inputStream];

    if (!inputStream) {

    // LOG inputStream = null

    }

    inputStream.delegate = self;

    [inputStream open];

    }

    实现 NSStreamDelegate 协议

    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {

    // LOG stream & event code

    switch (eventCode) {

    case NSStreamEventNone:

    break;

    case NSStreamEventOpenCompleted:

    // 开始读取

    break;

    case NSStreamEventHasBytesAvailable:

    // 获取可读数据大小,读取流才有效。

    break;

    case NSStreamEventHasSpaceAvailable:

    // 获取可写空间大小,写入流才有效。

    break;

    case NSStreamEventErrorOccurred:

    // 出错处理

    break;

    case NSStreamEventEndEncountered:

    // 读取结束

    break;

    }

    }

    2、ExternalAccessory框架

    1、EAAccessory

    提供一个已连接的设备的信息,如制造商,固件版本等。

    2、EAAccessoryManager

    协调MFi设备与iOS设备之间的工作。

    3、EASession

    用来创建 App 与附件设备之间的通信通道。

    4、EAWiFiUnconfiguredAccessory

    提供未配置的 MFi Wireless Accessory Configuration 设备的信息给 App。

    5、EAWiFiUnconfiguredAccessoryBrowser

    让 App 访问 MFi Wireless Accessory Configuration 进程。

    3、开发技巧

    Lightning 接了设备则不能连接计算机,所以直观的做法是,将日志用 UITextView 显示出来。写成日志就得每次都拔掉设备,插上电脑,如此反复。

    另一个办法是,通过蓝牙测试传输协议,手机连接电脑,可单步调试。验证完再用 Lightning 连接设备联调。

    因本人目前在做关于 iOS App 连接外设方面的工作,因此搜集查找相关信息,文章中信息出自于以下简友:、,在此对两位的分享表示感谢。

    1218+人转发iOS朋友圈

    有意思啊

    责任编辑:

    展开全文
  • NuMaker Uni亦支持第三方开发软件工具,如:Keil RVMDK、IAR EWARM等。 主控板:NuMaker Uni 采用新唐 Cortex:registered:-M0 NANO100NE3BN 单片机为核心,主频率达42 MHz,支持3.7V 锂电池或5V电源输入以及ADC、PWM、...
  • 外设外设 参考答案【C】 3.CPU访问存储器时,被访问数据一般聚集在一个较小的连续存储区域中。若一个存储单元已被访问,则其邻近的存储单元有可能还要被访问,该特性被称为(3) A.数据局部性 B.指令局部性 ...
  • 一、需求 为了降低stm32单片机在非工作状态下的功耗,需要实现通过手机端软件,tong'g 二、硬件电路 三、软件 四、实现效果

    一、需求

         为了降低stm32单片机在非工作状态下的功耗,需要实现通过手机端软件,通过蓝牙通讯的方式,发送待机指令,实现stm32单片机进入待机模式、蓝牙通讯模块实现低功耗运行。上述功能的手机端软件类似于遥控器的功能,能够遥控stm32单片机电路进入开机或待机状态下。

    二、硬件电路

    1、蓝牙模块

    蓝牙模块采用周立功ZLG52810P0-1-TC,蓝牙模块的典型应用电路如下图所示:

    蓝牙低功耗模式查询与设置指令说明,如下图:

    蓝牙模块17管脚P0.20的说明如下图:
     
     
           ZLG52810P0-1-TC 主要工作在透传模式下,也能配置标准 iBeacon 功能,或者发送自定
    义广播数据。 默认出厂情况下,模块启动后会自动进行广播,使用 BLE 主机对其进行扫描连接,连 接成功之后就可以通过 BLE 在模块和 BLE 主机之间进行数据透传。用户也可以通过特定的
    串口 AT 指令,对某些通讯参数进行修改(例如:串口波特率、广播间隔等)。
           蓝牙模块有透传模式和 自定义广播包/iBeacon 模式等,在自定义广播包/iBeacon 模式下用户可以通过 AT 指令配置广播包自定义数据,模块会根据用户设置的自定义数据进行广播。

    2、STM32103CBT6TR电路

     
    单片机STM32103CBT6TR的管脚与蓝牙模块的连接如下:
    1)PA9-------USART1_TX
    2)PA10------USART1_RX
    3)  PA0--------P0.20
    4)  PA2--------BL_RST
    采用PA0口做一键唤醒用,PA0即WKUP引脚的上升沿,可以使MCU退出待机模式。
     
    总体实现思路:
    1)需要省电待机时:手机APP软件发送待机命令给MCU,MCU接收到后再发送低功耗设置的AT命令给蓝牙模块,蓝牙模块进入低功耗模式下,此时P0.20引脚由高电平变为低电平,设置PA0为下降沿外部中断,中断服务程序中执行程序,使得MCU进入待机模式;注意:因为正常情况下,蓝牙模块处于透传模式,手机APP软件直接发送AT命令,蓝牙模块不会执行,只能透传到MCU接收变量的数据区内。
    2)需要唤醒工作时:利用上述设置的低功耗模式1,手机APP软件发送任意数据,蓝牙模块接收到BLE数据可被唤醒,从而P0.20引脚由低电平变为高电平,此时PA0引脚的上升沿实现MCU退出待机模式,进入正常工作状态。
     

    三、软件

    1)MCU中蓝牙接收待机命令后的处理程序:

    	if((Modbus_HoldReg[33]&0x00FF)==0x08)
    	{
        
          //透传回复数据
    	  USART_TX_BUFF[0]=USART_RX_BUFF[0];
    	  USART_TX_BUFF[1]=USART_RX_BUFF[1];
    	  USART_TX_BUFF[2]=USART_RX_BUFF[2];
    	  USART_TX_BUFF[3]=USART_RX_BUFF[3];
    	  USART_TX_BUFF[4]=USART_RX_BUFF[4];
    	  USART_TX_BUFF[5]=USART_RX_BUFF[5];
    	  calCRC=CRC_Compute(USART_TX_BUFF,6);
    	  USART_TX_BUFF[7]=calCRC&0xFF;
    	  USART_TX_BUFF[6]=(calCRC>>8)&0xFF;
    	  Slave_SendData(USART_TX_BUFF,8);
           delay_ms(300);
    	//AT+LOWL:1 (41 54 2B 4C 4F 57 4C 3A 31)
    	  USART_TX_BUFF[0]=0x41;
    	  USART_TX_BUFF[1]=0x54;
    	  USART_TX_BUFF[2]=0x2B;	
    	  USART_TX_BUFF[3]=0x4C;
    	  USART_TX_BUFF[4]=0x4F;
    	  USART_TX_BUFF[5]=0x57;	
    	  USART_TX_BUFF[6]=0x4C;	
    	  USART_TX_BUFF[7]=0x3A;	
    	  USART_TX_BUFF[8]=0x31;	
    	  Slave_SendData(USART_TX_BUFF,9);
    	}

    上述程序中 "Slave_SendData(USART_TX_BUFF,8)"主要做接收待机命令后,利用透传模式还未失效,返回原数据,用于手机端APP判断指令发送成功与否;

    "Slave_SendData(USART_TX_BUFF,9)"用于MCU发送"AT+LOW:1"指令到蓝牙模块上,注意:要将该指令字符串转为ASCII码,数组变量下的多字节发送。

    2)唤醒初始化及PA0中断服务程序

    //PA0 WKUP唤醒初始化
    void WKUP_Init(void)
    {	
      GPIO_InitTypeDef  GPIO_InitStructure;  		  
    	NVIC_InitTypeDef NVIC_InitStructure;
    	EXTI_InitTypeDef EXTI_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能 
     GPIOA和复用功能时钟
    
    	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;	 //PA.0
    	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//下拉输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure);	//初始化IO
        //使用外部中断方式
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);	//中断线0连接GPIOA.0
    
        EXTI_InitStructure.EXTI_Line = EXTI_Line0;	//设置信号所有的外部线路
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//设外外部中断模式:EXTI线路为中断请求
    	 //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //下降沿触发
     	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure);	// 初始化外部中断
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能信号所在的外部中断通道
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5; //先占优先级2级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5; //从优先级2级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
    	NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    
    	
    }
    
    
    
    
    void Sys_Standby(void)
    {  
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	//使能PWR外设时钟
    	PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能
    	PWR_EnterSTANDBYMode();	  //进入待命(STANDBY)模式 		 
    }
    //系统进入待机模式
    void Sys_Enter_Standby(void)
    {			 
    	RCC_APB2PeriphResetCmd(0X01FC,DISABLE);	//复位所有IO口
    	Sys_Standby();
    }
    //检测WKUP脚的信号
    //返回值1:低电平连续3s以上
    //      0:错误的触发	
    u8 Check_WKUP(void) 
    {
    	u8 t=0;	//记录低电平的时间
    	LED0=0; //亮灯DS0 
    	while(1)
    	{
    		if(WKUP_KD==0)  
    		{
    			t++;			//处于低电平
    			delay_ms(30);
    			if(t>=100)		//低电平超过3秒钟
    			{
    				LED0=0;	 	//点亮DS0 
    				return 1; 	//按下3s以上了
    			}
    		}else 
    		{ 
    			LED0=1;
    			return 0; //低电平不足3s
    		}
    	}
    } 
    
    
    //中断,检测到PA0脚的一个下升沿.	  
    //中断线0线上的中断检测
    void EXTI0_IRQHandler(void)
    { 		    		    				     		    
    	EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE0上的中断标志位		  
    	if(Check_WKUP())//待机?
    	{		  
    		Sys_Enter_Standby();  
    	}
    } 
    

    需要注意的是:PA0需要设置为下拉输入方式;PA0作为外部中断需要设置成下降沿触发,相应的中断服务程序里面WKUP_KD等于0时,即低电平时执行待机程序。

    四、实现效果

    待机前:电路板电流42mA左右,待机后,电路板电流8mA左右,实现了功耗电流的降低,并且手机端软件遥控实现一键待机,一键唤醒开机。

    展开全文
  • android蓝牙app连接外设时崩溃问题

    千次阅读 2018-09-18 13:57:15
    连接蓝牙设备的app在连接时,如遇到蓝牙设备的信号名称错误或蓝牙设备关闭时,app有一定概率出现程序闪退; 经查证原因出现在接收蓝牙信号的广播的地方,原代码如下: public BroadcastReceiver mReceiver = new ...
  • 32/WinXP-64/Vista-32/Vista-64/Win7-32/Win7-64/Win8-32/Win8-64(2013年6月28日发布) 日前,著名外设厂商Razer雷蛇发布了一款可以模拟7.1环绕音效的音频软件——Razer Surround。而且,Razer Surround现在是限时...
  • 中国青年APP大赛 https://baike.baidu.com/item/%E7%AC%AC%E4%B8%89%E5%B1%8A%E4%B8%AD%E5%9B%BD%E9%9D%92%E5%B9%B4APP%E5%A4%A7%E8%B5%9B/22101278?fr=aladdin 中国(天津)工业app创新应用大赛 2019年:...
  • 软件测试理论和APP测试案例

    万次阅读 多人点赞 2017-02-17 12:45:17
    1、软件测试流程和软件测试方法 软件工程模型基本就是业务建模-〉系统分析-〉概要设计-〉详细设计-〉编码-〉测试-〉部署。其中测试过程按4个步骤进行,即单元测试、集成测试、系统及发版测试和回归测试。  (1)、...
  • 谈谈工业App (1)

    千次阅读 2019-03-10 22:16:54
    本人虽然自喻为资深软件工程师,还是感觉孤陋寡闻,看不明白所谓“工业App”到是什么?使用英文 “Industry Apps” 谷歌一番,好像也搜不出什么像样的文章。估计“工业App”不是舶来品,而是中国...
  • Arduino应用开发——手机APP控制LED

    千次阅读 2022-04-13 10:39:34
    物联网是最近几年比较火的一个话题,什么是物联网? 简单的来说就是通过有线和...特别说明:通过网络远程控制LED的方式有很多,本文介绍的这种方式是基于blinker的服务器和APP实现的。ESP8266软件基于Arduino平台实现。
  • otg键盘和鼠标映射软件v5.2.0 Android版

    万次阅读 2021-06-06 08:41:55
    otg键盘和鼠标映射软件是一款游戏映射软件,可以使用键盘和鼠标通过otg功能控制手机。它为游戏爱好者提供了一个喜爱游戏的平台,使游戏更易于控制和感兴趣的玩家。何不来IT毛朴下载并尝试!Android手机OTG映射软件...
  • 首先去网页搜联想智能引擎,下载联想智能引擎这个软件。 其次您可以点击相应选项,设置键盘背光显示方式。或通过Fn+空格键快速切换。 当您选择自动背光显示方式时,系统会根据环境光线自动为您调整键盘背光亮度。
  • 第一步:打开MM/纵行地图/SuperGo软件的下载网站 www.tngps.com(用Safari浏览器进行操作),在APPstore下载并安装“TestFlight”软件,安装以 后就不用管这个软件了 第二步:下载完“TestFlight”后,返回刚才的...
  • 安卓使用usb连接外设

    2021-07-16 16:44:26
    #### 软件架构 Android Studio 4.1.2 #### 使用说明 1. 权限 在main添加 <uses-feature android:name="android.hardware.usb.host" android:required="true" /> 2. 判断是否支持usb.host(比如chromeOS...
  • stm32 IAP软件更新方法

    2018-12-03 15:18:45
    IAP,全称是“In-Application Programming...STM32微控制器带有可编程的内置闪存,同时STM32拥有在数量上和种类上都非常丰富的外设通信接口,因此在STM32上实现IAP技术是完全可行的。上传代码中包含IAP和APP两个程序。
  • Android APP安全测试

    2021-12-03 15:21:28
    1、Android APP安全分析风险 1.1安全威胁分析 安全威胁从三个不同环节进行划分,主要分为客户端威胁、数据传输端威胁和服务端的威胁。 1.2面临的主要风险 客户端 数据传输 服务端 反编译 防二次打包 组件导出 ...
  • APP:0x8010000 0x70000 flash IAP: 定时跳转 if(IAP_JUMP_APP_Count > 30) { IAP_JUMP_APP_Count = 0; iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码 } APP: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x...
  • 2. App测试类型

    2021-05-02 21:52:40
    情景:当用户正在操作一个App时,闹铃响了,这里的闹铃显然比该App相关操作的事件级别更高,因为及时在关机时,闹铃也会照样响,在不主动干预的情况下,这个事件是不可阻止的。同理,我们也可以把其他App定期产生的...
  • 使得ipad或者iPhone成为PC显示器的神器,PC版本必备配套软件,小众软件,有ipad或者闲置iPhone的可以在App Store了解一下这个软件“duet”。 之所以上传是因为搜到除了官网以外的版本不仅都不是最新版,还动不动文件...
  • AndroidAPP如何在Android平台上架?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!AndroidAPP如何在Android平台上架?在Android应用商店上传APP,简单...
  • 优点:设备即插即用,可修改iPhone,iPad系统位置,目前手上的iPad NEW/MAX都能,还没有发现哪个软件改不动,其中路径规划这个功能好像对读大学的同学挺有用,需要跑步?好像是,嘿嘿嘿 下边这个
  • 手机APP物联网远程控制开关

    万次阅读 2020-09-10 21:17:29
    2 系统总体方案设计 2.1 技术指标 本次毕业设计的主要任务是通过设计软硬件以及相应手机app程序、上位机软件和网页实现一款物联网远程终端控制开关系统,针对较长距离和工业现场环境恶劣,增加远程数据采集和通信的...
  • //将P0_2和P0_3端口设置成外设功能 U0BAUD = 216; //32MHz的系统时钟产生115200BPS的波特率 U0GCR&=~(0x1F);//清空波特率指数 U0GCR|=11; //32MHz的系统时钟产生115200BPS的波特率 U0UCR |= 0x80; //禁止流控,8位...
  • 软件测试面试题集(含答案)

    万次阅读 2021-01-28 22:52:41
    软件测试面试题集 一、Bug基本要素 缺陷ID,状态,类型,所属项目,所属模块,缺陷提交时间,缺陷提交人(检测者),严重程度,优先级别,缺陷描述信息,测试步骤,测试前置条件,测试数据,期望结果,实际结果。 注...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,068
精华内容 2,427
关键字:

外设app软件