Android. Связываем телефон с компьютером
По умолчанию программа работает в режиме Java. Но Processing поддерживает и другие режимы, в частности, Android. В верхнем правом углу нажмите на выпадающий список и выберите команду Add Mode....
В диалоговом окне выберите вариант Android Mode и нажмите кнопку Install.
На предыдущих скриншотах показаны уже установленные компоненты, у вас будет немного по-другому.
После загрузки необходимых файлов, вы сможете создавать полноценные приложения для Android (не забывайте переключаться в данный режим).
Приступаем к сложному этапу — подружить компьютер с телефоном. Мы напишем программу, которая будет передавать показания акселерометра телефона на компьютер, в свою очередь компьютер будет передавать статус нажатой кнопки мыши.
Для решения этой задачи нам понадобятся библиотеки: Ketai и oscP5.
Библиотека Ketai позволяет работать с датчиками, камерой, сетью и многое другое.
Библиотека oscP5 позволяет передавать сообщения между устройствами.
Устанавливаются они за пару щелчков. Открываем меню Sketch | Import Library | Add Library... и находим нужные библиотеки. Используйте фильтр для быстрого поиска.
Выбираем нужную библиотеку и нажимаем кнопку iInstall. Остальное программа сделает сама.
Для обмена сообщениями компьютер и телефон должны использовать общую Wi-Fi сеть. Далее следует узнать IP-адрес компьютера. В Windows это можно сделать через команду ipconfig
.
Запомним адрес и впишем его в скетч для Android-режима.
import netP5.*;
import oscP5.*;
import ketai.net.*;
import ketai.sensors.*;
OscP5 oscP5;
KetaiSensor sensor;
NetAddress remoteLocation;
float myAccelerometerX, myAccelerometerY, myAccelerometerZ;
float proximity;
String msg;
int x, y, p;
String myIPAddress;
String remoteAddress = "192.168.1.42"; // адрес вашего компьютера
void setup() {
sensor = new KetaiSensor(this);
//println(sensor.list()); // список всех датчиков
orientation(PORTRAIT);
textAlign(CENTER, CENTER);
textSize(40);
msg = "hello";
initNetworkConnection();
sensor.start();
}
void draw() {
background(78, 93, 75);
text("Remote Mouse Info: \n" +
"mouseX: " + x + "\n" +
"mouseY: " + y + "\n" +
"mousePressed: " + p + "\n\n" +
"Local Accelerometer Data: \n" +
"x: " + nfp(myAccelerometerX, 1, 3) + "\n" +
"y: " + nfp(myAccelerometerY, 1, 3) + "\n" +
"z: " + nfp(myAccelerometerZ, 1, 3) + "\n" +
"Датчик расстояния: " + proximity + "\n" +
"Message: " + msg + "\n\n" +
"Local IP Address: \n" + myIPAddress + "\n\n" +
"Remote IP Address: \n" + remoteAddress, width/2, height/2);
OscMessage myMessage = new OscMessage("accelerometerData");
myMessage.add(myAccelerometerX);
myMessage.add(myAccelerometerY);
myMessage.add(myAccelerometerZ);
myMessage.add(msg);
myMessage.add(proximity);
oscP5.send(myMessage, remoteLocation);
}
void oscEvent(OscMessage theOscMessage) {
if (theOscMessage.checkTypetag("iii"))
{
x = theOscMessage.get(0).intValue();
y = theOscMessage.get(1).intValue();
p = theOscMessage.get(2).intValue();
}
}
void onAccelerometerEvent(float x, float y, float z)
{
myAccelerometerX = x;
myAccelerometerY = y;
myAccelerometerZ = z;
}
void onProximityEvent(float d)
{
proximity = d;
}
void initNetworkConnection()
{
oscP5 = new OscP5(this, 12000);
remoteLocation = new NetAddress(remoteAddress, 12000);
myIPAddress = KetaiNet.getIP();
}
Так как наш телефон будет передавать данные через интернет, то необходим включить разрешение на его использование. Идём в меню Android | Sketch Permissions и ставим флажок у пункта Internet.
Запускаем приложение на телефоне (не забудьте включить Wi-Fi). На телефоне мы увидим данные от акслелерометра, датчика расстояния, текст сообщения и два ip-адреса: свой и удалённого компьютера. Запоминаем адрес телефона и вбиваем его в скетч в режиме Java.
import oscP5.*;
import netP5.*;
OscP5 oscP5;
NetAddress remoteLocation;
float accelerometerX, accelerometerY, accelerometerZ;
float proximity;
String msg;
void setup() {
size(480, 480);
oscP5 = new OscP5(this, 12000);
remoteLocation = new NetAddress("192.168.1.43", 12000); // ip-адрес телефона
textAlign(CENTER, CENTER);
textSize(24);
}
void draw() {
background(78, 93, 75);
text("Remote Accelerometer Info: " + "\n" +
"x: "+ nfp(accelerometerX, 1, 3) + "\n" +
"y: "+ nfp(accelerometerY, 1, 3) + "\n" +
"z: "+ nfp(accelerometerZ, 1, 3) + "\n\n" +
"Message: " + msg + "\n\n" +
"Датчик расстояния: " + proximity + "\n\n" +
"Local Info: \n" +
"mousePressed: " + mousePressed, width/2, height/2);
if (proximity == 0.0)
{
background(10, 10, 45);
}
OscMessage myMessage = new OscMessage("mouseStatus");
myMessage.add(mouseX);
myMessage.add(mouseY);
myMessage.add(int(mousePressed));
oscP5.send(myMessage, remoteLocation);
}
void oscEvent(OscMessage theOscMessage) {
if (theOscMessage.checkTypetag("fffsf"))
{
accelerometerX = theOscMessage.get(0).floatValue();
accelerometerY = theOscMessage.get(1).floatValue();
accelerometerZ = theOscMessage.get(2).floatValue();
msg = theOscMessage.get(3).stringValue();
proximity = theOscMessage.get(4).floatValue();
}
}
Запускаем скетч на компьютере. Телефон положите на стол. Наблюдайте за происходящим.
Нажимаем на кнопку мыши. Текст должен поменяться на mousePressed: true.
Посмотрите на телефон. Там надпись синхронно сменится на mousePressed: 1.
Отпускайте и нажимайте кнопку мыши, чтобы увидеть, что оба устройства видят друг друга и передают информацию о себе. Аналогично вы можете вращать телефон в руках и видеть на своем мониторе изменения показаний датчика акселерометра.
Это ещё не всё! Положите телефон на стол и прикройте его ладонью. Сработает датчик приближения и окно десктопного приложения внезапно изменит свой цвет.
Уберите ладонь, информация снова проявится.
Текст «hello» также был получен с телефона. Вы можете поменять его в коде для телефона и перезапустить скетч, чтобы увидеть изменения.