在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俱乐部小秘书一直在为大家服务,如果有需要请加小秘书的微信:

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

  1. 浅谈三层架构 通过这个,+Java开发模式经验。终于相通了,动软到底是为什么这么做...

    浅谈三层架构 收藏 自己理解的原理 http://www.cnblogs.com/mahaisong/archive/2011/05/12/2044665.html 浅谈三层架构  通过这个,+Jav ...

  2. arm架构安装rxtx_Parallels推新版本 M1芯片Mac能安装Win 10

    搭载苹果自研M1芯片的Mac终于在上个月发布,性能表现也着实让人惊喜,但是由于基于ARM架构,系统的兼容性一直饱受质疑.然而Mac平台知名虚拟化软件Parallels最近宣布了一个令人振奋的好消息,新 ...

  3. 黑莓如何装java软件_安装BlackBerry的Java开发环境

    BlackBerry的开发工具现在是BlackBerry JDE.BlackBerry以前是提供了一个单独的IDE来开发应用程序,而现在提供的是一种Eclipse的插件形式,这也是业界的一个大势所趋. ...

  4. Java JDK安装教程 Idea Java开发环境配置教程

    文章目录 1.JDK和JRE之间的区别与关系: 2. Java SE Development Kit 15 Downloads 3. 安装Java JDK 4. 验证JDK是否安装成功 5. 使用id ...

  5. arm架构安装虚拟XP

    其实这是一个伪命题,arm架构怎么能够安装Windows XP呢?充其量应该算是模拟,没错,答题思路就是在系统上安装虚拟机,用arm虚拟机模拟x86架构安装Windows XP. 其实方法很简单,进入 ...

  6. 美团架构师深入讲解Java开发!java编程逻辑符号

    所以,我认为在你选择之前不妨好好想想什么是Java?你适不适合从事这份工作? Java开发是近20多年来最热门的编程语言,就业市场确实比较大,入门的难度也比C和C++要低,结合各方面来说,你选择Jav ...

  7. java开发串口步骤

    在做过一年多的RXTX操作串口项目有现在把一些平时遇到的问题在这里写写:  RXTX是一个开源包,主要是在COMM开源包中做扩张,以前的COMM包只能在WINDOWS下面对串口或并口做操作,扩充后的R ...

  8. day13,腾讯架构师深入讲解Java开发

    抽象方法 :被abstract所修饰的方法 抽象类:被abstract所修饰的类 抽象类的语法格式 抽象方法的语法格式 代码举例 package demo01; //定义抽象类 public abst ...

  9. 网易架构师深入讲解Java开发!BAT等大厂必问技术面试题

    前言 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询 ...

  10. String的内存分配与拼接操作,华为架构师深入讲解Java开发

    字符串拼接操作 常量与常量的拼接结果在常量池,原理是编译期优化 常量池中不会存在相同内容的变量 只要其中有一个是变量,结果就在堆中.变量拼接的原理是StringBuilder 如果拼接的结果调用int ...

最新文章

  1. python套接字编程_Python套接字编程(1)——socket模块与套接字编程
  2. Selenium3自动化测试——10.为百度搜索设置弹窗
  3. 【开发环境】Mac 中 IntelliJ IDEA 运行 Python 程序 ( 安装 Python Community Edition 插件 )
  4. oracle for循环_浅谈Oracle的执行计划
  5. 20162325金立清第三周作业
  6. MySQL-06:pyMySQL增删改查基本命令笔记
  7. matlab dtft的函数,DTFT的Matlab矩阵计算的理解
  8. Android10弹出截屏对话框,Android一个美丽而聪明的警告对话框SweetAlert
  9. process is bad
  10. 使用 Redis 实现一个轻量级的搜索引擎,牛逼啊!
  11. 关于:Google Chrome 官方下载地址
  12. Win11打印机状态错误怎么解决
  13. [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
  14. [转]performSelector延时调用导致的内存泄露
  15. 商品详情页中特别注意的三件事
  16. 浓眉大眼的Google Wave怎么也会死?
  17. 模糊数学Fuzzy Set第2讲——Fuzzy Logic Fuzzy Reasoning
  18. minui点击分页控件后滚动条置顶
  19. 左声道,右声道和立体声
  20. 在app中关闭第三方app

热门文章

  1. 关于jqui datepicker 使用enter选择日期后 点击input 没有打开日期控件问题
  2. SatSun CRMS V2010 整站系统
  3. linux 命令chmod 755的意思
  4. 《嵌入式C编程:PIC单片机和C编程技术与应用》一导读
  5. IIS 热启动设置的方法
  6. 【EDA】8 路彩灯控制器设计与实现
  7. 带你认识!通用网络安全开发包(Libdnet)
  8. 高中学习计算机技术,关于高中生学习计算机信息技术的思考
  9. Interfaces for Music音乐界面——翻译
  10. Python爬虫5-API和爬虫