mbed connector webapp quickstart
app.py@0:3ffbcdb3b8cd, 2017-03-13 (annotated)
- Committer:
- group-NCTU-Programming-Maratho
- Date:
- Mon Mar 13 02:43:00 2017 +0000
- Revision:
- 0:3ffbcdb3b8cd
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 1 | import mbed_connector_api # mbed Device Connector library |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 2 | import pybars # use to fill in handlebar templates |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 3 | from flask import Flask # framework for hosting webpages |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 4 | from flask_socketio import SocketIO, emit,send,join_room, leave_room |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 5 | from base64 import standard_b64decode as b64decode |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 6 | import os |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 7 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 8 | app = Flask(__name__) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 9 | socketio = SocketIO(app,async_mode='threading') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 10 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 11 | if 'ACCESS_KEY' in os.environ.keys(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 12 | token = os.environ['ACCESS_KEY'] # get access key from environment variable |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 13 | else: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 14 | token = "ChangeMe" # replace with your API token |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 15 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 16 | connector = mbed_connector_api.connector(token) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 17 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 18 | @app.route('/') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 19 | def index(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 20 | # get list of endpoints, for each endpoint get the pattern (/3201/0/5853) value |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 21 | epList = connector.getEndpoints().result |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 22 | for index in range(len(epList)): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 23 | print "Endpoint Found: ",epList[index]['name'] |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 24 | e = connector.getResourceValue(epList[index]['name'],"/3201/0/5853") |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 25 | while not e.isDone(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 26 | None |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 27 | epList[index]['blinkPattern'] = e.result |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 28 | print "Endpoint List :",epList |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 29 | # fill out html using handlebar template |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 30 | handlebarJSON = {'endpoints':epList} |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 31 | comp = pybars.Compiler() |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 32 | source = unicode(open("./views/index.hbs",'r').read()) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 33 | template = comp.compile(source) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 34 | return "".join(template(handlebarJSON)) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 35 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 36 | @socketio.on('connect') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 37 | def connect(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 38 | print('connect ') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 39 | join_room('room') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 40 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 41 | @socketio.on('disconnect') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 42 | def disconnect(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 43 | print('Disconnect') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 44 | leave_room('room') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 45 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 46 | @socketio.on('subscribe_to_presses') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 47 | def subscribeToPresses(data): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 48 | # Subscribe to all changes of resource /3200/0/5501 (button presses) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 49 | print('subscribe_to_presses: ',data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 50 | e = connector.putResourceSubscription(data['endpointName'],'/3200/0/5501') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 51 | while not e.isDone(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 52 | None |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 53 | if e.error: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 54 | print("Error: ",e.error.errType, e.error.error, e.raw_data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 55 | else: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 56 | print("Subscribed Successfully!") |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 57 | emit('subscribed-to-presses') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 58 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 59 | @socketio.on('unsubscribe_to_presses') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 60 | def unsubscribeToPresses(data): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 61 | print('unsubscribe_to_presses: ',data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 62 | e = connector.deleteResourceSubscription(data['endpointName'],'/3200/0/5501') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 63 | while not e.isDone(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 64 | None |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 65 | if e.error: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 66 | print("Error: ",e.error.errType, e.error.error, e.raw_data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 67 | else: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 68 | print("Unsubscribed Successfully!") |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 69 | emit('unsubscribed-to-presses',{"endpointName":data['endpointName'],"value":'True'}) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 70 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 71 | @socketio.on('get_presses') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 72 | def getPresses(data): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 73 | # Read data from GET resource /3200/0/5501 (num button presses) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 74 | print("get_presses ",data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 75 | e = connector.getResourceValue(data['endpointName'],'/3200/0/5501') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 76 | while not e.isDone(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 77 | None |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 78 | if e.error: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 79 | print("Error: ",e.error.errType, e.error.error, e.raw_data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 80 | else: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 81 | data_to_emit = {"endpointName":data['endpointName'],"value":e.result} |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 82 | print data_to_emit |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 83 | emit('presses', data_to_emit) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 84 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 85 | @socketio.on('update_blink_pattern') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 86 | def updateBlinkPattern(data): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 87 | # Set data on PUT resource /3201/0/5853 (pattern of LED blink) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 88 | print('update_blink_pattern ',data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 89 | e = connector.putResourceValue(data['endpointName'],'/3201/0/5853',data['blinkPattern']) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 90 | while not e.isDone(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 91 | None |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 92 | if e.error: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 93 | print("Error: ",e.error.errType, e.error.error, e.raw_data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 94 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 95 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 96 | @socketio.on('blink') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 97 | def blink(data): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 98 | # POST to resource /3201/0/5850 (start blinking LED) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 99 | print('blink: ',data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 100 | e = connector.postResource(data['endpointName'],'/3201/0/5850') |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 101 | while not e.isDone(): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 102 | None |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 103 | if e.error: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 104 | print("Error: ",e.error.errType, e.error.error, e.raw_data) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 105 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 106 | # 'notifications' are routed here, handle subscriptions and update webpage |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 107 | def notificationHandler(data): |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 108 | global socketio |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 109 | print "\r\nNotification Data Received : %s" %data['notifications'] |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 110 | notifications = data['notifications'] |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 111 | for thing in notifications: |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 112 | stuff = {"endpointName":thing["ep"],"value":b64decode(thing["payload"])} |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 113 | print "Emitting :",stuff |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 114 | socketio.emit('presses',stuff) |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 115 | |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 116 | if __name__ == "__main__": |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 117 | connector.deleteAllSubscriptions() # remove all subscriptions, start fresh |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 118 | connector.startLongPolling() # start long polling connector.mbed.com |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 119 | connector.setHandler('notifications', notificationHandler) # send 'notifications' to the notificationHandler FN |
| group-NCTU-Programming-Maratho | 0:3ffbcdb3b8cd | 120 | socketio.run(app,host='0.0.0.0', port=8080) |