Arduino a TCP komunikace

daew

Arduino a TCP komunikace
« kdy: 03. 03. 2013, 00:30:36 »
Ahoj, omlouvám se, můj dotaz sem asi nepatří, ale jelikož jsem neúspěšný již mnoho dní a nikde nemůžu vygooglit nic, co by mi pomohlo, poprosil bych o pomoc. Snažím se udělat dálkové ovládání z mobilu a arduina.

Zatím jen testuju TCP komunikaci. Napíšu-li program v Processingu (notebook IP 10.10.11.13) , tak Arduino připojené přes Ethernet Shield (IP 10.10.11.17) data přijímá-čte. Když zkompiluji ten programu do mobilu (IP 10.10.11.10), aplikace běží, ale Arduino již nic nečte. Komunikace mezi mobilem a Arduinem tedy asi nefunguje, nevím proč, ani  jak to ověřit. (V Processingu používám knihovnu oscP5.) Je nějaká základní chyba, kterou dělám? Androidu zatím moc nerozumím, ale snažím se do všeho postupně proniknout.
« Poslední změna: 03. 03. 2013, 20:47:23 od Petr Krčmář »


Re:Arduino, Processing, Android
« Odpověď #1 kdy: 03. 03. 2013, 01:26:51 »
Dotaz sem celkem patří, jsou tu lidi, kteří budou umět pomoct. Ale myslím, že by to chtělo lepší popis - co s čím komunikuje, jak jsi to testoval, jak přesně test dopadl.

Taky mi není úplně jasné to "zkompiluji ten programu do mobilu"... S tím mobilem Arduino komunikuje po sériáku a data chceš posílat přes nějaký 3G, nebo jak vlastně, nějak mi to z toho popisu není jasný :)

Pokud používáš datový přenost přes mobil, tak první věc, co udělej, je, že si ověř IP rozsahy - mobily bývají za naty a může to tam nějak kolidovat. Pro lepší radu by to asi fakt chtělo lepší popis situace...

daew

Re:Arduino, Processing, Android
« Odpověď #2 kdy: 03. 03. 2013, 08:20:55 »
Díky za reakci. Veškerá komunikace probíhá přes domácí router. Jen Arduino je připojeno ještě k noťasu seriákem,ale jen pro kontrolu toho, co Arduino dostává za data - Co Arduino přijme přes TCP, přeposílá do noťasu přes seriák a zobrazuji si to přes "Serial monitor" Arduino je připojeno přes Ethernet Shield a kabel. Noťas a mobil přes wifi. Arduino funguje jako server, má pevnou adresu (10.10.11.17) a poslouchá na portu 8808. Noťas i mobil dostávají adresu od DNS, port v nich je nastaven také na 8808. Kompilací do mobilu myslím toto, prostředí Processingu umožňuje tzv. ladějí na mobilu-program prostě nahraje přes USB kabel do telefonu a v něm se objeví nová aplikace. Na ní když kliknu, tak se normálně spustí, zobrazí se okno i  textem, ale po kliknutí na plochu mi to napíše "odeslano" (takže program běží), ale Arduino nic nezobrazí. Pustím-li to přímo v processingu, tak Arduino data přijímá.
Program pro processing vypadá takto(je to z Examplu pro knihovnu oscP5, jen jsem změnil port a IP):

import oscP5.*;
import netP5.*;

OscP5 oscP5tcpServer;
OscP5 oscP5tcpClient;
NetAddress myServerAddress;

void setup() {
  /* create  an oscP5 instance using TCP listening @ port 11000 */
  oscP5tcpServer = new OscP5(this, 8808, OscP5.TCP);
 
  /* create an oscP5 instance using TCP.
   * the remote address is 127.0.0.1 @ port 11000 = the server from above
   */
  oscP5tcpClient = new OscP5(this, "10.10.11.17", 8808, OscP5.TCP);
}
void draw() {
  background(0); 
}
void mousePressed() {
  /* the tcp client sends a message to the server it is connected to.*/
  oscP5tcpClient.send("/test", new Object[] {new Integer(1)});
  text("odeslano",10,10);
}
}

a v arduinu:

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10,10,11,17);
IPAddress gateway(10,10,11,1);
IPAddress subnet(255, 255, 255, 0);
byte stav[17];
const String passw = "daew";
const char head[] = "daew#";
EthernetServer server(8808);
boolean ethernetPasswOK = false;
boolean nactiStav = true;

void setup() {
  Ethernet.begin(mac, ip, gateway, subnet); // initialize the ethernet device
    server.begin();// start listening for clients
  Serial.begin(9600); // Open serial communications and wait for port to open:
  Serial.print("Chat server address:");
  Serial.println(Ethernet.localIP());
}

void loop() {
//ETHERNET
  EthernetClient client = server.available();
  if (client) {
    while (client.available()>0) {
      char thisChar = client.read();
      Serial.print(thisChar); }}
}

3ugeene

Re:Arduino, Processing, Android
« Odpověď #3 kdy: 03. 03. 2013, 12:03:34 »
ja teda taky asi nejak extra neporadim, ale pokud ti ten program nejede jen na androidu, tak tam bude treba problem s pravama nebo tak, on ten processing umi kompilovat primo pro android, zejo? Nejsem si jistej, jestli neni problem prave tam...


ja jsem s oscP5 delal par veci, ale jen mezi pc a arduinem nebo mezi pc a iPhonem, kde iPhone na to ma primo appku v Appstore.

daew

Re:Arduino, Processing, Android
« Odpověď #4 kdy: 03. 03. 2013, 14:14:58 »
přesně tak, ten Processing má tu kompilaci v sobě, ale právě nevím jestli se někde v nějakém config souboru něco nastavuje nebo jak to funguje, ale v om androidu to nechodí, resp. nechodí TCP spojení


J. V. Stalin

Re:Arduino a TCP komunikace
« Odpověď #5 kdy: 04. 03. 2013, 03:06:13 »
Takovej nápad: zkus se pomocí androidí aplikace co se jmenuje airdroid připojit k mobilu z počítače. Když to nebude fungovat, bude problém asi v routeru.

Re:Arduino a TCP komunikace
« Odpověď #6 kdy: 04. 03. 2013, 07:27:44 »

daew

Re:Arduino a TCP komunikace
« Odpověď #7 kdy: 04. 03. 2013, 08:00:18 »
díky za reakce
Stalin: hned jak přijdu z práce domů, tak to zkusím
Prýmek: tohle jsem vygooglil taky, fakt jsem se snažil :) ale nepoužívám právě tuto processing.net* library - o které je zmínka, ale uploadovanou oscP5 library

daew

Re:Arduino a TCP komunikace
« Odpověď #8 kdy: 04. 03. 2013, 09:42:24 »
tak ten Airdroid chodí výborně, mj. výborná aplikace

J. V. Stalin

Re:Arduino a TCP komunikace
« Odpověď #9 kdy: 04. 03. 2013, 20:19:09 »
já bych tomu processingu moc nevěřil, možná stojí za pokus tohleto http://myandroidsolutions.blogspot.cz/2012/07/android-tcp-connection-tutorial.html.

JmJ

  • ****
  • 325
    • Zobrazit profil
Re:Arduino a TCP komunikace
« Odpověď #10 kdy: 05. 03. 2013, 06:38:43 »
Ja bych z toho prozatim vynechal to arduino. V aplikaci pro android bych zmenil cilovou ip na ip notebooku a na notebooku bych si na danem portu pustil netcat v rezimu naslouchani. Pripadne na notesu pustit wireshark a sledovat co se deje. Pokud se nedeje nic, pak bych svedl problem na aplikaci v androidu. Jeste bych to overil tak, ze bych opet pustil natcat ovsem na portu 80 nebo wireshark, na telefonu bych pustil webovy prohlizec a zadal do adresy ip notebooku. Pokud toto projde, pak je problem s konkretni aplikaci, pokud to neprojde, pak mas nejspis problem v siti.

daew

Re:Arduino a TCP komunikace
« Odpověď #11 kdy: 10. 03. 2013, 10:27:20 »
Díky za nápady. Po týdnu jsem se dostal k PC. Podařilo se mi nalézt odpovídající knihovny, resp. knihovnu odpovídající oscP5 v processingu pro Arduino "gitHub" https://github.com/. Jsou tam uveřejněny i příklady, vše mi to funguje na jednoduchém příkladu, který je tam uveden , program jak pro Processing - Android, tak i pro Arduino, stačí uvést patřičné IP a zkompilovat. Myslím, že to bude dobrý odpich pro někoho, který bude mít stejný problém jako já.
Arduino:

#include <SPI.h>
#include <Ethernet.h>

#include <ArdOSC.h>

byte myMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte myIp[]  = { 10, 10, 11, 17 };
int  serverPort  = 10000;
int destPort=12000;
int ledPin =  13;

int flag=0;

OSCServer server;
OSCClient client;

void setup(){
 
 Serial.begin(19200);
 
 Ethernet.begin(myMac ,myIp);
 server.begin(serverPort);
 
 //set callback function & oscaddress
 server.addCallback("/ard/aaa",&func1);
 
 pinMode(ledPin, OUTPUT); 
 
}
 
void loop(){
 
  if(server.aviableCheck()>0){
 //    Serial.println("alive! ");
  }
 
}


void func1(OSCMessage *_mes){
  int value = _mes->getArgInt32(0);
  if(value!=1) return;
 
  //create new osc message
  OSCMessage newMes;
 
  //set destination ip address & port no
  newMes.setAddress(_mes->getIpAddress(),destPort);
  newMes.beginMessage("/ard/aaa");
 
  if(flag==1){
    flag=0;
    digitalWrite(ledPin, LOW);
  }
  else{
    flag=1;
    digitalWrite(ledPin, HIGH);
  }
  newMes.addArgInt32(flag);
 
  //send osc message
  client.send(&newMes);
 
}

Pro Processing - Android:

**
 * oscP5oscArgument by andreas schlegel
 * example shows how to parse incoming osc messages "by hand".
 * it is recommended to take a look at oscP5plug for an alternative way to parse messages.
 * oscP5 website at http://www.sojamo.de/oscP5
 */

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;


void setup() {
size(300,300);
  background(200);

  oscP5 = new OscP5(this,12000);
 
 
//  myRemoteLocation = new NetAddress("192.168.0.177",10000);
   myRemoteLocation = new NetAddress("10.10.11.17",10000);  //multicast address
 
 
}

void draw() {
 
 
}
void mousePressed(){
   println("send!!");
    sender();
}

void sender(){
  OscMessage myMessage = new OscMessage("/ard/aaa");
  myMessage.add(1);
  oscP5.send(myMessage, myRemoteLocation);
}



void oscEvent(OscMessage theOscMessage) {
  print("### received an osc message.");
 
  theOscMessage.print();
  if(theOscMessage.checkAddrPattern("/ard/aaa")==true) {
    if(theOscMessage.checkTypetag("i")) {
      int firstValue = theOscMessage.get(0).intValue();
      if(firstValue==1) background(100,100,0);
      else background(0,0,0);
    }
  }
}


daew

Re:Arduino a TCP komunikace
« Odpověď #12 kdy: 10. 03. 2013, 10:49:50 »
Nějak však nechápu úplně ty funkce. Dokázal bych uvedený příklad sice aplikovat na to, co potřebuju. Ale to u mne prostě nejde, potřebuju to celé pochopit. Nějak jsem před x lety zkončil u Pascalu a Cka. Tohle je na mne zatím moc. Byl by tu někdo, kdo by mne mohl trochu nakopnout s principem funke toho oscP5 protokolu? Z tohohle http://www.sojamo.de/libraries/oscP5/reference/index.html, to prostě zatím nepochopím. Celý projekt jsem chtěl koncipovat, že budu pouze přes IP posílat řetězce, ale tohle je složitější. Neumím si představit, jaký "fyzický" řetězec se vlasně přenáší.
   Chápu dobře, že toto : na vysílací straně : "newMes.beginMessage("/ard/aaa")" vytvoří novou "obálku" pro zprávu a to "/ard/aaa" je vlastně heslo pro ověření zprávy? zprávu přidám "myMessage.add(1)"? ta 1 je byte nebo char nebo co vlastně? může být v závorce i nějaký řetězec? nebo více zpráv oddělených něčím, např. tečkou?
   na přijímací straně "theOscMessage.checkAddrPattern("/ard/aaa")" ověřím správnost přenosového hesla, ale nevím co kontroluje "theOscMessage.checkTypetag("i")" a jaká hodnota se zapíše sem "int firstValue = theOscMessage.get(0).intValue()"? ta "1"ka?
   Chápu, že je to asi primitivní, ale potřebuji se od něčeho odpíchout. Tak pokud se najde někdo, kdo by mne občas trocu postrčil, byl bych moc vděčný.

Re:Arduino a TCP komunikace
« Odpověď #13 kdy: 10. 03. 2013, 13:17:26 »
Ten processing pro Android me hodne zajima, mam v planu to vyzkouset, akorat jsem ted nejak nenasel cas.

Mohl bys prosim uvest presnou adresu, odkud jsi stahoval tu knihovnu? (Github neni nazev projektu, to je web, kde je projektu milion)

daew

Re:Arduino a TCP komunikace
« Odpověď #14 kdy: 10. 03. 2013, 15:31:15 »
Á, sorry, nevšim jsem si, že to tam nedalo celý odkaz, knihovna ArdOSC:https://github.com/recotana/ArdOSC . Není asi moc známá, po desítkách hodin na googlu, jsem našel jen dotazy podobné jako ode mne, nikda žádná zmínka o řešení a o této knihovně.
Je u ní super, že v examplu je program pro obě strany - server, client a člověk nemusí nic testovat a dopustit se případné chyby. A chodí!