NCTU Programming Marathon / Program5_mbedConnectorQuickstart
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?

UserRevisionLine numberNew 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)