arm架构安装rxtx_树莓派JAVA开发串口(RXTX)和GPIO(pi4j)

在RPI上完成了一个用JAVA开发的智能家居小项目,将RPI与单片机结合后可以对一些设备进行简单的控制。在项目中,RPI充当了服务器,它的性能对于这种小数据处理量的场合还是游刃有余的。而谈到控制,最简单的控制方式之一就是采用串行接口通信。因为项目采用JAVA语言进行开发,只能通过JNI调用底层的代码实现。至于JVM,原本需要安装预览版的JRE8。不过最新版本的系统镜像中已经内置了支持硬浮点运算的JRE7,因此JAVA环境不再需要额外安装。

在安装RXTX的时候还是遇到了一些小麻烦,因为目前Raspbian源中的librxtx似乎是在openJDK的基础上编译打包的,直接通过apt-get安装的librxtx无法在JRE7中使用。因此,只能从RXTX项目的网站上下载源码包进行编译安装了。

在撰写本文时,最新的RXTX稳定版本是rxtx 2.1-7r2。首先用wget获取源码包并解压

如果直接MAKE编译安装,可能会遇到以下两种错误:

错误1:/tmp/rxtx-2.1-7r2/./src/I2CImp.c:135: error: ‘UTS_RELEASE’ undeclared (first use in this function)

这是由于version.h中缺少’UTS_RELEASE’信息,需要手工添加。先获取当前系统的版本信息:

然后在/usr/include/linux/version.h中添加

3.10.24+为上一步中获得的版本号

错误2:libtool: install: armv6l-unknown-linux-gnu/librxtxRS485.la’ is not a directory

这个错误会出现在JDK1.6及以上的运行环境下,需要对configure文件进行修改。在configure文件中找到

这一行,在后边添加上当前JDK的版本号即可,如

完成以上两项修改后,就可以正常编译安装了。如果看到 Libraries have been installed in:/usr/lib/jvm/jdk-7-oracle-armhf/jre/lib/arm 则说明RXTX安装已经成功。

配置树莓派GPIO

1) 安装Java

要想控制继电器,我们必须先学会控制树莓派上的GPIO,控制GPIO有很多方式:python、wiringPi、pi4j。前两种方式的介绍网上有很多,所以我们这里介绍pi4j,该项目旨在为全面进入Raspberry Pi的提供本地库和Java之间的桥梁(This project is intended to provide a bridge between the native libraries and Java for full access to the Raspberry Pi.)。要想使用pi4j必须给树莓派安装Java,不过在最新的树莓派系统Raspbian中已经内置了Java(2013-12-20-wheezy-raspbian.zip),如果不知道你的树莓派中有没有Java,你可以使用javac -version 来查看是否有安装了Java。如下图出现了版本信息,就表示安装了Java。如果没有就去下载最新的Raspbian系统吧。

2) 安装Pi4j

打开树莓派的控制台输入下面的命令下载Pi4j文件:

wget http://get.pi4j.com/download/pi4j-0.0.5.deb

(如果你已经安装了Pi4j的其他版本,请先执行如下命令将其卸载掉:sudo dpkg -r pi4j)

下载完成后使用下面的命令安装:

sudo dpkg -i pi4j-0.0.5.deb

安装Pi4j库和示例文件:

/opt/pi4j/lib

/opt/pi4j/examples

到这里就已经安装完成了,如果想要卸载Pi4j执行如下命令:

sudo dpkg -r pi4j

3) Pi4j程序的编译与运行示例

要想编译使用Pi4j的程序必须指明其包的路径比如说我在home/pi/code/java/下编写了一个叫Test.java的程序,应该执行如下命令:

首先进入到程序的目录:

cd code/java

编译:

javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java

运行:

sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test

4、控制继电器

在home/pi/code/java/下新建java程序Test.java,功能就是让继电器每隔一秒就切换一下状态:

import com.pi4j.io.gpio.GpioController;

import com.pi4j.io.gpio.GpioFactory;

import com.pi4j.io.gpio.GpioPinDigitalOutput;

import com.pi4j.io.gpio.PinState;

import com.pi4j.io.gpio.RaspiPin;

/**

* 控制树莓派上的GPIO实例

* @author 亓根火柴

*/

public class Test {

public static void main(String[] args) throws InterruptedException {

// 创建一个GPIO控制器

final GpioController gpio = GpioFactory.getInstance();

// 获取1号GPIO针脚并设置高电平状态,对应的是树莓派上的12号针脚,可以参考pi4j提供的图片。

final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "LED", PinState.HIGH);

while(true){

//设置高电平

pin.high();

System.out.println("打开继电器");

//睡眠1秒

Thread.sleep(1000);

//设置低电平

pin.low();

System.out.println("关闭继电器");

Thread.sleep(1000);

//切换状态

//pin.toggle();

}

}

}

进入到程序的目录:

cd code/java

编译:

javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java

运行:

sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test

5、完整的Java代码 - 原文来自:http://blog.csdn.net/qigenhuochai/article/details/17661845

搭建好Yeelink平台后,我们可以用树莓派访问设备的状态链接以获得设备的当前状态,然后根据得到的状态来控制GPIO。编写程序每2秒获取一次状态,访问时间间隔不建议设置的太短。在home/pi/code/java/下新建java程序ControlLed.java,代码没有什么算法,都是基本的操作。如有不足望高手指点一二。

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import com.pi4j.io.gpio.GpioController;

import com.pi4j.io.gpio.GpioFactory;

import com.pi4j.io.gpio.GpioPinDigitalOutput;

import com.pi4j.io.gpio.PinState;

import com.pi4j.io.gpio.RaspiPin;

/**

* 远程控制树莓派上的GPIO实例

* @author 亓根火柴

*/

public class ControlLed {

GpioController gpio;

GpioPinDigitalOutput pin;

public static void main(String s[]){

//下面的链接就是你在Yeelink的设备的状态URL

String urlStr = "http://api.yeelink.net/v1.0/device/《这

里是你的设备编号》/sensor/《这里是你的传感器编号》/datapoints";

ControlLed cl = new ControlLed();

cl.gpio = GpioFactory.getInstance();

cl.pin = cl.gpio.provisionDigitalOutputPin

(RaspiPin.GPIO_01, "LED", PinState.HIGH);

boolean current = cl.getStatus(urlStr);

cl.setLedStatus(current);

while(true){

try{

if(cl.getStatus(urlStr) != current){

current = cl.getStatus(urlStr);

cl.setLedStatus(current);

}

Thread.sleep(2000);

}catch(Exception e){e.printStackTrace();}

}

}

public boolean getStatus(String urlStr){

URL url;boolean on = false;

try {

url = new URL(urlStr);

HttpURLConnection conn = (HttpURLConnection)

url.openConnection();

conn.setRequestMethod("GET");

InputStream in = conn.getInputStream();

BufferedReader rd = new BufferedReader(new

InputStreamReader(in));

StringBuilder tempStr = new StringBuilder();

while (rd.read() != -1) {

tempStr.append(rd.readLine());

}

//System.out.print("--> 服务器上传感器的信息:");

String status = tempStr.substring

(tempStr.lastIndexOf(":")+1, tempStr.length()-1);

//System.out.println(status);

on = status.equals("1")? true:false;

//System.out.println(on);

return on;

} catch (IOException e) {

e.printStackTrace();

}return on;

}

public void setLedStatus(boolean sta){

if(sta){

pin.low();

//因为我的继电器是低电平有效

System.out.println("--> 更新GPIO的状态: 开");

}else {

pin.high();

System.out.println("--> 更新GPIO的状态: 关");

}

}

}

MBH俱乐部小秘书一直在为大家服务,如果有需要请加小秘书的微信:


版权声明:本文为weixin_30806145原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。