上个月Google推出Android Things 嵌入式系统取代“Brillo”,这意味着Google看好IoT(物联网)发展,要与Apple的HomeKit抗衡。我本人是先学51单片机,然后是ARM的stm32嵌入式开发,再到Android客户端开发。因此,对于Android中的嵌入式开发比较感兴趣。其实,Android Things是Android的一个分支版本,类似于可穿戴手表,为开发者提供丰富的API接口,使用java语言开发。其框架结构如下:


        可以看出,它与Android的框架是大致相同的。只是应用框架层换成特定的Java API Framework,另外增加了Google Services和Things Support Library。既然要用到Google Services,那么需要在AndroidManifest.xml添加:

       另外,在gradle添加依赖,注意不是compile,而是provided:
provided 'com.google.android.things:androidthings:0.1-devpreview'
      接下来,可以在Activity的onCreate里面创建一个外设管理服务对象PeripheralManagerService:

PeripheralManagerService pioService = new PeripheralManagerService();

       该服务提供获取GPIO(通用IO口)、SPI(串行外设接口)、Uart(串口)、I2C(串行总线)、PWM(脉冲宽度调节)列表,与打开对应的外设。在这里主要介绍下GPIO控制LED灯开关:

//使用外设管理服务对象获取GPIO列表List gpioList = pioService.getGpioList();if(gpioList != null && gpioList.size() > 0) {    try {        //打开列表中的第一个GPIO        Gpio ledPin = pioService.openGpio(gpioList.get(0));        //设置边沿触发类型        ledPin.setEdgeTriggerType(Gpio.EDGE_NONE);        //设置激活类型        ledPin.setActiveType(Gpio.ACTIVE_HIGH);        //设置方向        ledPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);        //设置为高电平,使能该GPIO端口        ledPin.setValue(true);    } catch (IOException e) {        e.printStackTrace();    }}
       如果你曾经接触过单片机或者嵌入式ARM开发,看到上面GPIO的操作是不是很熟悉呢?其实,在GPIO类里面定义有关常量:

    public static final int ACTIVE_HIGH = 1;//高电平    public static final int ACTIVE_LOW = 0;//低电平    public static final int DIRECTION_IN = 0;//输入    public static final int DIRECTION_OUT_INITIALLY_HIGH = 1;//输出并且初始化为高电平    public static final int DIRECTION_OUT_INITIALLY_LOW = 2;//输出并且初始化为低电平    public static final int EDGE_BOTH = 3;//上升、下降沿同时触发    public static final int EDGE_FALLING = 2;//下降沿触发    public static final int EDGE_NONE = 0;//无触发    public static final int EDGE_RISING = 1;//上升沿触发
       再来对比下ARM中stm32系列的GPIO初始化(库函数操作版本):

   void GPIO_init (){    GPIO_InitTypeDef GPIO_InitStructure; //声明结构体    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择GPIO_Pin_0端口    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟频率    GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化结构体    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能时钟}
       可以看出,ARM比Android Things的多了时钟频率设置与使能。ARM中的时钟分为内部低速、内部高速、外部低速与外部高速,主要是为了节约功耗,可灵活根据需求选择时钟并且单独使能。我猜测,Android Things操作系统应该是默认了时钟频率,才不需要单独配置的。
其实,ARM的库函数是基于寄存器操作的,来看下寄存器操作初始化GPIO:

void LED_Init(void){    RCC->APB2ENR|=1<<2; //使能PORTA时钟                 GPIOA->CRH&=0XFFFFFFF0; //选中PA8端口    GPIOA->CRH|=0X00000003;//PA8推挽输出         GPIOA->ODR|=1<<8; //PA8输出高电平}
       上面寄存器操作涉及了指针、左移、与运算、或运算,这很符合C语言的特征,这样效率也是相当比较高的。可以想象到,Android Things底层也是基于寄存器操作;然后是Native 硬件抽象层调用底层方法,为上层提供接口;再是框架层使用java语言进行封装,为应用层提供API接口。

       目前存在开发平台的局限性:“树莓派3”、英特尔微型可穿戴设备“爱迪生”(Edison)以及恩智浦半导体的Pico平台。但是,Google致力于增加更多认证设备。相信不久的将来,Android的IoT操作系统会得到广泛应用,让我们共同期待属于Android的物联网时代的到来吧!







更多相关文章

  1. android的简单理解(原创)
  2. Android启动脚本init.rc
  3. Android(安卓)中屏幕点击事件的实现
  4. Android启动脚本init.rc
  5. android 触摸事件、点击事件的区别
  6. EditText单击触发onclick事件处理
  7. Android初始化语言 (init.*.rc、init.conf文件格式)
  8. Android启动脚本init.rc
  9. 如何写Android(安卓)init.rc

随机推荐

  1. 命令行下可以跑PHP脚本,但是通过浏览器却
  2. PHP二维数组按照指定的字段排序的函数
  3. 面试题之:颠倒二进制位的实现思路讲解(PHP
  4. 聚合数据短信API服务接口PHP请求示例(附
  5. php怎么调用自建证书的webservice
  6. PHP自动加载机制介绍——spl_autoload_re
  7. 安装及配置eaccelerator-0.9.5加速PHP-5.
  8. php判断从数据库查出的二维数组是否有重
  9. PHP如何为函数执行设置超时
  10. php解析url获取url中的参数值