如何分分钟成为Java嵌入式开发人员

用Java开发下一代嵌入式产品

在我10年的Java布道师生涯里,没有哪次Java新版本发布能让我如此兴奋。Java 8的发布不仅在语言本身加入了些不错的新特性,还在嵌入式开发上加入了很棒的功能,进行了优化,还有简洁的开发文档。如果你是一名Java程序员,并且准备好和我一同加入机器间技术的潮流,或者说开发下一代改变世界的设备,那么就让我们开始学习物联网(IoT)把。

在你开始嵌入式开发之前,你需要知道你具体想要开发出什么,以及你打算在哪运行你的程序。这十分重要,因为得根据目的选择不同版本的Embedded Java。

如果你想要开发跟桌面应用相似的应用,或者你想要开发出优美的UI,那么你需要选择从Java SE衍生出来的Oracle Java SE Embedded版本。它支持同Java SE一样的平台和功能。此外,它还提供了其它特性,兼容更多平台,小巧的Java运行环境(JREs),支持headless模式配置,以及内存优化。

如果你想要更方便地连接如开关、传感器、马达之类的外设,Oracle Java ME Embedded将是你最好的选择。它具有设备访问API,为嵌入式平台最常见的外设提供了接口:通用输入/输出(GPIO)、集成电路总线(IIC)、串行外设接口总线(SPI)、模数转换器(ADC)、数模转换器(DAC)、通用异步收发传输器(UART)、内存映射输入输出(MMIO)、AT命令设备、看门狗定时器、脉冲计数器、脉冲宽度调制器(PWM)和通用设备。

至于设备,Embedded Java覆盖了大部分的平台,从传统的Java SE桌面平台与服务器平台到基于STM微处理器的STM32F4DISCOVERY板、树莓派和windows平台。在这篇文章中,我将使用树莓派,不仅仅是因为它是十分强大,且只有卡片大小的计算机,还因为它价格便宜。最新版只要35美元。

准备树莓派

树莓派需要一张存有Linux镜像的SD卡才能开机。因为树莓派没有硬盘,SD卡就被用来存储运行所需的Linux镜像。该SD卡也被当作存储设备用于加载其它的应用程序。

配置SD卡请按以下步骤操作:

  1. 格式化SD卡。
  2. 下载Raspbian(一个专为树莓派优化的基于Debian的免费操作系统)。
  3. 创建一个可引导的镜像。使用像Win32 Disk Imager这样的应用可以更方便地创建镜像。

当你准备好SD卡之后,树莓派就可以开机了。第一次开机时,树莓派会加载软件配置工具让你进行基本的设置。以下是此时应该注意的选项:

  1. 勾选“扩展文件系统(Expand Filesystem)”选项,使操作系统对整个SD存储具有权限。
  2. 选择“国际化(Internationalisation)”选项中选择与当地对应的语言与区域。
  3. 在主菜单选择“高级(Advanced)”选项,通过开启SSH将树莓派设置为headless嵌入式设备模式(没有显示器)。
  4. 设置静态IP地址,确保树莓派总以相同的IP地址接入。虽然这不是必须的,但我发现在树莓派headless模式下总是很有用。设置静态IP需要编辑/etc/network/interfaces文件如下图:

(图1)

现在你已经准备好了连接树莓派,你可以选择使用[PuTTY](http://www.putty.org/)连接。如下图:

(图2)

在树莓派上安装Embedded Java

现在是时候决定你打算在你的设备上运行什么样的应用了。我个人喜欢搞外设,所以在这篇文章中我将使用Oracle Java ME Embedded,这样我才能使用设备访问API。但是你也可以用Oracle Java SE Embedded来开发树莓派应用。

在树莓派上安装Oracle Java ME Embedded二进制文件十分简单,只需要通过SSH连接用FTP协议把树莓派版本的zip压缩文件从桌面传输到树莓派,然后再解压到一个新目录就好了。

集成开发环境

使用Java ME SDK和NetBeans IDE是创建嵌入式应用不错的选择。这两者结合就能在设备上运行之前先在虚拟机中进行测试,并且能够自动地将代码传输到树莓派运行,甚至能在运行时调试。你所需要做的只是确保Java ME SDK是IDE的Java平台的一部分。你需要在 工具->Java平台 点击“添加平台”的选项,然后选择SDK的路径。

为了能够远程管理树莓派上的嵌入式应用,你需要运行应用管理系统(AMS)。通过SSH,运行以下代码:

pi@raspberrypi sudo

javame8ea/bin/usertest.sh

第一个嵌入式应用

Oracle Java ME Embedded应用与Java ME应用看起来完全一样,就如下例:

你的应用必须继承MIDlet类,并且重写两个生命周期方法:startApp和destroyApp。这两个方法分别在应用启动时和快结束前被调用。以上代码能在控制台输出信息。

打开LED灯

现在让我们做些更有趣的事,比如通过开关来实现开启和关闭LED灯。首先让我们看下树莓派的通用外设输入输出(GPIO)管脚。

(图3)

通用外设输入输出连接器(GPIO connector)上有许多不同的连接类型管脚:

– 通用外设输入输出管脚(GPIO)

– 集成电路总线管脚(IIC)

– 串行外设接口管脚(SPI)

– RxTx串口管脚

这意味着我们有好几个选择可以连接LED和开关,以上任何一个GPIO管脚都可以,只要记住管脚数字和外设ID,因为你需要这些信息才能用代码指向这些设备。

现在按照下图焊接电路。注意我们将LED连接到16管脚(GPIO 23),把开关连接到11管脚(GPIO 17)。同时加上 两个电阻以保证电压在安全范围之内。

(图4)

现在让我们看下程序。设备访问API中的PeripheralManager类能够让你用外设ID连接到任何类型的外设,这能够极大地简化代码。比如要连接LED,只需要用静态方法open,提供管脚ID 23如下代码:

要改变LED的值(即开关函数)只要用setValue方法传入相应参数:

这实在不能再简单了。

我们能用PeripheralManager中同样的open方法来连接开关,但我们将用稍微不同的方法来设置一些配置信息。首先,创建GPIOPinConfig对象(代码3),其中包含了如下信息:

外设名称

– 管脚号 – 传输方向:输入、输出还是双向 – 模式:上拉、下拉还是开漏 – 触发器:无触发、下降沿触发、上升沿触发还是双边沿触发,高电平触发、低电平触发还是双电平触发 – 初始值

接着我们用该配置对象调用open方法,如下:

我们也可以给管脚添加监听器,这样管脚值一旦发生改变,我们就能够知道。在这个例子中,我们想要知道什么时候开关的值发生了改变,这样我们就能相应的改变LED的值:

button1.setInputListener(this); 然后实现valueChanged方法,当监听器事件发生时就调用该方法。

在结束时关闭管脚是十分重要的,同时还要保证关掉了LED。

整个类的代码可以在链接找到。

现在,我们剩下的只有MIDlet来启用我们的代码了。代码7中的startApp方法会生成一个对象来控制我们的两个通用输入输出设备(LED和开关),并且监听我们的输入。stopApp方法则保证所有东西都被正确地关闭。

感知环境

做到LED和开关已经十分不错,但感知周围环境才是真正有意思的。在下面的例子中,我将演示如何着手使用IIC协议的传感器。

IIC设备可能是最常见的设备,它们最大的有点是设计简单。IIC只有两条双向的开漏线:串行数据线(SDA)和串行时钟线(SCL)。

总线上的设备都会有一个特殊的地址。主控制器通过在串行数据线上发出开始请求和设备地址建立通讯连接。如果对应地址的设备空闲,则返回请求。然后数据就在串行数据线上传输,用串行时钟线来控制每一比特的时间。

一旦通讯结束,控制器就发出停止请求。这样的协议使得在两条总线上得以增加多个设备。

启动树莓派的集成电路总线

如果你查看树莓派的管脚图(图3),你会发现两个IIC管脚:管脚3是数据总线,管脚5是时钟总线。IIC默认未开启,所以我们需要采取以下步骤才能让我们的应用使用总线。

首先,用终端连接树莓派,然后在/etc/modules文件增加一下两行:

i2c-bcm2708 i2c-dev

i2c-tools包十分有用,它能够检测设备,保证一切正常运转。可以通过以下命令安装:

sudo apt-get install python-smbus sudo apt-get install i2c-tools

最后,树莓派中有个黑名单文件/etc/modprobe.d/raspi-blacklist.conf,默认情况下SPI和IIC都在该名单中。这意味着除非我们移除它们或者把他们设为注释,IIC和SPI在树莓派上是不能用的。编辑该文件去除以下两行:

blacklist spi-bcm2708 blacklist i2c-bcm2708

重启树莓派,确保应用所有的修改。

添加传感器

Bosch Sensortec的BMP180传感器是测量大气压和气温的经济解决方案。由于气压随着海拔高度改变,你也可以把它当作海拔高度测量仪。BMP180使用IIC协议,工作电压为3V到5V,十分适合连接到树莓派。

按照以下的图5把BMP180焊接到树莓派上。通常情况下,使用IIC设备时需要需要在串行数据线和串行时钟线加上一个上拉电阻。幸运的是,树莓派支持上拉电阻,所以你只需要把它们连接在一起。

(图5)

在你把传感器连接到树莓派之后,就可以检查是否能看到IIC设备了。在树莓派上运行以下命令:

sudo i2cdetect -y 1

你应该能在表格中看到设备。图6中显示了两个IIC设备:一个在地址40,另一个在地址70。

使用IIC设备来获取温度 在你编程连接IIC设备之前有一些必须知道的事项:

  • 设备地址是多少?IIC使用7位作为设备地址,树莓派使用IIC总线1。
  • 寄存器的地址是多少?在我们的例子中,我们将读取温度值,而相应寄存器地址是0xF6。(针对BMP180)
  • 是否需要设置控制寄存器来启动传感器?某些设备默认处于睡眠状态,除非我们启动它,否则它是不会监测任何数据的。此处设备的控制寄存器地址是0xF4。(针对BMP180)
  • 设备的时钟频率是多少?BMP180频率为3.4Mhz。

代码8将BMP180的这些参数设置为静态变量供之后的代码使用:

编程连接设备依然是使用PeripheralManager类的静态方法open。该处我们将针对IIC设备创建一个I2CDeviceConfig对象(代码9)。该对象能让我们设定设备的总线,地址,地址位数(比特单位)和时钟速度。

要读取温度,我们需要采取以下步骤:

  1. 按代码10a和代码10b从设备读取校准数据。该步只针对BMP180传感器,使用其它温度传感器时不一定需要这一步。

2.写入到设备上的一个控制寄存器,初始化温度传感器(代码11)。

3.读取未补偿温度为两个字节的变量,用校准常量得出真实的温度。代码如下(依然针对BMP180)

最后,摄氏度为单位的温度数据就被保存在了celsius变量中。你可以在链接找到整个程序。

作为练习,你也可以把该程序扩展到读取压力、海拔或者两者。

总结:

我们通过演示如何使用GPIO和IIC设备的真实案例学习了如何创建Java嵌入式应用。现在是时候轮到你自己在树莓派上连接更多设备了,希望你喜欢树莓派嵌入式Java开发。

原文发布于微信公众号 - java一日一条(mjx_java)

原文发表时间:2016-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哲学驱动设计

“秒杀”心得

    本文记录对某网站A的秒杀活动编写秒杀器的经历和技术重点。 故事回顾     某日早上,朋友给我说最近A网站在开展秒杀活动,有IPad、IPhone,让大...

36680
来自专栏V站

图片API丨V站二次元随机图片API(自判断)

①于2018.03.31公布,采用高速服务器运行! ②PC版随机图片拥有200+张,PE版拥有100+张超精美二次元风随机图片,每星期一更! ③全程免费,欢迎支...

4.9K100
来自专栏张戈的专栏

WordPress发布文章主动推送到百度,加快收录保护原创

工作实在太忙,也没时间打理网站。最近公司额外交待了一些网站 SEO 方面的优化任务让我关注(这就是啥都要会、啥都要做的苦逼运维的真实写照了...)。 于是抽空看...

38460
来自专栏京东技术

多级缓存设计详解 | 给数据库减负,刻不容缓!

物流研发部架构师,GIS技术部负责人,2012年加入京东,多年一线团队大促备战经验,负责物流研发一些部门的架构工作,专注于低延迟系统设计与海量数据处理。曾负责青...

55260
来自专栏北京马哥教育

性能调优攻略

关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈...

47250
来自专栏Java3y

操作系统第七篇【设备管理】

14230
来自专栏北京马哥教育

一秒内诊断 Linux 服务器的性能

60,000 毫秒内对 Linux 的性能诊断 当你为了解决一个性能问题登录到一台 Linux 服务器:在第一分钟你应该检查些什么? 在 Netflix,我们有...

40260
来自专栏VMCloud

【解析向】腾讯云的Windows Server日志配置收集工具是个什么鬼?(5)

且听笔者一句劝,无论是Windows还是Linux抑或是Unix都是大部分理论是相同的,与其与人争吵对比这几个平台之类的差异,不如好好研究下底层的各个子系统...

28470
来自专栏鹅厂网事

高性能网关设备及服务实践

针对海量的网络流量,转发性能是我们最关键的一个方面,那构建高性能的后台服务器有哪些关键的技术和需要注意的地方。

90980
来自专栏工科狗和生物喵

计算机操作系统概念初解

一、存储系统 在计算机系统中存储层次可分为,处理器上的寄存器、高速缓冲存储器、主存储器(内存)、辅助存储器(外存)四级。高速缓冲存储器用来改善主存储器与中央处理...

36080

扫码关注云+社区

领取腾讯云代金券