NetIO with Gnublin

Werbung
Inhaltsverzeichnis
• 1 NetIO with Gnublin
- 1.1 Funktionsweise
NetIO with Gnublin
Mit NetIO erstellt man sehr schnell und einfach Oberflächen für Fernbedienungen. Man kann
einfach diese Oberfläche auf ein Smartphone oder Tablet laden.
Als Gegenstück kann man sehr leicht auf dem GNUBLIN die Kommandos mit Python der
Fernbedienung entgegennehmen und auswerten bzw. einfache Aktionen direkt starten.
Wie geht das alles?
●
●
●
●
●
●
●
●
●
●
Account auf NetIO anlegen http://netio.davideickhoff.de/editor
App auf Smartphone installieren
UI-Designer per Browser starten und Config öffnen: "http://wiki.gnublin.orgNetIO with
Gnublin"http://wiki.gnublin.org http://netio.davideickhoff.de/editor2?config=6932
Aktuelle IP Adresse von GNUBLIN in Connection-Settings eingeben
Save Online klicken
App im Smartphone starten (im Iphone Telefon schütteln)
Zugangsdaten eingeben und auf Sync clicken
"http://wiki.gnublin.orgNetIO with Gnublin"http://wiki.gnublin.org auswählen
Auf GNUBLIN gehen, Python API + Server kopieren und starten
Relay + GPIO steuern
Wir steuern als Demo die rote LED (an GPIO 3) auf dem GNUBLIN Board das im gleichen Netzwerk
wie unser Telefon hängt.
Im wesentlichen denkt man sich einfache Kommandos aus, die man in der Oberfläche für jeden
Button & Co. definiert. Diese Kommandos werden dann an den kleinen Server im GNUBLIN 1:1
gesendet. Dort kann man diese einfach auswerten.
Funktionsweise
Hier eine kleine Anleitung, wie du NetIO auch auf dem Gnublin zum Laufen bekommst:
Lade die UI-Designer config von unserer Projektseite herunter: [1]
Trage bei Connection die aktuelle IP des Gnublin ein. Die IP des Gnublin findest du mit folgendem
Befehl heraus:
root@gnublin:~$ ifconfig
NetIO App aus dem Apple App Store (Google Play Store) installieren. Die App baut einen TCP Socket
auf um dort dann selbst definierte Strings zu versenden. Um diese mit dem Online Account zu
synchronisieren muss man bei einem Android Smartphone mit zwei Fingern über den Bildschirm
streichen, das iPhone muss man schütteln.
Gnublin Seite (Python):
Nun benötigt man noch einen TCP Socket Server der die Verbindung annimmt und entsprechend
reagiert. Dieser wird im Beispiel unten in Python implementiert.
Gnublin mit Netzwerk verbinden. [2]
Bevor man die API in Python nutzen kann laden wir uns die folgenden beiden Dateien herunter:
root@gnublin:~$ wget
https://raw.github.com/embeddedprojects/gnublin-api/master/python-module/gnublin/gnublin.p
y –no-check-certificate
root@gnublin:~$ wget
https://github.com/embeddedprojects/gnublin-api/raw/master/python-module/gnublin/_gnublin.
so –no-check-certificate
Die beiden Dateien holen wir dann direkt auf unser Gnublin.
Erstelle eine Datei server_netio.py und kopiere Folgendes hinein und schiebe siehe via scp auf dein
Gnublin: [3]
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#!/usr/bin/python
import
import
import
import
import
import
asyncore
socket
select
subprocess
gnublin
os
gpio = gnublin.gnublin_gpio()
gpio.pinMode(3, 'out')
gpio.pinMode(18, 'out')
class Client(asyncore.dispatcher_with_send):
def __init__(self, socket=None, pollster=None):
asyncore.dispatcher_with_send.__init__(self, socket)
self.data = ''
if pollster:
self.pollster = pollster
pollster.register(self, select.EPOLLIN)
def handle_close(self):
if self.pollster:
self.pollster.unregister(self)
def handle_read(self):
receivedData = self.recv(8192)
if not receivedData:
self.close()
return
receivedData = self.data + receivedData
while '\n' in receivedData:
line, receivedData = receivedData.split('\n',1)
self.handle_command(line)
self.data = receivedData
34.
def handle_command(self, line):
35.
if line == 'LED1 on':
36.
self.send('on')
37.
gpio.digitalWrite(3,1)
38.
elif line == 'LED1 off':
39.
self.send('off')
40.
gpio.digitalWrite(3,0)
41.
elif line == 'RELAY open':
42.
self.send('off')
43.
gpio.digitalWrite(18,0)
44.
elif line == 'RELAY close':
45.
self.send('off')
46.
gpio.digitalWrite(18,1)
47.
else:
48.
self.send('unknown command')
49. class Server(asyncore.dispatcher):
50.
def __init__(self, listen_to, pollster):
51.
asyncore.dispatcher.__init__(self)
52.
self.pollster = pollster
53.
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
54.
self.bind(listen_to)
55.
self.listen(5)
56.
def handle_accept(self):
57.
newSocket, address = self.accept()
58.
print "Connected from", address
59.
Client(newSocket,self.pollster)
60. def readwrite(obj, flags):
61.
try:
62.
if flags & select.EPOLLIN:
63.
obj.handle_read_event()
64.
if flags & select.EPOLLOUT:
65.
obj.handle_write_event()
66.
if flags & select.EPOLLPRI:
67.
obj.handle_expt_event()
68.
if flags & (select.EPOLLHUP | select.EPOLLERR | select.POLLNVAL):
69.
obj.handle_close()
70.
except socket.error, e:
71.
if e.args[0] not in asyncore._DISCONNECTED:
72.
obj.handle_error()
73.
else:
74.
obj.handle_close()
75.
except asyncore._reraised_exceptions:
76.
raise
77.
except:
78.
obj.handle_error()
79. class EPoll(object):
80.
def __init__(self):
81.
self.epoll = select.epoll()
82.
self.fdmap = {}
83.
def register(self, obj, flags):
84.
fd = obj.fileno()
85.
self.epoll.register(fd, flags)
86.
self.fdmap[fd] = obj
87.
def unregister(self, obj):
88.
fd = obj.fileno()
89.
del self.fdmap[fd]
90.
self.epoll.unregister(fd)
91.
def poll(self):
92.
evt = self.epoll.poll()
93.
for fd, flags in evt:
94.
yield self.fdmap[fd], flags
95. if __name__ == "__main__":
96.
pollster = EPoll()
97.
pollster.register(Server(("",54321),pollster), select.EPOLLIN)
98.
while True:
99.
evt = pollster.poll()
100.
for obj, flags in evt:
101.
readwrite(obj, flags)
Danach einfach:
python server_netio.py
Starte die NetIO App und bediene den Schalter. Die onboard LED wird ein- und ausgeschaltet.
Viel Spaß beim Weiterbasteln.
Herunterladen