一、接口简介
通用输入/输出(General Purpose Input/Output),简单的传感器使用这个API,如运动探测器、距离探测器,和电平开关使用一个二进制值-高或者低来报告它们的状态。 它引脚提供了可编程的接口,来读取二进制输入设备的状态(如开关按钮)或者控制二进制输出设备的开关状态(例如LED等)。
你可以配置GPIO引脚为具有高低状态的输入或者输出:
  作为输入:外部源决定这个状态,你的app可以读取当前的值或者对状态的变化做出反应。
  作为输出:你的app配置引脚的状态。
二、使用步骤
对于GPIO接口的操作,主要有如下几个步骤:
1.打开连接
创建PeripheralManagerService对象,使用你要打开的端口的名称调用openGpio()方法打开指定端口的连接。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Attempt to access the GPIOtry {PeripheralManagerService manager = new PeripheralManagerService();mGpio = manager.openGpio(GPIO_NAME);} catch (IOException e) {Log.w(TAG, "Unable to access GPIO", e);}
}

2.读取输入
使用DIRECTION_IN模式调用setDirection()方法配置端口为输入。
使用ACTIVE_HIGHT或者ACTIVE_LOW调用setActiveType()方法,配置高(接近LOREF)或者低(接近zero)电压状态作为true(活动的)返回。
使用getValue()方法返回当前状态。

public void configureInput(Gpio gpio) throws IOException {gpio.setDirection(Gpio.DIRECTION_IN);gpio.setActiveType(Gpio.ACTIVE_HIGH);if (gpio.getValue()) {} else {}
}

3.监听输入变化
GPIO端口被配置为输入后,当它的状态在高和低之间改变时会通知你的app。注册这些改变事件:
  在活动的端口连接添加一个GpioCallback。
  使用setEdgeTriggerType()方法声明触发中断事件的状态变化。边缘触发器支持下面的四个类型:
    EDGE_NONE:没有中断事件,这个是默认的值。
    EDGE_RISING:从低到高过渡中断。
    EDGE_FALLING:从高到底过渡中断。
    EDGE_BOTH:在所有状态转换中断。
  onGpioEdge()方法返回true意味着这个监听器会持续获取端口的每个状态改变事件。
  当你的app不在监听输入事件的时候,注销所有中断Handler。

public void configureInput(Gpio gpio) throws IOException {gpio.setDirection(Gpio.DIRECTION_IN);gpio.setActiveType(Gpio.ACTIVE_LOW);gpio.setEdgeTriggerType(Gpio.EDGE_BOTH);gpio.registerGpioCallback(mGpioCallback);
}
private GpioCallback mGpioCallback = new GpioCallback() {@Overridepublic boolean onGpioEdge(Gpio gpio) {if (mDevice.getValue()) {} else {}return true;}@Overridepublic void onGpioError(Gpio gpio, int error) {Log.w(TAG, gpio + ": Error event " + error);}
};
@Override
protected void onStop() {super.onStop();// Interrupt events no longer necessarymGpio.unregisterGpioCallback(mGpioCallback);
}

4.写入输出
使用DIRECTIOIN_OUT_INITIALLY_HIGHT或者DIRECTION_OUT_INITIALLY_LOW模式调用setDirection()方法配置它为输出。这些模式确保了端口的初始化状态在配置时间正确设置。
配置高 (接近IOREF)或者低(接近zero)电压信号作为true(活动)返回,使用ACTIVE_HIGHT或者ACTIVE_LOW调用setActiveType()方法。
使用setValue方法来设置当前状态。

public void configureOutput(Gpio gpio) throws IOException {gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);gpio.setActiveType(Gpio.ACTIVE_LOW);gpio.setValue(true);
}

5.关闭连接
当完成GPIO端口通信,使用close()方法关闭连接并释放资源。

@Override
protected void onDestroy() {super.onDestroy();if (mGpio != null) {try {mGpio.close();mGpio = null;} catch (IOException e) {Log.w(TAG, "Unable to close GPIO", e);}}
}

二、案例演示
这里我们演示一个案例,通过BCM21监听开关按钮的开关产生的输入信号,从而通过BCM5输出信号控制LED灯的开关。

1.硬件准备
     树莓派开发板 1块
     面包板 1块
LED灯 1个
开关按钮 1个
电阻 2个
杜邦线(公对公,公对母) 若干
广告时间咯:如果你还没有自己的开发板和元器件,到我们的“1024工场”旗舰店来逛逛一逛吧(文章底部二维码),这里能一次性有买到你想要的!

2.电路搭建

3.代码编写

GpioDemo\app\src\main\java\com\chengxiang\gpiodemo\MainActivity.java

public class MainActivity extends AppCompatActivity {//输入和输出GPIO引脚名称private static final String GPIO_IN_NAME = "BCM21";private static final String GPIO_OUT_NAME = "BCM5";//输入和输出Gpioprivate Gpio mGpioIn;private Gpio mGpioOut;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);PeripheralManagerService manager = new PeripheralManagerService();try {//打开并设置输入Gpio,监听输入信号变化(开关按钮的开关)mGpioIn = manager.openGpio(GPIO_IN_NAME);mGpioIn.setDirection(Gpio.DIRECTION_IN);mGpioIn.setEdgeTriggerType(Gpio.EDGE_FALLING);mGpioIn.setActiveType(Gpio.ACTIVE_HIGH);mGpioIn.registerGpioCallback(mGpioCallback);//打开并设置输出GpiomGpioOut = manager.openGpio(GPIO_OUT_NAME);mGpioOut.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);} catch (IOException e) {e.printStackTrace();}}private GpioCallback mGpioCallback = new GpioCallback() {@Overridepublic boolean onGpioEdge(Gpio gpio) {try {//当按开关按钮的时候,改变输出Gpio的信号,从而控制LED灯的亮和灭mGpioOut.setValue(!mGpioOut.getValue());} catch (IOException e) {e.printStackTrace();}return true;}@Overridepublic void onGpioError(Gpio gpio, int error) {}};@Overrideprotected void onDestroy() {super.onDestroy();//关闭Gpioif (mGpioIn != null) {try {mGpioIn.unregisterGpioCallback(mGpioCallback);mGpioIn.close();mGpioIn = null;} catch (IOException e) {e.printStackTrace();}}if (mGpioOut != null) {try {mGpioOut.close();mGpioOut = null;} catch (IOException e) {e.printStackTrace();}}}
}

代码库:https://github.com/ThingsDeveloper/gpiodemo

广告时间咯:如果你需要完成的Demo源码,请关注“1024工场服务号”->工场仓库->Things代码(文章底部二维码),就可以找到你想要的代码噢。

4.运行结果

通过按钮的开关,来控制LED等的亮和灭。

提示1:在实验的过程中,发现使用BCM6引脚会报错如下:
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err: com.google.android.things.pio.PioException: android.os.ServiceSpecificException: BCM6 driver failure
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at com.google.android.things.pio.GpioImpl.setDirection(GpioImpl.java:64)
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at com.chengxiang.gpiodemo.MainActivity.onCreate(MainActivity.java:39)
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at android.app.Activity.performCreate(Activity.java:6662)
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)

处理1:更换BCM5接口即正常,目前只能猜测是否是things系统还是预览版,存在一些bug造成。

1.抛弃各种找元器件的烦恼,来“1024工场”旗舰店,一次性买到你所想要的:树莓派套装—专为Android Things打造。

电脑用户,点击如下链接进入淘宝宝贝页面:
https://item.taobao.com/item.htm?spm=686.1000925.0.0.3f11c9ed68fPu7&id=549263158263
手机用户,打开淘宝客户端扫描二维码:
2.完整和持续更新的《使用Android打开物联网开发大门——Andoid Thigns开发》文档,欢迎大家阅读! 
https://www.kancloud.cn/workshop1024/android_things_develop/360773 
 
3.新技术,新未来!欢迎大家关注“1024工场”微信服务号,时刻关注我们的最新的技术讯息。
4.加入“Android Things开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)

Android Things:外设I/O接口-GPIO相关推荐

  1. android10开发io接口,Android Things:外设I/O接口-GPIO

    一.接口简介 通用输入/输出(General Purpose Input/Output),简单的传感器使用这个API,如运动探测器.距离探测器,和电平开关使用一个二进制值-高或者低来报告它们的状态. ...

  2. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

  3. 定制Android系统开发之一——提供接口的方式

    何为定制Android系统?就是在特定的硬件上,移植上Android操作系统,并修改原生Android系统以提供给定制的APP操作定制硬件的方法. 所以,定制Android的主要工作有以下三部分: 适 ...

  4. Android 9 的非 SDK 接口限制 | 中文教学视频

    我们一直致力于为 Android 用户和开发者提供稳定的体验.秉持这种理念,我们逐步限制应用使用非公开接口,因为这种做法往往导致用户遭遇系统崩溃及开发者需要紧急发布修复的风险.在 Android 8. ...

  5. Android P (4)一种绕过Android P上非SDK接口限制的简单方法

    一种绕过Android P上非SDK接口限制的简单方法 众所周知,Android P 引入了 针对非 SDK 接口(俗称为隐藏API)的使用限制.这是继 Android N上 针对 NDK 中私有库的 ...

  6. android 首页接口设计方案,Android开发最佳实践——1.接口设计

    Android开发最佳实践--1.接口设计 一个项目刚开始的时候,最需要确认的就是接口设计了:数据如何传递,使用什么格式什么协议乃至如何保证安全性.如果一个项目的接口设计不合理--比如没有考虑到安全性 ...

  7. Android 推送消息开放接口 OpenPush

    Android 推送消息开放接口 OpenPush 我们知道, 在中国不能使用 google 的服务. 在中国销售的手机甚至没有安装 google 的服务.所以, 原本由 google gcm 提供的 ...

  8. Android开发规范:API接口安全设计规范

    公众号[国民程序员]回馈粉丝福利: 现金红包和送书活动火热进行中,点击参与! 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买. 书籍详情请 ...

  9. Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo

    Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo 标签: app在线更新下载Update升级 2016-09-18 20:47  ...

最新文章

  1. 2 并发编程--开启进程的两种方式
  2. AI如何影响经济周期?诺奖得主表态:保持关注,我很乐观
  3. 案例 | 华仁药业数字化转型 致远互联打造数字化“中台”一条直线,映射出软件产业发展的辛酸与瓶颈。...
  4. dojo 官方翻译 dojo/_base/array 版本1.10
  5. How far away ?
  6. linq.js的用法
  7. 预充电电路工作原理_LED触摸调光台灯控制电路板的工作原理
  8. python 生成html_Python使用pyh生成HTML文档的方法示例
  9. 使用SQL命令行更改数据库字段类型
  10. 【es】ElasticSearch 插件开发
  11. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
  12. Qt中的对话框(模态,非模态,关于,问题,文件)
  13. css设置字体的行数,超出显示...
  14. 匿名对象与非匿名对象的区别
  15. 【产品】电池容量简介
  16. 《Processing SPARQL queries over distributed RDF graphs》——读书笔记
  17. JDK 内置实用工具:监视、故障排除
  18. The Innovation | 用系统生物学的观点鸟瞰肿瘤易感基因
  19. pythonweb项目微服务_python web微服务器端
  20. TPTP测试项目的性能

热门文章

  1. 基于QT实现的alpha-beta剪枝算法搜索的象棋人机博弈游戏
  2. 浙江大学计算机科学排名,2017浙江大学专业排名结果
  3. Windows10下如何创建VHDX(VHD)格式的虚拟硬盘文件
  4. java 条件编译_Java条件编译:如何防止代码块被编译?
  5. ipad一直卡在白苹果_IOS checkm8漏洞越狱 典型应用案例之OTA升级造成白苹果修复案例...
  6. 再看bit、kbit、bit/s,byte、kbyte、byte/s
  7. 年化17.5%,十年8倍的“双低”转债策略:从零实现量化回测系统之三
  8. ACL+SASL的认证配置后的Kafka命令操作(Windows版)
  9. 离线部署NFS文件系统
  10. 整理软件行业职位介绍(PM,RD,FE,UE,UI,QA,OP,DBA,BRD,MRD, PRD,FSD等)、组织结构、职责