我有Raspberry Pi 2型号B,安装了Raspbian Linux。我必须创建并启动linux服务,在LCD模块SC1602a上打印文本。它看起来像这样:
[]
我使用Java语言1.8_x86,Apache Commons Daemon和jsvc创建我的守护程序服务。我还使用pi4j project(这是WiringPi的包装器)来管理Raspberry Pi引脚。 Java类:
public class Application implements Daemon{
public static void main(String[] a){
Application app=new Application();
app.init(null);
app.start();
System.in.read();
application.stop();
application.destroy();
}
public void init(DaemonContext daemonContext) throws Exception {
LogUtil.info("Init method...");
GpioController gpio = GpioFactory.getInstance();
LogUtil.info("GpioController instance created...");
GpioLcdDisplay lcd;
lcd = new GpioLcdDisplay(2, 16, RaspiPin.GPIO_00, RaspiPin.GPIO_02, new Pin[]{RaspiPin.GPIO_03, RaspiPin.GPIO_04, RaspiPin.GPIO_05, RaspiPin.GPIO_06});
LogUtil.info("LCD instance created...");
lcd.clear();
lcd.write(new Date().toString());
LogUtil.info("Init compeleted:");
}
public void start() throws Exception {}
public void stop() throws Exception {}
public void destroy() {}
}
我使用maven打包我的工件。我使用WinScp将工件移动到Raspberry Pi。
当我从命令行java -jar application.jar
启动此应用程序时,它运行良好。应用程序打印到LCD模块“hello”字符串。
接下来我尝试启动我的应用程序,如linux服务。我在Raspberry Pi上安装了jsvc,创建了脚本lcd
并将其移动到文件夹/etc/init.d/。我还从文件夹/etc/init.d写了chmod +x lcd
。这是我的剧本:
NAME="lcd"
DESC="Lcd Application"
EXEC="/usr/bin/jsvc"
FILE_PATH="/root/lcd"
JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt
CLASS_PATH="$FILE_PATH/lcd.jar:/usr/share/java/commons-daemon-1.0.15.jar"
CLASS="com.mycompany.Application"
ARGS=""
USER="root"
PID="/var/run/$NAME.pid"
LOG_OUT="$FILE_PATH/$NAME.out"
LOG_ERR="$FILE_PATH/$NAME.err"
jsvc_exec()
{
cd $FILE_PATH
echo $CLASS_PATH
sudo $EXEC -home $JAVA_HOME -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS $ARGS
}
case "$1" in
start)
echo "Starting service LCD"
jsvc_exec
echo "Service started"
;;
//many unimportant information
我写命令service lcd start
。
这种方式不起作用。在这种情况下,应用程序不会在LCD模块上打印任何信息。我打开了日志文件并找到了下一个信息:
lcd.out:
2015-08-20 12:59:09.934 [INFO] - 初始化方法......
lcd.err:
wiringPiSetup:无法打开/ dev / mem:不允许操作 服务退出,返回值为1
正如您所见,在尝试加载pi4j驱动程序时应用程序失败。我试图扩展dev / mem文件的访问规则,我做了它,文件有rwxrwxrwx
但服务仍然无效。
我还从init()
方法关闭了LCD初始化。服务开始很好,所以服务很好,没有LCD。
有人知道解决方案吗?非常感谢