Hier mal der Quelltext des Sketches:
#include <RedFly.h>
byte ip[] = { 192,168, 72, 2 }; //ip from shield
byte netmask[] = { 255,255,255, 0 }; //netmask
#define UDP_PORT (1234) //local UDP port on the shield
uint8_t hUDP=0xFF; //socket handles
//serial format: 9600 Baud, 8N2
void debugout(char *s) { RedFly.disable(); Serial.print(s); RedFly.enable(); }
void debugoutln(char *s){ RedFly.disable(); Serial.println(s); RedFly.enable(); }
void setup()
{
uint8_t ret;
//init the WiFi module on the shield
ret = RedFly.init();
if(ret)
{
debugoutln("INIT ERR"); //there are problems with the communication between the Arduino and the RedFly
}
else
{
//scan for wireless networks (must be run before join command)
RedFly.scan();
//join network
//ret = RedFly.join("WLAN-SSID", "passwort123", INFRASTRUCTURE);
ret = RedFly.join("Connectify-arduinopc", "12345678", INFRASTRUCTURE);
if(ret)
{
debugoutln("JOIN ERR");
for(;;); //do nothing forevermore
}
else
{
//set ip config
ret = RedFly.begin(ip, 0, 0, netmask);
if(ret)
{
debugoutln("BEGIN ERR");
RedFly.disconnect();
for(;;); //do nothing forevermore
}
}
}
Serial.begin(9600); // open the serial connection at 9600bps
}
void loop()
{
uint8_t sock;
uint16_t buf_len, rd, len;
uint16_t port; //incomming UDP port
uint8_t ip[4]; //incomming UDP ip
char buffer[3], *ptr;
int receiveVar1;
//check if sockets are opened
if(RedFly.socketClosed(hUDP) || (hUDP == 0xFF))
{
hUDP = RedFly.socketListen(PROTO_UDP, UDP_PORT); //open UDP socket
}
//get data
sock = 0xFF; //0xFF = return data from all open sockets
ptr = &buffer[0];
buf_len = 0;
do
{
rd = RedFly.socketRead(&sock, &len, ip, &port, (uint8_t*)ptr, sizeof(buffer)-buf_len);
if((rd != 0) && (rd != 0xFFFF)) //0xFFFF = connection closed
{
ptr += rd;
buf_len += rd;
}
}while(len != 0);
//Buffer auswerten: wenn Länge gleich 3 und der Socket nicht geschlossen
if(buf_len == 3 && (sock != 0xFF) && sock == hUDP)
{
//Pointer an Stelle 0 des Buffers
ptr = &buffer[0];
//erstes Byte des Buffers ist der Modus
char modus = *(ptr);
//zweites Byte des Buffers ist der jeweilige Pin
int pin = (int)*(ptr + 1);
//drittes Byte des Buffers ist der Zustand
int state = (int)*(ptr + 2);
//Wenn der Pin zwischen 4 und 19 liegt
if(pin>=4 && pin<=19)
{
switch(pin)
{
case 14: pin = A0; break;
case 15: pin = A1; break;
case 16: pin = A2; break;
case 17: pin = A3; break;
case 18: pin = A4; break;
case 19: pin = A5; break;
}
if (*ptr == 'B') //read analog
{
//Pin als Input definieren
pinMode(pin, INPUT);
uint8_t val[1];
//Wert am Pin lesen und in die Variable speichern
//exakte Temperatur
float temperature;
temperature = analogRead(pin);
Serial.println("Exakter Sensorwert: ");
Serial.println(temperature);
int B=3975;
float resistance=(float)(1023-temperature)*10000/temperature;
float ctemperature=1/(log(resistance/10000)/B+1/298.15)-273.15;
Serial.println("Ermittelte Temperatur: ");
Serial.println(ctemperature);
val[0] = map(analogRead(pin), 0, 1023, 0, 100);
Serial.println("gemapter Sensorwert: ");
Serial.println(val[0]);
delay(100);
//Senden des Wertes an die IP, von dem der Eingangs-Buffer empfangen wurde
RedFly.socketSend(hUDP, val, 1, ip, UDP_PORT);
}else if (*ptr == 'E') //read digital
{
//Pin als Input definieren
pinMode(pin, INPUT);
uint8_t val[1];
//Wert am Pin lesen und in die Variable speichern
if(digitalRead(pin)==0){
val[0] = 0;
}else{
val[0] = 1;
}
delay(100);
//Senden des Wertes an die IP und an den Port, von dem der Eingangs-Buffer empfangen wurde
RedFly.socketSend(hUDP, val, 1, ip, UDP_PORT);
}else{
Serial.print("Wrong Command (not available modus): ");
}
}else{
Serial.print("Wrong Command (not available pin): ");
}
//Ausgeben des Eingangsbuffers über den Serial Monitor
Serial.print(modus);
Serial.print("-");
Serial.print(pin);
Serial.print("-");
Serial.println(state);
}
}
Und hier noch der Quelltext des Android :
package de.gerding.wert_auslesen_wifi;
import java.lang.reflect.Array;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import java.util.Arrays;
/**
* Klasse, die eine Kommunikation mit einem Arduino + RedFly/WiFly Shield ermöglicht. Sie beinhaltet Methoden zum senden und empfangen
* digitaler und analoger Werte und zusätzlich das Senden eines PWM Signals für die Servo-Steuerung
*
*/
public class ArduinoCommManager
{
public ArduinoCommManager()
{
super();
}
/**
* Liest den analogen Wert an dem spezifischen Pin des Arduino.
*
* @param pin der spezifische Pin, an dem der Zustand gelesen werden soll (14 bis 19 (14-19 = A0-A5))
* @param address die Adresse des Arduino (bzw. des RedFly/WiFly - Shields)
* @param port Port des Arduino
* @return den an dem spezifischen Pin anliegenden Zustand (0 bis 100)
*/
public int readAnalogValue(int pin, InetAddress address, int port) throws Exception
{
if (pin >= 14 && pin <= 19)
{
String commString = "B" + (char)pin + (char)0;
DatagramSocket socket = new DatagramSocket(1234);
socket.setSoTimeout(4000);
byte[] buf = commString.getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
byte[] buf_receive = new byte[1];
DatagramPacket packet_receive = new DatagramPacket(buf_receive, buf_receive.length);
do
{
try
{
socket.receive(packet_receive);
}catch(SocketTimeoutException ex)
{
socket.close();
throw new Exception("Arduino-Board antwortet nicht! Timeout!!");
}
} while (!packet_receive.getAddress().equals(address) || packet_receive.getPort() != port);
byte[] data = packet_receive.getData();
int value = Array.getInt(data, 0);
socket.close();
return value;
}else{
throw new Exception("Ungueltiger Pin!");
}
}
/**
* Liest den digitalen Wert an dem spezifischen Pin des Arduino.
*
* @param pin der spezifische Pin, an dem der Zustand gelesen werden soll (4 bis 19 (14-19 = A0-A5))
* @param address die Adresse des Arduino (bzw. des RedFly/WiFly - Shields)
* @param port Port des Arduino
* @return den an dem spezifischen Pin anliegenden Zustand (false=LOW, true=HIGH)
*/
public boolean readDigitalValue(int pin, InetAddress address, int port) throws Exception
{
if (pin >= 4 && pin <= 19)
{
String commString = "E" + (char)pin + (char)0;
DatagramSocket socket = new DatagramSocket(1234);
socket.setSoTimeout(4000);
byte[] buf = commString.getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
byte[] buf_receive = new byte[1];
DatagramPacket packet_receive = new DatagramPacket(buf_receive, buf_receive.length);
do
{
try
{
socket.receive(packet_receive);
}catch(SocketTimeoutException ex)
{
socket.close();
throw new Exception("Arduino-Board antwortet nicht! Timeout!!");
}
} while (!packet_receive.getAddress().equals(address) || packet_receive.getPort() != port);
byte[] data = packet_receive.getData();
socket.close();
if(Arrays.equals(data,new byte[]{0}))
{
return false;
}else if(Arrays.equals(data,new byte[]{1}))
{
return true;
}else{
throw new Exception("Ungueltige Antwort erhalten!");
}
}else{
throw new Exception("Ungueltiger Pin!");
}
}
}