NXP

相比移动领域,Android能否也为物联网打开一片新天地

2019-07-12 13:18发布

我与Android Things的24小时\我正在参与一个基于Android的物联网商用项目,它运行在Raspberry Pi 3上。最近发生了一件很有意思的事情,Google发布了Android Things的第一个预览版,他们的SDK主要针对3个开发板(Single Board Computers),Pi 3、Intel的Edison和NXP Pico。在Pi和Android之间无法建立端口连接,我们只能忍受自制固件的各种问题,这种痛苦真的是无以言表。其中一个最大的问题是它们不支持触摸屏,甚至连Element 14官方出售的版本也不行。我知道Android正在向Pi靠拢,而之前Google向AOSP项目提交的一个声明更是让每个人为之动容。2016年12月12号,Google发布了“Android Things”,外加一个可下载的SDK。于是我开始着手研究,并在门上挂上“勿扰”的牌子……\关于Android Things的疑问\在经历了大量Android工作和一些Pi项目之后(包括现在的这个项目),对于Android和Pi,我不禁有很多疑问。后面我会逐个说明,不过第一个最大的疑问现在已经得到了回答——Android Studio完全支持Pi,Pi正式成为一个支持ADB连接的设备。是的!Android Studio那些超级好用的强大特性最终支持了真实的物联网硬件,我们可以使用布局预览、调试系统、源代码检查器、自动化测试等等。我为此感到很激动。直到现在,我的很多Pi板载程序都是使用Python来开发,使用运行在Pi上面的编辑器(MC)来进行SSH连接。这种方式是可行的,而且毋庸置疑,Pi和Python大神们会提出更好的方式,不过这仍然会让人感觉回到了80年代的软件开发时代。我的项目需要为控制Pi的手持设备编写Android程序,如果使用之前的方式等于往伤口上洒盐,而我后来使用Android Studio来开发“真正”的Android程序,然后使用SSH来完全其它工作,一直到现在。\所有的例子都是有关上述的3个开发板,Pi 3是其中一个。通过Build.DEVICE常量可以在运行时决定是哪一种设备,所以你会看到很多类似这样的代码:\ public static String getGPIOForButton() { switch (Build.DEVICE) { case DEVICE_EDISON_ARDUINO: return "IO12"; case DEVICE_EDISON: return "GP44"; case DEVICE_RPI3: return "BCM21"; case DEVICE_NXP: return "GPIO4_IO20"; default: throw new IllegalStateException(“Unknown Build.DEVICE “ + Build.DEVICE); } }\这里对GPIO的处理很有意思,因为我只对Pi比较熟悉,所以我只能假设其它开发板也是以这种方式工作的。可以在这些地方定义输入和输出,并作为到外部世界的主要接口。Pi所使用的Linux发行版完全支持Python的读写操作,但对于Android来说,你必须使用NDK来编写C++驱动,然后通过JNI与Java进行交互。这样做不仅增加了难度,还让构建过程变得更加复杂。Pi设计了两个针脚的I2C接口,分别是时钟和数据,需要额外的工作来处理它们。I2C是一个强大的可寻址总线系统,它可以把多个针脚的数据串行化到一个针脚上面。让我们感到惊喜的是,我们现在可以直接在Android Things里完成这些工作。你只需要调用read()或write()方法来访问GPIO针脚,而I2C的操作也很简单:\public class HomeActivity extends Activity { // I2C Device Name private static final String I2C_DEVICE_NAME = ...; // I2C Slave Address private static final int I2C_ADDRESS = ...; private I2cDevice mDevice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Attempt to access the I2C device try { PeripheralManagerService manager = new PeripheralManagerService(); mDevice = manager.openI2cDevice(I2C_DEVICE_NAME, I2C_ADDRESS) } catch (IOException e) { Log.w(TAG, "Unable to access I2C device