Raspberry Pi IDE Java Development
The Raspberry Pi is an
incredible device for building embedded
Java
applications but, despite being able to run an IDE on
the Pi it really
pushes things to
the limit. It's much better to use a PC or
laptop to develop
the code and then deploy and test on
the Pi.
What I thought I'd do in this blog entry was to run through
the steps
necessary to set up NetBeans on a
PC for Java code development, with automatic deployment to
the
Raspberry Pi as part of
the build process.
I will assume that your starting point is a Raspberry Pi with an SD
card that has one of
the latest Raspbian
images on it. This is good because this now includes
the JDK 7 as
part of
the distro, so no need to download and install a separate
JDK. I will also assume that you have installed
the JDK and
NetBeans on your PC. These can be downloaded here.
There are numerous approaches you can take to this including mounting
the file system from
the Raspberry Pi remotely on your development
machine. I tried this and I found that NetBeans got rather upset
if
the file system disappeared either through network interruption or
the Raspberry Pi being turned off.
The following method uses
copying over SSH, which will fail more gracefully if
the Pi is not
responding.
Step 1: Enable SSH on
the Raspberry Pi
To run
the Java applications you create you will need to start Java on
the Raspberry Pi with
the appropriate class name, classpath and
parameters. For non-JavaFX applications you can either do this
from
the Raspberry Pi desktop or, if you do not have a monitor
connected through a remote command line. To execute
the remote
command line you need to enable SSH (a secure shell login over
the
network) and connect using an application like PuTTY.
You can enable SSH when you first boot
the Raspberry Pi, as
the
raspi-config program runs automatically. You can also run it at
any time afterwards by running
the command: sudo
raspi-config
This will bring up a menu of options. Select '8 Advanced Options'
and on
the next screen select 'A$ SSH'. Select 'Enable' and
the
task is complete.
Step 2: Configure Raspberry Pi Networking
By default,
the Raspbian distribution configures
the ethernet
connection to use DHCP rather than a static IP address. You can
continue to use DHCP if you want, but to avoid having to potentially
change settings whenever you reboot
the Pi using a static IP address is
simpler.
To configure this on
the Pi you need to edit
the /etc/network/interfaces
file. You will need to do this as root using
the sudo command, so
something like sudo
vi /etc/network/interfaces. In this file you will see this
line: iface eth0
inet dhcp
This needs to be changed to
the following: iface eth0
inet static
address 10.0.0.2
gateway 10.0.0.254
netmask 255.255.255.0
You will need to change
the values in red to an appropriate IP address
and to match
the address of your gateway.
Step 3: Create a Public-Private Key Pair On Your Development
Machine
How you do this will depend on which Operating system you are using:
Mac OSX or Linux
Run
the command: ssh-keygen -t
rsa
Press ENTER/RETURN to accept
the default destination for saving
the
key. We do not need a passphrase so simply press ENTER/RETURN for
an empty one and once more to confirm.
The key will be created in
the file .ssh/id_rsa.pub
in your home directory.
Display
the contents of this file using
the cat command: cat
~/.ssh/id_rsa.pub
Open a window, SSH to
the Raspberry Pi and login. Change
directory to .ssh
and edit
the authorized_keys
file (don't worry if
the file does not exist). Copy and paste
the
contents of
the id_rsa.pub
file to
the authorized_keys
file and save it.
Windows
Since Windows is not a UNIX derivative operating system it does not
include
the necessary key generating software by default. To
generate
the key I used puttygen.exe
which is available from
the same site that provides
the PuTTY
application, here.
Download this and run it on your Windows
machine. Follow
the
instructions to generate a key. I remove
the key comment, but you
can leave that if you want.
Click "Save private key", confirm that you don't want to use a
passphrase and select a filename and location for
the key.
Copy
the public key from
the part of
the window marked, "Public key for
pasting into OpenSSH authorized_keys file". Use PuTTY to connect
to
the Raspberry Pi and login. Change directory to .ssh and
edit
the authorized_keys
file (don't worry if this does not exist). Paste
the key
information at
the end of this file and save it.
Logout and then start PuTTY again. This time we need to create a
saved session using
the private key. Type in
the IP address of
the Raspberry Pi in
the "Hostname (or IP address)" field and expand
"SSH" under
the "Connection" category. Select "Auth" (see
the
screen shot below).
Click
the "Browse" button under "Private key file for authentication"
and select
the file you saved from puttygen.
Go back to
the "Session" category and enter a short name in
the saved
sessions field, as shown below. Click "Save" to save
the session.
Step 4: Test
The Configuration
You should now have
the ability to use scp
(Mac/Linux) or pscp.exe
(Windows) to copy files from your development
machine to
the Raspberry
Pi without needing to authenticate by typing in a password (so we can
automate
the process in NetBeans). It's a good idea to test this
using something like: scp /tmp/foo
[email protected]:/tmp
on Linux or Mac or pscp.exe foo
pi@raspi:/tmp
on Windows (Note that we use
the saved configuration name instead of
the IP address or hostname so
the public key is picked up). pscp.exe is another tool available from
the creators of PuTTY.
Step 5: Configure
the NetBeans Build Script
Start NetBeans and create a new project (or open an existing one that
you want to deploy automatically to
the Raspberry Pi).
Select
the Files tab in
the explorer window and expand your
project. You will see a build.xml
file. Double click this
to edit it.
This file will mostly be comments. At
the end (but within
the </project>
tag) add
the XML for <target
name="-post-jar">, shown below
Here's
the code again in case you want to use cut-and-paste: <target name="-post-jar">
<echo level="info" message="Copying dist
directory to remote Pi"/>
<exec executable="scp" dir="${basedir}">
<arg line="-r"/>
<arg value="dist"/>
<arg
value="
[email protected]:NetBeans/CopyTest"/>
</exec>
</target>
For Windows it will be slightly different: <target name="-post-jar">
<echo level="info" message="Copying dist
directory to remote Pi"/>
<exec executable="C:\pi\putty\pscp.exe" dir="${basedir}">
<arg line="-r"/>
<arg value="dist"/>
<arg
value="pi@raspi:NetBeans/CopyTest"/>
</exec>
</target>
You will also need to ensure that pscp.exe is
in your PATH
(or specify
a fully qualified pathname).
From now on when you clean and build
the project
the dist
directory will automatically be copied to
the Raspberry Pi ready for
testing.