DataTransferWebRaspberryArduino: Unterschied zwischen den Versionen
Aus Hackerspace Ffm
(Die Seite wurde neu angelegt: „Hier wird beschrieben wie man Daten von einer WebSeite über den Raspberry Pi zum Arduino schicken kann. Als erstes brauchen wir einen WebServer. Da wir Pytho…“) |
|||
Zeile 1: | Zeile 1: | ||
− | Hier wird beschrieben wie man Daten von einer WebSeite über den Raspberry Pi zum Arduino schicken kann. | + | Hier wird beschrieben wie man Daten in Echtzeit und Duplex von einer WebSeite über den Raspberry Pi zum Arduino schicken kann. |
Als erstes brauchen wir einen WebServer. Da wir Python verwenden wollen nehmen wir [http://www.tornadoweb.org/en/stable/ Tornado]. | Als erstes brauchen wir einen WebServer. Da wir Python verwenden wollen nehmen wir [http://www.tornadoweb.org/en/stable/ Tornado]. | ||
Zeile 38: | Zeile 38: | ||
</body> | </body> | ||
</html> | </html> | ||
+ | </pre> | ||
+ | |||
+ | Danach eine Python-Datei mit dem Server-Code erstellen /server/server.py | ||
+ | |||
+ | <pre> | ||
+ | import tornado.web | ||
+ | import tornado.websocket | ||
+ | import tornado.httpserver | ||
+ | import tornado.ioloop | ||
+ | import serial | ||
+ | import thread | ||
+ | |||
+ | ser = serial.Serial('/dev/ttyS0', 9600) | ||
+ | print(ser.name) | ||
+ | |||
+ | def readSerial(): | ||
+ | while True: | ||
+ | data = ser.read(); | ||
+ | print 'from Arduino: ', data | ||
+ | # received from Arduino written to all WebSocket clients | ||
+ | [con.write_message(data) for con in WebSocketHandler.connection$ | ||
+ | |||
+ | |||
+ | class WebSocketHandler(tornado.websocket.WebSocketHandler): | ||
+ | connections = set() | ||
+ | |||
+ | def open(self): | ||
+ | self.connections.add(self) | ||
+ | print 'new connection was opened' | ||
+ | pass | ||
+ | |||
+ | def on_message(self, message): | ||
+ | print 'from WebSocket: ', message | ||
+ | ser.write(message); # received from WebSocket writen to ard$ | ||
+ | |||
+ | def on_close(self): | ||
+ | self.connections.remove(self) | ||
+ | print 'connection closed' | ||
+ | pass | ||
+ | |||
+ | class IndexPageHandler(tornado.web.RequestHandler): | ||
+ | def get(self): | ||
+ | self.render("index.html") | ||
+ | |||
+ | |||
+ | class Application(tornado.web.Application): | ||
+ | def __init__(self): | ||
+ | handlers = [ | ||
+ | (r'/', IndexPageHandler), | ||
+ | (r'/websocket', WebSocketHandler), | ||
+ | (r'/(.*)', tornado.web.StaticFileHandler, {'path': './root'}) | ||
+ | ] | ||
+ | |||
+ | settings = { | ||
+ | 'template_path': 'templates' | ||
+ | } | ||
+ | tornado.web.Application.__init__(self, handlers, **settings) | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | ser.flushInput() | ||
+ | thread.start_new_thread(readSerial, ()) | ||
+ | ws_app = Application() | ||
+ | server = tornado.httpserver.HTTPServer(ws_app) | ||
+ | server.listen(9090) | ||
+ | tornado.ioloop.IOLoop.instance().start() | ||
+ | </pre> | ||
+ | |||
+ | Für den Arduino diesen Code verwenden. | ||
+ | <pre> | ||
+ | |||
</pre> | </pre> |
Version vom 27. Juli 2017, 19:40 Uhr
Hier wird beschrieben wie man Daten in Echtzeit und Duplex von einer WebSeite über den Raspberry Pi zum Arduino schicken kann.
Als erstes brauchen wir einen WebServer. Da wir Python verwenden wollen nehmen wir Tornado.
sudo pip install tornado
Dann ein Verzeichniss für den Server anlegen /server/.
Dort ein Unterverzeichniss mit dem namen /server/templates anlegen und ein index.html Datei mit folgendem Inhalt erstellen.
<!DOCTYPE html> <html> <head> <title>Tornado WebSockets</title> <script> var ws; function onLoad() { ws = new WebSocket("ws://raspberrypi:9090/websocket"); ws.onmessage = function(e) { //alert(e.data); document.getElementById('out').value += e.data; }; } function sendMsg() { ws.send(document.getElementById('msg').value); } </script> </head> <body onload="onLoad();"> Send:<input type="text" id="msg" maxlength="25" size="30" /> <input type="button" onclick="sendMsg();" value="Send" /> <br> Received:<br> <textarea id="out" rows="4" cols="50"></textarea> </body> </html>
Danach eine Python-Datei mit dem Server-Code erstellen /server/server.py
import tornado.web import tornado.websocket import tornado.httpserver import tornado.ioloop import serial import thread ser = serial.Serial('/dev/ttyS0', 9600) print(ser.name) def readSerial(): while True: data = ser.read(); print 'from Arduino: ', data # received from Arduino written to all WebSocket clients [con.write_message(data) for con in WebSocketHandler.connection$ class WebSocketHandler(tornado.websocket.WebSocketHandler): connections = set() def open(self): self.connections.add(self) print 'new connection was opened' pass def on_message(self, message): print 'from WebSocket: ', message ser.write(message); # received from WebSocket writen to ard$ def on_close(self): self.connections.remove(self) print 'connection closed' pass class IndexPageHandler(tornado.web.RequestHandler): def get(self): self.render("index.html") class Application(tornado.web.Application): def __init__(self): handlers = [ (r'/', IndexPageHandler), (r'/websocket', WebSocketHandler), (r'/(.*)', tornado.web.StaticFileHandler, {'path': './root'}) ] settings = { 'template_path': 'templates' } tornado.web.Application.__init__(self, handlers, **settings) if __name__ == '__main__': ser.flushInput() thread.start_new_thread(readSerial, ()) ws_app = Application() server = tornado.httpserver.HTTPServer(ws_app) server.listen(9090) tornado.ioloop.IOLoop.instance().start()
Für den Arduino diesen Code verwenden.