本文为 Qunar 技术沙龙投稿,版权归原作者所有,未经允许,请勿转载。
原文地址:http://mp.weixin.qq.com/s/RW1_4mNjFmInpgdbpTpgeg
作者:彭呈祥,去哪儿网大住宿事业部 Android 开发工程师,毕业于江西农业大学,2014 年加入去哪儿网,目前主要工作为去哪儿酒店 Android 相关客户端开发。致力于 Android 技术研发、性能提高和流程优化,项目管理规范化和自动化。
【CSDN 有奖征稿啦】技术之路,共同进步,欢迎投稿、给文章纠错,请发送邮件至[email protected],或加微信 tree-rain-chen。
Google 物联网操作系统 Android Things,它可以运行在有线扬声器、智能温控器、安全摄像头、路由器等设备上,Google 的理念是通过 Android Things 让 Android 开发者与公司能够以他们过去的开发方式继续开发物联网硬件设备。结合 Google 为物联网推出的通讯协议 Weave,Android Things 将会在 Google 的物联网战略中发挥重要作用。
在深入了解它的开发之前,你应该了解如下几点:
官方推荐的开发板有 Intel Edison、NXP Pico i.MX6UL 和 Raspberry Pi 3(树莓派 3)。树莓派是世界上最流行的单板计算机,3 Model B 是最新的版本。它提供了如下配置:
准备你的硬件设备,如:1-树莓派 3 开发板,2-电源线,3-HDMI 转接线(连接显示器),4-SD 卡等和 5-网线;
在你的电脑上插入 8G 或者更大的 SD 卡;
注意:千万小心!!如果选择的磁盘不是 SD 卡,会损坏该磁盘中的数据;
这里我们以官方提供的 sample-simplepio 项目的 blink 模块为例,这样给大家演示一下如何使用 Android Studio 和树莓派 3 开发板,进行 Android Things 项目的开发;
Open an existing Android Studio Project->选择 sample-simplepio 项目->OK->按照默认引导导入项目;
sample-simplepio 项目运行基本的代码练习 PIO API, 项目包含 3 个模块,每个例子是一个可以独立运行的 Android 模块。这里我们仅仅使用 blink 模块跟大家演示和介绍:
在搭建电路之前,我们列举一下需要的硬件设备:
树莓派 3 开发板 1 块
LED 灯 1 个
电阻 1 个
面包板 1 块
根据下面的电路设计图,使用相关的元器件搭建电路如下(注意正极连接 BCM6 引脚,负极连接 Ground 引脚 ):
连接好树莓派开发板,启动 Android Things 系统,并在开发电脑中使用 adb connect 命令连接到开发板(这样你就可以在构建运行的时候选择树莓派开发板进行安装了 );
该项目实现了使用 SeekBar UI 控件来控制电路中 LED 等闪烁频率的功能,主要使用了 GPIO API 进行如下处理:
使用 PeripheralManagerService 来打开一个连接到 GPIO 端口的 LED 连接;
使用 DIRECTION_OUT_INITIALLY_LOW 配置端口;
给 setValue()方法传递 getValue()相反的值来改变 LED 的状态;
使用 Handler 来执行触发 GPIO 的事件,在一段时间后再次触发;
当应用程序不在需要 GPIO 连接的时候,关闭 Gpio 资源;
原有官方的 Demo 上我进行相关的修改,使用一个 SeekBar 来控制 LED 等的闪烁频率;
sample-simplepio\blink\build.gradle:
sample-simplepio\blink\src\main\AndroidManifest.xml:
BlinkActivity.java:实现 SeekbarUI 控制界面,并且向 Gpio 接口引脚发送指定频率的信号;
public class BlinkActivity extends Activity {
private static final String TAG = BlinkActivity.class.getSimpleName();
//LED 闪烁时间间隔,单位毫秒
private int interval_between_blinks_ms = 1000;
//控制 LED 灯闪烁频率控件
private SeekBar mSeekbar;
//当前 LED 等闪烁频率
private TextView mSeekbarValue;
private Handler mHandler = new Handler();
//Gpio 接口对象
private Gpio mLedGpio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "Starting BlinkActivity");
setContentView(R.layout.blink_activity);
mSeekbarValue = (TextView) findViewById(R.id.seekBar_value);
mSeekbar = (SeekBar) findViewById(R.id.seekBar);
mSeekbar.setProgress(interval_between_blinks_ms);
mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
mSeekbarValue.setText("LED between time:" + i + "ms");
//通过 SeekBar 控件改变 LED 等闪烁频率
interval_between_blinks_ms = i;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onStopTrackingTouch(SeekBar seekBar) { }
});
// 使用指定引脚名称,PeripheralManagerService 来打开一个连接到 GPIO 端口的 LED 连接
PeripheralManagerService service = new PeripheralManagerService();
try {
String pinName = BoardDefaults.getGPIOForLED();
mLedGpio = service.openGpio(pinName);
//设置引脚为输出信号
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
Log.i(TAG, "Start blinking LED GPIO pin");
//Post 一个 Runnable 对象,在指定的时间间隔持续的改变 GPIO 接口的状态,使得 LED 等闪烁
mHandler.post(mBlinkRunnable);
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//从 Handler 中移除 blink Runnable 对象
mHandler.removeCallbacks(mBlinkRunnable);
Log.i(TAG, "Closing LED GPIO pin");
try {
//页面销毁,当应用程序不在需要 GPIO 连接的时候,关闭 Gpio 资源
mLedGpio.close();
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
} finally {
mLedGpio = null;
}
}
private Runnable mBlinkRunnable = new Runnable() {
@Override
public void run() {
// 如果 GPIO 引脚已经关闭,则退出 Runnable
if (mLedGpio == null) {
return;
}
try {
//使用 setValue()方法传递 getValue()相反的值来改变 LED 的状态;
mLedGpio.setValue(!mLedGpio.getValue());
Log.d(TAG, "State set to " + mLedGpio.getValue());
mHandler.postDelayed(mBlinkRunnable, interval_between_blinks_ms);
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
};
}
blink_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="1000"
android:progress="1000"/>
<TextView
android:id="@+id/seekBar_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="30dp"/>
LinearLayout>
选择 blink 模块,点击运行,选择树莓派(Iot_rpi3)安装程序;
注意:如果工程导入构建的过程中,提示升级 Build Tools,则按照 Android Studio 引导升级即可。Android Things 要求:
SDK Tools 为 24 或者更高版本;
Android SDK 为 7.0(API 24)或者更高版本;
应用安装成功后,显示器上显示如下;
电路板运行效果,看上图。