google邁向IoT的開端——推出Android Things作業系統

徐福記456發表於2017-01-10

       上個月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新增:

<uses-library android:name="com.google.android.things"/>
       另外,在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<String> 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的物聯網時代的到來吧!







相關文章