精华内容
下载资源
问答
  • 2018-04-27 13:49:45
    更多相关内容
  • 智能外设 APP 云平台:移动医疗的一种新方案.pdf
  • iOS APP外设连接的学习研究

    千次阅读 2018-06-11 14:31:17
    iOS APP外设连接的学习研究一、iOS连接外设的几种方式iOS App连接外设的常用方式,可以分为三大类:通过网络端口,建立Socket使用TCP/IP协议进行通信,它主要有三种方式:wi-fi连接 优点是:简单,不需要集成MFi...

    iOS APP跟外设连接的学习研究

    一、iOS连接外设的几种方式

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

    • 通过网络端口,建立Socket使用TCP/IP协议进行通信,它主要有三种方式:

      1. wi-fi连接 优点是:简单,不需要集成MFi芯片。缺点:信号容易受到干扰,不太稳定,容易断开;如果硬件使用的场合没有公共wifi,就需要手机自建热点共享,硬件进行热点接入,操作步骤较多。
      2. USB热点共享 和WiFi连接类似,也不需要集成MFI芯片,区别就是USB线共享热点,走的是有线,不容易受到干扰,更稳定。
      3. NCM,就是把USB端口虚拟成标准的网络端口,然后手机和外设就能通过有线网络直连了。优点是:有线连接,非常稳定,带宽足够;也不依赖移动网络信号;但是它的缺点就是:需要集成MFI芯片并进行MFI认证

      关于如何使用Socket进行TCP、UDP连接,推荐github上的开源项目CocoaAsyncSocket https://github.com/robbiehanson/CocoaAsyncSocket

    • iOS App连接外部硬件的第二大类是EAP,全拼是External Accessory Protocol ,外部设备协议。这个是苹果推荐使用的外设连接方式。需要外设集成MFI芯片进行MFI认证。

    • 第三大类就是BLE,低功耗蓝牙,是iOS7.0以后才支持的连接方式。它的优点是不需要集成MFI芯片做认证,功耗低。缺点是:带宽很低,一般适合于只需要传输少量数据的场景。

    二、ExternalAccessory框架

    ExternalAccessory框架,就是可以用来和Lightning接口的硬件,或者蓝牙(2.1)设备进行连接、通讯的这么一个框架。该框架的主要功能,就是提供一个管道,让外围设备可以和基于iOS系统的设备进行通讯。

    1.下面是ExternalAccessory框架中主要类的介绍:

    • EAAccessory:表示你连接的设备。
    • EAAccessoryManager:有一个重要的属性connectedAccessories,用来获取已经连接上手机的设备。
    • EASession:这个类主要用来建立通道,让App和设备可以进行数据的传输(发送和接收)
    • EAWiFiUnconfiguredAccessory: 提供未配置的MFI Wireless Accessory Configuration设备的信息给App。
    • EAWiFiUnconfiguredAccessoryBrowser: 让App访问MFi Wireless Accessory Configuration进程。
    2.设备的连接
    设备的连接、断开,都是系统自动完成的。EAAccessoryManager类中有一个属性connectedAccessories(一个array),里面就已经包含了所有已经连接的外围设备(EAAccessory对象)。比如设备名称、制造厂商、硬件型号、固件型号等等信息,都可以在EAAccessory对象中拿得到。
    1.1 监听设备的断开和链接状态 — 注册通知
    调用EAAccessoryManager的方法registerForLocalNotifications。
    // 注册通告
    [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];
    
    // 监听EAAccessoryDidConnectNotification通告(有硬件连接就会回调Block)
    [[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidConnectNotification
                                                  object:nil
                                                   queue:nil
                                              usingBlock:^(NSNotification * _Nonnull note) {
    
                                                  // 从已经连接的外设中查找我们的设备(根据协议名称来查找)
    
    }];
    
    [[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidDisconnectNotification
                                                  object:nil
                                                   queue:nil
                                              usingBlock:^(NSNotification * _Nonnull note) {
                                                  // Do something what you want
    }];


    此外,除了注册通知,框架还提供了Delegate的回调方式,遵守EAAccessoryDelegate协议,并实现accessoryDidDisconnect:这个方法。

    1.2 识别硬件
    设备连接之后,需要通过「协议」来识别硬件的身份,协议本质上就是一个字符串,一个由反向域名组成的字符串,例如om.apple.myProtocol。而这个协议(字符串)的定义,是由硬件的生产厂商定义的,所以App开发人员,要和厂商沟通拿到这部分的资料。我们需要进行如下操作:
    1. #import <ExternalAccessory/ExternalAccessory.h>

    2. 使用UISupportedExternalAccessoryProtocols键在Info.plist中声明支持的协议,值为数组,数组的元素为支持的协议,元素的顺序任意且不限数量。 如下是官方文档中对UISupportedExternalAccessoryProtocols的介绍:

       UISupportedExternalAccessoryProtocols (Array - iOS) Specifies the protocols that your app supports and can use to communicate with external accessory hardware. Each item in the array is a string listing the name of a supported communications protocol. Your app can include any number of protocols in this list and the protocols can be in any order. The system does not use this list to determine which protocol your app should choose; it uses it only to determine if your app is capable of communicating with the accessory. It is up to your code to choose an appropriate communications protocol when it begins talking to the accessory.This key is supported in iOS 3.0 and later. For more information about communicating with external accessories, see External Accessory Programming Topics.

    3. 在delegate中遍历所有已经连接的设备

      - (void)accessoryDidConnect:(NSNotification *)notification{
      
          NSArray *connectedAccessories = [[EAAccessoryManager sharedAccessoryManager] connectedAccessories];
      
          for(EAAccessory *accessory in connectedAccessories){
      
              protocolString = accessory.protocolStrings;//协议
              manufacturer = accessory.manufacturer;//制造商
              name = accessory.name;//名字
              firmwareRevision = accessory.firmwareRevision;//固件型号
      
          }
      }

      或者在通告Block回调中,NSNotification * _Nonnull note这个参数,包含了EAAccessory对象,我们也可以直接通过EAAccessoryKey这个key拿到EAAccessory对象。

    1.3 传输数据

    创建EASession、打开输入、输出通道。 App和外围设备通讯、数据传输,靠的是NSInputStream和NSOutputStream对象,而这两个对象是EASession的两个属性。所以我们要创建EASession对象。

    - (BOOL)openSession {
        // 根据已经连接的EAAccessory对象和这个协议(反向域名字符串)来创建EASession对象,并打开输入、输出通道
        self.session = [[EASession alloc] initWithAccessory:self.accessory forProtocol:protocolString];
        if(self.session != nil) {
            // open input stream
            self.session.inputStream.delegate = self;
            [self.session.inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            [self.session.inputStream open];
            // open output stream
            self.session.outputStream.delegate = self;
            [self.session.outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            [self.session.outputStream open];
        }
        else {
            NSLog(@"Failed to create session");
        }
        return (nil != self.session);
    
    }

    注意上面遵守的NSStreamDelegate协议,这里就是利用delegate回调来监听input stream和output stream的数据。

    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
         switch (eventCode) {
             case NSStreamEventNone:
                 break;
             case NSStreamEventOpenCompleted:
                 break;
             case NSStreamEventHasBytesAvailable:
                 //NSLog(@"Input stream is ready");
                 // 接收到硬件数据了,根据指令定义对数据进行解析。
                 [self readFromDevice];
                 break;
             case NSStreamEventHasSpaceAvailable:
                 //NSLog(@"Output stream is ready");
                 // 可以发送数据给硬件了
                 [self writeToDevice];
                 break;
             case NSStreamEventErrorOccurred:
                 break;
             case NSStreamEventEndEncountered:
                 break;
             default:
                 break;
         }
     }

    • HasBytesAvailable:表示stream中有数据需要读取(硬件发送了数据给App)
    • HasSpaceAvailable:表示stream中可以接收数据的写入(App发送了数据给硬件)

    三、carplay

    苹果carplay官方文档  https://developer.apple.com/design/human-interface-guidelines/carplay/overview/introduction/ 目前只支持Audio Apps,Automaker Apps,Messaging and VoIP Apps三类APP,iOS 12会支持导航类APP。

    展开全文
  • } 需要在Bootloader中停止DMA传输流后才能在APP中正常使用,否则APP中不能正常启动DMA串口接收。 __disable_irq(); HAL_DMA_Abort(&hdma_usart1_rx); HAL_DMA_Abort(&hdma_usart2_rx);
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_DMA_Init();
      MX_USART1_UART_Init();
      MX_USART2_UART_Init();
      /* USER CODE BEGIN 2 */
      ExcomInit();
    void ExcomInit(void)
    {
    	excom.uart = &huart2;
    	excom.rxdma = &hdma_usart2_rx;
    
    	__HAL_UART_ENABLE_IT(excom.uart,UART_IT_IDLE);
    	HAL_UART_Receive_DMA(excom.uart,excom.RxRam[excom.DMARxNo].DMARxbuff,DMARXBUFFSIZE);
    	
    }

    需要在Bootloader中停止DMA传输流后才能在APP中正常使用,否则APP中不能正常启动DMA串口接收。

    			__disable_irq();
    			HAL_DMA_Abort(&hdma_usart1_rx);
    			HAL_DMA_Abort(&hdma_usart2_rx);
    展开全文
  • Android 新增外设Service添加供app使用

    千次阅读 2022-03-04 14:51:11
    LED Service添加供app使用基本流程 1、需要添加文件在源码中的位置 2、具体需要添加的代码路径: Kernel: Dts: a、kernel/msm-4.4/arch/arm/boot/dts/qcom/xxxx-mtp.dtsi b、 kernel/msm-4.4/arch/arm/boot/dts/...

    LED Service添加供app使用基本流程
    1、需要添加文件在源码中的位置

    在这里插入图片描述

    2、具体需要添加的代码路径:
    Kernel:
    Dts:
    a、kernel/msm-4.4/arch/arm/boot/dts/qcom/xxxx-mtp.dtsi
    b、 kernel/msm-4.4/arch/arm/boot/dts/qcom/xxxxx.dtsi
    c、 kernel/msm-4.4/arch/arm/boot/dts/qcom/msm-xxxxxl.dtsi
    由于控制4A纸、finger和身份证三盏LED灯都是挂载到gpio_B口下,所以需要通过msm-pmxxxxxI.dtsi实现dts的配置操作
    Driver:
    a、kernel/msm-4.4/drivers/leds/leds-a4Paper.c 
    b、 kernel/msm-4.4/drivers/leds/leds-finger.c 
    c、 kernel/msm-4.4/drivers/leds/leds-idCard.c

    Hal:
    a、hardware/libhardware/modules/led/led.c 
    b、hardware/libhardware/modules/led/Android.bp 
    c、hardware/libhardware/include/hardware/led.h 
    其他还需要将新加的LED hal控制做相关的打包处理 build/make/target/product/full_base.mk和LED 节点文件的权限修改device/qcom/common/rootdir/etc/init.qcom.rc

    Frameworks:
    JNI:
    a、frameworks/base/services/core/jni/com_android_server_LedService.cpp 
    b、 frameworks/base/services/core/jni/onload.cpp
    c、frameworks/base/services/core/jni/Android.bp
    Jni的封装添加
    Service:
    a、frameworks/base/core/java/android/app/LedManager.java 
    b、frameworks/base/services/core/java/com/android/server/LedService.java 
    为添加的service文件
    c、frameworks/base/core/java/android/app/ILedService.aidl 
    跨进程调用添加
    d、frameworks/base/core/java/android/app/SystemServiceRegistry.java
    e、 frameworks/base/core/java/android/content/Context.java
    context上下文服务添加

    3、代码基本流程
    在这里插入图片描述

     函数hw_get_module依次在目录/system/lib /hw和/vendor/lib/hw中查找一个名称为"<MODULE_ID>.variant.so"的文件,其 中,<MODULE_ID>是一个模块ID
    

    hw_get_module()函数利用HAL层注册信息id,获取相应的模块。
    hw_get_module_by_class()函数利用HAL层注册信息id和name,获取相应的模块,主要用于id相同、name不同,即获取相同功能但厂家不同的硬件库。

    展开全文
  • 常见的Wi-Fi模块可透过UART或SPI接口来实现,且使用PWM捕捉功能量测接收红外线,以及用GPIO控制相关的指示灯显示,以上都可以通过具有超低待机功耗且富含许多外设,同时带有LCD驱动能力的Nano112来实现。 智能插座...
  • ios设备app作为蓝牙外设
  • 再上一节说了app作为central连接peripheral的情况,这一节介绍如何使用app发布一个peripheral,给其他的central连接 还是这张图,central模式用的都是左边的类,而peripheral模式用的是右边的类 peripheral...
  • 安卓毕业设计app源码 EyeTracker 项目内容 功能描述 由安卓移动设备作为传感器,通过目视控制,使用者可以使用目视跟踪技术控制鼠标、使用屏幕键盘进行键入。 必要性 提供一种全新计算机交互方式,用眼球完整的进行...
  • 苹果手机可以作为蓝牙外设端,被蓝牙中央端来扫描连接交互数据,实现模拟蓝牙外设硬件。通过阅读CoreBluetooth库,可以找到一个CBPeripheralManager的类,该类主要的作用就是允许你来管理发布services,把这些...
  • App Open-crx插件

    2021-04-03 03:12:21
    或者您想要仔细观察的外设或以全屏模式浏览的眉毛。 全屏模式有一个工具,即全屏选择器,它使您可以选择要进入全屏状态的元素(例如网站上的图块或图像,例如)。选项中有许多小功能非常有用。 权限:* activeTab...
  • android蓝牙app连接外设时崩溃问题

    千次阅读 2018-09-18 13:57:15
    连接蓝牙设备的app在连接时,如遇到蓝牙设备的信号名称错误或蓝牙设备关闭时,app有一定概率出现程序闪退; 经查证原因出现在接收蓝牙信号的广播的地方,原代码如下: public BroadcastReceiver mReceiver = new ...
  • iOS App连接外设的几种方式

    千次阅读 2016-11-08 17:36:24
    iOS App连接外设的几种方式
  • Razer外设的开源GUI,它是繁重的Razer Synapse的替代品,Razer Synapse需要身份验证并且是需要大量RAM的应用程序。 如何安装? 首先,抓住 ,然后安装它。 然后,下载安装程序或使用便携式版本。 如何使用? 重要...
  • ESP-IDF 是ESP32 的官方...板载16颗ws2812彩灯,温湿度传感器,光敏传感器,外设按键,PWM电机控制,通过MQTT协议接入阿里云,OTA远程升级功能。实现微信小程序控制,app远程控制,天猫精灵语音控制。提供全部源码。
  • 软件测试知识——APP测试专项知识 什么是 APPAPP是英文单词 Application 的简称,现在的 APP 指代的是智能手机的第三方应用程序。目前国内互联网公司都会有自己的APP产品,比如淘宝、京东都有APP客户端。 ...
  • iOS App如何连接外设

    2016-09-20 19:00:00
    如上图所示,我把iOS App连接外设的常用方式总结了一下,可以分为三大类: iOS App连接外部硬件方式第一类是通过网络端口 建立Socket使用TCP/IP协议族进行通信,天然支持多通道,想要几个通道就建几个socket...
  • BLE 蓝牙 与APP 得交互 内设 外设

    千次阅读 2016-11-26 10:07:36
    这两组api粉笔对应不同的业务常见:左侧叫中心模式,就是以你的app作为中心,连接其他的外设的场景;而右侧称为外设模式,使用`手机作为外设`连接其他中心设备操作的场景 服务和特征(service andcharacteristic)  ...
  • 前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面;... 效果图: function 1: 重写Activity的dispatchKeyEvent...
  • http://www.html5-app.com/show/120 描述如图哈, 做原作者要收费的哈。 我也是从愿作者那花钱买来的
  • 1.检查stm32f407xx_flash.icf 其它MCU一样 *.icf文件中 中断向量地址... 反初始化所有IO ,外设 UART ,SPI,DMA, RCC等,然后关中断 __set_FAULTMASK(1); /* 禁止全局中断*/ 包含错误中断也禁止4. 从来没碰到过PLLQ BOOT
  • 安卓使用usb连接外设

    2021-07-16 16:44:26
    获取usb外设 HashMap map = usbManager.getDeviceList(); 连接usb外设参考代码public void usbConnect() 发送数据usbDeviceConnection.bulkTransfer 参与贡献 安卓usb使用文档 ...
  • STM32F0/F4BootLoader之IAP与APP工作中的事

    千次阅读 2021-11-17 16:06:33
    F407环境下,iap开机跳转到APP运行程序,APP接受更新指令后,跳转回IAP并通过Ymodem协议接受UART数据,更新APP程序。更新完成后等待重启, 该项目中无难点。 F030环境下,iap开机跳转到APP中,接受更新指令,跳...
  • 中国青年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年:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,512
精华内容 4,204
关键字:

外设app