本文由
玉刚说写做平台
提供写做赞助java原做者:
AndroFarmer
android版权声明:本文版权归微信公众号
玉刚说
全部,未经许可,不得以任何形式转载git
Android things(后面正文内容简称ats)是一个物联网平台,他基于Android,并作了至关多的改造以适合在一些低配置的物联网设备上运行,同时它又是安卓,由于其保留了绝大部分Android framework的功能。所以借助ats平台咱们不须要了解嵌入式(准确的说仍是须要了解一些的)相关的知识就能够开发出一系列智能硬件产品。github
要说明这个问题,咱们不如从反面说明,ats不能作什么。
先看张ats的框架图:
shell
因为android studio 并未有提供ats的模拟器,因此咱们必需要有一个能刷ats系统的硬件(好比树莓派)才行,同时为了还须要一些传感器、电阻、电子按钮、面包板、led灯等一些列配套外设,由于iot(物联网)的开发不少时候都是对硬件的操做,有了这些外设才能更好的去实验一些demo。
下面贴出我购买的硬件全家桶套装: api
ats的开发不少时候都是操做硬件,因此咱们就有必要去研究,如何去操做外设设备,一个很重要的方法就是经过外设接口去操做。 看下图:
bash
总线,总线,就是总让你陷进去微信
树莓派支持的总线类型: GPIO,I2C,I2S,SPI,PWM,UART网络
关于总线我也不是专业的。以个人理解就是为了控制不一样的硬件设备,而对电信号作不一样的处理而划分的标准。这里咱们先混个脸熟,后面用的最多的是GPIO,也就是以名称BCM开通的针脚,后面咱们会经过名称去控制这个针脚上的设备。 关于总线详细的介绍,你们能够参考下这篇文章: https://blog.csdn.net/haima1998/article/details/18729929app
关于这方面的介绍,网上仍是挺多的,我搜了一下最不缺的就是这类文章,因此这里就不作详细介绍了,简单介绍下 步骤:
因为物联网设配的特殊性,咱们没有像安卓同样的触摸屏和按键等外设来操做设备,因此咱们须要经过以下两种方式去链接设备。
1.经过usb转ttl设备直接链接
2.经过局域网链接(推荐方式) 先让ats设备链接到路由器,这里推荐链接显示器鼠标键盘可视化操做链接网络等操做,链接上显示器以下图:
经过这些命令咱们能够更好的管理和使用ats
这是一个操做LED让其闪烁的demo, 咱们经过这个demo来介绍基本的操做硬件的方法 先看下最终效果:
硬件搭建步骤:
更直观一点的参考以下官方图片:
public class LightActivity extends Activity {
Handler mHandler;
PeripheralManager mPeripheralManager;
Gpio mLightGpio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_light);
mHandler = new Handler();
mPeripheralManager = PeripheralManager.getInstance();
try {
mLightGpio = mPeripheralManager.openGpio("BCM2");
mLightGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
mHandler.post(mBlinkRunnable);
} catch (IOException e) {
e.printStackTrace();
}
}
private Runnable mBlinkRunnable = new Runnable() {
@Override
public void run() {
try {
if (mLightGpio == null)
return;
mLightGpio.setValue(!mLightGpio.getValue());
mHandler.postDelayed(mBlinkRunnable, 1000);
} catch (IOException e) {
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (mLightGpio != null) {
try {
mLightGpio.close();
mLightGpio = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
代码很少,就全贴上去了,下面咱们分析下代码。
mPeripheralManager=PeripheralManager.getInstance();
mLightGpio= mPeripheralManager.openGpio("BCM2");
复制代码
咱们经过PeripheralManager单例后调用openGpio方法,传入的参数为GPIO端口对应的名称,这样就拿到这个端口控制对象Gpio的一个实例mLightGpio。
mLightGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
复制代码
这句话代码有两个做用:1.设置电平方向为输出方向;2设置初始电平为高电平并当即激活。 这句代码执行后,LED会变为常亮状态。 咱们还能够经过如下三行代码实现跟上面一句一样的效果:
//设置电平方向为输出方向,设置初始电平为低电平并当即激活
mLightGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
//设置激活状态为高电平
mLightGpio.setActiveType(Gpio.ACTIVE_HIGH)
//进行激活
mLightGpio.setValue(true);
复制代码
在mBlinkRunnable中经过 mLightGpio.setValue(!mLightGpio.getValue()) 来循环改变电平的激活状态来实现LED的闪烁,至此LED就能够blingbling的闪了。
最后看下ats项目和标准安卓有和区别 主要区别有两点:
<uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO"/>
<uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />
复制代码
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
复制代码
所谓用户驱动就是ats容许你把相应的硬件的电信号转化成系统事件,好比按钮的点按事件注册成系统的键盘按键事件,温度感应器的电信号注册成系统已存在的感应器事件,这样各个组件均可以很方便的使用标准的framework api去操做硬件了。
本例展示的内容是把按钮的点按事件电信号注册成键盘的key事件,这样按钮就变成一个键盘了,能够点击和长按。注册成系统事件后能够在应用程序的各个组件中进行使用了。 演示效果:
硬件安装图:
看下代码:
package com.androfarmer.button;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.view.KeyEvent;
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.GpioCallback;
import com.google.android.things.pio.PeripheralManager;
import com.google.android.things.userdriver.UserDriverManager;
import com.google.android.things.userdriver.input.InputDriver;
import com.google.android.things.userdriver.input.InputDriverEvent;
import java.io.IOException;
public class KeyCodeDriverService extends Service {
private InputDriver mDriver;
private Gpio mButtonGpio;
private static final int KEY_CODE = KeyEvent.KEYCODE_A;
@Override
public void onCreate() {
super.onCreate();
//建立输入驱动,并设置驱动的基本信息
mDriver = new InputDriver.Builder()
.setName("Button2Keyboard")
.setSupportedKeys(new int[]{KEY_CODE})
.build();
// 经过 UserDriverManager注册上面建立的驱动
UserDriverManager manager = UserDriverManager.getInstance();
manager.registerInputDriver(mDriver);
PeripheralManager peripheralManager = PeripheralManager.getInstance();
try {
mButtonGpio = peripheralManager.openGpio("BCM21");
//设置电平方向为输入
mButtonGpio.setDirection(Gpio.DIRECTION_IN);
//设置激活类型
mButtonGpio.setActiveType(Gpio.ACTIVE_LOW);
//设置监听事件为:电平中断变化事件,Gpio.EDGE_BOTH
//意味着电平从低到高中断以及从高到低中断都会触发回调
mButtonGpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
//设置电平变化的监听器
mButtonGpio.registerGpioCallback(new GpioCallback() {
@Override
public boolean onGpioEdge(Gpio gpio) {
try {
Log.d("-------------button",gpio.getValue()+"");
boolean pressed=gpio.getValue();
InputDriverEvent event = new InputDriverEvent();
event.setKeyPressed(KEY_CODE, pressed);
mDriver.emit(event);
} catch (IOException e) {
e.printStackTrace();
}
//返回true表明一直监听,false表明监听一次
return true;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
//接触注册
UserDriverManager manager = UserDriverManager.getInstance();
manager.unregisterInputDriver(mDriver);
//关闭gpio端口
try {
mButtonGpio.close();
mButtonGpio = null;
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
复制代码
代码的注释写的已经很详细了,就不过多解释了。 这里简要介绍下步骤
主要分为四类:
ats的不少场景咱们能够像开发app同样,对于作过android开发的同窗们来讲这很easy,可是用户驱动这个概念咱们可能第一次据说。ats的设计是模块化的,一个ats硬件板只会包含基础的硬件模块如:网络模块,cpu,内存等。咱们拿到这个运行ats系统的基础板后,若是要开发成具体的物联网产品,可能须要接外设传感器去实现具体功能:好比温度传感器,烟雾报警器等。
市面上传感器门类复杂,若是咱们开发时将业务逻辑与硬件传感器的操做杂糅在一块儿,很显然这样的话咱们的代码很脆弱而且不具有可移植性,换个同类别的其余型号传感器就没法使用了。所以用户驱动的出现很好的解决了这个问题,无论外设硬件同类别的型号有多少种,咱们只须要写相应的用户驱动将其注册成framework已经实现的传感器事件,这样业务逻辑只须要跟标准的framework api打交道,而不用管具体用了哪种传感器。
附上一个开源项目,这里面实现了不少市面上广泛使用的硬件的用户驱动 https://github.com/androidthings/contrib-drivers 有兴趣的同窗能够去研究下不一样类型的用户驱动是如何编写
ps:本文不少内容和案例来自于官网,更多案例请查看 https://developer.android.com/samples/?technology=iot&language=java