Tinkerforge

Tinkerforge Expedition

Neben meinen Raspberry Pi Experimenten bin ich auf die Module von www.tinkerforge.com aufmerksam geworden. Neugierig von den angepriesenen Möglichkeiten und „einfachen“ Nutzung habe ich mir gleich mal einen bestellt. Konkret, einen sogenannten Master Brick und ein IO4 Bricklet.

Was steckt dahinter: Der Masterbrick ein der Master zwischen Host (z.B. ein PC) und den Funktionen der Erweiterungen, sogn. Bricklets (bei mir ein IO4fach). Weiterhin wird auf dem Host ein Dienst installiert, der es ermöglicht via localhost auf den Master Brick zuzugreifen. Danach kann man seine Bricklets adressieren.

Mit dem Gedanke, es muß innerhalb einer Stunde funktionieren, habe ich mich an das Ziel gemacht, mittels einem Druckknopf (Input) – 2 LEDs für eine gewisse Zeit anzuschalten. Lets go…

  • Dienst installiert (bei mir Windows)
  • Bricklet mit Master verbunden
  • Master an USB angeschlossen
  • Eclipse, neues Projekt
  • JAR hinterlegt
  • Beispiel geladen (hier mal Hut a, es gibt für JEDEN Bricklet für jede angebotene Sprache ein Beispiel, COOL!

Danach mußte ich nur noch kapieren, wie ich die IO’s ansteuere und fertig war das ProjektIMG-20130115-00016

Zeit: 20 min

FAZIT: Craß Jungs, ihr haltet was ihr versprecht!

import com.tinkerforge.BrickletIO4;

import com.tinkerforge.IPConnection;

public class ExampleInterrupt {

private static final String host = “localhost”;
private static final int port = 4223;
private static final String UID = “ae1″; // Change to your UID

// Note: To make the example code cleaner we do not handle exceptions. Exceptions you
//       might normally want to catch are described in the commnents below

public static void main(String args[]) throws Exception {

// Create connection to brickd
IPConnection ipcon = new IPConnection(host, port); // Can throw IOException
final BrickletIO4 io4 = new BrickletIO4(UID); // Create device object

// Add device to IP connection
ipcon.addDevice(io4); // Can throw IPConnection.TimeoutException

// Don’t use device before it is added to a connection
// Add and implement listener for interrupt (called if pin 0 changes)
io4.addListener(new BrickletIO4.InterruptListener() {

public void interrupt(short interruptMask, short valueMask) {
System.out.println(“Interrupt by: ” + Integer.toBinaryString(interruptMask));
System.out.println(“Value: ” + Integer.toBinaryString(valueMask));
io4.setConfiguration((short)(1 << 1), ‘o’, true);
io4.setConfiguration((short)(1 << 0), ‘o’, true);
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
io4.setConfiguration((short)(1 << 1), ‘o’, false);
io4.setConfiguration((short)(1 << 0), ‘o’, false);
}
});
// Enable interrupt on pin 3
io4.setInterrupt((short)(1 << 3));
}
}

Mein Raspberry…

nu ist er auch da… und ich fang mal an zu basteln…

 

IMG-20130108-00013

Raspberry PI und die Kaffemaschine

Zuletzt war ich mit meinem Kollegen Sascha Wolter (www.wolter.biz) bei Oracle unterwegs und haben ein paar nette Sachen gemacht:

Eine Kaffeemaschine mit dem Handygesteuert, aber seht selbst:

http://www.wolter.biz/2012/11/the-voice-controlled-coffee-machine/

Nokia Fail…

Ohne Wort Jungs… ich mag echt eure Telefone, aber das geht gar nicht…

 

http://www.alexanderwilde.com/2012/09/nokia-lumia-920-pureview-fail/

 

Simple Conference Call on WP7 / Developer Garden API

Konferenzen starten, uhhh – umständlich mit einem Handy…

Der Developer Garden, die Entwicklerplattform der Deutschen Telekom, bietet eine sehr schicke REST basierende Conference Call API an. Die habe ich mir mal näher angesehen und mit dem aktuellen .Net SDK mal auf Windows Phone gebracht. Sehr einfach ist nämlich, dass .Net SDK schon syncrone und asyncrone Methoden mitbringt.

Bezahlen muß man das ganze auch und erfolgt durch anlegen eines Accounts im Developer Center (www.developercenter.telekom.com) und natürlich aufladen des Kontos.

Danach einfach die App aufs Windows Phone laden

http://www.windowsphone.com/de-DE/apps/da18bbe0-e5c7-4abe-a182-8c3e5c1afbdc

und mit den Developer Cneter Usernmae und Passwort anmelden. Schon könnte Ihr einfach eine Konferenz aus euren Kontakten zusammen stellen und durchführen.

Windows Phone 7 und OAuth 2.0

Im Zuge der rasanten App-Entwicklung haben sich auch die sicheren Login Methoden wie OpenID oder OAUTH schnell entwickelt. Schnell findet man für diverse Plattformen wie iOS oder Android erste Bibliotheken bzw Sample Clients, um OAuth in der aktuellen Version 2.0 nutzen zu können.

Hier nun ein Beispiel, wie Ihr für Windows Phone 7 (WP SDK 7.1) dies nutzen könnt.

OAuth Sieht vor, eine URL zum Login im Browser aufzurufen mit diversen Attributen: /authorize?client_id={0}&response_type=code&scope={1}&redirect_uri={2}

Die Werte erhält man aus der OAuth Konfiguration des jeweiligen Provider. Wichtig ist nur, dass man eine RedirectURI angibt, an die am Ende des Autorisierungsprozesses des Kunden, der Autorosierungscode gesendet wird. Viele Frameworks behelfen sich dabei sogenannter Custome Schemas. In Adroid z.B. ist es ein Name eines Intends. Diese Möglichkeit besitzt leider WP SDK 7.1 noch nicht. Daher muß man sich hier einer “Krücke” bedienen. Konkret, wir geben eine eigene im Web erreichbare URL an, an die der Code gesendet wird. Wichtig ist, dass die URL einen http Code 200 zurück liefert, damit ein Ereignishandler von WP7 greift.

Wir starten mit einem neuen Projekt in VS Express for WP und  legen ein WebBrowser Element auf eure Seite an und hinterlegt ein Ereignishandler, hier z.B. MyWebBrowser_Navigated”. Dieser wird aufgerufen, wenn erfolgreich (http Code 200) eine Seite aufgerufen werden konnte.:
<Grid x:Name="LayoutRoot" Background="Transparent">
<phone:WebBrowser
Name="MyWebBrowser"
Navigated="MyWebBrowser_Navigated"
IsScriptEnabled="True"
DataContext="{Binding}"/>
<ProgressBar
x:Name="MyProgressBar"
IsIndeterminate="True"
Visibility="Collapsed"
VerticalAlignment="Center"
HorizontalAlignment="Stretch" />
</Grid>

Beim Aufrufen der Seite starten wir automatisch mit der Webseite zum OAuth Login:
 
public Login()
{
InitializeComponent();
MyWebBrowser.Navigate(new Uri(<<<deine Login URL>>>));
}

Wenn die Login URL aufgerufen wurde, erscheint im Browser die entsprechende Login Maske und nach Eingabe des Usernamen / Passwordes und ggf einer Grant Access Seite, wo der User den Zugriff erlaubt, wird die zuvor genannte Redirect URI aufgerufen mit dem AccessCode als Paramter. Je nach OAuth Konfiguration, kann auch direkt ein AccessToken gesendet werden.

Nun muß im Ereignesshandler der AccessCode ausgelesen werden. Da jedoch der Handler mehrlmals aufgerufen wird, z.B. Anzeige der Loginmaske ist auch ein erfolgreicher Aufruf, muß expliztiet auf den AccessCode geprüft werden:
       
private void MyWebBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
string code = null;
//Überprüfen, ob die Redirect URI aufgerufen wurde
if (e.Uri.AbsoluteUri.ToLower().StartsWith(redirectURI))
{
//Die Suche nach dem AccessCode beginnt
string text = HttpUtility.HtmlDecode(e.Uri.Query).TrimStart('?');
var pairs = text.Split('&');
foreach (var pair in pairs)
{
var kvp = pair.Split('=');
if (kvp.Length == 2)
{
if (kvp[0] == "code")
{
code = kvp[1];
if (string.IsNullOrEmpty(code))
{
MessageBox.Show("Unable to authenticate","Error", MessageBoxButton.OK);
}
else if (stepin == false)
{
stepin = true;
MyWebBrowser.Visibility = Visibility.Collapsed;
//Nun haben wir Erfolgreich einen Access Code, mit dem wir einen AccessToken bekommen

}
}
}
}
}
}

Nun haben wir in der letzten elseif Anweisung erfolgreich einen AccessCode ausgelesen. Als nächsten Schritt ziehen wir uns den finalen Access Token. Dieser Schritt ist ein standard REST Request, auf den ich jetzt nicht im Detail mehr eingehe.

Warum diese komische stepin Abfrage. Es kann vorkommen, bei mehrmaligen Klick auf Login, dass die Seite auch logischerweise mehrmals aufgerufen wird. Dann passiert es, dass der AccessCode einmal erscheint und kurz darauf erneut und ggf total asyncron mit den Request arbeitet. Es ist kein muß, hat mir aber sehr geholfen und div. Fehlerquellen ausgeschlossen.

Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.