Вы можете запускать приложения JavaScript Node прямо на своем телефоне Android, AVD или встроенном устройстве IoT. Я покажу вам шесть советов по использованию проекта с открытым исходным кодом Termux для эффективного прототипирования приложений Node на Android.
Выбор Android для ОС вашего IoT-устройства позволяет миллионам разработчиков мобильных устройств быстро получить доступ к вашей платформе. Однако выбора хорошей платформы недостаточно. Вы должны сделать так, чтобы многие разработчики могли с легкостью донести свои творческие идеи до стадии прототипа.
После двух лет помощи разработчикам в создании приложений для камеры на базе Android RICOH THETA я определил две ключевые области, в которых люди испытывают трудности: 1) разработчики приложений для Android могут не иметь опыта разработки облачных систем IoT, необходимых для обработки данных; 2) Бэкэнд-разработчики IoT могут не иметь опыта разработки под Android.
Чтобы помочь разработчикам быстро прототипировать свои идеи на устройствах Android IoT, многие люди в сообществе используют Termux для разработки RICOH THETA . Это служит мостом знаний для серверной части, написанной на JavaScript или Python, и приложения Android IoT для устройств, написанного на Java. Эти методы применимы для любого устройства Android, включая телефоны.
Код для проекта доступен на GitHub .
Вам также может понравиться:
Учебник для Android — Изучай Android с нуля!
Создайте веб-интерфейс для управления устройством Android
Создайте веб-интерфейс для взаимодействия с устройством Android для тестирования, настройки и демонстрации. Мое устройство представляет собой сетевую камеру Android, и я использую графический интерфейс для съемки и предварительного просмотра изображений. Это легко сделать с помощью Node , Express и Bootstrap . В примере моего фотоальбома используется модифицированный пример альбома с официального сайта Bootstrap.
Очень здорово запускать Node-сервер прямо на камере, так как у меня есть прямой доступ к файловой системе камеры, и я могу обрабатывать изображения локально внутри камеры перед передачей изображений на другой сервер или в приложение.
В этом примере я обрабатываю каждое изображение размером 5 МБ в камере с помощью GraphicsMagick для узла через пакет gm . Это учитывает преобразования, такие как стиль мультфильма с одной строкой кода.
Вот пример фрагмента.
JavaScript
1
gm('/sdcard/DCIM/100RICOH/' + item)
2
.edge(30)
3
.write(__dirname + '/media/paint/' + outputName, function(err) {
Для создания прототипа концепции и демонстрации ваших коллег или босса Node и Express очень просты. Мой предыдущий проект с Java и родным Android SDK был более сложным. Я создал веб-интерфейс на Java с помощью NanoHttpd и обработал обработку с помощью OpenCV с помощью Android NDK.
С помощью графического веб-интерфейса и отображения изображений вы можете немедленно передать свою концепцию и показать, что происходит в устройстве IoT.
Дополнительные подробности о создании WebUI здесь .
Включить SSH с ключами и локальным хранилищем
На встроенном устройстве вы должны загрузить Termux с сайта, такого как F-Droid , а не из Google Play. У меня есть более подробная информация о процессе установки в этой статье. Установите Termux apk с помощью adb:
Чтобы получить мой открытый ключ ssh на моем устройстве Android, я использую Vysor, который отображает виртуальный экран. У моего физического устройства нет экрана.
Мое устройство Android имеет доступ к Wi-Fi. Чтобы подключиться к Интернету и использовать Vysor через USB, я использую эту команду со своей рабочей станции:
$ adb shell settings put global usb_debug true
Затем я могу подключить камеру к Интернету через маршрутизатор Wi-Fi.
Вы можете проверить доступ в Интернет с помощью пинга к любому известному домену.
Обновите пакеты Termux.
В настройках Android включите разрешения для Termux.
Настройте хранилище Termux.
Проверьте Хранение. Вы должны иметь доступ к своим изображениям, музыке и фильмам на Android изнутри Termux.
Установите OpenSSH с помощью следующей команды: apt install openssh
.
Добавьте ваш открытый ключ
В вашей локальной системе скопируйте ваш открытый ключ в буфер обмена. Снимок экрана ниже с рабочей станции. Скопируйте содержимое id_rsa.pub в системный буфер обмена. Например, откройте файл в текстовом редакторе и скопируйте его с помощью CTRL-C .
Вставьте ключ .ssh/authorized_keys
на вашем устройстве Android.
Установите SSHD для автоматического запуска
Запустите SSHD, когда Termux запустится, добавив его в ваш .bashrc .
Войдите в устройство на порт 8022
Установите Emacs или tmux
Если вы знакомы с Emacs, это отличный способ открыть несколько окон в одном сеансе ssh.
Если вы не хотите использовать Emacs, вы можете использовать tmux для аналогичной функциональности.
4) Используйте Termux: загрузитесь, чтобы автоматически запустить приложение Node
Получите Termux: Загрузитесь с F-Droid.
Создайте новый файл ~/.termux/boot/startup
и добавьте эти строки:
Оболочка
xxxxxxxxxx
1
2
/data/data/com.termux/files/usr/bin/node /data/data/com.termux/files/home/Development/theta-termux-node/index.js
Убедитесь, что у вас есть полный путь к узлу index.js . Команда узла и имя файла index.js должны находиться по одному пути.
Настройте путь к местоположению вашего файла index.js
Теперь я могу запустить и Termux, и мое приложение-узел с помощью физической кнопки моего устройства Android. Для этого выполните следующие действия:
- Убедитесь, что камера выключена (должна быть выключена и не спать).
- Включите камеру с помощью кнопки физического питания.
- Нажмите и удерживайте нижнюю кнопку режима более двух секунд, чтобы перевести камеру в режим подключения.
- На одном из моих устройств я настроил отображение IP-адреса на небольшом OLED-дисплее. На другом устройстве я использую обнаружение сети, чтобы найти IP-адрес.
Используйте NeDB вместо MongoDB
Если вы знакомы с разработкой Node, вы можете выбрать MongoDB в качестве своей базы данных. MongoDB не работает на Termux. Хорошей новостью является то, что NeDB — чистый JavaScript и отлично работает в Termux на Android.
Вот краткий пример использования NeDB на Android с Node.
JavaScript
xxxxxxxxxx
1
const fs = require('fs');
2
const Datastore = require('nedb');
3
const images = new Datastore({ filename: 'images.db' });
4
const cameraPictureDir = '/sdcard/DCIM/100RICOH/'
6
images.loadDatabase();
9
function loadAll() {
12
fs.readdir(cameraPictureDir, (fileErr, items)=> {
13
if (!fileErr) {
14
console.log("About to insert these items \n" + items);
15
items.forEach(item => {
16
const image = {
17
title: 'Beautiful title for ' + item,
18
filename: item
19
}
20
images.insert(image, (err, doc)=> {
21
if (!err) {
22
console.log('Inserted', doc.filename, 'with ID', doc._id);
23
} else {
24
console.log(err);
25
}
26
});
27
})
28
} else {
30
console.log(fileErr);
31
}
32
});
33
}
34
function findAll() {
37
images.find({}, (err, doc)=> {
38
if (!err) {
39
console.log(doc);
40
} else {
41
console.log(err);
42
}
43
});
44
}
45
// loadAll();
47
// images.remove({_id: 'lZaB4KIijYsmIKde'});
48
findAll();
Так как я включил хранилище (см. Совет по включению хранилища выше), я могу напрямую получать доступ к снимкам с камеры /sdcard/DCIM/100RICOH/
.
Это вывод findAll()
функции.
Уменьшить размер данных на локальном устройстве
Большинство устройств IoT имеют доступ к большему количеству данных, чем может быть эффективно обработано в облаке. Эта проблема особенно остра, когда вы имеете дело с данными изображения и видео. Каждое изображение на моей камере имеет размер 5 МБ, а в обычном сеансе снимается сотни или тысячи изображений. Чтобы помочь с этой проблемой передачи огромных файлов данных по сети Wi-Fi, я уменьшил размер файла изображения с помощью gm .
JavaScript
xxxxxxxxxx
1
// reduce file size by reducing quality
3
app.post('/reduce-quality', (req, res) => {
5
let imageArray = [];
7
fs.readdir(ricohImageDir, (err, items) => {
8
items.forEach ((item) => {
9
if (isImage(item)) {
10
imageArray.push(item);
11
gm('/sdcard/DCIM/100RICOH/' + item)
12
.quality(30)
13
.noProfile()
14
.write(__dirname + '/public/gallery/' + item, function(err) {
15
if (!err) console.log('wrote reduced image file size ' + item);
16
});
17
}
18
});
19
});
20
});
оригинал
Средний размер файла 8 МБ
Уменьшается с компрессией с потерями
Средний размер файла 600 КБ
Качество 30%, размер 750 КБ, размеры 6720x3360, масштаб 100%
Качество 100%, размер 8,8 МБ, 6720x3360 пикселей, масштаб 100%
You can process the images down to thumbnails. This example shows how to reduce the 9MB image files down to 4K with 200x100 pixel size.
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
- Connect Android device to your Router with Wi-Fi.
- Connect a laptop to the same router.
- 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.)
- Clone code example from GitHub.
- Run
npm install
- Enter: node index.js.
- 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.
Install git.
Clone the repo.
Install Node
run npm install
Get the IP address if you don’t already know it. I’m getting it with
ifconfig
My IP address is 192.168.43.41.
Run node index.js
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.