1

我有安装了 Raspbian Linux 的 Raspberry Pi 2 型号 B。我必须创建并启动在 LCD 模块 SC1602a 上打印文本的 linux 服务。它看起来像这样:

[ 这个]

我使用 Java 语言 1.8_x86 、Apache Commons Daemon 和 jsvc 创建我的守护程序服务。我还使用pi4j 项目(这是 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/ 。我也是chmod +x lcd从文件夹 /etc/init.d 中写的。这是我的脚本:

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 模块上打印任何信息。我打开日志文件并找到下一个信息:

液晶输出:

2015-08-20 12:59:09.934 [INFO] - 初始化方法...

液晶显示器错误:

接线PiSetup:无法打开/dev/mem:不允许操作服务退出,返回值为1

如您所见,尝试加载 pi4j 驱动程序时应用程序失败。我尝试扩展 dev/mem 文件的访问规则,我做到了,文件有rwxrwxrwx但服务仍然无法正常工作。

init()我也从方法中关闭了 LCD 初始化。服务启动良好,因此无需 LCD 服务也能正常运行。

有人知道解决方案吗?非常感谢

4

0 回答 0