google迈向IoT的开端——推出Android Things操作系统

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

google迈向IoT的开端——推出Android Things操作系统_第1张图片

        可以看出,它与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的物联网时代的到来吧!







你可能感兴趣的:(android开发)