You can run JavaScript Node applications directly on your Android phone, AVD, or embedded IoT device. I’ll show you six tips to use the open source project, Termux, to effectively prototype Node applications on Android.

Choosing Android for the OS of your IoT device allows millions of mobile developers to quickly access your platform. However, choosing a good platform is not enough.  You need to make it super easy for many types of developers to bring their creative ideas to the prototype stage.

After two years of helping developers build applications for the RICOH THETA Android-based camera,  I’ve identified two key areas where people struggle: 1) Android app developers may not have experience developing cloud-based IoT systems needed to process data; 2) IoT backend developers may not have experience with Android development. 

To help developers rapidly prototype their ideas on Android IoT devices, many people in the community are using Termux for RICOH THETA development. This serves as a knowledge bridge for the backend written in JavaScript or Python and the Android IoT device app written in Java. These techniques are applicable for any Android device, including phones.

The code for the project is available on GitHub.

You may also like:
Android Tutorial – Learn Android From Scratch!

Build the Web GUI to Control the Android Device

basic-application-ui

Basic application UI

Build a web GUI to interact with your Android device for testing, configuration, and demos. My device is a networked Android camera, and I use the GUI to take and preview pictures. This is easy to do with Node, Express, and Bootstrap. My photo album example uses a modified Album example from the official Bootstrap site. 

It’s very cool to run the Node server directly on the camera, as I have direct access to the camera file system and can process images locally inside the camera before pushing the images to another server or application.

improved-application-ui

Improved application UI with Bootstrap

In this example, I’m processing each 5MB image inside the camera with GraphicsMagick for Node through the gm package. This allows for transformations, such as a cartoon styling with a single line of code.

Adding-effect-with-graphicsmagick

Adding effects with GraphicsMagick

Here’s an example snippet.

Link on GitHub.

For prototyping a concept and showing your peers or boss, Node and Express are super easy.  My previous project with Java and the native Android SDK was more difficult. I built the web GUI in Java with NanoHttpd and handled processing with OpenCV using the Android NDK.  

With a web GUI and image display, you can immediately convey your concept and show what is happening in the IoT device.

project-workflow

Project workflow

Additional details on building the WebUI is here.

Enable SSH With Keys and Local Storage

On an embedded device, you should download Termux from a site like F-Droid, not from Google Play.  I have more details of the setup process in this article. Install the Termux apk with adb:

Installing-termux-apk

Installing Termux

To get my public ssh key onto my Android device, I am using Vysor, which displays a virtual screen.  My physical device doesn’t have a screen.

Adding-ssh-key-to-Android-device

Adding ssh key to Android device

My Android device has Wi-Fi access. To connect to the Internet and use Vysor over USB, I use this command from my workstation:

 $ adb shell settings put global usb_debug true 

I can then connect my camera to the Internet through my Wi-Fi router.

Connecting-camera-to-wifi

You can test Internet access with a ping to any known domain.

testing-internet-connection

Testing internet connection

Update the Termux packages.

updating-termux

Updtaing Termux

In the Android settings, enable permissions for Termux.

enabling-permissions-for-Termux

Enabling permissions for Termux

enabling-permissions-for-termux

Set up Termux storage.

setting-up-termux-storage

Setting up Termux storage

Check Storage. You should be able to access your Android pictures, music, and movies from inside of Termux.

accessing-files-from-termux

Accessing files from Termux

Install OpenSSH with the following command: apt install openssh.

installing-openssh

Installing OpenSSH

Add Your Public Key

On your local system, copy your public key into your clipboard. The screenshot below is from the workstation. Copy the contents of id_rsa.pub into your system clipboard. For example, open the file in a text editor and copy it with CTRL-C

copying-id_rsa.pub

Paste the key into  .ssh/authorized_keys on your Android device.

adding-ssh-key-to-Android-device

Adding SSH key to Android device

Set SSHD to Automatically Start

Start SSHD when Termux starts by adding it to your .bashrc.

adding-sshd-to-.bashrc

Adding SSHD to .bashrc

Login to the Device on Port 8022

logging-into-device

Logging into device

Install Emacs or tmux

If you’re familiar with Emacs, it’s a great way to open up multiple windows through the same ssh session.

opening-mulitple-windows-with-emux

If you do not want to use Emacs, you can use tmux for similar functionality.

opening-mulitple-windows-with-emux

Opening multiple windows with Emacs

4) Use Termux:Boot to Start Your Node App Automatically

Get Termux:Boot from F-Droid.

Create a new file ~/.termux/boot/startup and add these lines:

Make sure you have the full path of node index.js. The node command and the index.js file name need to be on the same path.

Adjust the path to the location of your index.js file

I can now start both Termux and my node application with the physical button of my Android device. To do so, follow these steps: 

  1. Make suer the camera is powered off (must be off and not in sleep).
  2. Power camera on with the physical power button.
  3. Press the lower mode button for longer than two seconds to put the camera in plug-in mode.
  4. On one of my devices, I configured the IP address to appear on a small OLED display. On another device, I use network discovery to find the IP address.

Use NeDB Instead of MongoDB

If you’re familiar with Node development, you might reach for MongoDB as your database of choice.  MongoDB doesn’t run on Termux. The good news is that NeDB is pure JavaScript and runs great inside of Termux on Android.

Here’s a short example of using NeDB on Android with Node.

Since I’ve enabled storage (see tip on enabling storage above), I can access my camera pictures directly on /sdcard/DCIM/100RICOH/ .

This is the output of the  findAll()  function.

running-findall-with-neDB

Running findall with neDB

Reduce Data Size on Local Device

Most IoT devices have access to more data than can be handled effectively in the cloud. This problem is especially acute when you deal with image and video data. Each image on my camera is 5MB, and a typical session will capture hundreds or thousands of pictures. To help with this problem of transmitting huge data files over the Wi-Fi network, I reduced the file size of the image with gm.

Original

Average file size of 8MB

original-file-sizes

Original file sizes

Reduced with Lossy Compression

Average file size of 600K

reduced-file-sizes

Reduced file sizes

Despite the massive reduction in file size, the image quality looks okay.

30% Quality, 750kB size, 6720×3360 dimensions, 100% scalequality-reduction-after-compression

Quality reduction after compression

100% quality, 8.8MB size, 6720×3360 pixels, 100% scale

full-quality-after-compression

Full quality after compression

You can process the images down to thumbnails. This example shows how to reduce the 9MB image files down to 4K with 200×100 pixel size.

processing-images-to-thumbnails

Processing images to thumbnails

compression-output

Compression output

Additional Information on Installing Node

If you’re new to using Node on Android, I’ll include some information on how to get Node on Android running with Termux.

Steps

  1. Connect Android device to your Router with Wi-Fi.
  2. Connect a laptop to the same router.
  3. SSH into your Android device (assuming you have set up ssh public key) or use Termux from the command line. (See tip above to set up ssh public key.) 
  4. Clone code example from GitHub.
  5. Run npm install
  6. Enter: node index.js.
  7. Point the browser to http://ip-address:3000.

Note that you need to adjust the JavaScript example for your specific Android device.  

Make a directory for Development.

making-deployment-directory

Making deployment directory

Install git.

installing-git

Installing git

Clone the repo.

cloning-the-repo

Cloning the repo

Install Node
installing-node

Installing Node

run npm install

installing-dependenciesGet the IP address if you don’t already know it. I’m getting it with ifconfig

getting-ip-address

My IP address is 192.168.43.41.

Run node index.js

running-application

The server should start on port 3000.

Use a web browser to connect to the IP address and port. See this article for more information. Note that unless you’ve installed the sample code on a RICOH THETA Android device, most of the commands won’t work without modification. However, you can use the code example as a reference for your specific Android device.

Summary

Running Android on Node is a very fast way to build IoT prototypes on Android if the developer is already familiar with Node for backend development. This is a great way to test concepts, show peers, and managers. As most people use Termux on an Android phone with a screen, using Termux on an Android device with no screen can be tricky to set up. 

However, once the environment is properly set up, it is a very pleasant and stable development environment. Follow these tips to help you achieve a more blissful and aggravation-free coding experience. 

Further Reading



Source link

Write A Comment