From 62dab7bb59596afeaaa5f8b1d5196f2a0bace990 Mon Sep 17 00:00:00 2001 From: Mikael Jergefelt Date: Sun, 18 Oct 2015 19:03:02 +0200 Subject: [PATCH 01/36] add link to TI-CC2640 --- eddystone-url/implementations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/eddystone-url/implementations/README.md b/eddystone-url/implementations/README.md index 8fc3634..890f9f5 100644 --- a/eddystone-url/implementations/README.md +++ b/eddystone-url/implementations/README.md @@ -14,5 +14,6 @@ To date, in this directory you will find the following implementations: * [RFduino](RFduino) * [Linux (bluez)](linux-url-advertiser) * [ARM mbed (Nordic nRF51-dongle, nRF51-DK))](mbed_EddystoneURL_Beacon) +* [TI-CC2640](TI-CC2640) * [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) * [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). From 7d574ae24a3b2748f15cc04e1642f83ab2cac6bd Mon Sep 17 00:00:00 2001 From: Mikael Jergefelt Date: Sun, 18 Oct 2015 19:06:26 +0200 Subject: [PATCH 02/36] add folders for external implementations for navigation usability --- eddystone-url/implementations/Arduino/README.md | 3 +++ eddystone-url/implementations/nodejs/README.md | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 eddystone-url/implementations/Arduino/README.md create mode 100644 eddystone-url/implementations/nodejs/README.md diff --git a/eddystone-url/implementations/Arduino/README.md b/eddystone-url/implementations/Arduino/README.md new file mode 100644 index 0000000..e51af69 --- /dev/null +++ b/eddystone-url/implementations/Arduino/README.md @@ -0,0 +1,3 @@ +# Arduino (BLEPeripheral) + +[Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). \ No newline at end of file diff --git a/eddystone-url/implementations/nodejs/README.md b/eddystone-url/implementations/nodejs/README.md new file mode 100644 index 0000000..ec59662 --- /dev/null +++ b/eddystone-url/implementations/nodejs/README.md @@ -0,0 +1,3 @@ +# Node.js + +[node-eddystone-beacon](https://github.com/don/node-eddystone-beacon) \ No newline at end of file From 8dc7cf6662eadbcc38d0c35bca6c8f68afaae7ba Mon Sep 17 00:00:00 2001 From: Mikael Jergefelt Date: Sun, 13 Mar 2016 18:52:38 +0100 Subject: [PATCH 03/36] fix order to match dir listing --- eddystone-url/implementations/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eddystone-url/implementations/README.md b/eddystone-url/implementations/README.md index 890f9f5..d987a34 100644 --- a/eddystone-url/implementations/README.md +++ b/eddystone-url/implementations/README.md @@ -9,11 +9,11 @@ under the licenses described in each subdirectory. These projects serve as a gui write you own Eddystone-URL beacon code. We encourage you to add additional examples. To date, in this directory you will find the following implementations: +* [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). * [BlueGiga BLED112](BlueGiga-BLED112) * [Cambridge Silicon Radio CSR1010 (Beacon Development Board)](CSR-1010) * [RFduino](RFduino) +* [TI-CC2640](TI-CC2640) * [Linux (bluez)](linux-url-advertiser) * [ARM mbed (Nordic nRF51-dongle, nRF51-DK))](mbed_EddystoneURL_Beacon) -* [TI-CC2640](TI-CC2640) -* [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) -* [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). +* [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) \ No newline at end of file From 3ba720194e59b318b8534fd8d6736d00b2c13191 Mon Sep 17 00:00:00 2001 From: Pedro Henrique Lima Ferreira Date: Sat, 7 May 2016 21:08:56 -0300 Subject: [PATCH 04/36] Update MainActivity.java fixing some minor bug in function isValidHex --- .../java/com/google/sample/txeddystone_uid/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/java/com/google/sample/txeddystone_uid/MainActivity.java b/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/java/com/google/sample/txeddystone_uid/MainActivity.java index 09047d4..59d9517 100644 --- a/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/java/com/google/sample/txeddystone_uid/MainActivity.java +++ b/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/java/com/google/sample/txeddystone_uid/MainActivity.java @@ -351,7 +351,7 @@ private byte[] buildServiceData() throws IOException { } private boolean isValidHex(String s, int len) { - return !(s == null || s.isEmpty()) && (s.length() / 2) == len && s.matches("[0-9A-F]+"); + return !(s == null || s.isEmpty()) && s.length() == len*2 && s.matches("[0-9A-F]+"); } private byte[] toByteArray(String hexString) { From 02e5db1667fe9eb06cafd5c070a432141023eb02 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Tue, 17 May 2016 11:24:28 +0100 Subject: [PATCH 05/36] Update README.md --- configuration-service/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index efba33d..e6318cf 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -377,8 +377,8 @@ Writeable only in locked state. Return Codes -Read Not Permitted: for any attempt to read or write while the beacon is locked.
-Write Not Permitted: for any attempt to write while the beacon is locked. +Read Not Permitted: for any attempt to read while the beacon is unlocked.
+Write Not Permitted: for any attempt to write while the beacon is unlocked. From 51688b962512a99987efd498849444b599b17672 Mon Sep 17 00:00:00 2001 From: Tommy Thorsen Date: Tue, 27 Oct 2015 09:54:01 +0100 Subject: [PATCH 06/36] Add a python script for scanning for beacons on linux. The folder has been renamed from "linux-url-advertiser" to just "linux", since it now contains more than just advertising code. --- .../linux-url-advertiser/README.md | 15 -- .../{linux-url-advertiser => linux}/LICENSE | 0 eddystone-url/implementations/linux/README.md | 24 +++ .../advertise-url | 38 ++-- .../implementations/linux/resolve-urls | 71 +++++++ .../implementations/linux/scan-for-urls | 174 ++++++++++++++++++ 6 files changed, 289 insertions(+), 33 deletions(-) delete mode 100644 eddystone-url/implementations/linux-url-advertiser/README.md rename eddystone-url/implementations/{linux-url-advertiser => linux}/LICENSE (100%) create mode 100644 eddystone-url/implementations/linux/README.md rename eddystone-url/implementations/{linux-url-advertiser => linux}/advertise-url (82%) create mode 100755 eddystone-url/implementations/linux/resolve-urls create mode 100755 eddystone-url/implementations/linux/scan-for-urls diff --git a/eddystone-url/implementations/linux-url-advertiser/README.md b/eddystone-url/implementations/linux-url-advertiser/README.md deleted file mode 100644 index 0b1c8a3..0000000 --- a/eddystone-url/implementations/linux-url-advertiser/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Url advertiser for linux - -A python script that advertises a url using Eddystone-URL - -## Installation - - sudo apt-get install bluez - -## Usage - - # Advertising a url - ./advertise-url http://your/url - - # Stopping the advertisement - ./advertise-url -s diff --git a/eddystone-url/implementations/linux-url-advertiser/LICENSE b/eddystone-url/implementations/linux/LICENSE similarity index 100% rename from eddystone-url/implementations/linux-url-advertiser/LICENSE rename to eddystone-url/implementations/linux/LICENSE diff --git a/eddystone-url/implementations/linux/README.md b/eddystone-url/implementations/linux/README.md new file mode 100644 index 0000000..c4acaca --- /dev/null +++ b/eddystone-url/implementations/linux/README.md @@ -0,0 +1,24 @@ +# Url advertiser for linux + +A set of python scripts for scanning and advertising urls over Eddystone-URL. + +## Installation + + sudo apt-get install bluez + +## Usage + + # Advertising a url + ./advertise-url http://your/url + + # Stopping the advertisement + ./advertise-url -s + + # Running a single scan for urls + ./scan-for-urls -s + + # A continuous scan for urls + ./scan-for-urls + + # A continuous scan and resolving short urls to long urls + ./scan-for-urls | ./resolve-urls diff --git a/eddystone-url/implementations/linux-url-advertiser/advertise-url b/eddystone-url/implementations/linux/advertise-url similarity index 82% rename from eddystone-url/implementations/linux-url-advertiser/advertise-url rename to eddystone-url/implementations/linux/advertise-url index 8969659..554a7cb 100755 --- a/eddystone-url/implementations/linux-url-advertiser/advertise-url +++ b/eddystone-url/implementations/linux/advertise-url @@ -13,12 +13,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +""" +Advertises a url as an Eddystone beacon. +""" import sys import subprocess from optparse import OptionParser -parser = OptionParser(usage="%prog [options] [url]") +parser = OptionParser(usage = "%prog [options] [url]", description = __doc__) parser.add_option("-s", "--stop", dest="stop", action="store_true", default=False, @@ -43,15 +46,17 @@ schemes = [ "https://", ] -expansions = [ +extensions = [ ".com/", ".org/", ".edu/", ".net/", ".info/", ".biz/", ".gov/", ".com", ".org", ".edu", ".net", ".info", ".biz", ".gov", ] -def verboseOutput(text): + +def verboseOutput(text = ""): if options.verbose: sys.stderr.write(text + "\n") + def encodeUri(uri): i = 0 data = [] @@ -61,14 +66,14 @@ def encodeUri(uri): if uri.startswith(scheme): data.append(s) i += len(scheme) - break; + break else: raise Exception("Invalid uri scheme") while i < len(uri): if uri[i] == '.': - for e in range(len(expansions)): - expansion = expansions[e] + for e in range(len(extensions)): + expansion = extensions[e] if uri.startswith(expansion, i): data.append(e) i += len(expansion) @@ -82,6 +87,7 @@ def encodeUri(uri): return data + def encodeMessage(uri): encodedUri = encodeUri(uri) encodedUriLength = len(encodedUri) @@ -114,13 +120,6 @@ def encodeMessage(uri): return message -def systemCall(command): - verboseOutput(command) - child = subprocess.Popen(["-c", command], - stdout = subprocess.PIPE, - stderr = subprocess.PIPE, - shell = True) - child.communicate() def advertise(uri): verboseOutput("Advertising: " + uri) @@ -139,19 +138,22 @@ def advertise(uri): message = " ".join(message) verboseOutput("Message: " + message) - systemCall("sudo hciconfig hci0 up") + subprocess.call("sudo hciconfig hci0 up", shell = True, stdout = subprocess.DEVNULL) + # Stop advertising - systemCall("sudo hcitool -i hci0 cmd 0x08 0x000a 00") + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = subprocess.DEVNULL) # Set message - systemCall("sudo hcitool -i hci0 cmd 0x08 0x0008 " + message) + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x0008 " + message, shell = True, stdout = subprocess.DEVNULL) # Resume advertising - systemCall("sudo hcitool -i hci0 cmd 0x08 0x000a 01") + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 01", shell = True, stdout = subprocess.DEVNULL) + def stopAdvertising(): verboseOutput("Stopping advertising") - systemCall("sudo hcitool -i hci0 cmd 0x08 0x000a 00") + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = subprocess.DEVNULL) + try: if options.stop: diff --git a/eddystone-url/implementations/linux/resolve-urls b/eddystone-url/implementations/linux/resolve-urls new file mode 100755 index 0000000..60a56ce --- /dev/null +++ b/eddystone-url/implementations/linux/resolve-urls @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# +# Copyright 2015 Opera Software ASA. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Resolve url redirects and output the final urls. Input can be given either on +the command line, or through standard input. Try: "./scan-for-urls | +./resolve-urls" +""" + +import http.client +import sys +import urllib.parse + +from optparse import OptionParser + +parser = OptionParser(usage = "%prog [urls]", description = __doc__) +(options, args) = parser.parse_args() + + +def resolveUrl(url): + """ + Follows redirects until the final url is found. + """ + + try: + parsed = urllib.parse.urlsplit(url) + + conn = None + if parsed.scheme == "https": + conn = http.client.HTTPSConnection(parsed.netloc) + elif parsed.scheme == "http": + conn = http.client.HTTPConnection(parsed.netloc) + + path = parsed.path + if parsed.query: + path += "&" + parsed.query + + conn.request("HEAD", path) + + response = conn.getresponse() + + if response.status >= 300 and response.status < 400: + return resolveUrl(response.getheader("Location")) + else: + return url + + except: + return url + + +resolvedUrls = dict() + +for url in args or sys.stdin: + url = url.strip() + + if not url in resolvedUrls: + resolvedUrls[url] = resolveUrl(url) + + print(resolvedUrls[url]) diff --git a/eddystone-url/implementations/linux/scan-for-urls b/eddystone-url/implementations/linux/scan-for-urls new file mode 100755 index 0000000..571ed98 --- /dev/null +++ b/eddystone-url/implementations/linux/scan-for-urls @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +# +# Copyright 2015 Opera Software ASA. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Scan for URLs from Eddystone and UriBeacon bluetooth beacons. +""" + +import re +import signal +import subprocess +import sys +import time + +from optparse import OptionParser + +parser = OptionParser(usage = "%prog [options]", description = __doc__) + +parser.add_option("-v", "--verbose", dest = "verbose", + action = "store_true", default = False, + help = "Print lots of debug output. This mode also outputs non-url beacons.") + +parser.add_option("-s", "--single", dest = "single", + action = "store_true", default = False, + help = "Perform a single scan and output all the urls found without duplicates.") + +(options, args) = parser.parse_args() + +schemes = [ + "http://www.", + "https://www.", + "http://", + "https://", + ] + +extensions = [ + ".com/", ".org/", ".edu/", ".net/", ".info/", ".biz/", ".gov/", + ".com", ".org", ".edu", ".net", ".info", ".biz", ".gov", + ] + + +def verboseOutput(text = ""): + if options.verbose: + sys.stderr.write(text + "\n") + + +def decodeUrl(encodedUrl): + """ + Decode a url encoded with the Eddystone (or UriBeacon) URL encoding scheme + """ + + decodedUrl = schemes[encodedUrl[0]] + for c in encodedUrl[1:]: + if c <= 0x20: + decodedUrl += extensions[c] + else: + decodedUrl += chr(c) + + return decodedUrl + + +def onUrlFound(url): + """ + Called by onPacketFound, if the packet contains a url. + """ + + sys.stdout.write(url) + sys.stdout.write("\n") + sys.stdout.flush() + + +foundPackets = set() + +def onPacketFound(packet): + """ + Called by the scan function for each beacon packets found. + """ + + data = bytearray.fromhex(packet) + + if options.single: + tmp = packet[:-3] + if tmp in foundPackets: + return + foundPackets.add(tmp) + + # Eddystone + if len(data) >= 20 and data[19] == 0xaa and data[20] == 0xfe: + serviceDataLength = data[21] + frameType = data[25] + + # Eddystone-URL + if frameType == 0x10: + verboseOutput("Eddystone-URL") + onUrlFound(decodeUrl(data[27:22 + serviceDataLength])) + elif frameType == 0x00: + verboseOutput("Eddystone-UID") + elif frameType == 0x20: + verboseOutput("Eddystone-TLM") + else: + verboseOutput("Unknown Eddystone frame type: {}".format(frameType)) + + # UriBeacon + elif len(data) >= 20 and data[19] == 0xd8 and data[20] == 0xfe: + serviceDataLength = data[21] + verboseOutput("UriBeacon") + onUrlFound(decodeUrl(data[27:22 + serviceDataLength])) + + else: + verboseOutput("Unknown beacon type") + + verboseOutput(packet) + verboseOutput() + + +def scan(duration = None): + """ + Scan for beacons. This function scans for [duration] seconds. If duration + is set to None, it scans until interrupted. + """ + + subprocess.call(["sudo", "-v"]) + + lescan = subprocess.Popen( + ["sudo", "-n", "hcitool", "lescan", "--duplicates"], + stdout = subprocess.DEVNULL) + + dump = subprocess.Popen( + ["sudo", "-n", "hcidump", "--raw"], + stdout = subprocess.PIPE) + + packet = None + try: + startTime = time.time() + for line in dump.stdout: + line = line.decode() + if line.startswith("> "): + if packet: onPacketFound(packet) + packet = line[2:].strip() + elif line.startswith("< "): + if packet: onPacketFound(packet) + packet = None + else: + if packet: packet += " " + line.strip() + + if duration and time.time() - startTime > duration: + break + + except KeyboardInterrupt: + pass + + subprocess.call(["sudo", "kill", str(dump.pid), "-s", "SIGINT"]) + subprocess.call(["sudo", "-n", "kill", str(lescan.pid), "-s", "SIGINT"]) + + +try: + if options.single: + scan(3) + else: + scan() +except Exception as e: + sys.stderr.write("Exception: " + str(e) + "\n") + exit(1) From 31ad53bf31f9761d9b308ebfb0cfe00244536af9 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Wed, 1 Jun 2016 21:16:46 +0530 Subject: [PATCH 07/36] Fix input/output error --- eddystone-url/implementations/linux/scan-for-urls | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eddystone-url/implementations/linux/scan-for-urls b/eddystone-url/implementations/linux/scan-for-urls index 571ed98..b09b90e 100755 --- a/eddystone-url/implementations/linux/scan-for-urls +++ b/eddystone-url/implementations/linux/scan-for-urls @@ -131,6 +131,8 @@ def scan(duration = None): """ subprocess.call(["sudo", "-v"]) + subprocess.call("sudo hciconfig hci0 down", shell = True, stdout = subprocess.DEVNULL) + subprocess.call("sudo hciconfig hci0 up", shell = True, stdout = subprocess.DEVNULL) lescan = subprocess.Popen( ["sudo", "-n", "hcitool", "lescan", "--duplicates"], From 7a2621793d5f0e6a0d29cf836e0a1327b3b98ea0 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Fri, 3 Jun 2016 20:52:14 +0530 Subject: [PATCH 08/36] Merged 2 commands --- eddystone-url/implementations/linux/scan-for-urls | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/eddystone-url/implementations/linux/scan-for-urls b/eddystone-url/implementations/linux/scan-for-urls index b09b90e..dd16f38 100755 --- a/eddystone-url/implementations/linux/scan-for-urls +++ b/eddystone-url/implementations/linux/scan-for-urls @@ -131,9 +131,8 @@ def scan(duration = None): """ subprocess.call(["sudo", "-v"]) - subprocess.call("sudo hciconfig hci0 down", shell = True, stdout = subprocess.DEVNULL) - subprocess.call("sudo hciconfig hci0 up", shell = True, stdout = subprocess.DEVNULL) - + subprocess.call("sudo hciconfig hci0 reset", shell = True, stdout = subprocess.DEVNULL) + lescan = subprocess.Popen( ["sudo", "-n", "hcitool", "lescan", "--duplicates"], stdout = subprocess.DEVNULL) From 13ca2bed254392a86d5fd93b47aa83c096dd4a15 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Sun, 19 Jun 2016 15:02:11 +0530 Subject: [PATCH 09/36] Replaced optparse(deprecated) to argparse Modified README.md Replaced optparse(deprecated) to argparse --- eddystone-url/implementations/linux/README.md | 10 ++- .../implementations/linux/advertise-url | 65 ++++++++++--------- .../implementations/linux/resolve-urls | 10 +-- .../implementations/linux/scan-for-urls | 16 ++--- 4 files changed, 54 insertions(+), 47 deletions(-) diff --git a/eddystone-url/implementations/linux/README.md b/eddystone-url/implementations/linux/README.md index c4acaca..bddbc9c 100644 --- a/eddystone-url/implementations/linux/README.md +++ b/eddystone-url/implementations/linux/README.md @@ -2,6 +2,12 @@ A set of python scripts for scanning and advertising urls over Eddystone-URL. +## Requirements + + Linux + Python 3 + bluez + ## Installation sudo apt-get install bluez @@ -9,7 +15,7 @@ A set of python scripts for scanning and advertising urls over Eddystone-URL. ## Usage # Advertising a url - ./advertise-url http://your/url + ./advertise-url -u http://your/url # Stopping the advertisement ./advertise-url -s @@ -21,4 +27,4 @@ A set of python scripts for scanning and advertising urls over Eddystone-URL. ./scan-for-urls # A continuous scan and resolving short urls to long urls - ./scan-for-urls | ./resolve-urls + ./scan-for-urls | ./resolve-urls -u [URLs] diff --git a/eddystone-url/implementations/linux/advertise-url b/eddystone-url/implementations/linux/advertise-url index 554a7cb..0b2907f 100755 --- a/eddystone-url/implementations/linux/advertise-url +++ b/eddystone-url/implementations/linux/advertise-url @@ -19,25 +19,24 @@ Advertises a url as an Eddystone beacon. import sys import subprocess -from optparse import OptionParser +import argparse -parser = OptionParser(usage = "%prog [options] [url]", description = __doc__) +# The default url +url = "https://goo.gl/SkcDTN" -parser.add_option("-s", "--stop", dest="stop", - action="store_true", default=False, - help="Stop advertising") +parser = argparse.ArgumentParser(prog='advertise-url', description= __doc__) +parser.add_argument("-u", "--url", nargs='?', const=url, type=str, + default=url, help='URL to advertise.') -parser.add_option("-v", "--verbose", dest="verbose", - action="store_true", default=False, - help="Print lots of debug output") +parser.add_argument('-s','--stop', action='store_true', + help='Stop advertising url.') -(options, args) = parser.parse_args() +parser.add_argument("-v", "--verbose", action='store_true', + help='Print lots of debug output.') -# The default uri -uri = "https://goo.gl/SkcDTN" +options = parser.parse_args() -if len(args) > 0: - uri = args[0] +url = options.url schemes = [ "http://www.", @@ -57,24 +56,24 @@ def verboseOutput(text = ""): sys.stderr.write(text + "\n") -def encodeUri(uri): +def encodeurl(url): i = 0 data = [] for s in range(len(schemes)): scheme = schemes[s] - if uri.startswith(scheme): + if url.startswith(scheme): data.append(s) i += len(scheme) break else: - raise Exception("Invalid uri scheme") + raise Exception("Invalid url scheme") - while i < len(uri): - if uri[i] == '.': + while i < len(url): + if url[i] == '.': for e in range(len(extensions)): expansion = extensions[e] - if uri.startswith(expansion, i): + if url.startswith(expansion, i): data.append(e) i += len(expansion) break @@ -82,19 +81,19 @@ def encodeUri(uri): data.append(0x2E) i += 1 else: - data.append(ord(uri[i])) + data.append(ord(url[i])) i += 1 return data -def encodeMessage(uri): - encodedUri = encodeUri(uri) - encodedUriLength = len(encodedUri) +def encodeMessage(url): + encodedurl = encodeurl(url) + encodedurlLength = len(encodedurl) - verboseOutput("Encoded uri length: " + str(encodedUriLength)) + verboseOutput("Encoded url length: " + str(encodedurlLength)) - if encodedUriLength > 18: + if encodedurlLength > 18: raise Exception("Encoded url too long (max 18 bytes)") message = [ @@ -107,23 +106,24 @@ def encodeMessage(uri): 0xaa, # 16-bit Eddystone UUID 0xfe, # 16-bit Eddystone UUID - 5 + len(encodedUri), # Service Data length + 5 + len(encodedurl), # Service Data length 0x16, # Service Data data type value 0xaa, # 16-bit Eddystone UUID 0xfe, # 16-bit Eddystone UUID - 0x10, # Eddystone-URL frame type + 0x10, # Eddystone-url frame type 0xed, # txpower ] - message += encodedUri + message += encodedurl return message -def advertise(uri): - verboseOutput("Advertising: " + uri) - message = encodeMessage(uri) +def advertise(url): + print("Advertising: " + url) + verboseOutput("Advertising: " + url) + message = encodeMessage(url) # Prepend the length of the whole message message.insert(0, len(message)) @@ -151,6 +151,7 @@ def advertise(uri): def stopAdvertising(): + print("Stopping advertising") verboseOutput("Stopping advertising") subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = subprocess.DEVNULL) @@ -159,7 +160,7 @@ try: if options.stop: stopAdvertising() else: - advertise(uri) + advertise(url) except Exception as e: sys.stderr.write("Exception: " + str(e) + "\n") exit(1) diff --git a/eddystone-url/implementations/linux/resolve-urls b/eddystone-url/implementations/linux/resolve-urls index 60a56ce..c4b2add 100755 --- a/eddystone-url/implementations/linux/resolve-urls +++ b/eddystone-url/implementations/linux/resolve-urls @@ -22,11 +22,13 @@ the command line, or through standard input. Try: "./scan-for-urls | import http.client import sys import urllib.parse +import argparse -from optparse import OptionParser +parser = argparse.ArgumentParser(prog='advertise-url', description= __doc__) +parser.add_argument("-u", "--urls", nargs='+', type=str, required=True, + help='URLs to resolve.') -parser = OptionParser(usage = "%prog [urls]", description = __doc__) -(options, args) = parser.parse_args() +args = parser.parse_args() def resolveUrl(url): @@ -62,7 +64,7 @@ def resolveUrl(url): resolvedUrls = dict() -for url in args or sys.stdin: +for url in args.urls or sys.stdin: url = url.strip() if not url in resolvedUrls: diff --git a/eddystone-url/implementations/linux/scan-for-urls b/eddystone-url/implementations/linux/scan-for-urls index dd16f38..1def934 100755 --- a/eddystone-url/implementations/linux/scan-for-urls +++ b/eddystone-url/implementations/linux/scan-for-urls @@ -23,19 +23,17 @@ import subprocess import sys import time -from optparse import OptionParser +import argparse -parser = OptionParser(usage = "%prog [options]", description = __doc__) +parser = argparse.ArgumentParser(prog='scan-for-urls', description= __doc__) -parser.add_option("-v", "--verbose", dest = "verbose", - action = "store_true", default = False, - help = "Print lots of debug output. This mode also outputs non-url beacons.") +parser.add_argument('-s','--single', action='store_true', + help='Perform a single scan and output all the urls found without duplicates.') -parser.add_option("-s", "--single", dest = "single", - action = "store_true", default = False, - help = "Perform a single scan and output all the urls found without duplicates.") +parser.add_argument("-v", "--verbose", action='store_true', + help='Print lots of debug output.') -(options, args) = parser.parse_args() +options = parser.parse_args() schemes = [ "http://www.", From 527c232aeb40040ab2737be6877cbcf210fed1d2 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Tue, 21 Jun 2016 14:13:04 +0100 Subject: [PATCH 10/36] Update README.md #132 was closed --- configuration-service/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index e6318cf..e34ac69 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -1,7 +1,5 @@ # Eddystone Configuration GATT Service -**Note: https://github.com/google/eddystone/issues/132 needs resolution before this specification can be considered final.** - This document defines the specification for the Eddystone Configuration Service and offers some implementation guidance. The Eddystone Configuration Service runs as a GATT service on the beacon while it is connectable and allows configuration of the advertised data, the broadcast power levels, and the advertising intervals. It also forms part of the definition of how Eddystone-EID beacons are configured and registered with a trusted resolver. From a6126f3a1bf0fffe5b95e0b9e0fc3336db8487f4 Mon Sep 17 00:00:00 2001 From: scottjenson Date: Tue, 21 Jun 2016 19:47:33 -0700 Subject: [PATCH 11/36] Fix link to Linux (bluez) --- eddystone-url/implementations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eddystone-url/implementations/README.md b/eddystone-url/implementations/README.md index 8fc3634..28912d6 100644 --- a/eddystone-url/implementations/README.md +++ b/eddystone-url/implementations/README.md @@ -12,7 +12,7 @@ To date, in this directory you will find the following implementations: * [BlueGiga BLED112](BlueGiga-BLED112) * [Cambridge Silicon Radio CSR1010 (Beacon Development Board)](CSR-1010) * [RFduino](RFduino) -* [Linux (bluez)](linux-url-advertiser) +* [Linux (bluez)](linux) * [ARM mbed (Nordic nRF51-dongle, nRF51-DK))](mbed_EddystoneURL_Beacon) * [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) * [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). From 57ff58fb017389b3af2cc4174f9aac45cca48c35 Mon Sep 17 00:00:00 2001 From: Mikael Jergefelt Date: Wed, 22 Jun 2016 11:14:05 +0200 Subject: [PATCH 12/36] fix order to match dir listing --- eddystone-url/implementations/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eddystone-url/implementations/README.md b/eddystone-url/implementations/README.md index 369dace..3a6426c 100644 --- a/eddystone-url/implementations/README.md +++ b/eddystone-url/implementations/README.md @@ -12,8 +12,8 @@ To date, in this directory you will find the following implementations: * [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). * [BlueGiga BLED112](BlueGiga-BLED112) * [Cambridge Silicon Radio CSR1010 (Beacon Development Board)](CSR-1010) -* [RFduino](RFduino) -* [TI-CC2640](TI-CC2640) * [Linux (bluez)](linux) * [ARM mbed (Nordic nRF51-dongle, nRF51-DK))](mbed_EddystoneURL_Beacon) -* [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) \ No newline at end of file +* [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) +* [RFduino](RFduino) +* [TI-CC2640](TI-CC2640) \ No newline at end of file From 4aa1f206abc045c60b893cae0030d213d85fa7be Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Thu, 23 Jun 2016 01:57:28 +0530 Subject: [PATCH 13/36] Added Python2.x check for compatibility. --- .../implementations/linux/advertise-url | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/eddystone-url/implementations/linux/advertise-url b/eddystone-url/implementations/linux/advertise-url index 0b2907f..5b0bd2b 100755 --- a/eddystone-url/implementations/linux/advertise-url +++ b/eddystone-url/implementations/linux/advertise-url @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python # # Copyright 2015 Opera Software ASA. All rights reserved. # @@ -16,11 +16,15 @@ """ Advertises a url as an Eddystone beacon. """ - +import os import sys import subprocess import argparse +if (sys.version_info > (3, 0)): + DEVNULL = subprocess.DEVNULL +else: + DEVNULL = open(os.devnull, 'wb') # The default url url = "https://goo.gl/SkcDTN" @@ -138,22 +142,22 @@ def advertise(url): message = " ".join(message) verboseOutput("Message: " + message) - subprocess.call("sudo hciconfig hci0 up", shell = True, stdout = subprocess.DEVNULL) + subprocess.call("sudo hciconfig hci0 up", shell = True, stdout = DEVNULL) # Stop advertising - subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = subprocess.DEVNULL) + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = DEVNULL) # Set message - subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x0008 " + message, shell = True, stdout = subprocess.DEVNULL) + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x0008 " + message, shell = True, stdout = DEVNULL) # Resume advertising - subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 01", shell = True, stdout = subprocess.DEVNULL) + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 01", shell = True, stdout = DEVNULL) def stopAdvertising(): print("Stopping advertising") verboseOutput("Stopping advertising") - subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = subprocess.DEVNULL) + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = DEVNULL) try: From 30d61041c8d412b52101872eb2fa7a8eb75218b9 Mon Sep 17 00:00:00 2001 From: PrabhanshuAttri Date: Thu, 23 Jun 2016 02:25:53 +0530 Subject: [PATCH 14/36] Added PyBeacon, a python package --- .../implementations/PyBeacon/LICENSE | 201 ++++++++++++ .../PyBeacon/PyBeacon/PyBeacon.py | 296 ++++++++++++++++++ .../PyBeacon/PyBeacon/__init__.py | 0 .../PyBeacon/PyBeacon/__main__.py | 4 + .../implementations/PyBeacon/README.md | 30 ++ .../implementations/PyBeacon/setup.cfg | 3 + .../implementations/PyBeacon/setup.py | 36 +++ eddystone-url/implementations/README.md | 1 + 8 files changed, 571 insertions(+) create mode 100644 eddystone-url/implementations/PyBeacon/LICENSE create mode 100644 eddystone-url/implementations/PyBeacon/PyBeacon/PyBeacon.py create mode 100644 eddystone-url/implementations/PyBeacon/PyBeacon/__init__.py create mode 100644 eddystone-url/implementations/PyBeacon/PyBeacon/__main__.py create mode 100644 eddystone-url/implementations/PyBeacon/README.md create mode 100644 eddystone-url/implementations/PyBeacon/setup.cfg create mode 100644 eddystone-url/implementations/PyBeacon/setup.py diff --git a/eddystone-url/implementations/PyBeacon/LICENSE b/eddystone-url/implementations/PyBeacon/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/eddystone-url/implementations/PyBeacon/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/eddystone-url/implementations/PyBeacon/PyBeacon/PyBeacon.py b/eddystone-url/implementations/PyBeacon/PyBeacon/PyBeacon.py new file mode 100644 index 0000000..0c0b3c2 --- /dev/null +++ b/eddystone-url/implementations/PyBeacon/PyBeacon/PyBeacon.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +# +# Copyright 2015 Opera Software ASA. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Python script for scanning and advertising urls over Eddystone-URL. +""" +import re +import os +import signal +import subprocess +import sys +import time +import argparse +from pprint import pprint + +application_name = 'PyBeacon' +version = '0.2.4.3beta' + +if (sys.version_info > (3, 0)): + DEVNULL = subprocess.DEVNULL +else: + DEVNULL = open(os.devnull, 'wb') + +# The default url +url = "https://goo.gl/SkcDTN" + +schemes = [ + "http://www.", + "https://www.", + "http://", + "https://", + ] + +extensions = [ + ".com/", ".org/", ".edu/", ".net/", ".info/", ".biz/", ".gov/", + ".com", ".org", ".edu", ".net", ".info", ".biz", ".gov", + ] + +parser = argparse.ArgumentParser(prog=application_name, description= __doc__) + +parser.add_argument("-u", "--url", nargs='?', const=url, type=str, + default=url, help='URL to advertise.') +parser.add_argument('-s','--scan', action='store_true', + help='Scan for URLs.') +parser.add_argument('-t','--terminate', action='store_true', + help='Stop advertising URL.') +parser.add_argument('-o','--one', action='store_true', + help='Scan one URL only.') +parser.add_argument("-v", "--version", action='store_true', + help='Version of ' + application_name + '.') +parser.add_argument("-V", "--verbose", action='store_true', + help='Print lots of debug output.') + +args = parser.parse_args() + +def verboseOutput(text = ""): + if args.verbose: + sys.stderr.write(text + "\n") + + +def decodeUrl(encodedUrl): + """ + Decode a url encoded with the Eddystone (or UriBeacon) URL encoding scheme + """ + + decodedUrl = schemes[encodedUrl[0]] + for c in encodedUrl[1:]: + if c <= 0x20: + decodedUrl += extensions[c] + else: + decodedUrl += chr(c) + + return decodedUrl + + +def onUrlFound(url): + """ + Called by onPacketFound, if the packet contains a url. + """ + + sys.stdout.write(url) + sys.stdout.write("\n") + sys.stdout.flush() + + +foundPackets = set() + +def onPacketFound(packet): + """ + Called by the scan function for each beacon packets found. + """ + + data = bytearray.fromhex(packet) + + if args.one: + tmp = packet[:-3] + if tmp in foundPackets: + return + foundPackets.add(tmp) + + # Eddystone + if len(data) >= 20 and data[19] == 0xaa and data[20] == 0xfe: + serviceDataLength = data[21] + frameType = data[25] + + # Eddystone-URL + if frameType == 0x10: + verboseOutput("Eddystone-URL") + onUrlFound(decodeUrl(data[27:22 + serviceDataLength])) + elif frameType == 0x00: + verboseOutput("Eddystone-UID") + elif frameType == 0x20: + verboseOutput("Eddystone-TLM") + else: + verboseOutput("Unknown Eddystone frame type: {}".format(frameType)) + + # UriBeacon + elif len(data) >= 20 and data[19] == 0xd8 and data[20] == 0xfe: + serviceDataLength = data[21] + verboseOutput("UriBeacon") + onUrlFound(decodeUrl(data[27:22 + serviceDataLength])) + + else: + verboseOutput("Unknown beacon type") + + verboseOutput(packet) + verboseOutput() + + +def scan(duration = None): + """ + Scan for beacons. This function scans for [duration] seconds. If duration + is set to None, it scans until interrupted. + """ + print("Scanning...") + subprocess.call("sudo hciconfig hci0 reset", shell = True, stdout = DEVNULL) + + lescan = subprocess.Popen( + ["sudo", "-n", "hcitool", "lescan", "--duplicates"], + stdout = DEVNULL) + + dump = subprocess.Popen( + ["sudo", "-n", "hcidump", "--raw"], + stdout = subprocess.PIPE) + + packet = None + try: + startTime = time.time() + for line in dump.stdout: + line = line.decode() + if line.startswith("> "): + if packet: onPacketFound(packet) + packet = line[2:].strip() + elif line.startswith("< "): + if packet: onPacketFound(packet) + packet = None + else: + if packet: packet += " " + line.strip() + + if duration and time.time() - startTime > duration: + break + + except KeyboardInterrupt: + pass + + subprocess.call(["sudo", "kill", str(dump.pid), "-s", "SIGINT"]) + subprocess.call(["sudo", "-n", "kill", str(lescan.pid), "-s", "SIGINT"]) + + +def encodeurl(url): + i = 0 + data = [] + + for s in range(len(schemes)): + scheme = schemes[s] + if url.startswith(scheme): + data.append(s) + i += len(scheme) + break + else: + raise Exception("Invalid url scheme") + + while i < len(url): + if url[i] == '.': + for e in range(len(extensions)): + expansion = extensions[e] + if url.startswith(expansion, i): + data.append(e) + i += len(expansion) + break + else: + data.append(0x2E) + i += 1 + else: + data.append(ord(url[i])) + i += 1 + + return data + + +def encodeMessage(url): + encodedurl = encodeurl(url) + encodedurlLength = len(encodedurl) + + verboseOutput("Encoded url length: " + str(encodedurlLength)) + + if encodedurlLength > 18: + raise Exception("Encoded url too long (max 18 bytes)") + + message = [ + 0x02, # Flags length + 0x01, # Flags data type value + 0x1a, # Flags data + + 0x03, # Service UUID length + 0x03, # Service UUID data type value + 0xaa, # 16-bit Eddystone UUID + 0xfe, # 16-bit Eddystone UUID + + 5 + len(encodedurl), # Service Data length + 0x16, # Service Data data type value + 0xaa, # 16-bit Eddystone UUID + 0xfe, # 16-bit Eddystone UUID + + 0x10, # Eddystone-url frame type + 0xed, # txpower + ] + + message += encodedurl + + return message + + +def advertise(url): + print("Advertising: " + url) + message = encodeMessage(url) + + # Prepend the length of the whole message + message.insert(0, len(message)) + + # Pad message to 32 bytes for hcitool + while len(message) < 32: message.append(0x00) + + # Make a list of hex strings from the list of numbers + message = map(lambda x: "%02x" % x, message) + + # Concatenate all the hex strings, separated by spaces + message = " ".join(message) + verboseOutput("Message: " + message) + + subprocess.call("sudo hciconfig hci0 up", shell = True, stdout = DEVNULL) + + # Stop advertising + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = DEVNULL) + + # Set message + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x0008 " + message, shell = True, stdout = DEVNULL) + + # Resume advertising + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 01", shell = True, stdout = DEVNULL) + + +def stopAdvertising(): + print("Stopping advertising") + subprocess.call("sudo hcitool -i hci0 cmd 0x08 0x000a 00", shell = True, stdout = DEVNULL) + +def showVersion(): + print(application_name + " " + version) + +def main(): + subprocess.call(["sudo", "-v"]) + if args.version: + showVersion() + elif args.terminate: + stopAdvertising() + elif args.one: + scan(3) + elif args.scan: + scan() + else: + advertise(args.url) + +if __name__ == "__main__": + main() diff --git a/eddystone-url/implementations/PyBeacon/PyBeacon/__init__.py b/eddystone-url/implementations/PyBeacon/PyBeacon/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/eddystone-url/implementations/PyBeacon/PyBeacon/__main__.py b/eddystone-url/implementations/PyBeacon/PyBeacon/__main__.py new file mode 100644 index 0000000..0c0ffd0 --- /dev/null +++ b/eddystone-url/implementations/PyBeacon/PyBeacon/__main__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from .RPyBeacon import main +main() \ No newline at end of file diff --git a/eddystone-url/implementations/PyBeacon/README.md b/eddystone-url/implementations/PyBeacon/README.md new file mode 100644 index 0000000..622df9b --- /dev/null +++ b/eddystone-url/implementations/PyBeacon/README.md @@ -0,0 +1,30 @@ +# PyBeacon +Python script for scanning and advertising urls over Eddystone-URL. + +**Note**: This is just a stable build. For latest builds, check [Nirmanakarta/PyBeacon](https://github.com/nirmankarta/PyBeacon). + +## Requirements + +* Python 3.x (Scanning will not work on Python 2.x) +* Bluez + * sudo apt-get install bluez bluez-hcidump + +## Installation + + sudo pip install PyBeacon + +## Upgrade + + sudo pip install PyBeacon --upgrade + +## Usage + PyBeacon [-h] [-u [URL]] [-s] [-t] [-o] [-v] [-V] + + optional arguments: + -h, --help show this help message and exit + -u [URL], --url [URL] URL to advertise. + -s, --scan Scan for URLs. + -t, --terminate Stop advertising URL. + -o, --one Scan one URL only. + -v, --version Version of PyBeacon. + -V, --verbose Print lots of debug output. \ No newline at end of file diff --git a/eddystone-url/implementations/PyBeacon/setup.cfg b/eddystone-url/implementations/PyBeacon/setup.cfg new file mode 100644 index 0000000..aa35ccb --- /dev/null +++ b/eddystone-url/implementations/PyBeacon/setup.cfg @@ -0,0 +1,3 @@ +# PyBeacon +[metadata] +description-file = README.md \ No newline at end of file diff --git a/eddystone-url/implementations/PyBeacon/setup.py b/eddystone-url/implementations/PyBeacon/setup.py new file mode 100644 index 0000000..2e072f8 --- /dev/null +++ b/eddystone-url/implementations/PyBeacon/setup.py @@ -0,0 +1,36 @@ +from setuptools import setup + +setup( + name='PyBeacon', + version='0.2.4.3', + packages=['PyBeacon'], + entry_points = { + "console_scripts": ['PyBeacon = PyBeacon.PyBeacon:main'] + }, + + description ='Python script for scanning and advertising urls over Eddystone-URL.', + + url='https://github.com/nirmankarta/PyBeacon', + + author='Nirmankarta', + + license='MIT', + + classifiers=[ + + 'Development Status :: 4 - Beta', + + 'Intended Audience :: Developers', + 'Topic :: Software Development :: Build Tools', + + 'License :: OSI Approved :: MIT License', + + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + ], +) \ No newline at end of file diff --git a/eddystone-url/implementations/README.md b/eddystone-url/implementations/README.md index 3a6426c..db6f641 100644 --- a/eddystone-url/implementations/README.md +++ b/eddystone-url/implementations/README.md @@ -12,6 +12,7 @@ To date, in this directory you will find the following implementations: * [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). * [BlueGiga BLED112](BlueGiga-BLED112) * [Cambridge Silicon Radio CSR1010 (Beacon Development Board)](CSR-1010) +* [PyBeacon (Python Package)](PyBeacon), for latest builds, check [Nirmanakarta/PyBeacon](https://github.com/nirmankarta/PyBeacon) * [Linux (bluez)](linux) * [ARM mbed (Nordic nRF51-dongle, nRF51-DK))](mbed_EddystoneURL_Beacon) * [Node.js (node-eddystone-beacon)](https://github.com/don/node-eddystone-beacon) From 7337ad7cbc64521ff23b230b7c3886f442d4f98f Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Thu, 30 Jun 2016 16:44:17 +0100 Subject: [PATCH 15/36] Update README.md --- configuration-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index e34ac69..8af220f 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -502,7 +502,7 @@ In the case of UID and URL frames, the data to be broadcast is supplied in the a

In the case of a TLM frame, the data is just the frame type byte, 0x20. If another slot on the beacon has been configured as an EID frame type, the beacon shall broadcast the ETLM variety of telemetry. Otherwise, the plain TLM frame shall be broadcast. If the beacon is currently broadcasting a plain TLM frame and an EID frame is configured, the beacon shall switch to broadcasting the ETLM variety. If the beacon is configured to broadcast multiple EID frames, then the beacon should cycle through the set identity keys and use them in turn to broadcast an equal number of ETLM frames.

-In the case of an EID frame, the length is either 33 or 17. If 33, it's the 32-byte service's public ECDH key and the exponent byte. This is the prefered method of provisioning an EID beacon. If 17, it's the result of encrypting the 16-byte identity key with the beacon's lock code, and the exponent. This is less secure and any provisioner who implements this should make it clear to the user. +In the case of an EID frame, the length is either 34 or 18. If 34, it's the frame type, the 32-byte service's public ECDH key and the exponent byte. This is the prefered method of provisioning an EID beacon. If 18, it's the frame type, the result of encrypting the 16-byte identity key with the beacon's lock code, and the exponent. This is less secure and any provisioner who implements this should make it clear to the user.

Writing an empty array, or a single 0x00 byte clears the slot and stops Tx. If configured as an EID beacon this will also destroy the peripheral's state for this frame data. From d522df8b5c60858ddd4dbaa69a53a0870e304579 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Mon, 4 Jul 2016 09:29:43 +0100 Subject: [PATCH 16/36] Update README.md URLs shouldn't be considered valid unless they have at least one byte beyond the scheme --- eddystone-url/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eddystone-url/README.md b/eddystone-url/README.md index 00556e1..eecc4a9 100644 --- a/eddystone-url/README.md +++ b/eddystone-url/README.md @@ -13,7 +13,7 @@ Byte offset | Field | Description 0 | Frame Type | Value = `0x10` 1 | TX Power | Calibrated Tx power at 0 m 2 | URL Scheme | Encoded Scheme Prefix -3+ | Encoded URL | Length 0-17 +3+ | Encoded URL | Length 1-17 ### Tx Power Level From 0240e6b2030934ced9d7ff1083003fdbbf4ba226 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Thu, 28 Jul 2016 10:00:39 +0100 Subject: [PATCH 17/36] Update README.md note that a default unlock code is required. fixes #162 --- configuration-service/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configuration-service/README.md b/configuration-service/README.md index 8af220f..58619e3 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -19,6 +19,9 @@ In either case, users may find it helpful if your beacons arrive broadcasting on * An Eddystone-URL frame type whose URL points to information about using your beacons. We recommend this for ease of recognition by the person who is configuring the device. * An Eddystone-UID frame type where the namespace part of the UID is fixed to the one you've chosen for your organization and the instance part is randomized. This ensures the beacon is ready to be registered with a service that supports the UID format with no configuration necessary. +### Default unlock code +If a beacon ships in a `0x02` unlocked state, care must be taken to ensure that it has a default unlock code that's known to the owner. + ### Single connection only While a configuration client is connected to the beacon, the beacon must refuse other connections. From 6141b74b79789993849d5ff3e8372e4e81160772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Beaufort?= Date: Thu, 28 Jul 2016 12:25:21 +0200 Subject: [PATCH 18/36] Add connectable timeout recommendation --- configuration-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index 58619e3..be256d3 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -10,7 +10,7 @@ The primary goal of a standardized configuration service is interoperability bet There are two ways to accomplish this. Your choice depends on whether your beacons are always connectable, or if they are non-connectable by default and become connectable through some action by the user. -We recommend that your beacons spend the majority of their lives in a non-connectable state, which avoids network congestion and collision issues in a dense wireless environment. In this case, the user will take some action to make a beacon temporarily connectable, perhaps by depressing a button, pulling a battery activation tab, or similar. Once your beacon becomes connectable, we recommend broadcasting the configuration GATT service's UUID as a 128-bit service UUID in the scan response, along with a local name data type that identifies your beacon. Configuration applications may look for both of these signals in the scan records of nearby beacons and use the information to highlight which ones are ready for configuration. (A flash of an LED or an audible beep upon connection from a client are helpful too, if your hardware has the necessary support.) +We recommend that your beacons spend the majority of their lives in a non-connectable state, which avoids network congestion and collision issues in a dense wireless environment. In this case, the user will take some action to make a beacon temporarily connectable, perhaps by depressing a button, pulling a battery activation tab, or similar. The connectable timeout should be at the very least 30 seconds to let enough time to user to start a configuration application. Once your beacon becomes connectable, we recommend broadcasting the configuration GATT service's UUID as a 128-bit service UUID in the scan response, along with a local name data type that identifies your beacon. Configuration applications may look for both of these signals in the scan records of nearby beacons and use the information to highlight which ones are ready for configuration. (A flash of an LED or an audible beep upon connection from a client are helpful too, if your hardware has the necessary support.) If your beacons must be always connectable, you may wish to minimize the amount of data that's broadcast in a scan response to conserve the battery. In this case we recommend that in an occasional scan response you broadcast a short local name so that configuration clients can display it to the user and aid an easier association between your beacon and any other nearby beacons. The time between scan responses should be tuned to balance the power requirements with the patience of a human trying to find a connectable frame to configure your beacon -- once the hardware device address has been obtained it should be possible to connect to the beacon in a few seconds. From b130bd9b74d49316a1bd6a8443b33d6337d6b5b0 Mon Sep 17 00:00:00 2001 From: jfarfel Date: Wed, 10 Aug 2016 17:11:39 -0700 Subject: [PATCH 19/36] Disable screen rotation (it leaks advertisers) Rotate the screen while advertising, and the advertiser leaks (when the Activity is recreated). From then on, the on/off switch is broken (you're still advertising even if you flip the switch off). Advertising only stops if you kill the app. So, disable screen rotation until we support this. --- .../TxEddystone-UID/app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/AndroidManifest.xml b/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/AndroidManifest.xml index 8c61d92..b083f55 100644 --- a/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/AndroidManifest.xml +++ b/eddystone-uid/tools/txeddystone-uid/TxEddystone-UID/app/src/main/AndroidManifest.xml @@ -13,7 +13,8 @@ android:theme="@style/AppTheme"> + android:label="@string/app_name" + android:screenOrientation="portrait"> From 4a58358a0402bcf44de06c00bbfe7f92aaf95c99 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Mon, 15 Aug 2016 15:28:39 +0100 Subject: [PATCH 20/36] Update README.md Remove the ambiguous wording around forcing the beacon to be in an explicitly unlocked state before a factory reset can be performed. --- configuration-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index be256d3..bfbd4b4 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -547,7 +547,7 @@ If a value of 0x0B is written, the beacon shall reset to its factor

Any other value shall be ignored.

-In addition, any write shall be ignored if the lock state is not 0x01, i.e. locked and automatic lock disabled. The beacon must have been purposefully unlocked by the current client before a factory reset can be performed. +In addition, any write shall be ignored if the lock state is not 0x01. The beacon must have been purposefully unlocked by the current client before a factory reset can be performed. From e0bd7fbb02847e35e8ddd235ee69198c2d58f96e Mon Sep 17 00:00:00 2001 From: Roy Want Date: Wed, 17 Aug 2016 22:20:38 -0700 Subject: [PATCH 21/36] Added correction stating that EID related keys used in association with elliptic curve-25519 are all little-endian byte arrays --- configuration-service/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index bfbd4b4..6a77014 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -44,7 +44,7 @@ If variable advertising intervals are supported (see `IS_VARIABLE_ADV_SUPPORTED` Notes -Where not explicitly stated, data written and read is defined in terms of big-endian arrays of signed bytes. +Where not explicitly stated, data written and read is defined in terms of big-endian arrays of bytes. However, there are exceptions for EID related keys: the Public ECDH Key in Characteristic 8, the Identity Key in Characteristic 9, and the service's public ECDH key when writing an EID slot in Characteristic 10, all three of which are little-endian. This exception exists because the reference design for eliptic curve-25519, which has been widely adopted, was implemented using little-endian arithmetic and is the basis for the EID design. Note: the elliptic curve-25519 reference design is little-endian, even though big-endian is used almost universally for all other cryto protocols @@ -407,7 +407,7 @@ Length: 32 bytes Description -Reads the beacon's 256-bit public ECDH key. +Reads the beacon's 256-bit public ECDH key (little-endian). @@ -445,7 +445,7 @@ Length: 16 bytes Description -Reads the identity key for the active slot. If the slot isn't configured as EID, returns an error. +Reads the identity key (little-endian) for the active slot. If the slot isn't configured as EID, returns an error.

To prevent this data being broadcast in the clear, it shall be AES-128 encrypted with the lock code for the beacon. @@ -505,7 +505,7 @@ In the case of UID and URL frames, the data to be broadcast is supplied in the a

In the case of a TLM frame, the data is just the frame type byte, 0x20. If another slot on the beacon has been configured as an EID frame type, the beacon shall broadcast the ETLM variety of telemetry. Otherwise, the plain TLM frame shall be broadcast. If the beacon is currently broadcasting a plain TLM frame and an EID frame is configured, the beacon shall switch to broadcasting the ETLM variety. If the beacon is configured to broadcast multiple EID frames, then the beacon should cycle through the set identity keys and use them in turn to broadcast an equal number of ETLM frames.

-In the case of an EID frame, the length is either 34 or 18. If 34, it's the frame type, the 32-byte service's public ECDH key and the exponent byte. This is the prefered method of provisioning an EID beacon. If 18, it's the frame type, the result of encrypting the 16-byte identity key with the beacon's lock code, and the exponent. This is less secure and any provisioner who implements this should make it clear to the user. +In the case of an EID frame, the length is either 34 or 18. If 34, it's the frame type, the 32-byte service's public ECDH key (little-endian) and the exponent byte. This is the prefered method of provisioning an EID beacon. If 18, it's the frame type, the result of encrypting the 16-byte identity key (little-endian) with the beacon's lock code (big-endian), and the exponent. This is less secure and any provisioner who implements this should make it clear to the user.

Writing an empty array, or a single 0x00 byte clears the slot and stops Tx. If configured as an EID beacon this will also destroy the peripheral's state for this frame data. From 9479e780784b97b41b7817853822e3438990b4b0 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Mon, 22 Aug 2016 10:14:01 +0100 Subject: [PATCH 22/36] Update README.md typo --- configuration-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index 6a77014..35684f4 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -44,7 +44,7 @@ If variable advertising intervals are supported (see `IS_VARIABLE_ADV_SUPPORTED` Notes -Where not explicitly stated, data written and read is defined in terms of big-endian arrays of bytes. However, there are exceptions for EID related keys: the Public ECDH Key in Characteristic 8, the Identity Key in Characteristic 9, and the service's public ECDH key when writing an EID slot in Characteristic 10, all three of which are little-endian. This exception exists because the reference design for eliptic curve-25519, which has been widely adopted, was implemented using little-endian arithmetic and is the basis for the EID design. Note: the elliptic curve-25519 reference design is little-endian, even though big-endian is used almost universally for all other cryto protocols +Where not explicitly stated, data written and read is defined in terms of big-endian arrays of bytes. However, there are exceptions for EID related keys: the Public ECDH Key in Characteristic 8, the Identity Key in Characteristic 9, and the service's public ECDH key when writing an EID slot in Characteristic 10, all three of which are little-endian. This exception exists because the reference design for eliptic curve-25519, which has been widely adopted, was implemented using little-endian arithmetic and is the basis for the EID design. Note: the elliptic curve-25519 reference design is little-endian, even though big-endian is used almost universally for all other cryptographic protocols From cbc9fd52aefe951c025f8c04ab5e75e2b87677af Mon Sep 17 00:00:00 2001 From: Roy Want Date: Mon, 29 Aug 2016 14:06:09 -0700 Subject: [PATCH 23/36] Edited Broadcast Capabilities to Capabilities; consistent with the new name --- configuration-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index 6a77014..a9298f8 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -26,7 +26,7 @@ If a beacon ships in a `0x02` unlocked state, care must be taken to ensure that While a configuration client is connected to the beacon, the beacon must refuse other connections. ### Interleaving multiple advertisement frames. -If variable advertising intervals are supported (see `IS_VARIABLE_ADV_SUPPORTED` in the Broadcast Capabilities characteristic) it will be inevitable that some slots will be scheduled to broadcast at the same time. We recommend that implementers transmit those frames in slot order at the shortest permissible advertising interval (100 ms). +If variable advertising intervals are supported (see `IS_VARIABLE_ADV_SUPPORTED` in the Capabilities characteristic) it will be inevitable that some slots will be scheduled to broadcast at the same time. We recommend that implementers transmit those frames in slot order at the shortest permissible advertising interval (100 ms). ## Specification From 17716658d360817e14696e701d0fab55347033be Mon Sep 17 00:00:00 2001 From: Christian Brunschen Date: Mon, 5 Sep 2016 17:06:12 +0100 Subject: [PATCH 24/36] For always-connectable beacons, add a similar note about LED flash or audible beep on connection as for mostly non-connectable ones. When describing beacons that are mostly non-connectable but can be made connectable, there is a note pointing out that an audible or visible signal can be useful to confirm connection to a beacon. This change makes an almost identical parenthetical note when describing beacons that are constantly connectable. --- configuration-service/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index c9dde51..ae6510e 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -12,7 +12,7 @@ There are two ways to accomplish this. Your choice depends on whether your beaco We recommend that your beacons spend the majority of their lives in a non-connectable state, which avoids network congestion and collision issues in a dense wireless environment. In this case, the user will take some action to make a beacon temporarily connectable, perhaps by depressing a button, pulling a battery activation tab, or similar. The connectable timeout should be at the very least 30 seconds to let enough time to user to start a configuration application. Once your beacon becomes connectable, we recommend broadcasting the configuration GATT service's UUID as a 128-bit service UUID in the scan response, along with a local name data type that identifies your beacon. Configuration applications may look for both of these signals in the scan records of nearby beacons and use the information to highlight which ones are ready for configuration. (A flash of an LED or an audible beep upon connection from a client are helpful too, if your hardware has the necessary support.) -If your beacons must be always connectable, you may wish to minimize the amount of data that's broadcast in a scan response to conserve the battery. In this case we recommend that in an occasional scan response you broadcast a short local name so that configuration clients can display it to the user and aid an easier association between your beacon and any other nearby beacons. The time between scan responses should be tuned to balance the power requirements with the patience of a human trying to find a connectable frame to configure your beacon -- once the hardware device address has been obtained it should be possible to connect to the beacon in a few seconds. +If your beacons must be always connectable, you may wish to minimize the amount of data that's broadcast in a scan response to conserve the battery. In this case we recommend that in an occasional scan response you broadcast a short local name so that configuration clients can display it to the user and aid an easier association between your beacon and any other nearby beacons. The time between scan responses should be tuned to balance the power requirements with the patience of a human trying to find a connectable frame to configure your beacon -- once the hardware device address has been obtained it should be possible to connect to the beacon in a few seconds. (Here too, a flash of an LED or an audible beep upon connection from a client may be helpful, if your hardware has the necessary support, especially if there are multiple connectable beacons in the vicinity.) In either case, users may find it helpful if your beacons arrive broadcasting one of the following two frames: From 576ea7d70a2811653b746c8bf6af44ab46175fb0 Mon Sep 17 00:00:00 2001 From: Michael Ashbridge Date: Fri, 23 Sep 2016 09:58:04 +0100 Subject: [PATCH 25/36] Set up directories for intern GATT apps --- tools/gatt-config/README.md | 3 +++ tools/gatt-config/android/README.md | 1 + tools/gatt-config/ios/README.md | 1 + 3 files changed, 5 insertions(+) create mode 100644 tools/gatt-config/README.md create mode 100644 tools/gatt-config/android/README.md create mode 100644 tools/gatt-config/ios/README.md diff --git a/tools/gatt-config/README.md b/tools/gatt-config/README.md new file mode 100644 index 0000000..93f5bc6 --- /dev/null +++ b/tools/gatt-config/README.md @@ -0,0 +1,3 @@ +Android and iOS apps developed at Google by our amazing interns, Galia and Denisa. + +TODO: link up once pushed diff --git a/tools/gatt-config/android/README.md b/tools/gatt-config/android/README.md new file mode 100644 index 0000000..203163b --- /dev/null +++ b/tools/gatt-config/android/README.md @@ -0,0 +1 @@ +TODO: describe this app, how to build and run, etc. diff --git a/tools/gatt-config/ios/README.md b/tools/gatt-config/ios/README.md new file mode 100644 index 0000000..203163b --- /dev/null +++ b/tools/gatt-config/ios/README.md @@ -0,0 +1 @@ +TODO: describe this app, how to build and run, etc. From 8a2e5c2a1abc22a70c1e558e6f42d6a80db8bc6a Mon Sep 17 00:00:00 2001 From: Galia Peycheva Date: Fri, 23 Sep 2016 17:13:58 +0100 Subject: [PATCH 26/36] First version of the app implemented. The app can scan for beacons, display individual beacon informaiton and allows user to configure the beacon. --- .../android/BeaconConfig/.gitignore | 8 + .../android/BeaconConfig/.idea/.name | 1 + .../android/BeaconConfig/.idea/compiler.xml | 22 + .../.idea/copyright/profiles_settings.xml | 3 + .../android/BeaconConfig/.idea/encodings.xml | 6 + .../android/BeaconConfig/.idea/gradle.xml | 23 + .../android/BeaconConfig/.idea/misc.xml | 46 + .../android/BeaconConfig/.idea/modules.xml | 9 + .../BeaconConfig/.idea/runConfigurations.xml | 12 + .../android/BeaconConfig/app/.gitignore | 1 + .../android/BeaconConfig/app/app-release.apk | Bin 0 -> 1663595 bytes .../android/BeaconConfig/app/build.gradle | 39 + .../BeaconConfig/app/proguard-rules.pro | 17 + .../app/src/main/AndroidManifest.xml | 48 + .../beaconfig/BeaconConfigActivity.java | 965 ++++++++++++++++++ .../google/beaconfig/BeaconConfiguration.java | 90 ++ .../google/beaconfig/BeaconListAdapter.java | 224 ++++ .../google/beaconfig/BeaconScanData.java | 103 ++ .../google/beaconfig/BeaconScanner.java | 135 +++ .../github/google/beaconfig/Constants.java | 74 ++ .../ManageConfigurationsActivity.java | 68 ++ .../ManageConfigurationsAdapter.java | 210 ++++ .../beaconfig/SavedConfigurationsManager.java | 165 +++ .../google/beaconfig/ScanningActivity.java | 274 +++++ .../github/google/beaconfig/SlotsAdapter.java | 58 ++ .../dialogs/ChangePasswordDialog.java | 224 ++++ .../beaconfig/dialogs/ConfirmationDialog.java | 65 ++ .../dialogs/SaveConfigurationDialog.java | 78 ++ .../dialogs/UidSlotDataChangeDialog.java | 126 +++ .../beaconfig/dialogs/UnlockDialog.java | 150 +++ .../beaconfig/dialogs/UrlChangeDialog.java | 77 ++ .../google/beaconfig/gatt/GattClient.java | 534 ++++++++++ .../beaconfig/gatt/GattClientException.java | 79 ++ .../google/beaconfig/gatt/GattConstants.java | 135 +++ .../google/beaconfig/gatt/GattOperation.java | 24 + .../gatt/GattOperationException.java | 61 ++ .../utils/BroadcastCapabilities.java | 97 ++ .../beaconfig/utils/SlotDataManager.java | 212 ++++ .../beaconfig/utils/URLEncodeDecoder.java | 195 ++++ .../google/beaconfig/utils/UiUtils.java | 53 + .../github/google/beaconfig/utils/Utils.java | 266 +++++ .../main/java/layout/BeaconTabFragment.java | 352 +++++++ .../src/main/java/layout/GlobalFragment.java | 261 +++++ .../src/main/java/layout/SlotFragment.java | 373 +++++++ .../res/drawable/apply_default_config.xml | 9 + .../app/src/main/res/drawable/arrow_right.xml | 9 + .../app/src/main/res/drawable/circle.xml | 7 + .../app/src/main/res/drawable/close_arrow.xml | 9 + .../app/src/main/res/drawable/cross.xml | 9 + .../app/src/main/res/drawable/delete_grey.xml | 9 + .../src/main/res/drawable/expand_arrow.xml | 9 + .../main/res/drawable/factory_reset_icon.xml | 9 + .../app/src/main/res/drawable/globe.xml | 9 + .../app/src/main/res/drawable/pencil.xml | 9 + .../app/src/main/res/drawable/refresh.xml | 9 + .../src/main/res/drawable/save_changes.xml | 9 + .../app/src/main/res/drawable/save_config.xml | 9 + .../app/src/main/res/drawable/shadow.xml | 8 + .../src/main/res/drawable/side_nav_bar.xml | 9 + .../res/layout/activity_beacon_config.xml | 95 ++ .../app/src/main/res/layout/activity_main.xml | 16 + .../src/main/res/layout/activity_scanning.xml | 33 + .../src/main/res/layout/content_scanning.xml | 33 + .../res/layout/dialog_change_lock_code.xml | 142 +++ .../src/main/res/layout/dialog_change_uid.xml | 139 +++ .../src/main/res/layout/dialog_change_url.xml | 109 ++ .../main/res/layout/dialog_save_config.xml | 96 ++ .../app/src/main/res/layout/dialog_unlock.xml | 105 ++ .../main/res/layout/fragment_frame_slot.xml | 668 ++++++++++++ .../layout/fragment_manage_configurations.xml | 61 ++ .../fragment_manage_configurations_item.xml | 68 ++ .../app/src/main/res/layout/frame_row_tlm.xml | 123 +++ .../app/src/main/res/layout/frame_row_uid.xml | 67 ++ .../app/src/main/res/layout/frame_row_url.xml | 44 + .../src/main/res/layout/frame_type_row.xml | 30 + .../res/layout/saved_slot_configuration.xml | 203 ++++ .../main/res/layout/scan_result_layout.xml | 95 ++ .../app/src/main/res/layout/spinner_item.xml | 9 + .../app/src/main/res/layout/tabs_layout.xml | 24 + .../src/main/res/menu/menu_beacon_config.xml | 26 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4777 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2904 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6818 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10541 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 15379 bytes .../app/src/main/res/values-v21/styles.xml | 9 + .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/colors.xml | 11 + .../app/src/main/res/values/dimens.xml | 19 + .../app/src/main/res/values/strings.xml | 31 + .../app/src/main/res/values/styles.xml | 30 + .../android/BeaconConfig/build.gradle | 23 + .../android/BeaconConfig/gradle.properties | 18 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../gatt-config/android/BeaconConfig/gradlew | 160 +++ .../android/BeaconConfig/gradlew.bat | 90 ++ .../android/BeaconConfig/settings.gradle | 1 + 98 files changed, 8685 insertions(+) create mode 100644 tools/gatt-config/android/BeaconConfig/.gitignore create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/.name create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/compiler.xml create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/copyright/profiles_settings.xml create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/encodings.xml create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/gradle.xml create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/misc.xml create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/modules.xml create mode 100644 tools/gatt-config/android/BeaconConfig/.idea/runConfigurations.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/.gitignore create mode 100644 tools/gatt-config/android/BeaconConfig/app/app-release.apk create mode 100644 tools/gatt-config/android/BeaconConfig/app/build.gradle create mode 100644 tools/gatt-config/android/BeaconConfig/app/proguard-rules.pro create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/AndroidManifest.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfigActivity.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfiguration.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconListAdapter.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanData.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanner.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/Constants.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsActivity.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsAdapter.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SavedConfigurationsManager.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ScanningActivity.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SlotsAdapter.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ChangePasswordDialog.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ConfirmationDialog.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/SaveConfigurationDialog.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UidSlotDataChangeDialog.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UnlockDialog.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UrlChangeDialog.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClient.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClientException.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattConstants.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperation.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperationException.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/BroadcastCapabilities.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/SlotDataManager.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/URLEncodeDecoder.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/UiUtils.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/Utils.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/BeaconTabFragment.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/GlobalFragment.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/SlotFragment.java create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/apply_default_config.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/arrow_right.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/circle.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/close_arrow.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/cross.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/delete_grey.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/expand_arrow.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/factory_reset_icon.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/globe.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/pencil.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/refresh.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_changes.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_config.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/shadow.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/side_nav_bar.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/activity_beacon_config.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/activity_main.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/activity_scanning.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/content_scanning.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/dialog_change_lock_code.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/dialog_change_uid.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/dialog_change_url.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/dialog_save_config.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/dialog_unlock.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/fragment_frame_slot.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/fragment_manage_configurations.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/fragment_manage_configurations_item.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/frame_row_tlm.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/frame_row_uid.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/frame_row_url.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/frame_type_row.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/saved_slot_configuration.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/scan_result_layout.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/spinner_item.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/tabs_layout.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/menu/menu_beacon_config.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/values-v21/styles.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/values-w820dp/dimens.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/values/colors.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/values/dimens.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/values/strings.xml create mode 100644 tools/gatt-config/android/BeaconConfig/app/src/main/res/values/styles.xml create mode 100644 tools/gatt-config/android/BeaconConfig/build.gradle create mode 100644 tools/gatt-config/android/BeaconConfig/gradle.properties create mode 100644 tools/gatt-config/android/BeaconConfig/gradle/wrapper/gradle-wrapper.jar create mode 100644 tools/gatt-config/android/BeaconConfig/gradle/wrapper/gradle-wrapper.properties create mode 100755 tools/gatt-config/android/BeaconConfig/gradlew create mode 100644 tools/gatt-config/android/BeaconConfig/gradlew.bat create mode 100644 tools/gatt-config/android/BeaconConfig/settings.gradle diff --git a/tools/gatt-config/android/BeaconConfig/.gitignore b/tools/gatt-config/android/BeaconConfig/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/tools/gatt-config/android/BeaconConfig/.idea/.name b/tools/gatt-config/android/BeaconConfig/.idea/.name new file mode 100644 index 0000000..013b0b6 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/.name @@ -0,0 +1 @@ +BeaconConfig \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/compiler.xml b/tools/gatt-config/android/BeaconConfig/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/copyright/profiles_settings.xml b/tools/gatt-config/android/BeaconConfig/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/encodings.xml b/tools/gatt-config/android/BeaconConfig/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/gradle.xml b/tools/gatt-config/android/BeaconConfig/.idea/gradle.xml new file mode 100644 index 0000000..508b3d9 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/misc.xml b/tools/gatt-config/android/BeaconConfig/.idea/misc.xml new file mode 100644 index 0000000..1a3eaff --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/modules.xml b/tools/gatt-config/android/BeaconConfig/.idea/modules.xml new file mode 100644 index 0000000..cb7cbc7 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/.idea/runConfigurations.xml b/tools/gatt-config/android/BeaconConfig/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/.gitignore b/tools/gatt-config/android/BeaconConfig/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tools/gatt-config/android/BeaconConfig/app/app-release.apk b/tools/gatt-config/android/BeaconConfig/app/app-release.apk new file mode 100644 index 0000000000000000000000000000000000000000..56d16157c42352e5157bde92c373e42c68966003 GIT binary patch literal 1663595 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

8i^OEnqdlNjkxp+Ytdgpi9{8-RG>tXLJb5 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


OFUZT?82x`-0a#>1D1tsGaR)UHs*?gK)3Ud@w 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
^pO8PC>M1M6`?G0Q;)WF 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�Nu~cTwHe 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 XZR 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
    KXlTQ#dsAD$L9`Ft`dc;)$~Z!s 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 R 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 `1|7cq+V4=oQol_;$T#LvD~9FBj_7fwRq) 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

    dtL@cN$C|EoFK1}V#p7AAgH6sxE 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

    sEU`BUWlOrc8G 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 pf87t@i> 24) & 0xff; + ts[1] = (timeSecs >> 16) & 0xff; + + uint8_t tmpEidDS1[16] = { 0,0,0,0,0,0,0,0,0,0,0, SALT, 0, 0, ts[0], ts[1] }; + + // Perform the aes encryption to generate the final temporary key. + uint8_t tmpKey[16]; + aes128Encrypt(eidIdentityKey, tmpEidDS1, tmpKey); + + // Compute the EID + uint8_t eid[16]; + uint32_t scaledTime = (timeSecs >> rotationPeriodExp) << rotationPeriodExp; + ts[0] = (scaledTime >> 24) & 0xff; + ts[1] = (scaledTime >> 16) & 0xff; + ts[2] = (scaledTime >> 8) & 0xff; + ts[3] = scaledTime & 0xff; + uint8_t tmpEidDS2[16] = { 0,0,0,0,0,0,0,0,0,0,0, rotationPeriodExp, ts[0], ts[1], ts[2], ts[3] }; + aes128Encrypt(tmpKey, tmpEidDS2, eid); + + // copy the leading 8 bytes of the eid result (full result length = 16) into the ADV frame + memcpy(rawFrame + 5, eid, EID_LENGTH); + +} + +/** AES128 encrypts a 16-byte input array with a key, resulting in a 16-byte output array */ +void EIDFrame::aes128Encrypt(uint8_t key[], uint8_t input[], uint8_t output[]) { + mbedtls_aes_context ctx; + mbedtls_aes_init(&ctx); + mbedtls_aes_setkey_enc(&ctx, key, 8 * sizeof(Lock_t)); + mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, input, output); + mbedtls_aes_free(&ctx); +} + +int EIDFrame::genBeaconKeys(PrivateEcdhKey_t beaconPrivateEcdhKey, PublicEcdhKey_t beaconPublicEcdhKey) { + mbedtls_ecdh_init( &ecdh_ctx ); + + int i = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0); + if (i != 0) { + return i; // return EID_RND_FAIL; + } + + if (mbedtls_ecp_group_load(&ecdh_ctx.grp, MBEDTLS_ECP_DP_CURVE25519) != 0) { + return EID_GRP_FAIL; + } + if (mbedtls_ecdh_gen_public(&ecdh_ctx.grp, &ecdh_ctx.d, &ecdh_ctx.Q, mbedtls_ctr_drbg_random, &ctr_drbg) != 0) { + return EID_GENKEY_FAIL; + } + + mbedtls_mpi_write_binary(&ecdh_ctx.d, beaconPrivateEcdhKey, sizeof(PrivateEcdhKey_t)); + mbedtls_mpi_write_binary(&ecdh_ctx.Q.X, beaconPublicEcdhKey, sizeof(PublicEcdhKey_t)); + + mbedtls_ecdh_free( &ecdh_ctx ); + return EID_SUCCESS; +} + +int EIDFrame::genEcdhSharedKey(PrivateEcdhKey_t beaconPrivateEcdhKey, PublicEcdhKey_t beaconPublicEcdhKey, PublicEcdhKey_t serverPublicEcdhKey, EidIdentityKey_t eidIdentityKey) { + int16_t ret = 0; + uint8_t tmp[32]; + // initialize context + mbedtls_ecdh_init( &ecdh_ctx ); + mbedtls_ecp_group_load( &ecdh_ctx.grp, MBEDTLS_ECP_DP_CURVE25519 ); + + // copy binary beacon private key (previously generated!) into context + // Note: As the PrivateKey is generated locally, it is Big Endian + ret = mbedtls_mpi_read_binary( &ecdh_ctx.d, beaconPrivateEcdhKey, sizeof(PrivateEcdhKey_t) ); + + // copy server-public-key (received through GATT characteristic 10) into context + ret = mbedtls_mpi_lset( &ecdh_ctx.Qp.Z, 1 ); + EddystoneService::swapEndianArray(serverPublicEcdhKey, tmp, 32); // To make it Big Endian + ret = mbedtls_mpi_read_binary( &ecdh_ctx.Qp.X, tmp , sizeof(PublicEcdhKey_t) ); + + // ECDH point multiplication + size_t olen; // actual size of shared secret + uint8_t sharedSecret[32]; // shared ECDH secret + memset(sharedSecret, 0, 32); + ret = mbedtls_ecdh_calc_secret( &ecdh_ctx, &olen, sharedSecret, sizeof(sharedSecret), NULL, NULL ); + LOG(("size of olen= %d ret=%x\r\n", olen, ret)); + EddystoneService::swapEndianArray(sharedSecret, tmp, 32); + memcpy(sharedSecret, tmp, 32); + LOG(("Shared secret=")); EddystoneService::logPrintHex(sharedSecret, 32); + if (olen != sizeof(sharedSecret)) { + return EID_GENKEY_FAIL; + } + if (ret == MBEDTLS_ERR_ECP_BAD_INPUT_DATA) { + return EID_RC_SS_IS_ZERO; + } + + // Convert the shared secret to key material using HKDF-SHA256. HKDF is used with + // the salt set to a concatenation of the resolver's public key and beacon's + // public key, with a null context. + + // build HKDF key + unsigned char k[ 64 ]; + EddystoneService::swapEndianArray(beaconPublicEcdhKey, tmp, 32); + memcpy( &k[0], serverPublicEcdhKey, sizeof(PublicEcdhKey_t) ); + memcpy( &k[32], tmp, sizeof(PublicEcdhKey_t) ); + + // compute HKDF: see https://tools.ietf.org/html/rfc5869 + // mbedtls_md_context_t md_ctx; + mbedtls_md_init( &md_ctx ); + mbedtls_md_setup( &md_ctx, mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ), 1 ); + mbedtls_md_hmac_starts( &md_ctx, k, sizeof( k ) ); + mbedtls_md_hmac_update( &md_ctx, sharedSecret, sizeof(sharedSecret) ); + unsigned char prk[ 32 ]; + mbedtls_md_hmac_finish( &md_ctx, prk ); + mbedtls_md_hmac_starts( &md_ctx, prk, sizeof( prk ) ); + const unsigned char const1[] = { 0x01 }; + mbedtls_md_hmac_update( &md_ctx, const1, sizeof( const1 ) ); + unsigned char t[ 32 ]; + mbedtls_md_hmac_finish( &md_ctx, t ); + + //Truncate the key material to 16 bytes (128 bits) to convert it to an AES-128 secret key. + memcpy( eidIdentityKey, t, sizeof(EidIdentityKey_t) ); + LOG(("\r\nEIDIdentityKey=")); EddystoneService::logPrintHex(t, 32); LOG(("\r\n")); + + mbedtls_md_free( &md_ctx ); + mbedtls_ecdh_free( &ecdh_ctx ); + return EID_SUCCESS; +} diff --git a/implementations/mbed/source/EIDFrame.h b/implementations/mbed/source/EIDFrame.h new file mode 100644 index 0000000..b936b06 --- /dev/null +++ b/implementations/mbed/source/EIDFrame.h @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2016, Google Inc, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __EIDFRAME_H__ +#define __EIDFRAME_H__ + +#include +#include "EddystoneTypes.h" +#include "mbedtls/aes.h" +#include "mbedtls/ecdh.h" +#include "mbedtls/md.h" +#include "mbedtls/entropy.h" +#include "mbedtls/ctr_drbg.h" +#include "aes_eax.h" + +/** + * Class that encapsulates data that belongs to the Eddystone-EID frame. For + * more information refer to https://github.com/google/eddystone/tree/master/eddystone-EID. + */ +class EIDFrame +{ +public: + static const uint8_t SALT = 0xff; + static const uint8_t EID_LENGTH = 8; + static const int EID_SUCCESS = 0; + static const int EID_RC_SS_IS_ZERO = -1; + static const int EID_RND_FAIL = -2; + static const int EID_GRP_FAIL = -3; + static const int EID_GENKEY_FAIL = -4; + + /** + * Construct a new instance of this class. + */ + EIDFrame(); + + /** + * Clear frame (internally represented by length = 0 ) + */ + void clearFrame(uint8_t* frame); + + /** + * Construct the raw bytes of the Eddystone-EID frame that will be directly + * used in the advertising packets. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * @param[in] eidData + * The actual 16-byte EID data in the raw frame. + */ + void setData(uint8_t* rawFrame, int8_t advTxPower, const uint8_t* eidData); + + /** + * Get the EID frame data from the Eddystone-EID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-EID frame data. + */ + uint8_t* getData(uint8_t* rawFrame); + + /** + * Get the length of the EID frame data from the Eddystone-EID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-EID frame. + */ + uint8_t getDataLength(uint8_t* rawFrame); + + /** + * Get the EID Adv data from the Eddystone-EID frame. + * This is the full service data included in the BLE service data params + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-EID Adv frame data. + */ + uint8_t* getAdvFrame(uint8_t* rawFrame); + + /** + * Get the length of the EID Adv data from the Eddystone-EID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-EID Adv frame data. + */ + uint8_t getAdvFrameLength(uint8_t* rawFrame); + + /** + * Get just the EID data from the Eddystone-EID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the EID in the Eddystone-EID frame. + */ + uint8_t* getEid(uint8_t* rawFrame); + + /** + * Get the length of just the EID data from the Eddystone-EID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the EID in the Eddystone-EID frame. + */ + uint8_t getEidLength(uint8_t* rawFrame); + + /** + * Set the Adv TX Power in the frame. This is necessary because the adv + * Tx Power might be updated independent of the data bytes + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * + */ + void setAdvTxPower(uint8_t* rawFrame, int8_t advTxPower); + + + /** + * Generate the beacon private and public keys. This should be called on + * every restart of the beacon. + * + * @param[out] beaconPrivateEcdhKey + * Pointer to the beacon private key array. + * @param[out] beaconPublicEcdhKey + * Pointer to the beacon public key array. + * + */ + int genBeaconKeys(PrivateEcdhKey_t beaconPrivateEcdhKey, PublicEcdhKey_t beaconPublicEcdhKey); + + /** + * Update the EID frame. Tests if its time to rotate the EID payload, and if due, calculates and establishes the new value + * + * @param[in] *rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] *eidIdentityKey + * Eid key used to regenerate the EID id. + * @param[in] rotationPeriodExp + * EID rotation time as an exponent k : 2^k seconds + * @param[in] timeSecs + * time in seconds + * + */ + void update(uint8_t* rawFrame, uint8_t* eidIdentityKey, uint8_t rotationPeriodExp, uint32_t timeSecs); + + /** + * genEcdhSharedKey generates the eik value for inclusion in the EID ADV packet + * + * @param[in] beaconPrivateEcdhKey + * The beacon's private ECDH key, generated by genBeaconKeys() + * @param[in] beaconPublicEcdhKey + * The beacon's public ECDH key, generated by genBeaconKeys() + * @param[in] serverPublicEcdhKey + * The server's public ECDH key + * @param[out] eidIdentityKey + * Identity key for this beacon and server combination + */ + int genEcdhSharedKey(PrivateEcdhKey_t beaconPrivateEcdhKey, PublicEcdhKey_t beaconPublicEcdhKey, PublicEcdhKey_t serverPublicEcdhKey, EidIdentityKey_t eidIdentityKey); + + /** + * The byte ID of an Eddystone-EID frame. + */ + static const uint8_t FRAME_TYPE_EID = 0x30; + +private: + + // Declare context for crypto functions + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ecdh_context ecdh_ctx; + mbedtls_md_context_t md_ctx; + + /** + * The size (in bytes) of an Eddystone-EID frame. + * This is the some of the Eddystone UUID(2 bytes), FrameType, AdvTxPower, + * EID Value + */ + static const uint8_t EID_FRAME_LEN = 18; + static const uint8_t FRAME_LEN_OFFSET = 0; + static const uint8_t EDDYSTONE_UUID_LEN = 2; + static const uint8_t EID_DATA_OFFSET = 3; + static const uint8_t ADV_FRAME_OFFSET = 1; + static const uint8_t EID_VALUE_OFFSET = 5; + static const uint8_t EID_HEADER_LEN = 4; + static const uint8_t EID_TXPOWER_OFFSET = 4; + + /** + * AES128 ECB Encrypts a 16-byte input array with a key, to an output array + * + * @param[in] *key + * The encryption key + * @param[in] *input + * The input array + * @param[in] *output + * The output array (contains the encrypted data) + */ + void aes128Encrypt(uint8_t *key, uint8_t *input, uint8_t *output); + +}; + +#endif /* __EIDFRAME_H__ */ diff --git a/implementations/mbed/source/EddystoneService.cpp b/implementations/mbed/source/EddystoneService.cpp new file mode 100644 index 0000000..95b866b --- /dev/null +++ b/implementations/mbed/source/EddystoneService.cpp @@ -0,0 +1,1331 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "EddystoneService.h" +#include "PersistentStorageHelper/ConfigParamsPersistence.h" +#include "EntropySource/EntropySource.h" + +/* Use define zero for production, 1 for testing to allow connection at any time */ +#define DEFAULT_REMAIN_CONNECTABLE 0x01 + +const char * const EddystoneService::slotDefaultUrls[] = EDDYSTONE_DEFAULT_SLOT_URLS; + +// Static timer used as time since boot +Timer EddystoneService::timeSinceBootTimer; + +/* + * CONSTRUCTOR #1 Used on 1st boot (after reflash) + */ +EddystoneService::EddystoneService(BLE &bleIn, + const PowerLevels_t &advTxPowerLevelsIn, + const PowerLevels_t &radioTxPowerLevelsIn, + event_queue_t &evQ, + uint32_t advConfigIntervalIn) : + ble(bleIn), + operationMode(EDDYSTONE_MODE_NONE), + uidFrame(), + urlFrame(), + tlmFrame(), + eidFrame(), + tlmBatteryVoltageCallback(NULL), + tlmBeaconTemperatureCallback(NULL), + radioManagerCallbackHandle(NULL), + deviceName(DEFAULT_DEVICE_NAME), + eventQueue(evQ), + nextEidSlot(0) +{ + LOG(("1st Boot: ")); + LOG((BUILD_VERSION_STR)); + if (advConfigIntervalIn != 0) { + if (advConfigIntervalIn < ble.gap().getMinAdvertisingInterval()) { + advConfigInterval = ble.gap().getMinAdvertisingInterval(); + } else if (advConfigIntervalIn > ble.gap().getMaxAdvertisingInterval()) { + advConfigInterval = ble.gap().getMaxAdvertisingInterval(); + } else { + advConfigInterval = advConfigIntervalIn; + } + } + memcpy(radioTxPowerLevels, radioTxPowerLevelsIn, sizeof(PowerLevels_t)); + memcpy(advTxPowerLevels, advTxPowerLevelsIn, sizeof(PowerLevels_t)); + + // 1st Boot so reset everything to factory values + LOG(("1st BOOT: ")); + doFactoryReset(); // includes genBeaconKeys + + LOG(("After FactoryReset: 1st Boot Init: genBeaconKeyRC=%d\r\n", genBeaconKeyRC)); + + /* Set the device name at startup */ + ble.gap().setDeviceName(reinterpret_cast(deviceName)); +} + +/* + * Constuctor #2: Used on 2nd+ boot: EddystoneService parameters derived from persistent storage + */ +EddystoneService::EddystoneService(BLE &bleIn, + EddystoneParams_t ¶msIn, + const PowerLevels_t &radioTxPowerLevelsIn, + event_queue_t &evQ, + uint32_t advConfigIntervalIn) : + ble(bleIn), + operationMode(EDDYSTONE_MODE_NONE), + uidFrame(), + urlFrame(), + tlmFrame(), + eidFrame(), + tlmBatteryVoltageCallback(NULL), + tlmBeaconTemperatureCallback(NULL), + radioManagerCallbackHandle(NULL), + deviceName(DEFAULT_DEVICE_NAME), + eventQueue(evQ), + nextEidSlot(0) +{ + LOG(("2nd (>=) Boot: ")); + LOG((BUILD_VERSION_STR)); + // Init time Params + LOG(("Init Params\r\n")); + timeSinceBootTimer.start(); + memcpy(&timeParams, &(paramsIn.timeParams), sizeof(TimeParams_t)); + LOG(("2nd Boot: Time:")); + LOG(("PriorBoots=%lu, SinceBoot=%lu\r\n", timeParams.timeInPriorBoots, timeParams.timeSinceLastBoot)); + timeParams.timeInPriorBoots = timeParams.timeInPriorBoots + timeParams.timeSinceLastBoot; + timeParams.timeSinceLastBoot = getTimeSinceLastBootMs() / 1000; + nvmSaveTimeParams(); + + // Init gneeral params + memcpy(capabilities, paramsIn.capabilities, sizeof(Capability_t)); + activeSlot = paramsIn.activeSlot; + memcpy(radioTxPowerLevels, radioTxPowerLevelsIn, sizeof(PowerLevels_t)); + memcpy(slotRadioTxPowerLevels, paramsIn.slotRadioTxPowerLevels, sizeof(SlotTxPowerLevels_t)); + memcpy(advTxPowerLevels, paramsIn.advTxPowerLevels, sizeof(PowerLevels_t)); + memcpy(slotAdvTxPowerLevels, paramsIn.slotAdvTxPowerLevels, sizeof(SlotTxPowerLevels_t)); + memcpy(slotAdvIntervals, paramsIn.slotAdvIntervals, sizeof(SlotAdvIntervals_t)); + lockState = paramsIn.lockState; + memcpy(unlockKey, paramsIn.unlockKey, sizeof(Lock_t)); + memcpy(unlockToken, paramsIn.unlockToken, sizeof(Lock_t)); + memcpy(challenge, paramsIn.challenge, sizeof(Lock_t)); + memset(slotCallbackHandles, 0, sizeof(SlotCallbackHandles_t)); + memcpy(slotStorage, paramsIn.slotStorage, sizeof(SlotStorage_t)); + memcpy(slotFrameTypes, paramsIn.slotFrameTypes, sizeof(SlotFrameTypes_t)); + memcpy(slotEidRotationPeriodExps, paramsIn.slotEidRotationPeriodExps, sizeof(SlotEidRotationPeriodExps_t)); + memcpy(slotEidIdentityKeys, paramsIn.slotEidIdentityKeys, sizeof(SlotEidIdentityKeys_t)); + // Zero next EID slot rotation times to enforce rotation of each slot on restart + memset(slotEidNextRotationTimes, 0, sizeof(SlotEidNextRotationTimes_t)); + remainConnectable = paramsIn.remainConnectable; + + if (advConfigIntervalIn != 0) { + if (advConfigIntervalIn < ble.gap().getMinAdvertisingInterval()) { + advConfigInterval = ble.gap().getMinAdvertisingInterval(); + } else if (advConfigIntervalIn > ble.gap().getMaxAdvertisingInterval()) { + advConfigInterval = ble.gap().getMaxAdvertisingInterval(); + } else { + advConfigInterval = advConfigIntervalIn; + } + } + + // Generate fresh private and public ECDH keys for EID + genEIDBeaconKeys(); + + // Recompute EID Slot Data + for (int slot = 0; slot < MAX_ADV_SLOTS; slot++) { + uint8_t* frame = slotToFrame(slot); + switch (slotFrameTypes[slot]) { + case EDDYSTONE_FRAME_EID: + nextEidSlot = slot; + eidFrame.setData(frame, slotAdvTxPowerLevels[slot], nullEid); + eidFrame.update(frame, slotEidIdentityKeys[slot], slotEidRotationPeriodExps[slot], getTimeSinceFirstBootSecs()); + break; + } + } + + /* Set the device name at startup */ + ble.gap().setDeviceName(reinterpret_cast(deviceName)); +} + +// Regenerate the beacon keys +void EddystoneService::genEIDBeaconKeys(void) { + genBeaconKeyRC = -1; +#ifdef GEN_BEACON_KEYS_AT_INIT + memset(privateEcdhKey, 0, 32); + memset(publicEcdhKey, 0, 32); + genBeaconKeyRC = eidFrame.genBeaconKeys(privateEcdhKey, publicEcdhKey); + swapEndianArray(publicEcdhKey, publicEcdhKeyLE, 32); +#endif +} + +/** + * Factory reset all parmeters: used at initial boot, and activated from Char 11 + */ +void EddystoneService::doFactoryReset(void) +{ + // Init Time tracking + timeSinceBootTimer.start(); + timeParams.timeInPriorBoots = 0; + timeParams.timeSinceLastBoot = getTimeSinceLastBootMs() / 1000; + nvmSaveTimeParams(); + // Init callbacks + memset(slotCallbackHandles, 0, sizeof(SlotCallbackHandles_t)); + radioManagerCallbackHandle = NULL; + memcpy(capabilities, CAPABILITIES_DEFAULT, CAP_HDR_LEN); + // Line above leaves powerlevels blank; Line below fills them in + memcpy(capabilities + CAP_HDR_LEN, radioTxPowerLevels, sizeof(PowerLevels_t)); + activeSlot = DEFAULT_SLOT; + // Intervals + uint16_t buf1[] = EDDYSTONE_DEFAULT_SLOT_INTERVALS; + for (int i = 0; i < MAX_ADV_SLOTS; i++) { + // Ensure all slot periods are in range + buf1[i] = correctAdvertisementPeriod(buf1[i]); + } + memcpy(slotAdvIntervals, buf1, sizeof(SlotAdvIntervals_t)); + // Radio and Adv TX Power + int8_t buf2[] = EDDYSTONE_DEFAULT_SLOT_TX_POWERS; + for (int i = 0; i< MAX_ADV_SLOTS; i++) { + slotRadioTxPowerLevels[i] = buf2[i]; + slotAdvTxPowerLevels[i] = advTxPowerLevels[radioTxPowerToIndex(buf2[i])]; + } + // Lock + lockState = UNLOCKED; + uint8_t defKeyBuf[] = EDDYSTONE_DEFAULT_UNLOCK_KEY; + memcpy(unlockKey, defKeyBuf, sizeof(Lock_t)); + memset(unlockToken, 0, sizeof(Lock_t)); + memset(challenge, 0, sizeof(Lock_t)); // NOTE: challenge is randomized on first unlockChar read; + + // Generate ECDH Beacon Key Pair (Private/Public) + genEIDBeaconKeys(); + + memcpy(slotEidIdentityKeys, slotDefaultEidIdentityKeys, sizeof(SlotEidIdentityKeys_t)); + uint8_t buf4[] = EDDYSTONE_DEFAULT_SLOT_EID_ROTATION_PERIOD_EXPS; + memcpy(slotEidRotationPeriodExps, buf4, sizeof(SlotEidRotationPeriodExps_t)); + memset(slotEidNextRotationTimes, 0, sizeof(SlotEidNextRotationTimes_t)); + // Slot Data Type Defaults + uint8_t buf3[] = EDDYSTONE_DEFAULT_SLOT_TYPES; + memcpy(slotFrameTypes, buf3, sizeof(SlotFrameTypes_t)); + // Initialize Slot Data Defaults + int eidSlot; + for (int slot = 0; slot < MAX_ADV_SLOTS; slot++) { + uint8_t* frame = slotToFrame(slot); + switch (slotFrameTypes[slot]) { + case EDDYSTONE_FRAME_UID: + uidFrame.setData(frame, slotAdvTxPowerLevels[slot], reinterpret_cast(slotDefaultUids[slot])); + break; + case EDDYSTONE_FRAME_URL: + urlFrame.setUnencodedUrlData(frame, slotAdvTxPowerLevels[slot], slotDefaultUrls[slot]); + break; + case EDDYSTONE_FRAME_TLM: + tlmFrame.setTLMData(TLMFrame::DEFAULT_TLM_VERSION); + tlmFrame.setData(frame); + eidSlot = getEidSlot(); + if (eidSlot != NO_EID_SLOT_SET) { + LOG(("EID slot Set in FactoryReset\r\n")); + tlmFrame.encryptData(frame, slotEidIdentityKeys[eidSlot], slotEidRotationPeriodExps[eidSlot], getTimeSinceFirstBootSecs()); + } + break; + case EDDYSTONE_FRAME_EID: + nextEidSlot = slot; + eidFrame.setData(frame, slotAdvTxPowerLevels[slot], nullEid); + eidFrame.update(frame, slotEidIdentityKeys[slot], slotEidRotationPeriodExps[slot], getTimeSinceFirstBootSecs()); + break; + } + } + +#ifdef DONT_REMAIN_CONNECTABLE + remainConnectable = REMAIN_CONNECTABLE_UNSET; +#else + remainConnectable = REMAIN_CONNECTABLE_SET; +#endif + factoryReset = false; +} + +/* Setup callback to update BatteryVoltage in TLM frame */ +void EddystoneService::onTLMBatteryVoltageUpdate(TlmUpdateCallback_t tlmBatteryVoltageCallbackIn) +{ + tlmBatteryVoltageCallback = tlmBatteryVoltageCallbackIn; +} + +/* Setup callback to update BeaconTemperature in TLM frame */ +void EddystoneService::onTLMBeaconTemperatureUpdate(TlmUpdateCallback_t tlmBeaconTemperatureCallbackIn) +{ + tlmBeaconTemperatureCallback = tlmBeaconTemperatureCallbackIn; +} + +EddystoneService::EddystoneError_t EddystoneService::startEddystoneBeaconAdvertisements(void) +{ + stopEddystoneBeaconAdvertisements(); + + bool intervalValidFlag = false; + for (int i = 0; i < MAX_ADV_SLOTS; i++) { + if (slotAdvIntervals[i] != 0) { + intervalValidFlag = true; + } + } + + if (!intervalValidFlag) { + /* Nothing to do, the period is 0 for all frames */ + return EDDYSTONE_ERROR_INVALID_ADVERTISING_INTERVAL; + } + + // In case left over from Config Adv Mode + ble.gap().clearScanResponse(); + + operationMode = EDDYSTONE_MODE_BEACON; + + /* Configure advertisements initially at power of active slot*/ + ble.gap().setTxPower(slotRadioTxPowerLevels[activeSlot]); + + if (remainConnectable) { + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + } else { + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED); + } + ble.gap().setAdvertisingInterval(ble.gap().getMaxAdvertisingInterval()); + + /* Make sure the queue is currently empty */ + advFrameQueue.reset(); + /* Setup callbacks to periodically add frames to be advertised to the queue and + * add initial frame so that we have something to advertise on startup */ + for (int slot = 0; slot < MAX_ADV_SLOTS; slot++) { + uint8_t* frame = slotToFrame(slot); + if (slotAdvIntervals[slot] && testValidFrame(frame)) { + advFrameQueue.push(slot); + slotCallbackHandles[slot] = eventQueue.post_every( + &EddystoneService::enqueueFrame, this, slot, + slotAdvIntervals[slot] /* ms */ + ); + } + } + /* Start advertising */ + manageRadio(); + + return EDDYSTONE_ERROR_NONE; +} + +ble_error_t EddystoneService::setCompleteDeviceName(const char *deviceNameIn) +{ + /* Make sure the device name is safe */ + ble_error_t error = ble.gap().setDeviceName(reinterpret_cast(deviceNameIn)); + if (error == BLE_ERROR_NONE) { + deviceName = deviceNameIn; + if (operationMode == EDDYSTONE_MODE_CONFIG) { + /* Need to update the advertising packets to the new name */ + setupEddystoneConfigScanResponse(); + } + } + + return error; +} + +/* It is not the responsibility of the Eddystone implementation to store + * the configured parameters in persistent storage since this is + * platform-specific. So we provide this function that returns the + * configured values that need to be stored and the main application + * takes care of storing them. + */ +void EddystoneService::getEddystoneParams(EddystoneParams_t ¶ms) +{ + // Time + timeParams.timeSinceLastBoot = getTimeSinceLastBootMs() / 1000; + memcpy(&(params.timeParams), &timeParams, sizeof(TimeParams_t)); + // Capabilities + memcpy(params.capabilities, capabilities, sizeof(Capability_t)); + // Active Slot + params.activeSlot = activeSlot; + // Intervals + memcpy(params.slotAdvIntervals, slotAdvIntervals, sizeof(SlotAdvIntervals_t)); + // Power Levels + memcpy(params.radioTxPowerLevels, radioTxPowerLevels, sizeof(PowerLevels_t)); + memcpy(params.advTxPowerLevels, advTxPowerLevels, sizeof(PowerLevels_t)); + // Slot Power Levels + memcpy(params.slotRadioTxPowerLevels, slotRadioTxPowerLevels, sizeof(MAX_ADV_SLOTS)); + memcpy(params.slotAdvTxPowerLevels, slotAdvTxPowerLevels, sizeof(MAX_ADV_SLOTS)); + // Lock + params.lockState = lockState; + memcpy(params.unlockKey, unlockKey, sizeof(Lock_t)); + memcpy(params.unlockToken, unlockToken, sizeof(Lock_t)); + memcpy(params.challenge, challenge, sizeof(Lock_t)); + // Slots + memcpy(params.slotFrameTypes, slotFrameTypes, sizeof(SlotFrameTypes_t)); + memcpy(params.slotStorage, slotStorage, sizeof(SlotStorage_t)); + memcpy(params.slotEidRotationPeriodExps, slotEidRotationPeriodExps, sizeof(SlotEidRotationPeriodExps_t)); + memcpy(params.slotEidIdentityKeys, slotEidIdentityKeys, sizeof(SlotEidIdentityKeys_t)); + // Testing and Management + params.remainConnectable = remainConnectable; +} + +void EddystoneService::swapAdvertisedFrame(int slot) +{ + uint8_t* frame = slotToFrame(slot); + uint8_t frameType = slotFrameTypes[slot]; + uint32_t timeSecs = getTimeSinceFirstBootSecs(); + switch (frameType) { + case EDDYSTONE_FRAME_UID: + updateAdvertisementPacket(uidFrame.getAdvFrame(frame), uidFrame.getAdvFrameLength(frame)); + break; + case EDDYSTONE_FRAME_URL: + updateAdvertisementPacket(urlFrame.getAdvFrame(frame), urlFrame.getAdvFrameLength(frame)); + break; + case EDDYSTONE_FRAME_TLM: + updateRawTLMFrame(frame); + updateAdvertisementPacket(tlmFrame.getAdvFrame(frame), tlmFrame.getAdvFrameLength(frame)); + break; + case EDDYSTONE_FRAME_EID: + // only update the frame if the rotation period is due + if (timeSecs >= slotEidNextRotationTimes[slot]) { + eidFrame.update(frame, slotEidIdentityKeys[slot], slotEidRotationPeriodExps[slot], timeSecs); + slotEidNextRotationTimes[slot] = timeSecs + (1 << slotEidRotationPeriodExps[slot]); + // select a new random MAC address so the beacon is not trackable + setRandomMacAddress(); + // Store in NVM in case the beacon loses power + nvmSaveTimeParams(); + LOG(("EID ROTATED: Time=%lu\r\n", timeSecs)); + } + updateAdvertisementPacket(eidFrame.getAdvFrame(frame), eidFrame.getAdvFrameLength(frame)); + break; + default: + //Some error occurred + error("Frame to swap in does not specify a valid type"); + break; + } + ble.gap().setTxPower(slotRadioTxPowerLevels[slot]); +} + + +/* Helper function that calls user-defined functions to update Battery Voltage and Temperature (if available), + * then updates the raw frame data and finally updates the actual advertised packet. This operation must be + * done fairly often because the TLM frame TimeSinceBoot must have a 0.1 secs resolution according to the + * Eddystone specification. + */ +void EddystoneService::updateRawTLMFrame(uint8_t* frame) +{ + if (tlmBeaconTemperatureCallback != NULL) { + tlmFrame.updateBeaconTemperature((*tlmBeaconTemperatureCallback)(tlmFrame.getBeaconTemperature())); + } + if (tlmBatteryVoltageCallback != NULL) { + tlmFrame.updateBatteryVoltage((*tlmBatteryVoltageCallback)(tlmFrame.getBatteryVoltage())); + } + tlmFrame.updateTimeSinceLastBoot(getTimeSinceLastBootMs()); + tlmFrame.setData(frame); + int slot = getEidSlot(); + LOG(("TLMHelper Method slot=%d\r\n", slot)); + if (slot != NO_EID_SLOT_SET) { + LOG(("TLMHelper: Before Encrypting TLM\r\n")); + tlmFrame.encryptData(frame, slotEidIdentityKeys[slot], slotEidRotationPeriodExps[slot], getTimeSinceFirstBootSecs()); + LOG(("TLMHelper: Before Encrypting TLM\r\n")); + } +} + +void EddystoneService::updateAdvertisementPacket(const uint8_t* rawFrame, size_t rawFrameLength) +{ + ble.gap().clearAdvertisingPayload(); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, EDDYSTONE_UUID, sizeof(EDDYSTONE_UUID)); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, rawFrame, rawFrameLength); +} + +uint8_t* EddystoneService::slotToFrame(int slot) +{ + return reinterpret_cast(&slotStorage[slot * sizeof(Slot_t)]); +} + +void EddystoneService::enqueueFrame(int slot) +{ + advFrameQueue.push(slot); + if (!radioManagerCallbackHandle) { + /* Advertising stopped and there is not callback posted in the event queue. Just + * execute the manager to resume advertising */ + manageRadio(); + } +} + +void EddystoneService::manageRadio(void) +{ + uint8_t slot; + uint64_t startTimeManageRadio = getTimeSinceLastBootMs(); + + /* Signal that there is currently no callback posted */ + radioManagerCallbackHandle = NULL; + + if (advFrameQueue.pop(slot)) { + /* We have something to advertise */ + if (ble.gap().getState().advertising) { + ble.gap().stopAdvertising(); + } + swapAdvertisedFrame(slot); + ble.gap().startAdvertising(); + + /* Increase the advertised packet count in TLM frame */ + tlmFrame.updatePduCount(); + + /* Post a callback to itself to stop the advertisement or pop the next + * frame from the queue. However, take into account the time taken to + * swap in this frame. */ + radioManagerCallbackHandle = eventQueue.post_in( + &EddystoneService::manageRadio, this, + ble.gap().getMinNonConnectableAdvertisingInterval() - (getTimeSinceLastBootMs() - startTimeManageRadio) /* ms */ + ); + } else if (ble.gap().getState().advertising) { + /* Nothing else to advertise, stop advertising and do not schedule any callbacks */ + ble.gap().stopAdvertising(); + } +} + +void EddystoneService::startEddystoneConfigService(void) +{ + uint16_t beAdvInterval = swapEndian(slotAdvIntervals[activeSlot]); + int8_t radioTxPower = slotRadioTxPowerLevels[activeSlot]; + int8_t advTxPower = slotAdvTxPowerLevels[activeSlot]; + uint8_t* slotData = slotToFrame(activeSlot) + 1; + aes128Encrypt(unlockKey, slotEidIdentityKeys[activeSlot], encryptedEidIdentityKey); + + capabilitiesChar = new ReadOnlyArrayGattCharacteristic(UUID_CAPABILITIES_CHAR, capabilities); + activeSlotChar = new ReadWriteGattCharacteristic(UUID_ACTIVE_SLOT_CHAR, &activeSlot); + advIntervalChar = new ReadWriteGattCharacteristic(UUID_ADV_INTERVAL_CHAR, &beAdvInterval); + radioTxPowerChar = new ReadWriteGattCharacteristic(UUID_RADIO_TX_POWER_CHAR, &radioTxPower); + advTxPowerChar = new ReadWriteGattCharacteristic(UUID_ADV_TX_POWER_CHAR, &advTxPower); + lockStateChar = new GattCharacteristic(UUID_LOCK_STATE_CHAR, &lockState, sizeof(uint8_t), sizeof(LockState_t), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); + unlockChar = new ReadWriteArrayGattCharacteristic(UUID_UNLOCK_CHAR, unlockToken); + publicEcdhKeyChar = new GattCharacteristic(UUID_PUBLIC_ECDH_KEY_CHAR, publicEcdhKey, 0, sizeof(PublicEcdhKey_t), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); + eidIdentityKeyChar = new GattCharacteristic(UUID_EID_IDENTITY_KEY_CHAR, encryptedEidIdentityKey, 0, sizeof(EidIdentityKey_t), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); + advSlotDataChar = new GattCharacteristic(UUID_ADV_SLOT_DATA_CHAR, slotData, 0, 34, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); + factoryResetChar = new WriteOnlyGattCharacteristic(UUID_FACTORY_RESET_CHAR, &factoryReset); + remainConnectableChar = new ReadWriteGattCharacteristic(UUID_REMAIN_CONNECTABLE_CHAR, &remainConnectable); + + // CHAR-1 capabilities (READ ONLY) + capabilitiesChar->setReadAuthorizationCallback(this, &EddystoneService::readBasicTestLockAuthorizationCallback); + // CHAR-2 Active Slot + activeSlotChar->setReadAuthorizationCallback(this, &EddystoneService::readBasicTestLockAuthorizationCallback); + activeSlotChar->setWriteAuthorizationCallback(this, &EddystoneService::writeActiveSlotAuthorizationCallback); + // CHAR-3 Adv Interval + advIntervalChar->setReadAuthorizationCallback(this, &EddystoneService::readAdvIntervalAuthorizationCallback); + advIntervalChar->setWriteAuthorizationCallback(this, &EddystoneService::writeBasicAuthorizationCallback); + // CHAR-4 Radio TX Power + radioTxPowerChar->setReadAuthorizationCallback(this, &EddystoneService::readRadioTxPowerAuthorizationCallback); + radioTxPowerChar->setWriteAuthorizationCallback(this, &EddystoneService::writeBasicAuthorizationCallback); + // CHAR-5 + advTxPowerChar->setReadAuthorizationCallback(this, &EddystoneService::readAdvTxPowerAuthorizationCallback); + advTxPowerChar->setWriteAuthorizationCallback(this, &EddystoneService::writeBasicAuthorizationCallback); + // CHAR-6 Lock State + lockStateChar->setWriteAuthorizationCallback(this, &EddystoneService::writeLockStateAuthorizationCallback); + // CHAR-7 Unlock + unlockChar->setReadAuthorizationCallback(this, &EddystoneService::readUnlockAuthorizationCallback); + unlockChar->setWriteAuthorizationCallback(this, &EddystoneService::writeUnlockAuthorizationCallback); + // CHAR-8 Public Ecdh Key (READ ONLY) + publicEcdhKeyChar->setReadAuthorizationCallback(this, &EddystoneService::readPublicEcdhKeyAuthorizationCallback); + // CHAR-9 EID Identity Key (READ ONLY) + eidIdentityKeyChar->setReadAuthorizationCallback(this, &EddystoneService::readEidIdentityAuthorizationCallback); + // CHAR-10 Adv Slot Data + advSlotDataChar->setReadAuthorizationCallback(this, &EddystoneService::readDataAuthorizationCallback); + advSlotDataChar->setWriteAuthorizationCallback(this, &EddystoneService::writeVarLengthDataAuthorizationCallback); + // CHAR-11 Factory Reset + factoryResetChar->setReadAuthorizationCallback(this, &EddystoneService::readBasicTestLockAuthorizationCallback); + factoryResetChar->setWriteAuthorizationCallback(this, &EddystoneService::writeBasicAuthorizationCallback); + // CHAR-12 Remain Connectable + remainConnectableChar->setReadAuthorizationCallback(this, &EddystoneService::readBasicTestLockAuthorizationCallback); + remainConnectableChar->setWriteAuthorizationCallback(this, &EddystoneService::writeBasicAuthorizationCallback); + + // Create pointers to all characteristics in the GATT service + charTable[0] = capabilitiesChar; + charTable[1] = activeSlotChar; + charTable[2] = advIntervalChar; + charTable[3] = radioTxPowerChar; + charTable[4] = advTxPowerChar; + charTable[5] = lockStateChar; + charTable[6] = unlockChar; + charTable[7] = publicEcdhKeyChar; + charTable[8] = eidIdentityKeyChar; + charTable[9] = advSlotDataChar; + charTable[10] = factoryResetChar; + charTable[11] = remainConnectableChar; + + GattService configService(UUID_ES_BEACON_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); + + ble.gattServer().addService(configService); + ble.gattServer().onDataWritten(this, &EddystoneService::onDataWrittenCallback); + updateCharacteristicValues(); +} + + +void EddystoneService::freeConfigCharacteristics(void) +{ + delete capabilitiesChar; + delete activeSlotChar; + delete advIntervalChar; + delete radioTxPowerChar; + delete advTxPowerChar; + delete lockStateChar; + delete unlockChar; + delete publicEcdhKeyChar; + delete eidIdentityKeyChar; + delete advSlotDataChar; + delete factoryResetChar; + delete remainConnectableChar; +} + +void EddystoneService::stopEddystoneBeaconAdvertisements(void) +{ + /* Unschedule callbacks */ + + for (int slot = 0; slot < MAX_ADV_SLOTS; slot++) { + if (slotCallbackHandles[slot]) { + eventQueue.cancel(slotCallbackHandles[slot]); + slotCallbackHandles[slot] = NULL; + } + } + + if (radioManagerCallbackHandle) { + eventQueue.cancel(radioManagerCallbackHandle); + radioManagerCallbackHandle = NULL; + } + + /* Stop any current Advs (ES Config or Beacon) */ + BLE::Instance().gap().stopAdvertising(); +} + +/* + * Internal helper function used to update the GATT database following any + * change to the internal state of the service object. + */ +void EddystoneService::updateCharacteristicValues(void) +{ + // Init variables for update + uint16_t beAdvInterval = swapEndian(slotAdvIntervals[activeSlot]); + int8_t radioTxPower = slotRadioTxPowerLevels[activeSlot]; + int8_t advTxPower = slotAdvTxPowerLevels[activeSlot]; + uint8_t* frame = slotToFrame(activeSlot); + uint8_t slotLength = 0; + uint8_t* slotData = NULL; + memset(encryptedEidIdentityKey, 0, sizeof(encryptedEidIdentityKey)); + + switch(slotFrameTypes[activeSlot]) { + case EDDYSTONE_FRAME_UID: + slotLength = uidFrame.getDataLength(frame); + slotData = uidFrame.getData(frame); + break; + case EDDYSTONE_FRAME_URL: + slotLength = urlFrame.getDataLength(frame); + slotData = urlFrame.getData(frame); + break; + case EDDYSTONE_FRAME_TLM: + updateRawTLMFrame(frame); + slotLength = tlmFrame.getDataLength(frame); + slotData = tlmFrame.getData(frame); + break; + case EDDYSTONE_FRAME_EID: + slotLength = eidFrame.getDataLength(frame); + slotData = eidFrame.getData(frame); + aes128Encrypt(unlockKey, slotEidIdentityKeys[activeSlot], encryptedEidIdentityKey); + break; + } + + ble.gattServer().write(capabilitiesChar->getValueHandle(), reinterpret_cast(capabilities), sizeof(Capability_t)); + ble.gattServer().write(activeSlotChar->getValueHandle(), &activeSlot, sizeof(uint8_t)); + ble.gattServer().write(advIntervalChar->getValueHandle(), reinterpret_cast(&beAdvInterval), sizeof(uint16_t)); + ble.gattServer().write(radioTxPowerChar->getValueHandle(), reinterpret_cast(&radioTxPower), sizeof(int8_t)); + ble.gattServer().write(advTxPowerChar->getValueHandle(), reinterpret_cast(&advTxPower), sizeof(int8_t)); + ble.gattServer().write(lockStateChar->getValueHandle(), &lockState, sizeof(uint8_t)); + ble.gattServer().write(unlockChar->getValueHandle(), unlockToken, sizeof(Lock_t)); + ble.gattServer().write(publicEcdhKeyChar->getValueHandle(), reinterpret_cast(publicEcdhKey), sizeof(PublicEcdhKey_t)); + ble.gattServer().write(eidIdentityKeyChar->getValueHandle(), reinterpret_cast(encryptedEidIdentityKey), sizeof(EidIdentityKey_t)); + ble.gattServer().write(advSlotDataChar->getValueHandle(), slotData, slotLength); + ble.gattServer().write(factoryResetChar->getValueHandle(), &factoryReset, sizeof(uint8_t)); + ble.gattServer().write(remainConnectableChar->getValueHandle(), &remainConnectable, sizeof(uint8_t)); +} + +EddystoneService::EddystoneError_t EddystoneService::startEddystoneConfigAdvertisements(void) +{ + stopEddystoneBeaconAdvertisements(); + + if (advConfigInterval == 0) { + // Nothing to do, the advertisement interval is 0 + return EDDYSTONE_ERROR_INVALID_ADVERTISING_INTERVAL; + } + + operationMode = EDDYSTONE_MODE_CONFIG; + + ble.gap().clearAdvertisingPayload(); + + /* Accumulate the new payload */ + // Add the Flags param + ble.gap().accumulateAdvertisingPayload( + GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE + ); +#ifdef INCLUDE_CONFIG_URL + // Add the Eddystone 16-bit Service ID + ble.gap().accumulateAdvertisingPayload( + GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, + EDDYSTONE_UUID, + sizeof(EDDYSTONE_UUID) + ); +#endif + /* UUID is in different order in the ADV frame (!) */ + uint8_t reversedServiceUUID[sizeof(UUID_ES_BEACON_SERVICE)]; + for (size_t i = 0; i < sizeof(UUID_ES_BEACON_SERVICE); i++) { + reversedServiceUUID[i] = UUID_ES_BEACON_SERVICE[sizeof(UUID_ES_BEACON_SERVICE) - i - 1]; + } + ble.gap().accumulateAdvertisingPayload( + GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, + reversedServiceUUID, + sizeof(reversedServiceUUID) + ); + // Add Generic Appearance Tag + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_TAG); + setupEddystoneConfigScanResponse(); + + ble.gap().setTxPower(radioTxPowerLevels[sizeof(PowerLevels_t)-1]); // Max Power for Config + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.gap().setAdvertisingInterval(advConfigInterval); + ble.gap().startAdvertising(); + + return EDDYSTONE_ERROR_NONE; +} + +void EddystoneService::setupEddystoneConfigScanResponse(void) +{ + ble.gap().clearScanResponse(); + // Add LOCAL NAME (indicating the Eddystone Version) + ble.gap().accumulateScanResponse( + GapAdvertisingData::COMPLETE_LOCAL_NAME, + reinterpret_cast(deviceName), + strlen(deviceName) + ); +#ifdef INCLUDE_CONFIG_URL + // Add SERVICE DATA for a PhyWeb Config URL + uint8_t configFrame[URLFrame::ENCODED_BUF_SIZE]; + int encodedUrlLen = URLFrame::encodeURL(configFrame + CONFIG_FRAME_HDR_LEN, EDDYSTONE_CONFIG_URL); + uint8_t advPower = advTxPowerLevels[sizeof(PowerLevels_t)-1] & 0xFF; + uint8_t configFrameHdr[CONFIG_FRAME_HDR_LEN] = {0, 0, URLFrame::FRAME_TYPE_URL, advPower}; + // ++ Fill in the Eddystone Service UUID in the HDR + memcpy(configFrameHdr, EDDYSTONE_UUID, sizeof(EDDYSTONE_UUID)); + // ++ Copy the HDR to the config frame + memcpy(configFrame, configFrameHdr, CONFIG_FRAME_HDR_LEN); + ble.gap().accumulateScanResponse( + GapAdvertisingData::SERVICE_DATA, + configFrame, + CONFIG_FRAME_HDR_LEN + encodedUrlLen + ); +#else + // Add TRANSMIT POWER + ble.gap().accumulateScanResponse( + GapAdvertisingData::TX_POWER_LEVEL, + reinterpret_cast(&advTxPowerLevels[sizeof(PowerLevels_t)-1]), + sizeof(uint8_t) + ); +#endif +} + +/* WRITE AUTHORIZATION */ + +void EddystoneService::writeUnlockAuthorizationCallback(GattWriteAuthCallbackParams *authParams) +{ + if (lockState == UNLOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED; + } else if (authParams->len != sizeof(Lock_t)) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH; + } else if (authParams->offset != 0) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET; + } else if (memcmp(authParams->data, unlockToken, sizeof(Lock_t)) != 0) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +void EddystoneService::writeVarLengthDataAuthorizationCallback(GattWriteAuthCallbackParams *authParams) +{ + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED; + } else if (authParams->len > 34) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + + +void EddystoneService::writeLockStateAuthorizationCallback(GattWriteAuthCallbackParams *authParams) +{ + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED; + } else if ((authParams->len != sizeof(uint8_t)) && (authParams->len != (sizeof(uint8_t) + sizeof(Lock_t)))) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH; + } else if (authParams->offset != 0) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +template +void EddystoneService::writeBasicAuthorizationCallback(GattWriteAuthCallbackParams *authParams) +{ + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED; + } else if (authParams->len != sizeof(T)) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH; + } else if (authParams->offset != 0) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +template +void EddystoneService::writeActiveSlotAuthorizationCallback(GattWriteAuthCallbackParams *authParams) +{ + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED; + } else if (authParams->len != sizeof(T)) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH; + } else if (*(authParams->data) > MAX_ADV_SLOTS -1) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH; + } else if (authParams->offset != 0) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +/* READ AUTHORIZTION */ + +void EddystoneService::readBasicTestLockAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ BASIC TEST LOCK slot=%d\r\n", activeSlot)); + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +void EddystoneService::readEidIdentityAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ EID IDENTITY slot=%d\r\n", activeSlot)); + aes128Encrypt(unlockKey, slotEidIdentityKeys[activeSlot], encryptedEidIdentityKey); + int sum = 0; + // Test if the IdentityKey is all zeros for this slot + for (uint8_t i = 0; i < sizeof(EidIdentityKey_t); i++) { + sum = sum + slotEidIdentityKeys[activeSlot][i]; + } + ble.gattServer().write(eidIdentityKeyChar->getValueHandle(), encryptedEidIdentityKey, sizeof(EidIdentityKey_t)); + + // When the array is all zeros, the key has not been set, so return fault + if ((lockState == LOCKED) || (sum == 0)) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +void EddystoneService::readPublicEcdhKeyAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ BEACON PUBLIC ECDH KEY (LE) slot=%d\r\n", activeSlot)); + + ble.gattServer().write(publicEcdhKeyChar->getValueHandle(), publicEcdhKeyLE, sizeof(PublicEcdhKey_t)); + + // When the array is all zeros, the key has not been set, so return fault + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + } else { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; + } +} + +void EddystoneService::readDataAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ ADV-DATA : slot=%d\r\n", activeSlot)); + uint8_t frameType = slotFrameTypes[activeSlot]; + uint8_t* frame = slotToFrame(activeSlot); + uint8_t slotLength = 1; + uint8_t buf[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + uint8_t* slotData = buf; + + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + return; + } + LOG(("IN READ ADV-DATA AFTER LOCK TEST frameType=%d\r\n", frameType)); + if (testValidFrame(frame) ) { // Check the frame has valid data before proceeding + switch(frameType) { + case EDDYSTONE_FRAME_UID: + LOG(("READ ADV-DATA UID SLOT DATA slot=%d\r\n", activeSlot)); + slotLength = uidFrame.getDataLength(frame); + slotData = uidFrame.getData(frame); + break; + case EDDYSTONE_FRAME_URL: + LOG(("READ ADV-DATA URL SLOT DATA slot=%d\r\n", activeSlot)); + slotLength = urlFrame.getDataLength(frame); + slotData = urlFrame.getData(frame); + break; + case EDDYSTONE_FRAME_TLM: + LOG(("READ ADV-DATA TLM SLOT DATA slot=%d\r\n", activeSlot)); + updateRawTLMFrame(frame); + slotLength = tlmFrame.getDataLength(frame); + slotData = tlmFrame.getData(frame); + LOG(("READ ADV-DATA AFTER T/E TLM length=%d\r\n", slotLength)); + LOG(("Data=")); logPrintHex(slotData, 18); + break; + case EDDYSTONE_FRAME_EID: + LOG(("READ ADV-DATA EID SLOT DATA slot=%d\r\n", activeSlot)); + slotLength = 14; + buf[0] = EIDFrame::FRAME_TYPE_EID; + buf[1] = slotEidRotationPeriodExps[activeSlot]; + // Add time as a big endian 32 bit number + uint32_t timeSecs = getTimeSinceFirstBootSecs(); + buf[2] = (timeSecs >> 24) & 0xff; + buf[3] = (timeSecs >> 16) & 0xff; + buf[4] = (timeSecs >> 8) & 0xff; + buf[5] = timeSecs & 0xff; + memcpy(buf + 6, eidFrame.getEid(frame), 8); + slotData = buf; + break; + } + } + LOG(("IN READ ADV-DATA AFTER FRAME PROCESSING slot=%d\r\n", activeSlot)); + ble.gattServer().write(advSlotDataChar->getValueHandle(), slotData, slotLength); + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; +} + +bool EddystoneService::testValidFrame(uint8_t* frame) { + return (frame[0] != 0 ) ? true : false; +} + +void EddystoneService::readUnlockAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ UNLOCK slot=%d\r\n", activeSlot)); + if (lockState == UNLOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + return; + } + // Update the challenge ready for the characteristic read + generateRandom(challenge, sizeof(Lock_t)); + aes128Encrypt(unlockKey, challenge, unlockToken); + ble.gattServer().write(unlockChar->getValueHandle(), reinterpret_cast(challenge), sizeof(Lock_t)); + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; +} + +void EddystoneService::readAdvIntervalAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ ADV INTERVAL slot=%d\r\n", activeSlot)); + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + return; + } + uint16_t beAdvInterval = swapEndian(slotAdvIntervals[activeSlot]); + ble.gattServer().write(advIntervalChar->getValueHandle(), reinterpret_cast(&beAdvInterval), sizeof(uint16_t)); + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; +} + +void EddystoneService::readRadioTxPowerAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ RADIO TXPOWER slot=%d\r\n", activeSlot)); + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + return; + } + int8_t radioTxPower = slotRadioTxPowerLevels[activeSlot]; + ble.gattServer().write(radioTxPowerChar->getValueHandle(), reinterpret_cast(&radioTxPower), sizeof(int8_t)); + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; +} + +void EddystoneService::readAdvTxPowerAuthorizationCallback(GattReadAuthCallbackParams *authParams) +{ + LOG(("\r\nDO READ ADV TXPOWER slot=%d\r\n", activeSlot)); + if (lockState == LOCKED) { + authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_READ_NOT_PERMITTED; + return; + } + int8_t advTxPower = slotAdvTxPowerLevels[activeSlot]; + ble.gattServer().write(advTxPowerChar->getValueHandle(), reinterpret_cast(&advTxPower), sizeof(int8_t)); + authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS; +} + +/* + * This callback is invoked when a GATT client attempts to modify any of the + * characteristics of this service. Attempts to do so are also applied to + * the internal state of this service object. + */ +void EddystoneService::onDataWrittenCallback(const GattWriteCallbackParams *writeParams) +{ + uint16_t handle = writeParams->handle; + LOG(("\r\nDO WRITE: Handle=%d Len=%d\r\n", handle, writeParams->len)); + // CHAR-1 CAPABILITIES + /* capabilitySlotChar is READ ONLY */ + // CHAR-2 ACTIVE SLOT + if (handle == activeSlotChar->getValueHandle()) { + LOG(("Write: Active Slot Handle=%d\r\n", handle)); + uint8_t slot = *(writeParams->data); + LOG(("Active Slot=%d\r\n", slot)); + // Ensure slot does not exceed limit, or set highest slot + if (slot < MAX_ADV_SLOTS) { + activeSlot = slot; + } + ble.gattServer().write(activeSlotChar->getValueHandle(), &activeSlot, sizeof(uint8_t)); + // CHAR-3 ADV INTERVAL + } else if (handle == advIntervalChar->getValueHandle()) { + LOG(("Write: Interval Handle=%d\r\n", handle)); + uint16_t interval = correctAdvertisementPeriod(swapEndian(*((uint16_t *)(writeParams->data)))); + slotAdvIntervals[activeSlot] = interval; // Store this value for reading + uint16_t beAdvInterval = swapEndian(slotAdvIntervals[activeSlot]); + ble.gattServer().write(advIntervalChar->getValueHandle(), reinterpret_cast(&beAdvInterval), sizeof(uint16_t)); + // CHAR-4 RADIO TX POWER + } else if (handle == radioTxPowerChar->getValueHandle()) { + LOG(("Write: RADIO Power Handle=%d\r\n", handle)); + int8_t radioTxPower = *(writeParams->data); + uint8_t index = radioTxPowerToIndex(radioTxPower); + radioTxPower = radioTxPowerLevels[index]; // Power now corrected to nearest allowed power + slotRadioTxPowerLevels[activeSlot] = radioTxPower; // Store by slot number + int8_t advTxPower = advTxPowerLevels[index]; // Determine adv power equivalent + slotAdvTxPowerLevels[activeSlot] = advTxPower; + setFrameTxPower(activeSlot, advTxPower); // Set the actual frame radio TxPower for this slot + ble.gattServer().write(radioTxPowerChar->getValueHandle(), reinterpret_cast(&radioTxPower), sizeof(int8_t)); + // CHAR-5 ADV TX POWER + } else if (handle == advTxPowerChar->getValueHandle()) { + LOG(("Write: ADV Power Handle=%d\r\n", handle)); + int8_t advTxPower = *(writeParams->data); + slotAdvTxPowerLevels[activeSlot] = advTxPower; + setFrameTxPower(activeSlot, advTxPower); // Update the actual frame Adv TxPower for this slot + ble.gattServer().write(advTxPowerChar->getValueHandle(), reinterpret_cast(&advTxPower), sizeof(int8_t)); + // CHAR-6 LOCK STATE + } else if (handle == lockStateChar->getValueHandle()) { + LOG(("Write: Lock State Handle=%d\r\n", handle)); + uint8_t newLockState = *(writeParams->data); + if ((writeParams->len == sizeof(uint8_t)) || (writeParams->len == sizeof(uint8_t) + sizeof(Lock_t))) { + if ((newLockState == LOCKED) || (newLockState == UNLOCKED) || (newLockState == UNLOCKED_AUTO_RELOCK_DISABLED)) { + lockState = newLockState; + } + } + if ((newLockState == LOCKED) && (writeParams->len == (sizeof(uint8_t) + sizeof(Lock_t))) ) { + // And sets the new secret lock code if present + uint8_t encryptedNewKey[sizeof(Lock_t)]; + uint8_t newKey[sizeof(Lock_t)]; + memcpy(encryptedNewKey, (writeParams->data)+1, sizeof(Lock_t)); + // Decrypt the new key + aes128Decrypt(unlockKey, encryptedNewKey, newKey); + memcpy(unlockKey, newKey, sizeof(Lock_t)); + } + ble.gattServer().write(lockStateChar->getValueHandle(), reinterpret_cast(&lockState), sizeof(uint8_t)); + // CHAR-7 UNLOCK + } else if (handle == unlockChar->getValueHandle()) { + LOG(("Write: Unlock Handle=%d\r\n", handle)); + // NOTE: Actual comparison with unlock code is done in: + // writeUnlockAuthorizationCallback(...) which is executed before this method call. + lockState = UNLOCKED; + // Regenerate challenge and expected unlockToken for Next unlock operation + generateRandom(challenge, sizeof(Lock_t)); + aes128Encrypt(unlockKey, challenge, unlockToken); + // Update Chars + ble.gattServer().write(unlockChar->getValueHandle(), reinterpret_cast(challenge), sizeof(Lock_t)); // Update the challenge + ble.gattServer().write(lockStateChar->getValueHandle(), reinterpret_cast(&lockState), sizeof(uint8_t)); // Update the lock + // CHAR-8 PUBLIC ECDH KEY + /* PublicEchdChar is READ ONLY */ + // CHAR-9 EID INDENTITY KEY + /* EidIdentityChar is READ ONLY */ + // CHAR-10 ADV DATA + } else if (handle == advSlotDataChar->getValueHandle()) { + LOG(("Write: Adv Slot DATA Handle=%d\r\n", handle)); + uint8_t* frame = slotToFrame(activeSlot); + int8_t advTxPower = slotAdvTxPowerLevels[activeSlot]; + uint8_t writeFrameFormat = *(writeParams->data); + uint8_t writeFrameLen = (writeParams->len); + uint8_t writeData[34]; + uint8_t serverPublicEcdhKey[32]; + + if (writeFrameLen != 0) { + writeFrameLen--; // Remove the Format byte from the count + } else { + writeFrameFormat = UNDEFINED_FRAME_FORMAT; // Undefined format + } + + memcpy(writeData, (writeParams->data) + 1, writeFrameLen); + LOG(("ADV Data Write=%d,%d\r\n", writeFrameFormat, writeFrameLen)); + switch(writeFrameFormat) { + case UIDFrame::FRAME_TYPE_UID: + if (writeFrameLen == 16) { + uidFrame.setData(frame, advTxPower,reinterpret_cast((writeParams->data) + 1)); + slotFrameTypes[activeSlot] = EDDYSTONE_FRAME_UID; + } else if (writeFrameLen == 0) { + uidFrame.clearFrame(frame); + } + break; + case URLFrame::FRAME_TYPE_URL: + if (writeFrameLen <= 18) { + urlFrame.setData(frame, advTxPower, reinterpret_cast((writeParams->data) + 1), writeFrameLen ); + slotFrameTypes[activeSlot] = EDDYSTONE_FRAME_URL; + } else if (writeFrameLen == 0) { + urlFrame.clearFrame(frame); + } + break; + case TLMFrame::FRAME_TYPE_TLM: + if (writeFrameLen == 0) { + updateRawTLMFrame(frame); + tlmFrame.setData(frame); + int slot = getEidSlot(); + LOG(("WRITE: Testing if TLM or ETLM=%d\r\n", slot)); + if (slot != NO_EID_SLOT_SET) { + LOG(("WRITE: Configuring ETLM Slot time(S)=%lu\r\n", getTimeSinceFirstBootSecs() )); + tlmFrame.encryptData(frame, slotEidIdentityKeys[slot], slotEidRotationPeriodExps[slot], getTimeSinceFirstBootSecs() ); + } + slotFrameTypes[activeSlot] = EDDYSTONE_FRAME_TLM; + } + break; + case EIDFrame::FRAME_TYPE_EID: + LOG(("EID Len=%d\r\n", writeFrameLen)); + if (writeFrameLen == 17) { + // Least secure + LOG(("EID Insecure branch\r\n")); + aes128Decrypt(unlockKey, writeData, slotEidIdentityKeys[activeSlot]); + slotEidRotationPeriodExps[activeSlot] = writeData[16]; // index 16 is the exponent + ble.gattServer().write(eidIdentityKeyChar->getValueHandle(), reinterpret_cast(&writeData), sizeof(EidIdentityKey_t)); + } else if (writeFrameLen == 33 ) { + // Most secure + memcpy(serverPublicEcdhKey, writeData, 32); + ble.gattServer().write(publicEcdhKeyChar->getValueHandle(), reinterpret_cast(&serverPublicEcdhKey), sizeof(PublicEcdhKey_t)); + LOG(("ServerPublicEcdhKey=")); logPrintHex(serverPublicEcdhKey, 32); + slotEidRotationPeriodExps[activeSlot] = writeData[32]; // index 32 is the exponent + LOG(("Exponent=%i\r\n", writeData[32])); + LOG(("genBeaconKeyRC=%x\r\n", genBeaconKeyRC)); + LOG(("BeaconPrivateEcdhKey=")); logPrintHex(privateEcdhKey, 32); + LOG(("BeaconPublicEcdhKey=")); logPrintHex(publicEcdhKey, 32); + LOG(("genECDHShareKey\r\n")); + int rc = eidFrame.genEcdhSharedKey(privateEcdhKey, publicEcdhKey, serverPublicEcdhKey, slotEidIdentityKeys[activeSlot]); + LOG(("Gen Keys RC = %x\r\n", rc)); + LOG(("Generated eidIdentityKey=")); logPrintHex(slotEidIdentityKeys[activeSlot], 16); + aes128Encrypt(unlockKey, slotEidIdentityKeys[activeSlot], encryptedEidIdentityKey); + LOG(("encryptedEidIdentityKey=")); logPrintHex(encryptedEidIdentityKey, 16); + ble.gattServer().write(eidIdentityKeyChar->getValueHandle(), reinterpret_cast(&encryptedEidIdentityKey), sizeof(EidIdentityKey_t)); + } else if (writeFrameLen == 0) { + // Reset eidFrame + eidFrame.clearFrame(frame); + break; + } else { + break; // Do nothing, this is not a recognized Frame length + } + // Establish the new frame type + slotFrameTypes[activeSlot] = EDDYSTONE_FRAME_EID; + nextEidSlot = activeSlot; // This was the last one updated + LOG(("update Eid Frame\r\n")); + // Generate EID ADV frame packet + eidFrame.setData(frame, advTxPower, nullEid); + // Fill in the correct EID Value from the Identity Key/exp/clock + eidFrame.update(frame, slotEidIdentityKeys[activeSlot], slotEidRotationPeriodExps[activeSlot], getTimeSinceFirstBootSecs() ); + LOG(("END update Eid Frame\r\n")); + break; + default: + frame[0] = 0; // Frame format unknown so clear the entire frame by writing 0 to its length + break; + } + // Read takes care of setting the Characteristic Value + // CHAR-11 FACTORY RESET + } else if (handle == factoryResetChar->getValueHandle() && (*((uint8_t *)writeParams->data) != 0)) { + LOG(("Write: Factory Reset: Handle=%d\r\n", handle)); + // Reset params to default values + doFactoryReset(); + // Update all characteristics based on params + updateCharacteristicValues(); + // CHAR-12 REMAIN CONNECTABLE + } else if (handle == remainConnectableChar->getValueHandle()) { + LOG(("Write: Remain Connectable Handle=%d\r\n", handle)); + remainConnectable = *(writeParams->data); + ble.gattServer().write(remainConnectableChar->getValueHandle(), &remainConnectable, sizeof(uint8_t)); + } + +} + +void EddystoneService::setFrameTxPower(uint8_t slot, int8_t advTxPower) { + uint8_t* frame = slotToFrame(slot); + uint8_t frameType = slotFrameTypes[slot] << 4; // Converting the enum to an actual frame type + switch (frameType) { + case UIDFrame::FRAME_TYPE_UID: + uidFrame.setAdvTxPower(frame, advTxPower); + break; + case URLFrame::FRAME_TYPE_URL: + urlFrame.setAdvTxPower(frame, advTxPower); + break; + case EIDFrame::FRAME_TYPE_EID: + eidFrame.setAdvTxPower(frame, advTxPower); + break; + } +} + +uint8_t EddystoneService::radioTxPowerToIndex(int8_t txPower) { + // NOTE: txPower is an 8-bit signed number + uint8_t size = sizeof(PowerLevels_t); + // Look for the value in range (or next biggest value) + for (uint8_t i = 0; i < size; i++) { + if (txPower <= radioTxPowerLevels[i]) { + return i; + } + } + return size - 1; +} + +/** AES128 encrypts a 16-byte input array with a key, resulting in a 16-byte output array */ +void EddystoneService::aes128Encrypt(uint8_t key[], uint8_t input[], uint8_t output[]) { + mbedtls_aes_context ctx; + mbedtls_aes_init(&ctx); + mbedtls_aes_setkey_enc(&ctx, key, 8 * sizeof(Lock_t)); + mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, input, output); + mbedtls_aes_free(&ctx); +} + +/** AES128 decrypts a 16-byte input array with a key, resulting in a 16-byte output array */ +void EddystoneService::aes128Decrypt(uint8_t key[], uint8_t input[], uint8_t output[]) { + mbedtls_aes_context ctx; + mbedtls_aes_init(&ctx); + mbedtls_aes_setkey_dec(&ctx, key, 8 * sizeof(Lock_t)); + mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, input, output); + mbedtls_aes_free(&ctx); +} + + + +#ifdef HARDWARE_RANDOM_NUM_GENERATOR +// Generates a set of random values in byte array[size] based on hardware source +void EddystoneService::generateRandom(uint8_t ain[], int size) { + mbedtls_entropy_context entropy; + mbedtls_entropy_init(&entropy); + // init entropy source + eddystoneRegisterEntropySource(&entropy); + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ctr_drbg_init(&ctr_drbg); + mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0); + mbedtls_ctr_drbg_random(&ctr_drbg, ain, size); + mbedtls_ctr_drbg_free(&ctr_drbg); + mbedtls_entropy_free(&entropy); + return; +} +#else +// Generates a set of random values in byte array[size] seeded by the clock(ms) +void EddystoneService::generateRandom(uint8_t ain[], int size) { + int i; + // Random seed based on boot time in milliseconds + srand(getTimeSinceLastBootMs()); + for (i = 0; i < size; i++) { + ain[i] = rand() % 256; + } + return; +} +#endif + +/** Reverse Even sized Array endianess: Big to Little or Little to Big */ +void EddystoneService::swapEndianArray(uint8_t ptrIn[], uint8_t ptrOut[], int size) { + int i; + for (i = 0; i < size; i++) { + ptrOut[i] = ptrIn[size - i - 1]; + } + return; +} + +/** Reverse endianess: Big to Little or Little to Big */ +uint16_t EddystoneService::swapEndian(uint16_t arg) { + return (arg / 256) + (arg % 256) * 256; +} + +uint16_t EddystoneService::correctAdvertisementPeriod(uint16_t beaconPeriodIn) const +{ + /* Re-map beaconPeriod to within permissible bounds if necessary. */ + if (beaconPeriodIn != 0) { + if (beaconPeriodIn < ble.gap().getMinNonConnectableAdvertisingInterval()) { + return ble.gap().getMinNonConnectableAdvertisingInterval(); + } else if (beaconPeriodIn > ble.gap().getMaxAdvertisingInterval()) { + return ble.gap().getMaxAdvertisingInterval(); + } + } + return beaconPeriodIn; +} + +void EddystoneService::logPrintHex(uint8_t* a, int len) { + for (int i = 0; i < len; i++) { + LOG(("%x%x", a[i] >> 4, a[i] & 0x0f )); + } + LOG(("\r\n")); +} + +void EddystoneService::setRandomMacAddress(void) { +#ifdef EID_RANDOM_MAC + uint8_t macAddress[6]; // 48 bit Mac Address + generateRandom(macAddress, 6); + macAddress[5] |= 0xc0; // Ensure upper two bits are 11's for Random Add + ble.setAddress(BLEProtocol::AddressType::RANDOM_STATIC, macAddress); +#endif +} + +int EddystoneService::getEidSlot(void) { + int eidSlot = NO_EID_SLOT_SET; // by default; + for (int i = 0; i < MAX_ADV_SLOTS; i++) { + if (slotFrameTypes[nextEidSlot] == EDDYSTONE_FRAME_EID) { + eidSlot = nextEidSlot; + nextEidSlot = (nextEidSlot-1) % MAX_ADV_SLOTS; + break; + } + nextEidSlot = (nextEidSlot-1) % MAX_ADV_SLOTS; // ensure the slot numbers wrap + } + return eidSlot; +} + +bool EddystoneService::isLocked(void) { + if (lockState == LOCKED) { + return true; + } else { + return false; + } +} + +/** + * Time : Stable Storage + */ + +/** + * Returns the time since FIRST Boot (Time in Prior Boots + Time since Last Boot) in SECONDS + */ +uint32_t EddystoneService::getTimeSinceFirstBootSecs(void) { + timeParams.timeSinceLastBoot = getTimeSinceLastBootMs() / 1000; + uint32_t totalTimeSinceFirstBoot = timeParams.timeSinceLastBoot + timeParams.timeInPriorBoots; + // Timer Overflow condition = 136 years (32 bits in seconds) so no need for wrap check + return totalTimeSinceFirstBoot; +} + +/** + * Returns the time since last boot in MILLISECONDS + * NOTE: This solution is needed as a stopgap until the Timer API is updated to 64-bit + */ +uint64_t EddystoneService::getTimeSinceLastBootMs(void) { + static uint64_t time64bit = 0; + time64bit += timeSinceBootTimer.read_ms(); + timeSinceBootTimer.reset(); + return time64bit; +} + +/** + * Store only the time params in Pstorage(e.g. NVM), to maintain time between boots + * NOTE: Platform-specific implementation for persistence on the nRF5x. Based on the + * pstorage module provided by the Nordic SDK. + */ +void EddystoneService::nvmSaveTimeParams(void) { + LOG(("Time NVM: ")); + LOG(("PriorBoots=%lu, SinceBoot=%lu\r\n", timeParams.timeInPriorBoots, timeParams.timeSinceLastBoot)); + saveEddystoneTimeParams(&timeParams); +} + +/* + * Establish constant arrays + */ +const uint8_t EddystoneService::slotDefaultUids[MAX_ADV_SLOTS][16] = EDDYSTONE_DEFAULT_SLOT_UIDS; + +const uint8_t EddystoneService::slotDefaultEidIdentityKeys[MAX_ADV_SLOTS][16] = EDDYSTONE_DEFAULT_SLOT_EID_IDENTITY_KEYS; + +const uint8_t EddystoneService::nullEid[8] = {0,0,0,0,0,0,0,0}; + + + diff --git a/implementations/mbed/source/EddystoneService.h b/implementations/mbed/source/EddystoneService.h new file mode 100644 index 0000000..a0bbebf --- /dev/null +++ b/implementations/mbed/source/EddystoneService.h @@ -0,0 +1,1198 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __EDDYSTONESERVICE_H__ +#define __EDDYSTONESERVICE_H__ +// +// 2016-03 Eddystone Unified GATT +// +#include "EventQueue/EventQueue.h" +#include "ble/BLE.h" +#include "EddystoneTypes.h" +#include "UIDFrame.h" +#include "URLFrame.h" +#include "TLMFrame.h" +#include "EIDFrame.h" +#include +#include "mbedtls/aes.h" +#include "mbedtls/entropy.h" +#include "mbedtls/ctr_drbg.h" +// #include "PersistentStorageHelper/ConfigParamsPersistence.h" + +#ifdef YOTTA_CFG_MBED_OS + #include "mbed-drivers/mbed.h" + #include "mbed-drivers/CircularBuffer.h" +#else + #include "mbed.h" + #include "CircularBuffer.h" +#endif + +#include "stdio.h" +#include "Eddystone_config.h" +#include "pstorage_platform.h" + +/** + * This class implements the Eddystone-URL Config Service and the Eddystone + * Protocol Specification as defined in the publicly available specification at + * https://github.com/google/eddystone/blob/master/protocol-specification.md. + */ +class EddystoneService +{ +public: + /** + * Total number of GATT Characteristics in the Eddystonei-URL Configuration + * Service. + */ + static const uint16_t TOTAL_CHARACTERISTICS = 12; + + /** + * Max data that can be written to the data characteristic + */ + static const uint8_t MAX_DATA_WRITE = 34; // FrameType+32B(IdentityKey)+Exp + + /** + * Default interval for advertising packets for the Eddystone-URL + * Configuration Service. + */ + static const uint32_t DEFAULT_CONFIG_PERIOD_MSEC = EDDYSTONE_DEFAULT_CONFIG_ADV_INTERVAL; + + /** + * Enumeration that defines the various operation modes of the + * EddystoneService. + * + * @note The main app can change the mode of EddystoneService at any point + * of time by calling startConfigService() or startBeaconService(). + * Resources from the previous mode will be freed. + * + * @note It is currently NOT possible to force EddystoneService back into + * EDDYSTONE_MODE_NONE. + */ + enum OperationModes { + /** + * NONE: EddystoneService has been initialized but no memory has been + * dynamically allocated. Additionally, no services are running + * nothing is being advertised. + */ + EDDYSTONE_MODE_NONE, + /** + * CONFIG: EddystoneService has been initialized, the configuration + * service started and memory has been allocated for BLE + * characteristics. Memory consumption peaks during CONFIG + * mode. + */ + EDDYSTONE_MODE_CONFIG, + /** + * BEACON: Eddystone service is running as a beacon advertising URL, + * UID and/or TLM frames depending on how it is configured. + */ + EDDYSTONE_MODE_BEACON + }; + + /** + * Structure that encapsulates the Eddystone configuration parameters. This + * structure is particularly useful when storing the parameters to + * persistent storage. + */ + struct EddystoneParams_t { + /** + * + */ + TimeParams_t timeParams; + /** + * A buffer describing the capabilities of the beacon + */ + Capability_t capabilities; + + /** + * Defines the slot that advInterval, radioPower, advPower, advSlotData operate on + */ + uint8_t activeSlot; + + /** + * The Beacon interval for each beacon slot + * + * @note A value of zero disables Eddystone-URL frame trasmissions. + */ + SlotAdvIntervals_t slotAdvIntervals; + + /** + * The Radio TX Powers supported by this beacon + */ + PowerLevels_t radioTxPowerLevels; + + /** + * The Radio TX Power set for each slot + */ + SlotTxPowerLevels_t slotRadioTxPowerLevels; + + /** + * The Calibrated Adv TX Powers supported by this beacon (one for each radio power) + */ + PowerLevels_t advTxPowerLevels; + + /** + * The Adv TX Power set for each slot + */ + SlotTxPowerLevels_t slotAdvTxPowerLevels; + + /** + * The value of the Eddystone-URL Configuration Service Lock State + * characteristic. + */ + uint8_t lockState; + + /** + * The value of the Eddystone-URL Configuration Service Unlock + * characteristic that can be used to unlock the beacon and clear the + * single-use lock-code. + */ + Lock_t unlockToken; + + /** + * An array holding the 128-bit unlockKey (big endian) + */ + Lock_t unlockKey; + + /** + * An array holding the 128-bit challenge (big endian) in the + * challenge/response unlock protocol + */ + Lock_t challenge; + + /** + * EID: An array holding the slot rotation period exponents + */ + SlotEidRotationPeriodExps_t slotEidRotationPeriodExps; + + /** + * EID: An array holding the slot 128-bit EID Identity Key (big endian) + */ + SlotEidIdentityKeys_t slotEidIdentityKeys; + + /** + * Specifies the type of each frame indexed by slot + */ + SlotFrameTypes_t slotFrameTypes; + + /** + * A buffer that contains all slot frames, 32-bytes allocated to each frame + */ + SlotStorage_t slotStorage; + + /** + * The state of the recently invoked Factory Reset characteristic + */ + uint8_t factoryReset; + + /** + * The state of the recently invoked Remain Connectable characteristic + */ + uint8_t remainConnectable; + }; + + /** + * Enumeration that defines the various error codes for EddystoneService. + */ + enum EddystoneError_t { + /** + * No error occurred. + */ + EDDYSTONE_ERROR_NONE, + /** + * The supplied advertising interval is invalid. The interval may be + * too short/long for the type of advertising packets being broadcast. + * + * @note For the acceptable range of advertising interval refer to the + * following functions in mbed BLE API: + * - Gap::getMinNonConnectableAdvertisingInterval() + * - Gap::getMinAdvertisingInterval() + * - Gap::getMaxAdvertisingInterval() + */ + EDDYSTONE_ERROR_INVALID_ADVERTISING_INTERVAL, + /** + * The result of executing a call when the the EddystoneService is in + * the incorrect operation mode. + */ + EDDYSTONE_ERROR_INVALID_STATE + }; + + /** + * Enumeration that defines the available frame types within Eddystone + * advertising packets. + */ + enum FrameType { + /** + * The Eddystone-UID frame. Refer to + * https://github.com/google/eddystone/tree/master/eddystone-uid. + */ + EDDYSTONE_FRAME_UID, + /** + * The Eddystone-URL frame. Refer to + * https://github.com/google/eddystone/tree/master/eddystone-url. + */ + EDDYSTONE_FRAME_URL, + /** + * The Eddystone-TLM frame. Refer to + * https://github.com/google/eddystone/tree/master/eddystone-tlm. + */ + EDDYSTONE_FRAME_TLM, + /** + * The Eddystone-EID frame. Refer to + * https://github.com/google/eddystone/tree/master/eddystone-eid. + */ + EDDYSTONE_FRAME_EID, + /** + * The total number Eddystone frame types. + */ + NUM_EDDYSTONE_FRAMES + }; + + typedef eq::EventQueue event_queue_t; + + /** + * Constructor that Initializes the EddystoneService using parameters from + * the supplied EddystoneParams_t. This constructor is particularly useful + * for configuring the EddystoneService with parameters fetched from + * persistent storage. + * + * @param[in] bleIn + * The BLE instance. + * @param[in] paramIn + * The input Eddystone configuration parameters. + * @param[in] radioPowerLevelsIn + * The value set internally into the radion tx power. + * @param[in] eventQueue + * The event queue used by the service to schedule tasks. + * @param[in] advConfigIntervalIn + * The advertising interval for advertising packets of the + * Eddystone-URL Configuration Service. + */ + EddystoneService(BLE &bleIn, + EddystoneParams_t ¶msIn, + const PowerLevels_t &radioPowerLevelsIn, + event_queue_t &eventQueue, + uint32_t advConfigIntervalIn = DEFAULT_CONFIG_PERIOD_MSEC); + + /** + * Constructor to initialize the EddystoneService to default values. + * + * @param[in] bleIn + * The BLE instance. + * @param[in] advPowerLevelsIn + * The value of the Eddystone-URL Configuration Service TX + * Power Mode characteristic. + * @param[in] radioPowerLevelsIn + * The value set internally into the radion tx power. + * @param[in] eventQueue + * The event queue used by the service to schedule tasks. + * @param[in] advConfigIntervalIn + * The advertising interval for advertising packets of the + * Eddystone-URL Configuration Service. + * + * @note When using this constructor the setURLData(), setTMLData() and + * setUIDData() and setEIDData() functions must be called to initialize + * EddystoneService manually. + */ + EddystoneService(BLE &bleIn, + const PowerLevels_t &advPowerLevelsIn, + const PowerLevels_t &radioPowerLevelsIn, + event_queue_t &eventQueue, + uint32_t advConfigIntervalIn = DEFAULT_CONFIG_PERIOD_MSEC); + + + /** + * Generate the EID Beacon Random ECHD Keys (private and Public) + */ + void genEIDBeaconKeys(void); + + /** + * Factory Reset all parameters in the beacon + */ + void doFactoryReset(void); + + /** + * Setup callback to update BatteryVoltage in Eddystone-TLM frames + * + * @param[in] tlmBatteryVoltageCallbackIn + * The callback being registered. + */ + void onTLMBatteryVoltageUpdate(TlmUpdateCallback_t tlmBatteryVoltageCallbackIn); + + /** + * Setup callback to update BeaconTemperature in Eddystone-TLM frames + * + * @param[in] tlmBeaconTemperatureCallbackIn + * The callback being registered. + */ + void onTLMBeaconTemperatureUpdate(TlmUpdateCallback_t tlmBeaconTemperatureCallbackIn); + + /** + * Change the EddystoneService OperationMode to EDDYSTONE_MODE_CONFIG. + * + * @retval EDDYSTONE_ERROR_NONE if the operation succeeded. + * @retval EDDYSONE_ERROR_INVALID_ADVERTISING_INTERVAL if the configured + * advertising interval is zero. + * + * @note If EddystoneService was previously in EDDYSTONE_MODE_BEACON, then + * the resources allocated to that mode of operation such as memory + * are freed and the BLE instance shutdown before the new operation + * mode is configured. + */ + EddystoneError_t startConfigService(void); + + /** + * Change the EddystoneService to start transmitting Eddystone beacons + * operationMode = EDDYSTONE_MODE_BEACON + * + * @retval EDDYSTONE_ERROR_NONE if the operation succeeded. + * @retval EDDYSONE_ERROR_INVALID_ADVERTISING_INTERVAL if the configured + * advertising interval is zero. + * + * @note If EddystoneService was previously in EDDYSTONE_MODE_CONFIG, then + * the resources allocated to that mode of operation such as memory + * are freed and the BLE instance shutdown before the new operation + * mode is configured. + */ + EddystoneError_t startEddystoneBeaconAdvertisements(void); + + /** + * Set the Comple Local Name for the BLE device. This not only updates + * the value of the Device Name Characteristic, it also updates the scan + * response payload if the EddystoneService is currently in + * EDDYSTONE_MODE_CONFIG. + * + * @param[in] deviceNameIn + * A pointer to a null terminated string containing the new + * device name. + * + * @return BLE_ERROR_NONE if the name was successfully set. Otherwise an + * appropriate error. + * + * @note EddystoneService does not make an internal copy of the string + * pointed to by @p deviceNameIn. Therefore, the user is responsible + * for ensuring that the string persists in memory as long as it is + * in use by the EddystoneService. + * + * @note The device name is not considered an Eddystone configuration + * parameter; therefore, it is not contained within the + * EddystoneParams_t structure and must be stored to persistent + * storage separately. + */ + ble_error_t setCompleteDeviceName(const char *deviceNameIn); + + /** + * Get the Eddystone Configuration parameters. This is particularly useful + * for storing the configuration parameters in persistent storage. + * It is not the responsibility of the Eddystone implementation to store + * the configured parameters in persistent storage since this is + * platform-specific. + * + * @param[out] params + * A reference to an EddystoneParams_t structure with the + * configured parameters of the EddystoneService. + */ + void getEddystoneParams(EddystoneParams_t ¶ms); + + /** + * Start advertising packets indicating the Eddystone Configuration state + * operationMode = EDDYSTONE_MODE_CONFIG + */ + EddystoneService::EddystoneError_t startEddystoneConfigAdvertisements(void); + + /** + * Free the resources acquired by a call to setupBeaconService() and + * cancel all pending callbacks that operate the radio and frame queue. + * + * @note This call will not modify the current state of the BLE device. + * EddystoneService::stopBeaconService should only be called after + * a call to BLE::shutdown(). + */ + void stopEddystoneBeaconAdvertisements(void); + + /** + * Initialize and start the BLE Eddystone Configuration Service + * This will create the 12-characteristics of the service and make them + * available when a client connects + */ + void startEddystoneConfigService(); + + /** + * Stops the Eddystone Configuration Service and frees its resources + * and cancels all pending callbacks that operate the radio and frame queue. + * + * @note This call will not modify the current state of the BLE device. + * EddystoneService::stopBeaconService should only be called after + * a call to BLE::shutdown(). + */ + void stopEddystoneConfigService(); + + /** + * Tests if the beacon is locked or not + * + * @return bool + */ + bool isLocked(); + + /** + * Print an array as a set of hex values + * + * @param[in] a + * The array to be printed. + * + * @param[in] len + * The length of the array. + * + * @return void + * + */ + static void logPrintHex(uint8_t* a, int len); + + /** + * Swaps the endianess of an array ptrIn[size] to ptrOut[size] + * + * @param[in] *ptrIn + * The input array + * @param[in] *ptrOut + * The output array + * @param[in] size + * The sizes of the arrays (num bytes to be reversed) + */ + static void swapEndianArray(uint8_t *ptrIn, uint8_t *ptrOut, int size); + + /** + * Generate a random array of bytes of length size + * + * @param[in] *ain + * The input/output array + * @param[in] size + * The size of the array in bytes + */ + static void generateRandom(uint8_t *ain, int size); + + /** + * Timer that keeps track of the time since boot. + */ + static Timer timeSinceBootTimer; + +private: + + static const uint8_t NO_EID_SLOT_SET = 0xff; + + static const uint8_t UNDEFINED_FRAME_FORMAT = 0xff; + + static const uint8_t REMAIN_CONNECTABLE_SET = 0x01; + + static const uint8_t REMAIN_CONNECTABLE_UNSET = 0x00; + + static const uint8_t CONFIG_FRAME_HDR_LEN = 4; + + /** + * Helper funtion that will be registered as an initialization complete + * callback when BLE::shutdown() is called. This is necessary when changing + * Eddystone OperationModes. Once the BLE initialization is complete, this + * callback will initialize all the necessary resource to operate + * Eddystone service in the selected mode. + * + * @param[in] initContext + * The context provided by BLE API when initialization + * completes. + */ + void bleInitComplete(BLE::InitializationCompleteCallbackContext* initContext); + + /** + * When in EDDYSTONE_MODE_BEACON this function is called to update the + * advertising payload to contain the information related to the specified + * FrameType. + * + * @param[in] slot + * The slot to populate the advertising payload with. + */ + void swapAdvertisedFrame(int slot); + + /** + * Helper function that manages the BLE radio that is used to broadcast + * advertising packets. To advertise frames at the configured intervals + * the actual advertising interval of the BLE instance is set to the value + * returned by Gap::getMaxAdvertisingInterval() from the BLE API. When a + * frame needs to be advertised, the enqueueFrame() callbacks add the frame + * type to the advFrameQueue and post a manageRadio() callback. When the + * callback is executed, the frame is dequeued and advertised using the + * radio (by updating the advertising payload). manageRadio() also posts a + * callback to itself Gap::getMinNonConnectableAdvertisingInterval() + * milliseconds later. In this callback, manageRadio() will advertise the + * next frame in the queue, yet if there is none it calls + * Gap::stopAdvertising() and does not post any further callbacks. + */ + void manageRadio(void); + + /** + * Regular callbacks posted at the rate of slotAdvPeriod[slot] milliseconds + * enqueue frames to be advertised. If the + * frame queue is currently empty, then this function directly calls + * manageRadio() to broadcast the required FrameType. + * + * @param[in] frameType + * The FrameType to enqueue for broadcasting. + */ + void enqueueFrame(int slot); + + /** + * Helper function that updates the advertising payload when in + * EDDYSTONE_MODE_BEACON to contain a new frame. + * + * @param[in] rawFrame + * The raw bytes of the frame to advertise. + * @param[in] rawFrameLength + * The length in bytes of the array pointed to by @p rawFrame. + */ + void updateAdvertisementPacket(const uint8_t* rawFrame, size_t rawFrameLength); + + /** + * Helper function that updates the information in the Eddystone-TLM frames + * Internally, this function executes the registered callbacks to update + * beacon Battery Voltage and Temperature (if available). Furthermore, this + * function updates the raw frame data. This operation must be done fairly + * often because the Eddystone-TLM frame Time Since Boot must have a 0.1 + * seconds resolution according to the Eddystone specification. + */ + void updateRawTLMFrame(uint8_t* frame); + + /** + * Calculate the Frame pointer from the slot number + */ + uint8_t* slotToFrame(int slot); + + /** + * Free the characteric resources acquired by a call to + * startEddystoneConfigService(). + */ + void freeConfigCharacteristics(void); + + /** + * Helper function used to update the GATT database following any + * change to the internal state of the service object. + */ + void updateCharacteristicValues(void); + + /** + * Helper function to setup the payload of scan response packets for + * Eddystone-URL Configuration Service. + */ + void setupEddystoneConfigScanResponse(void); + + /** + * Callback registered to the BLE API to authorize write operations to the + * Eddystone Configuration Service Lock characteristic. + * + * @param[in] authParams + * Write authentication information. + */ + void writeLockAuthorizationCallback(GattWriteAuthCallbackParams *authParams); + + /** + * Callback registered to the BLE API to authorize write operations to the + * Eddystone Configuration Service Unlock characteristic. + * + * @param[in] authParams + * Write authentication information. + */ + void writeUnlockAuthorizationCallback(GattWriteAuthCallbackParams *authParams); + + /** + * Callback registered to the BLE API to authorize write operations to the + * Eddystone Configuration Service advSlotData characteristic. + * + * @param[in] authParams + * Write authentication information. + */ + void writeVarLengthDataAuthorizationCallback(GattWriteAuthCallbackParams *authParams); + + /** + * Callback registered to the BLE API to authorize write operations to the + * lockState characteristic which can be 1 byte or 17 bytes long. + * + * @param[in] authParams + * Write authentication information. + */ + void writeLockStateAuthorizationCallback(GattWriteAuthCallbackParams *authParams); + + /** + * Callback registered to the BLE API to authorize write operations to simple fixed length + * value characteristic types. + * + * @param[in] authParams + * Write authentication information. + */ + template + void writeBasicAuthorizationCallback(GattWriteAuthCallbackParams *authParams); + + /** + * This callback is invoked when a GATT client attempts to write to the + * Active Slot characteristic of the service. + * + * @param[in] authParams + * Information about the values that are being read. + */ + template + void writeActiveSlotAuthorizationCallback(GattWriteAuthCallbackParams *authParams); + + /** + * READ AUTHORIZATIONS + */ + + /** + * This callback is invoked when a GATT client attempts to read from a + * basic characteristic of the Eddystone Configuration Service, which + * is blocked if the beacon lock is set to LOCKED. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readBasicTestLockAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * This callback is invoked when a GATT client attempts to read from the + * EidIdentityKey characteristic of the Eddystone Configuration Service, + * which is blocked if the beacon lock is set to LOCKED, or the key has not + * been set/initialized. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readEidIdentityAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * This callback is invoked when a GATT client attempts to read from the + * PublicEcdhKey characteristic of the Eddystone Configuration Service, + * which is blocked if the beacon lock is set to LOCKED, or the key has not + * been set/initialized. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readPublicEcdhKeyAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + + /** + * This callback is invoked when a GATT client attempts to read from the + * Adv Slot Data characteristic of the Eddystone Configuration Service, + * which isblocked if the beacon lock is set to LOCKED. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readDataAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * Checks if this is valid frame data (i.e. length > 0) + * + * @param[in] frame + * The frame being tested + * @returns frame is valid or not. + */ + bool testValidFrame(uint8_t* frame); + + /** + * This callback is invoked when a GATT client attempts to read the challenge + * from the Unlock characteristic of the Eddystone Configuration Service, + * which is blocked if the beacon lock is set to UNLOCKED. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readUnlockAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * This callback is invoked when a GATT client attempts to read from the + * Radio Tx Power characteristic of the Eddystone Configuration Service, + * which is blocked if the beacon lock is set to LOCKED. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readRadioTxPowerAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * This callback is invoked when a GATT client attempts to read from the + * Radio Tx Power characteristic of the Eddystone Configuration Service, + * which is blocked if the beacon lock is set to LOCKED. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readAdvTxPowerAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * This callback is invoked when a GATT client attempts to read from the + * Adv Interval characteristic of the Eddystone Configuration Service, + * which is blocked if the beacon lock is set to LOCKED. + * + * @param[in] authParams + * Information about the values that are being read. + */ + void readAdvIntervalAuthorizationCallback(GattReadAuthCallbackParams *authParams); + + /** + * Calculates the index in the radio power levels array which can be used + * to index into the adv power levels array to find the calibrated adv power + * used in the adv frame. + */ + uint8_t radioTxPowerToIndex(int8_t txPower); + + /** + * This callback is invoked when a GATT client attempts to modify any of the + * characteristics of this service. Attempts to do so are also applied to + * the internal state of this service object. + * + * @param[in] writeParams + * Information about the values that are being written. + */ + void onDataWrittenCallback(const GattWriteCallbackParams *writeParams); + + /** + * Sets the power for the frame in a particular slot using the + * adv tx power parmeter + * + * @param[in] slot + * The the current slot number being considered + * @param[in] advTxPower + * The adv power required in a frame + */ + void setFrameTxPower(uint8_t slot, int8_t advTxPower); + + /** + * AES128 ECB Encrypts a 16-byte input array with a key, to an output array + * + * @param[in] *key + * The encryption key + * @param[in] *input + * The input array + * @param[in] *output + * The output array (contains the encrypted data) + */ + void aes128Encrypt(uint8_t *key, uint8_t *input, uint8_t *output); + + /** + * AES128 ECB Deccrypts a 16-byte input array with a key, to an output array + * + * @param[in] *key + * The decryption key + * @param[in] *input + * The input array + * @param[in] *output + * The output array (containing the decrypted data) + */ + void aes128Decrypt(uint8_t *key, uint8_t *input, uint8_t *output); + + + + /** + * Swaps the endianess of a 16-bit unsigned int + * + * @param[in] arg + * The value with the byte order to be reversed + * + * @return The resulting 16-bit value with byte order reversed + */ + uint16_t swapEndian(uint16_t arg); + + /** + * Correct the advertising interval for non-connectable packets. + * + * @param[in] beaconPeriodIn + * The input interval in milliseconds. + * + * @return The corrected interval in milliseconds. + * + * @note For the acceptable range of advertising interval refer to the + * following functions in mbed BLE API: + * - Gap::getMinNonConnectableAdvertisingInterval() + * - Gap::getMaxAdvertisingInterval() + */ + uint16_t correctAdvertisementPeriod(uint16_t beaconPeriodIn) const; + + /** + * Swaps the endianess of a 16-bit unsigned int + * + * @param[in] arg + * The value with the byte order to be reversed + * + * @return The resulting 16-bit value with byte order reversed + */ + void setRandomMacAddress(void); + + /** + * Finds the first EID slot set + * + * @return slot number (and if not, returns NO_EID_SLOT_SET = -1) + */ + int getEidSlot(void); + + /** + * Returns the current time in Secs (Prior Time + Time since boot) + * + * @return time + */ + uint32_t getTimeSinceFirstBootSecs(void); + + + /** + * Returns the time since boot in Milliseconds + * + * @return time + */ + static uint64_t getTimeSinceLastBootMs(void); + + /** + * Saves only the Time Params in pStorage (a subset of all the Eddsytone Params) + * This is more efficient than periodically saving all state (its just 8 bytes) + */ + void nvmSaveTimeParams(void); + + /** + * BLE instance that EddystoneService will operate on. + */ + BLE &ble; + + /** + * The advertising interval for Eddystone-URL Config Service advertising + * packets. + */ + uint32_t advConfigInterval; + /** + * Current EddystoneServce operation mode. + */ + uint8_t operationMode; + + /** + * Parameter to consistently record the return code when generating Beacon Keys + */ + int genBeaconKeyRC; + + /** + * Keeps track of time in prior boots and current/last boot + */ + TimeParams_t timeParams; + + /** + * GATT Service Variables + */ + + /** + * An array describing the capabilites of the beacon. + */ + Capability_t capabilities; + + /** + * The currenty defined active slot. + */ + uint8_t activeSlot; + + /** + * An array containing all the adv intervals for each slot index + */ + SlotAdvIntervals_t slotAdvIntervals; + + /** + * The value of the Eddystone Configuration Service radioTX Power + * characteristic. + */ + SlotTxPowerLevels_t slotRadioTxPowerLevels; + + /** + * An array containing the supported radio tx power levels for this beacon + */ + PowerLevels_t radioTxPowerLevels; + + /** + * An array containing all possible values for advertised tx power in Eddystone + * slots. + */ + SlotTxPowerLevels_t slotAdvTxPowerLevels; + + /** + * An array containing the supported adv tx power levels for this beacon + */ + PowerLevels_t advTxPowerLevels; + + /** + * The value of the Eddystone Configuration Service Lock State + * characteristic. + */ + uint8_t lockState; + + + /** + * The value of the Eddystone Configuration Service Lock State + * buffer + */ + LockState_t lockStateBuf; + + /** + * The value of the Eddystone Configuration Service unlock key + */ + Lock_t unlockKey; + + /** + * The value of the Eddystone Configuration Service unlock challenge + */ + Lock_t challenge; + + /** + * The value of the Eddystone Configuration Service unlock token. A write + * to the unlock characteristic must contain this token to unlock the beacon + */ + Lock_t unlockToken; + + + /** + * EID: An array holding the 256-bit private Ecdh Key (big endian) + */ + PrivateEcdhKey_t privateEcdhKey; + + /** + * EID: An array holding the 256-bit public Ecdh Key (big endian) + */ + PublicEcdhKey_t publicEcdhKey; + + /** + * EID: An array holding the 256-bit public Ecdh Key (little endian) + */ + PublicEcdhKey_t publicEcdhKeyLE; + + /** + * EID: An array holding the slot rotation period exponents + */ + SlotEidRotationPeriodExps_t slotEidRotationPeriodExps; + + /** + * EID: An array holding the slot Eid Identity Keys + */ + SlotEidIdentityKeys_t slotEidIdentityKeys; + + /** + * EID: An array holding the slot Eid Public Ecdh Keys + */ + //SlotEidPublicEcdhKeys_t slotEidPublicEcdhKeys; + + /** + * Instance of the UID frame. + */ + UIDFrame uidFrame; + + /** + * Instance of the URL frame. + */ + URLFrame urlFrame; + + /** + * Instance of the TLM frame. + */ + TLMFrame tlmFrame; + + /** + * Instance of the EID frame. + */ + EIDFrame eidFrame; + + /** + * The value of the Eddystone Configuration Service reset + * characteristic. + */ + uint8_t factoryReset; + + /** + * The value of the Eddystone Configuration Service Remain Connectable + * characteristic. + */ + uint8_t remainConnectable; + + /** + * CHARACTERISTIC STORAGE + */ + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Capabilities characteristic. + */ + ReadOnlyArrayGattCharacteristic *capabilitiesChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Active Slot characteristic. + */ + ReadWriteGattCharacteristic *activeSlotChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Adv Interval characteristic. + */ + ReadWriteGattCharacteristic *advIntervalChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Radio Tx Power characteristic. + */ + ReadWriteGattCharacteristic *radioTxPowerChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Adv Tx Power characteristic. + */ + ReadWriteGattCharacteristic *advTxPowerChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Lock State characteristic. + */ + GattCharacteristic *lockStateChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Unlock characteristic. + */ + ReadWriteArrayGattCharacteristic *unlockChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone + * Configuration Service Public ECDH Key characteristic. + */ + GattCharacteristic *publicEcdhKeyChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone-URL + * Configuration Service EID Identity Key characteristic. + */ + GattCharacteristic *eidIdentityKeyChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone-URL + * Configuration Service Adv Slot Data characteristic. + */ + GattCharacteristic *advSlotDataChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone-URL + * Configuration Service Factory Reset characteristic. + */ + WriteOnlyGattCharacteristic *factoryResetChar; + + /** + * Pointer to the BLE API characteristic encapsulation for the Eddystone-GATT + * Configuration Service Remain Connectable characteristic. + */ + ReadWriteGattCharacteristic *remainConnectableChar; + + /** + * END OF GATT CHARACTERISTICS + */ + + /** + * EID: An array holding the slot next rotation times + */ + SlotEidNextRotationTimes_t slotEidNextRotationTimes; + + /** + * EID: Storage for the current slot encrypted EID Identity Key + */ + EidIdentityKey_t encryptedEidIdentityKey; + + /* + * Storage for all the slots / frames + */ + SlotStorage_t slotStorage; + + /** + * An array that defines the frame type of each slot using the slot number + * as an index. + */ + SlotFrameTypes_t slotFrameTypes; + + /** + * Circular buffer that represents of Eddystone frames to be advertised. + */ + CircularBuffer advFrameQueue; + + /** + * The registered callback to update the Eddystone-TLM frame Battery + * Voltage. + */ + TlmUpdateCallback_t tlmBatteryVoltageCallback; + + /** + * The registered callback to update the Eddystone-TLM frame Beacon + * Temperature. + */ + TlmUpdateCallback_t tlmBeaconTemperatureCallback; + + /** + * Type for the array of callback handles for all the slot timers + */ + typedef event_queue_t::event_handle_t SlotCallbackHandles_t[MAX_ADV_SLOTS]; + + /** + * An array of all the slot timer callbacks handles + */ + SlotCallbackHandles_t slotCallbackHandles; + + /** + * Callback handle to keep track of manageRadio() callbacks. + */ + event_queue_t::event_handle_t radioManagerCallbackHandle; + + /** + * GattCharacteristic table used to populate the BLE ATT table in the + * GATT Server. + */ + GattCharacteristic *charTable[TOTAL_CHARACTERISTICS]; + + /** + * Pointer to the device name currently being used. + */ + const char *deviceName; + + /** + * Defines an array of string constants (a container) used to initialise any URL slots + */ + static const char* const slotDefaultUrls[]; + + /** + * Defines an array of UIDs to initialize UID slots + */ + static const uint8_t slotDefaultUids[MAX_ADV_SLOTS][16]; + + /** + * Defines an array of EID (Identity keys) to initialize EID slots + */ + static const uint8_t slotDefaultEidIdentityKeys[MAX_ADV_SLOTS][16]; + + /** + * Defines default EID payload before being updated with the first EID rotation value + */ + static const uint8_t nullEid[8]; + + /** + * Reference to the event queue used to post tasks + */ + event_queue_t& eventQueue; + + /** + * Next EID slot frame that will be transmitted + */ + uint8_t nextEidSlot; +}; + +#endif /* __EDDYSTONESERVICE_H__ */ diff --git a/implementations/mbed/source/EddystoneTypes.h b/implementations/mbed/source/EddystoneTypes.h new file mode 100644 index 0000000..79c84f5 --- /dev/null +++ b/implementations/mbed/source/EddystoneTypes.h @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __EDDYSTONETYPES_H__ +#define __EDDYSTONETYPES_H__ + +#include +#include +#include "Eddystone_config.h" + +/** + * Macro to expand a 16-bit Eddystone UUID to 128-bit UUID. + */ +#define UUID_ES_BEACON(FIRST, SECOND) { \ + 0xa3, 0x0c8, FIRST, SECOND, 0x8e, 0xd3, 0x4b, 0xdf, \ + 0x8a, 0x39, 0xa0, 0x1b, 0xeb, 0xed, 0xe2, 0x95, \ +} + +/** + * Eddystone 16-bit UUID. + */ +const uint8_t EDDYSTONE_UUID[] = {0xAA, 0xFE}; + +/** + * Size of Eddystone UID. Needed to construct all frames raw bytes. + */ +const uint16_t EDDYSTONE_UUID_SIZE = sizeof(EDDYSTONE_UUID); + +/** BEGINING OF CHARACTERISTICS */ + +/** + * 128-bit UUID for Eddystone-GATT Configuration Service. + */ +const uint8_t UUID_ES_BEACON_SERVICE[] = UUID_ES_BEACON(0x75, 0x00); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Capabilities + * characteristic. + */ +const uint8_t UUID_CAPABILITIES_CHAR[] = UUID_ES_BEACON(0x75, 0x01); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Active Slot + * characteristic. + */ +const uint8_t UUID_ACTIVE_SLOT_CHAR[] = UUID_ES_BEACON(0x75, 0x02); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Advertising Interval + * characteristic. + */ +const uint8_t UUID_ADV_INTERVAL_CHAR[] = UUID_ES_BEACON(0x75, 0x03); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Radio Tx Power + * characteristic. + */ +const uint8_t UUID_RADIO_TX_POWER_CHAR[] = UUID_ES_BEACON(0x75, 0x04); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Adv Tx Power + * characteristic. + */ +const uint8_t UUID_ADV_TX_POWER_CHAR[] = UUID_ES_BEACON(0x75, 0x05); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Lock State + * characteristic. + */ +const uint8_t UUID_LOCK_STATE_CHAR[] = UUID_ES_BEACON(0x75, 0x06); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Unlock + * characteristic. + */ +const uint8_t UUID_UNLOCK_CHAR[] = UUID_ES_BEACON(0x75, 0x07); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Public ECDH Key + * characteristic. + */ +const uint8_t UUID_PUBLIC_ECDH_KEY_CHAR[] = UUID_ES_BEACON(0x75, 0x08); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service EID Identity Key + * characteristic. + */ +const uint8_t UUID_EID_IDENTITY_KEY_CHAR[] = UUID_ES_BEACON(0x75, 0x09); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Adv Slot Data + * characteristic. + */ +const uint8_t UUID_ADV_SLOT_DATA_CHAR[] = UUID_ES_BEACON(0x75, 0x0a); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Reset + * characteristic. + */ +const uint8_t UUID_FACTORY_RESET_CHAR[] = UUID_ES_BEACON(0x75, 0x0b); + +/** + * 128-bit UUID for Eddystone-URL Configuration Service Remain Connectable + * characteristic. + */ +const uint8_t UUID_REMAIN_CONNECTABLE_CHAR[] = UUID_ES_BEACON(0x75, 0x0c); + +/** END OF CHARACTERISTICS */ + +/** + * Default Lock State used by EddystoneService. + */ +const uint8_t DEFAULT_LOCK_STATE_DATA[] = {DEFAULT_LOCK_STATE}; + +/** + * A type defining the size of the READ ONLY capability characteristic + */ +typedef uint8_t Capability_t[CAP_HDR_LEN + NUM_POWER_MODES]; + +/** + * Type for the 128-bit for Eddystone-URL Configuration Service Lock and Unlock + * characteristic value. + */ +typedef uint8_t Lock_t[16]; + +/** + * Type for the 128-bit for Eddystone-URL Configuration Service Advertised TX + * Power Levels characteristic value. + */ +typedef int8_t PowerLevels_t[NUM_POWER_MODES]; + +/** + * Type representing the power level set for each slot + */ +typedef int8_t SlotTxPowerLevels_t[MAX_ADV_SLOTS]; + +/** + * Type representing the adv interval set for each slot + */ +typedef uint16_t SlotAdvIntervals_t[MAX_ADV_SLOTS]; + +/** + * Type representing the buffer used to represent the LockState and potentially + * an updated key + */ +typedef uint8_t LockState_t[17]; + +/** + * Type representing the EID private ECDH Key + */ +typedef uint8_t PrivateEcdhKey_t[32]; + +/** + * Type representing the EID public ECDH Key + */ +typedef uint8_t PublicEcdhKey_t[32]; + +/** + * Type representing the EID Identity Key + */ +typedef uint8_t EidIdentityKey_t[16]; + +/** + * Type representing the storage for a single slot + */ +typedef uint8_t Slot_t[32]; + +/** + * Type representing the storage for all slots given MAX_ADV_SLOTS + */ +typedef uint8_t SlotStorage_t[MAX_ADV_SLOTS * sizeof(Slot_t)]; + +/** + * Type representing the current frame types if each slot + */ +typedef uint8_t SlotFrameTypes_t[MAX_ADV_SLOTS]; + +/** + * Type representing the EID rotation period exp for each slot + */ +typedef uint8_t SlotEidRotationPeriodExps_t[MAX_ADV_SLOTS]; + +/** + * Type representing the EID next rotation time for each slot + */ +typedef uint32_t SlotEidNextRotationTimes_t[MAX_ADV_SLOTS]; + +/** + * Type representing the EID identity keys for each slot + */ +typedef EidIdentityKey_t SlotEidIdentityKeys_t[MAX_ADV_SLOTS]; + +/** + * Size in bytes of UID namespace ID. + */ +const size_t UID_NAMESPACEID_SIZE = 10; + +/** + * Type for the UID namespace ID. + */ +typedef uint8_t UIDNamespaceID_t[UID_NAMESPACEID_SIZE]; + +/** + * Size in bytes of UID instance ID. + */ +const size_t UID_INSTANCEID_SIZE = 6; + +/** + * Type for the UID instance ID. + */ +typedef uint8_t UIDInstanceID_t[UID_INSTANCEID_SIZE]; + +/** + * Type for callbacks to update Eddystone-TLM frame Batery Voltage and Beacon + * Temperature. + */ +typedef uint16_t (*TlmUpdateCallback_t) (uint16_t); + +// END OF PROTOTYPES + +typedef struct { + uint32_t timeInPriorBoots; + uint32_t timeSinceLastBoot; +} TimeParams_t; + +#endif /* __EDDYSTONETYPES_H__ */ diff --git a/implementations/mbed/source/Eddystone_config.h b/implementations/mbed/source/Eddystone_config.h new file mode 100644 index 0000000..087edcb --- /dev/null +++ b/implementations/mbed/source/Eddystone_config.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2016, Google, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef EDDYSTONE_CONFIG_H_ +#define EDDYSTONE_CONFIG_H_ + +// Version printed out on virtual terminal (independent of logging flag below) +#define BUILD_VERSION_STR "EID Version 1.00 2016-11-19:15:00\r\n" + +/** + * Platform Target (if not set, default is nRF51-DK or nRF51-dongle or nRF52-DK) + * NOTE1: All targets are assumed to be 32K (in target.json) and S110 (in config.h) + * NOTE2: Only enable one target below (default is nRF_DK). + */ +// #define MinewTech51 +#define MinewTech52 +// #define nRF_DK + +/** + * DECLARE YOUR TARGET'S PARAMETERS + * If you are adding a new target, append to end of elif chain + * + * LED_OFF: value for an LED off state: 1 or 0 + * CONFIG_LED: which LED to blink when in Configuration Mode + * On power up will go into configuration mode and eventually time out + * SHUTDOWN_LED: which LED to blink when shutting down (only used if RESET_BUTTON is defined) + * RESET_BUTTON: Which button to use. If defined, adds code to handle button presses + * Button press will toggle between configuration mode and off + * Configuration mode will eventually timeout and broadcast default values + * This will shutdown after initial power up! Assumes shipping with a battery in an off state + * EDDYSTONE_DEFAULT_RADIO_TX_POWER_LEVELS: Which power levels to offer + * EDDYSTONE_DEFAULT_ADV_TX_POWER_LEVELS: What to advertise these levels (as antennas always loose some power) + */ +#ifdef MinewTech51 + #define LED_OFF 0 + #define CONFIG_LED p15 + #define SHUTDOWN_LED p16 + #define RESET_BUTTON p18 + #define EDDYSTONE_DEFAULT_RADIO_TX_POWER_LEVELS { -30, -16, -4, 4 } + #define EDDYSTONE_DEFAULT_ADV_TX_POWER_LEVELS { -42, -30, -25, -13 } + +#elif defined MinewTech52 + #define LED_OFF 0 + #define CONFIG_LED LED3 + #define SHUTDOWN_LED LED2 + #define RESET_BUTTON BUTTON1 + #define EDDYSTONE_DEFAULT_RADIO_TX_POWER_LEVELS { -40, -20, -8, 4 } + #define EDDYSTONE_DEFAULT_ADV_TX_POWER_LEVELS { -50, -30, -18, -6 } + +#else + // *** nRF_DK or USB Dongle PIN defines *** + #define LED_OFF 1 + #define CONFIG_LED LED3 + // Uncomment the defines below if you want the DK board to behave like a + // Beacon target with shutdown on power up, and a mode button + // #define SHUTDOWN_LED LED2 + // #define RESET_BUTTON BUTTON1 + #define EDDYSTONE_DEFAULT_RADIO_TX_POWER_LEVELS { -30, -16, -4, 4 } + #define EDDYSTONE_DEFAULT_ADV_TX_POWER_LEVELS { -42, -30, -25, -13 } +#endif + +/** + * DEBUG OPTIONS + * For production: all defines below should be UNCOMMENTED: + * Key + * GEN_BEACON_KEYS_AT_INIT: Debugging flag to help test entropy source + * HARDWARE_RANDOM_NUM_GENERATOR: include if the target supports a hardware RNG + * EID_RANDOM_MAC: include if you want to randomize the mac address for each eid rotation + * INCLUDE_CONFIG_URL: Includes configuration url when in Configuration Mode + * DONT_REMAIN_CONNECTABLE: Debugging flag; remain connectable during beaconing for easy testing + * NO_4SEC_START_DELAY: Debugging flag to pause 4s before starting; allow time to connect virtual terminal + * NO_EAX_TEST: Debugging flag: when not define, test will check x = EAX_DECRYPT(EAX_ENCRYPT(x)), output in LOG + * NO_LOGGING: Debugging flag; controls logging to virtual terminal + */ +#define GEN_BEACON_KEYS_AT_INIT +#define HARDWARE_RANDOM_NUM_GENERATOR +#define EID_RANDOM_MAC +#define INCLUDE_CONFIG_URL +#define DONT_REMAIN_CONNECTABLE +#define NO_4SEC_START_DELAY +#define NO_EAX_TEST +#define NO_LOGGING + +/* Default enable printf logging, unless explicitly NO_LOGGING */ +#ifdef NO_LOGGING + #define LOG_PRINT 0 +#else + #define LOG_PRINT 1 +#endif + +#define LOG(x) do { if (LOG_PRINT) printf x; } while (0) + +/** + * GENERIC BEACON BEHAVIORS DEFINED + * Note: If the CONFIG_URL is enabled (DEFINE above) + * The size of the DEVICE_NAME + Encoded Length of the CONFIG_URL + * must be LESS THAN OR EQUAL to 23 + */ +#define EDDYSTONE_CONFIG_URL "http://c.pw3b.com" +#define EDDYSTONE_CFG_DEFAULT_DEVICE_NAME "Eddystone v3.0" +#define EDDYSTONE_DEFAULT_MAX_ADV_SLOTS 3 +#define EDDYSTONE_DEFAULT_CONFIG_ADV_INTERVAL 1000 +#define EDDYSTONE_DEFAULT_CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS 60 + +#define EDDYSTONE_DEFAULT_UNLOCK_KEY { \ + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF \ +} + +#define EDDYSTONE_DEFAULT_SLOT_URLS { \ + "http://c.pw3b.com", \ + "https://www.mbed.com/", \ + "https://www.github.com/" \ +} + +#define EDDYSTONE_DEFAULT_SLOT_UIDS { \ + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }, \ + { 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0 }, \ + { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF } \ +} + +#define EDDYSTONE_DEFAULT_SLOT_EID_IDENTITY_KEYS { \ + { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF }, \ + { 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF }, \ + { 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF } \ +} + +#define EDDYSTONE_DEFAULT_SLOT_EID_ROTATION_PERIOD_EXPS { 10, 10, 10 } + +// The following frame/slot types are supported: URL, UID, TLM, EID. The defaults set URL x2 and EID +#define EDDYSTONE_DEFAULT_SLOT_TYPES { \ + EDDYSTONE_FRAME_URL, \ + EDDYSTONE_FRAME_URL, \ + EDDYSTONE_FRAME_EID \ +} + +#define EDDYSTONE_DEFAULT_SLOT_INTERVALS { 700, 0, 0 } + +#define EDDYSTONE_DEFAULT_SLOT_TX_POWERS { -8, -8, -8 } + +/** + * Lock constants + */ +#define LOCKED 0 +#define UNLOCKED 1 +#define UNLOCKED_AUTO_RELOCK_DISABLED 2 + +#define DEFAULT_LOCK_STATE UNLOCKED + +/** + * Set default number of adv slots + */ +const uint8_t MAX_ADV_SLOTS = EDDYSTONE_DEFAULT_MAX_ADV_SLOTS; + +/** + * Slot and Power and Interval Constants + */ +const uint8_t DEFAULT_SLOT = 0; + +/** + * Number of radio power modes supported + */ +const uint8_t NUM_POWER_MODES = 4; + +/** + * Default name for the BLE Device Name characteristic. + */ +const char DEFAULT_DEVICE_NAME[] = EDDYSTONE_CFG_DEFAULT_DEVICE_NAME; + +/** + * ES GATT Capability Constants (6 values) + */ +const uint8_t CAP_HDR_LEN = 6; // The six constants below +const uint8_t ES_GATT_VERSION = 0; +const uint8_t MAX_EIDS = MAX_ADV_SLOTS; +const uint8_t CAPABILITIES = 0x03; // Per slot variable interval and variable Power +const uint8_t SUPPORTED_FRAMES_H = 0x00; +const uint8_t SUPPORTED_FRAMES_L = 0x0F; + +/** + * ES GATT Capability Constant Array storing the capability constants + */ +const uint8_t CAPABILITIES_DEFAULT[] = {ES_GATT_VERSION, MAX_ADV_SLOTS, MAX_EIDS, CAPABILITIES, \ + SUPPORTED_FRAMES_H, SUPPORTED_FRAMES_L}; + +#endif /* EDDYSTONE_CONFIG_H_ */ diff --git a/implementations/mbed/source/EntropySource/EntropySource.cpp b/implementations/mbed/source/EntropySource/EntropySource.cpp new file mode 100644 index 0000000..793cede --- /dev/null +++ b/implementations/mbed/source/EntropySource/EntropySource.cpp @@ -0,0 +1,33 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "EntropySource.h" + +#if !defined(TARGET_NRF51822) && !defined(TARGET_MCU_NRF52832) /* Persistent storage supported on nrf51 platforms */ + /** + * When not using an nRF51-based target then entropy source is currently unimplemented. + */ + #error "INSECURE CONFIGURATION - YOU MUST IMPLEMENT AN ENTROPY SOURCE" + + int eddystoneRegisterEntropySource( mbedtls_entropy_context* ctx) { + return 1; + } + + int eddystoneEntropyPoll( void *data, + unsigned char *output, size_t len, size_t *olen ) + { + return( 1 ); + } +#endif /* #ifdef TARGET_NRF51822 */ diff --git a/implementations/mbed/source/EntropySource/EntropySource.h b/implementations/mbed/source/EntropySource/EntropySource.h new file mode 100644 index 0000000..a1c73c0 --- /dev/null +++ b/implementations/mbed/source/EntropySource/EntropySource.h @@ -0,0 +1,11 @@ +#ifndef __ENTROPY_SOURCE_H__ +#define __ENTROPY_SOURCE_H__ +#include +#include + +int eddystoneRegisterEntropySource( mbedtls_entropy_context* ctx); + +int eddystoneEntropyPoll( void *data, + unsigned char *output, size_t len, size_t *olen ); + +#endif // __ENTROPY_SOURCE_H__ diff --git a/implementations/mbed/source/EntropySource/nRFEntropySource/nRFEntropySource.cpp b/implementations/mbed/source/EntropySource/nRFEntropySource/nRFEntropySource.cpp new file mode 100644 index 0000000..3e32958 --- /dev/null +++ b/implementations/mbed/source/EntropySource/nRFEntropySource/nRFEntropySource.cpp @@ -0,0 +1,67 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "../EntropySource.h" + +#if defined(TARGET_NRF51822) || defined(TARGET_MCU_NRF52832) /* Persistent storage supported on nrf51 platforms */ + +#include "nrf_soc.h" +#include "nrf_error.h" +#include "mbed.h" +#include + +/* + * nRF51 has a TRNG that we can access using SoftDevice. + */ +int eddystoneEntropyPoll(void *data, unsigned char *output, size_t len, size_t *olen) +{ + uint8_t bytes_available = 0; + + // get the number of random bytes available + if (sd_rand_application_bytes_available_get(&bytes_available) != NRF_SUCCESS) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + // if there is more bytes available that what is requested, + // truncate the number of bytes in output to len, otherwise use the total + // of bytes available. + const uint8_t output_len = bytes_available > len ? len : bytes_available; + + if (output_len) { + // transfer "output_len" random bytes to output. + if (sd_rand_application_vector_get(output, output_len) != NRF_SUCCESS) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + } + + // Everything went fine, commit the output_len to the output parameter + *olen = output_len; + return 0; +} + +int eddystoneRegisterEntropySource( mbedtls_entropy_context* ctx) { + uint8_t pool_capacity; + sd_rand_application_pool_capacity_get(&pool_capacity); + + return mbedtls_entropy_add_source( + ctx, + eddystoneEntropyPoll, // entropy source function + NULL, // entropy source data, NULL in this case + pool_capacity, // minimum number of bytes the entropy pool should wait on from this callback before releasing entropy + MBEDTLS_ENTROPY_SOURCE_STRONG + ); +} + +#endif /* #ifdef TARGET_NRF51822 */ diff --git a/implementations/mbed/source/EventQueue/AlignedStorage.h b/implementations/mbed/source/EventQueue/AlignedStorage.h new file mode 100644 index 0000000..0940360 --- /dev/null +++ b/implementations/mbed/source/EventQueue/AlignedStorage.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_ALIGNEDSTORAGE_H_ +#define EVENTQUEUE_DETAIL_ALIGNEDSTORAGE_H_ + +#include + +namespace eq { + +class AnonymousDeclaration; + +/** + * Provide aligned raw storage for holding a type T. + * This class is useful to delay the construction of objects while reserving + * space in memory for them. + * For instance, it can be use with static or global variable which can not + * be constructed before main. It can also be used in class member which + * do not have or can't be constructed at parent construction time. + * + * Once the storage has been reserved, it is possible explicitly construct the + * object of T by using placement new syntax. + * @code + * AlignedStorage foo; + * new (foo.get_storage()) Foo(...); + * @endcode + * Then it is possible to get a reference to the object by calling the member + * function get. + * @code + * foo.get().doSomething(); + * @endcode + * Once the object needs to be destroyed it is possible to call the destructor + * directly + * @code + * foo.get().~Foo(); + * @endcode + * After this point, their is no instance of T in the storage and the function + * get remains unusable until an object is again initialised in the storage. + */ +template +class AlignedStorage { +public: + /** + * Initialisation of the storage, does **not** zeroed its memory. + */ + AlignedStorage() {} + /** + * Provide the raw pointer to the address of the storage. + */ + void* get_storage() { + return data; + } + + /** + * Provide the raw pointer to the const address of the storage. + */ + const void* get_storage() const { + return data; + } + + /** + * Return a reference to the element T in this storage. + */ + T& get() { + return *static_cast(get_storage()); + } + + /** + * Return a reference to the const element of T in this storage. + */ + const T& get() const { + return *static_cast(get_storage()); + } + +private: + // it doesn't make sense to allow copy construction of copy assignement for + // this kind of object. + AlignedStorage(const AlignedStorage&); + AlignedStorage& operator=(const AlignedStorage&); + // storage. Can be improved by metaprogramming to be the best fit. + union { + char char_storage; + short int short_int_storage; + int int_storage; + long int long_int_storage; + float float_storage; + double double_storage; + long double long_double_storage; + void* pointer_storage; + AnonymousDeclaration (*function_pointer_storage)(AnonymousDeclaration); + AnonymousDeclaration* AnonymousDeclaration::*data_member_storage ; + AnonymousDeclaration (AnonymousDeclaration::*function_member_storage)(AnonymousDeclaration); + char data[sizeof(T)]; + }; +}; + +/** + * Provide aligned raw storage for holding an array of type T. + * This is a specialisation of AlignedStorage for arrays of T. + * With this class, it is possible to reserve space for a given number of + * elements of type T and delay their construction to a latter point. This + * feature can be really useful when building generic container which + * embed memory for their elements. Instead of default constructing them, + * the construction of an element can be made when it is really needed, by + * copy. It is the same for the destruction, only objects which have been + * constructed needs to be destructed. + * Those properties improve generic containers because only the operations + * which have to be made are made. It also allow generic container to hold + * types which are not DefaultConstructible. + * + * Once the storage has been reserved, it is possible explicitly construct an + * object of T at a given index by using placement new syntax. + * @code + * AlignedStorage foo; + * //construct object at index 0 then at index 1. + * new (foo.get_storage(0)) Foo(...); + * new (foo.get_storage(1)) Foo(...); + * @endcode + * Then it is possible to get a reference to an object at a given index by + * calling the member function get. + * @code + * // do something with object at index 1 + * foo.get(1).doSomething(); + * @endcode + * Once the object needs to be destroyed it is possible to call the destructor + * directly + * @code + * // destroy object at index 1. + * foo.get(1).~Foo(); + * @endcode + * After this point, their is no instance of T at index 1 in the storage and + * trying to use the object at this index will lead to undefined behavior until + * an object is again initialised at this index. + */ +template +struct AlignedStorage { + /** + * Initialisation of the storage, does **not** zeroed its memory. + */ + AlignedStorage() {} + + /** + * Return raw pointer to the address of element at a given index + */ + void* get_storage(std::size_t index) { + return &get(index); + } + + /** + * const version of void* get_storage(std::size_t). + */ + const void* get_storage(std::size_t index) const { + return &get(index); + } + + /** + * Return reference to the element stored atindex. + */ + T& get(std::size_t index) { + return reinterpret_cast(data)[index]; + } + + /** + * const version of T& get(std::size_t). + */ + const T& get(std::size_t index) const { + return reinterpret_cast(data)[index]; + } + +private: + // it doesn't make sense to allow copy construction of copy assignement for + // this kind of object. + AlignedStorage(const AlignedStorage&); + AlignedStorage& operator=(const AlignedStorage&); + // storage. Can be improved by metaprogramming to be the best fit. + union { + char char_storage; + short int short_int_storage; + int int_storage; + long int long_int_storage; + float float_storage; + double double_storage; + long double long_double_storage; + void* pointer_storage; + AnonymousDeclaration (*function_pointer_storage)(AnonymousDeclaration); + AnonymousDeclaration* AnonymousDeclaration::*data_member_storage ; + AnonymousDeclaration (AnonymousDeclaration::*function_member_storage)(AnonymousDeclaration); + char data[sizeof(T[ArraySize])]; + }; +}; + +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_ALIGNEDSTORAGE_H_ */ diff --git a/implementations/mbed/source/EventQueue/EventQueue.h b/implementations/mbed/source/EventQueue/EventQueue.h new file mode 100644 index 0000000..46e927e --- /dev/null +++ b/implementations/mbed/source/EventQueue/EventQueue.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_EVENTQUEUE_H_ +#define EVENTQUEUE_EVENTQUEUE_H_ + +#include +#include "Thunk.h" +#include "MakeThunk.h" + +namespace eq { + +class EventQueue { + +public: + /// typedef for callable type. + /// the callable type used should support the same operations + /// supported by a void(*)() function pointer. + typedef Thunk function_t; + + /// handle to a posted event which will be executed later. + /// model after a void* pointer. + typedef void* event_handle_t; + + /// type used for time + typedef std::size_t ms_time_t; + + /// Construct an empty event queue + EventQueue() { } + + virtual ~EventQueue() { } + + /** + * Post a callable to the event queue. + * It will be executed during the next dispatch cycle. + * @param f The callbable to be executed by the event queue. + * @return the handle to the event. + */ + template + event_handle_t post(const F& fn) { + return do_post(fn); + } + + /** + * Bind a callable and an argument then post a callable to the event queue. + * It will be executed during the next dispatch cycle. + * @param f The callbable to be bound with arg0. + * @param arg0 The first argument to bind to f. + * @return the handle to the event. + */ + template + event_handle_t post(const F& fn, const Arg0& arg0) { + return do_post(make_thunk(fn, arg0)); + } + + template + event_handle_t post(const F& fn, const Arg0& arg0, const Arg1& arg1) { + return do_post(make_thunk(fn, arg0, arg1)); + } + + template + event_handle_t post(const F& fn, const Arg0& arg0, const Arg1& arg1, const Arg2& arg2) { + return do_post(make_thunk(fn, arg0, arg1, arg2)); + } + + template + event_handle_t post_in(const F& fn, ms_time_t ms_delay) { + return do_post(fn, ms_delay); + } + + template + event_handle_t post_in(const F& fn, const Arg0& arg0, ms_time_t ms_delay) { + return do_post(make_thunk(fn, arg0), ms_delay); + } + + template + event_handle_t post_in(const F& fn, const Arg0& arg0, const Arg1& arg1, ms_time_t ms_delay) { + return do_post(make_thunk(fn, arg0, arg1), ms_delay); + } + + template + event_handle_t post_in(const F& fn, const Arg0& arg0, const Arg1& arg1, const Arg2& arg2, ms_time_t ms_delay) { + return do_post(make_thunk(fn, arg0, arg1, arg2), ms_delay); + } + + template + event_handle_t post_every(const F& fn, ms_time_t ms_delay) { + return do_post(fn, ms_delay, true); + } + + template + event_handle_t post_every(const F& fn, const Arg0& arg0, ms_time_t ms_delay) { + return do_post(make_thunk(fn, arg0), ms_delay, true); + } + + template + event_handle_t post_every(const F& fn, const Arg0& arg0, const Arg1& arg1, ms_time_t ms_delay) { + return do_post(make_thunk(fn, arg0, arg1), ms_delay, true); + } + + template + event_handle_t post_every(const F& fn, const Arg0& arg0, const Arg1& arg1, const Arg2& arg2, ms_time_t ms_delay) { + return do_post(make_thunk(fn, arg0, arg1, arg2), ms_delay, true); + } + + virtual bool cancel(event_handle_t event_handle) = 0; + +private: + virtual event_handle_t do_post(const function_t& fn, ms_time_t ms_delay = 0, bool repeat = false) = 0; +}; + +} // namespace eq + +#endif /* EVENTQUEUE_EVENTQUEUE_H_ */ diff --git a/implementations/mbed/source/EventQueue/EventQueueClassic.h b/implementations/mbed/source/EventQueue/EventQueueClassic.h new file mode 100644 index 0000000..d3ec007 --- /dev/null +++ b/implementations/mbed/source/EventQueue/EventQueueClassic.h @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef BLE_API_SOURCE_MBEDCLASSICEVENTQUEUE_H_ +#define BLE_API_SOURCE_MBEDCLASSICEVENTQUEUE_H_ + +#include +#include "PriorityQueue.h" +#include "Ticker.h" +#include "Timer.h" +#include +#include "Thunk.h" +#include "MakeThunk.h" +#include "EventQueue.h" + +#include +typedef ::mbed::util::CriticalSectionLock CriticalSection; + +namespace eq { + +template +class EventQueueClassic: public EventQueue { + + /// Describe an event. + /// An event is composed of a function f to execute after a a time t. + /// Optionnaly, the event can be periodic and in this case the function f + /// is executed after each period p. + struct Event { + /// construct an event + /// @param f The function to execute when this event occur + /// @param ms_remaining_time remaining time before this event occurence + /// @param ms_repeat_period If the event is periodic, this parameter is the + /// period between to occurence of this event. + Event(const function_t& f, ms_time_t ms_remaining_time, ms_time_t ms_repeat_period = 0) : + _f(f), + _ms_remaining_time(ms_remaining_time), + _ms_repeat_period(ms_repeat_period) { + } + + /// call the inner function within an event + void operator()() { + _f(); + } + + /// return a reference to the inner function + const function_t& get_function() const { + return _f; + } + + /// comparison operator used by the priority queue. + /// comaprare remaining time between two events + friend bool operator<(const Event& lhs, const Event& rhs) { + return lhs._ms_remaining_time < rhs._ms_remaining_time; + } + + /// return the time remaining when this event was inserted into the priority queue. + ms_time_t get_ms_remaining_time() const { + return _ms_remaining_time; + } + + /// update the remaining time for this event + void set_ms_remaining_time(ms_time_t new_remaining_time) { + _ms_remaining_time = new_remaining_time; + } + + /// If an event is periodic, return the time between two occurence + ms_time_t get_ms_repeat_period() const { + return _ms_repeat_period; + } + + private: + function_t _f; + ms_time_t _ms_remaining_time; + const ms_time_t _ms_repeat_period; + }; + + /// type of the internal queue + typedef PriorityQueue priority_queue_t; + + /// iterator for the queue type + typedef typename priority_queue_t::iterator q_iterator_t; + + /// node type in the queue + typedef typename priority_queue_t::Node q_node_t; + +public: + /// Construct an empty event queue + EventQueueClassic() : + _events_queue(), _ticker(), _timer(), _timed_event_pending(false) { + } + + virtual ~EventQueueClassic() { } + + virtual bool cancel(event_handle_t event_handle) { + CriticalSection critical_section; + bool success = _events_queue.erase(static_cast(event_handle)); + if (success) { + // update the timers and events remaining time + updateTime(); + } + return success; + } + + void dispatch() { + while(true) { + function_t f; + // pick a task from the queue/ or leave + { + CriticalSection cs; + q_iterator_t event_it = _events_queue.begin(); + if(event_it != _events_queue.end() && event_it->get_ms_remaining_time() == 0) { + f = event_it->get_function(); + // if the event_it should be repeated, reschedule it + if (event_it->get_ms_repeat_period()) { + reschedule_event(event_it); + } else { + _events_queue.pop(); + } + } else { + break; + } + } + f(); + } + } + +private: + + void update_ticker(ms_time_t ms_delay) { + _timed_event_pending = true; + _ticker.detach(); + _ticker.attach(this, &EventQueueClassic::updateTime, ((float) ms_delay / 1000)); + } + + void update_ticker(q_node_t* ref, ms_time_t ms_delay) { + // look if the node inserted is the first node with a delay + for (q_iterator_t it = _events_queue.begin(); it != _events_queue.end(); ++it) { + if(it->get_ms_remaining_time()) { + if (it.get_node() == ref) { + // update the ticker to ms_delay if the first event + // with a delay is the one inserted + update_ticker(ms_delay); + } + break; + } + } + } + + void update_events_remaining_time(ms_time_t elapsed_time) { + bool ticker_updated = false; + + for (q_iterator_t it = _events_queue.begin(); + it != _events_queue.end(); ++it) { + ms_time_t remaining_time = it->get_ms_remaining_time(); + if(remaining_time) { + if(remaining_time <= elapsed_time) { + it->set_ms_remaining_time(0); + } else { + it->set_ms_remaining_time(remaining_time - elapsed_time); + if (!ticker_updated) { + update_ticker(it->get_ms_remaining_time()); + _timer.start(); + ticker_updated = true; + } + } + } + } + } + + void updateTime() { + CriticalSection critical_section; + ms_time_t elapsed_time = _timer.read_ms(); + _timed_event_pending = false; + _timer.stop(); + _timer.reset(); + _ticker.detach(); + update_events_remaining_time(elapsed_time); + } + + void reschedule_event(q_iterator_t& event_it) { + ms_time_t ms_period = event_it->get_ms_repeat_period(); + + if (_timed_event_pending == false) { + update_ticker(ms_period); + _timer.start(); + event_it->set_ms_remaining_time(ms_period); + _events_queue.update(event_it); + } else { + int elapsed_time = _timer.read_ms(); + event_it->set_ms_remaining_time(elapsed_time + ms_period); + _events_queue.update(event_it); + update_ticker(event_it.get_node(), ms_period); + } + } + + virtual event_handle_t do_post(const function_t& fn, ms_time_t ms_delay = 0, bool repeat = false) { + if(repeat && (ms_delay == 0)) { + return NULL; + } + + Event event(fn, ms_delay, repeat ? ms_delay : 0); + + CriticalSection critical_section; + if (_events_queue.full()) { + return NULL; + } + + // there is no need to update timings if ms_delay == 0 + if (!ms_delay) { + return _events_queue.push(event).get_node(); + } + + // if there is no pending timed event, just add this one and start timers + if (_timed_event_pending == false) { + update_ticker(ms_delay); + _timer.start(); + return _events_queue.push(event).get_node(); + } + + int elapsed_time = _timer.read_ms(); + + // update remaining time and post the event + event.set_ms_remaining_time(ms_delay + elapsed_time); + event_handle_t handle = _events_queue.push(event).get_node(); + update_ticker(static_cast(handle), ms_delay); + + return handle; + } + + priority_queue_t _events_queue; + mbed::Ticker _ticker; + mbed::Timer _timer; + bool _timed_event_pending; +}; + +} // namespace eq + +#endif /* BLE_API_SOURCE_MBEDCLASSICEVENTQUEUE_H_ */ diff --git a/implementations/mbed/source/EventQueue/EventQueueMinar.h b/implementations/mbed/source/EventQueue/EventQueueMinar.h new file mode 100644 index 0000000..a00d774 --- /dev/null +++ b/implementations/mbed/source/EventQueue/EventQueueMinar.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_EVENTQUEUEMINAR_H_ +#define EVENTQUEUE_EVENTQUEUEMINAR_H_ + +#include +#include "EventQueue.h" + +namespace eq { + +class EventQueueMinar: public EventQueue { + +public: + /// Construct an empty event queue + EventQueueMinar() { } + + virtual ~EventQueueMinar() { } + + virtual bool cancel(event_handle_t event_handle) { + return minar::Scheduler::cancelCallback(event_handle); + } + +private: + + virtual event_handle_t do_post(const function_t& fn, ms_time_t ms_delay = 0, bool repeat = false) { + // convert ms to minar time + minar::tick_t tick = minar::milliseconds(ms_delay); + + // convert thunk to minar FunctionPointerBind + mbed::util::Event func( + mbed::util::FunctionPointer1( + free_func_thunk_call + ).bind(fn) + ); + + if (ms_delay == 0) { + return minar::Scheduler::postCallback(func).getHandle(); + } + + if (repeat == false) { + return minar::Scheduler::postCallback(func).delay(tick).tolerance(0).getHandle(); + } else { + return minar::Scheduler::postCallback(func).period(tick).tolerance(0).getHandle(); + } + } + + // due to design limitations in function pointer classes, it is not possible + // to use reference here ... + static void free_func_thunk_call(function_t fn) { + fn(); + } +}; + +} // namespace eq + +#endif /* EVENTQUEUE_EVENTQUEUEMINAR_H_ */ diff --git a/implementations/mbed/source/EventQueue/MakeThunk.h b/implementations/mbed/source/EventQueue/MakeThunk.h new file mode 100644 index 0000000..739ee2f --- /dev/null +++ b/implementations/mbed/source/EventQueue/MakeThunk.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_MAKETHUNK_H +#define EVENTQUEUE_MAKETHUNK_H + +#include "detail/MemberFunctionAdaptor.h" +#include "detail/FunctionAdaptor.h" +#include "detail/Thunks.h" + +namespace eq { + +/** + * Make a thunk from an F. + * When this function only takes an F then F it is expected that F is already + * a callable and therefore a kind of thunk. + * @tparam F The type of callable in input. + * @param fn the function to turn into a thunk. + * @return fn + */ +template +const F& make_thunk(const F& fn) { + return fn; +} + +/** + * Bind fn and arg0 into a thunk. + * @tparam F the type of the function to bind. It can be a function pointer, + * a function like object or a pointer to a member function. + * @tparam Arg0 The type of the first argument of F. + * @param fn the function to bind. + * @param arg0 the first argument to bind. + * @return a thunk binding F and arg0. + */ +template +detail::Thunk_1::type, Arg0> +make_thunk(const F& fn, const Arg0& arg0) { + typedef typename detail::FunctionAdaptor::type fn_adaptor_t; + return detail::Thunk_1( + fn_adaptor_t(fn), + arg0 + ); +} + +/** + * Bind fn, arg0 and arg1 into a thunk. + * @tparam F the type of the function to bind. It can be a function pointer, + * a function like object or a pointer to a member function. + * @tparam Arg0 The type of the first argument of F. + * @tparam Arg1 The type of the second argument of F. + * @param fn the function to bind. + * @param arg0 the first argument to bind. + * @param arg1 the second argument to bind. + * @return a thunk binding F, arg0 and arg1. + */ +template +detail::Thunk_2::type, Arg0, Arg1> +make_thunk(const F& fn, const Arg0& arg0, const Arg1& arg1) { + typedef typename detail::FunctionAdaptor::type fn_adaptor_t; + return detail::Thunk_2( + fn_adaptor_t(fn), + arg0, + arg1 + ); +} + +/** + * Bind fn, arg0, arg1 and arg2 into a thunk. + * @tparam F the type of the function to bind. It can be a function pointer, + * a function like object or a pointer to a member function. + * @tparam Arg0 The type of the first argument of F. + * @tparam Arg1 The type of the second argument of F. + * @tparam Arg2 The type of the third argument of F. + * @param fn the function to bind. + * @param arg0 the first argument to bind. + * @param arg1 the second argument to bind. + * @param arg1 the third argument to bind. + * @return a thunk binding F, arg0, arg1 and arg2. + */ +template +detail::Thunk_3::type, Arg0, Arg1, Arg2> +make_thunk(const F& fn, const Arg0& arg0, const Arg1& arg1, const Arg2& arg2) { + typedef typename detail::FunctionAdaptor::type fn_adaptor_t; + return detail::Thunk_3( + fn_adaptor_t(fn), + arg0, + arg1, + arg2 + ); +} + +} // namespace eq + +#endif /* EVENTQUEUE_MAKETHUNK_H */ diff --git a/implementations/mbed/source/EventQueue/PriorityQueue.h b/implementations/mbed/source/EventQueue/PriorityQueue.h new file mode 100644 index 0000000..4738e4b --- /dev/null +++ b/implementations/mbed/source/EventQueue/PriorityQueue.h @@ -0,0 +1,418 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_STACKPRIORITYQUEUE_H_ +#define EVENTQUEUE_STACKPRIORITYQUEUE_H_ + +#include +#include "AlignedStorage.h" + +namespace eq { + +/** + * Priority queue of Ts. + * Ts are ordered from the smaller to the bigger ( < ). + * Elements in the queue are mutable (this is a design choice). + * After a mutation the function update should be called to ensure that the + * queue is still properly sorted. + * @tparam T type of elements in this queue + * @param capacity Number of elements that this queue can contain + */ +template +class PriorityQueue { + +public: + /** + * Type of the nodes in this queue. + */ + struct Node { + AlignedStorage storage; /// storage for the T + Node* next; /// pointer to the next node + }; + + /** + * Iterator for elements of the queue. + */ + class Iterator { + friend PriorityQueue; + + /// Construct an iterator from a Node. + /// This constructor is private and can only be invoked from the PriorityQueue. + Iterator(Node* current) : + _current(current) { + } + + public: + + /// Indirection operator. + /// return a reference to the inner T + T& operator*() { + return _current->storage.get(); + } + + /// Const version of indirection operator. + /// return a reference to the inner T + const T& operator*() const { + return _current->storage.get(); + } + + /// dereference operator. + /// Will invoke the operation on the inner T + T* operator->() { + return &(_current->storage.get()); + } + + /// const dereference operator. + /// Will invoke the operation on the inner T + const T* operator->() const { + return &(_current->storage.get()); + } + + /// pre incrementation to the next T in the list + Iterator& operator++() { + _current = _current->next; + return *this; + } + + /// post incrementation to the next T in the list + Iterator operator++(int) { + Iterator tmp(*this); + _current = _current->next; + return tmp; + } + + /// Equality operator + friend bool operator==(const Iterator& lhs, const Iterator& rhs) { + return lhs._current == rhs._current; + } + + /// Unequality operator + friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { + return !(lhs == rhs); + } + + /// return the internal node. + Node* get_node() { + return _current; + } + + private: + Node* _current; + }; + + typedef Iterator iterator; + + /// Construct an empty priority queue. + PriorityQueue() : nodes(), free_nodes(NULL), head(NULL), used_nodes_count(0) { + initialize(); + } + + /// Copy construct a priority queue. + /// The queue will have the same content has other. + PriorityQueue(const PriorityQueue& other) : + nodes(), free_nodes(NULL), head(NULL), used_nodes_count(0) { + initialize(); + copy(other); + } + + /// destroy a priority queue. + ~PriorityQueue() { + clear(); + } + + /// Copy assignemnent from another priority queue. + /// The content of the queue will be destroyed then the content from + /// other will be copied. + PriorityQueue& operator=(const PriorityQueue& other) { + if (&other == this) { + return *this; + } + copy(other); + return *this; + } + + /// Push a new element to the queue. + /// It will be added before the first element p in the queue where + /// element < p == true. + /// @return An iterator to the inserted element. + iterator push(const T& element) { + if (full()) { + return NULL; + } + + // get a free node + Node* new_node = free_nodes; + free_nodes = free_nodes->next; + new_node->next = NULL; + + ++used_nodes_count; + + // copy content + new (new_node->storage.get_storage()) T(element); + + // if there is no node in the queue, just link the head + // to the new node and return + if (head == NULL) { + head = new_node; + return new_node; + } + + // if the new node has an higher priority than the node in head + // just link it as the head + if (element < head->storage.get()) { + new_node->next = head; + head = new_node; + return new_node; + } + + // insert the node after head + insert_after(head, new_node); + + return new_node; + } + + /// pop the head of the queue. + bool pop() { + if (!head) { + return false; + } + + Node* target = head; + target->storage.get().~T(); + head = target->next; + target->next = free_nodes; + free_nodes = target; + --used_nodes_count; + return true; + } + + /// If the content of an element is updated is updated after the insertion + /// then, the list can be in an unordered state. + /// This function help; it update the position of an iterator in the list. + void update(iterator it) { + Node* target = it.get_node(); + Node* hint = head; + + if (target == NULL) { + return; + } + + // remove the node from the list + if (target == head) { + // if it is the only node in the list, just return + // it is not needed to update its position + if (target->next == NULL) { + return; + } + + // if the order is already correct, just return + if (target->storage.get() < target->next->storage.get()) { + return; + } + + // otherwise remove the node from the list + // and update the hint + head = target->next; + hint = head; + } else { + bool node_found = false; + for (Node* current = head; current != NULL; current = current->next) { + if (current->next == target) { + // check if it is needed to move the node + if (current->storage.get() < target->storage.get()) { + if (target->next == NULL) { + return; + } + + if (target->storage.get() < target->next->storage.get()) { + return; + } + + // there is no need to iterate again the whole list + // just mark the hint has the current node + hint = current; + } + + // remove the node from the list and break out of the loop + current->next = target->next; + node_found = true; + break; + } + } + + // the node in parameter doesn't belong to this queue + if (!node_found) { + return; + } + } + + // insert the node after hint + insert_after(hint, target); + } + + /// return an iterator to the begining of the queue. + iterator begin() { + return head; + } + + /// return an iterator to the end of the queue. + /// @note can't be dereferenced + iterator end() { + return NULL; + } + + /// erase an iterator from the list + bool erase(iterator it) { + return erase(it.get_node()); + } + + /// erase a node from the list + bool erase(Node* n) { + if (n == NULL) { + return false; + } + + if (head == n) { + return pop(); + } + + Node* current = head; + while (current->next) { + if (current->next == n) { + current->next = n->next; + n->storage.get().~T(); + n->next = free_nodes; + free_nodes = n; + --used_nodes_count; + return true; + } + current = current->next; + } + return false; + } + + /** + * Indicate if the queue is empty or not. + * @return true if the queue is empty and false otherwise. + * @invariant the queue remains untouched. + */ + bool empty() const { + return head == NULL; + } + + /** + * Indicate if the true is full or not. + * @return true if the queue is full and false otherwise. + * @invariant the queue remains untouched. + */ + bool full() const { + return free_nodes == NULL; + } + + /** + * Indicate the number of elements in the queue. + * @return the number of elements currently held by the queue. + * @invariant the queue remains untouched. + */ + std::size_t size() const { + return used_nodes_count; + } + + /** + * Expose the capacity of the queue in terms of number of elements the + * queue can hold. + * @return the capacity of the queue. + * @invariant this function should always return Capacity. + */ + std::size_t capacity() const { + return Capacity; + } + + /** + * Clear the queue from all its elements. + */ + void clear() { + while (head) { + head->storage.get().~T(); + Node* tmp = head; + head = head->next; + tmp->next = free_nodes; + free_nodes = tmp; + } + used_nodes_count = 0; + } + +private: + void initialize() { + /// link all the nodes together + for (std::size_t i = 0; i < (Capacity - 1); ++i) { + nodes[i].next = &nodes[i + 1]; + } + /// the last node does not have a next node + nodes[Capacity - 1].next = NULL; + /// set all the nodes as free + free_nodes = nodes; + } + + void copy(const PriorityQueue& other) { + if (empty() == false) { + clear(); + } + + Node *to_copy = other.head; + Node *previous = NULL; + while (to_copy) { + // pick a free node + Node* new_node = free_nodes; + free_nodes = free_nodes->next; + new_node->next = NULL; + + // copy content + new (new_node->storage.get_storage()) T(to_copy->storage.get()); + + // link into the queue or update head then update previous pointer + if (previous) { + previous->next = new_node; + } else { + head = new_node; + } + previous = new_node; + + // update the node to copy + to_copy = to_copy->next; + } + used_nodes_count = other.used_nodes_count; + } + + void insert_after(Node* prev, Node* to_insert) { + for (; prev != NULL; prev = prev->next) { + if (prev->next == NULL || to_insert->storage.get() < prev->next->storage.get()) { + to_insert->next = prev->next; + prev->next = to_insert; + break; + } + } + } + + Node nodes[Capacity]; //< Nodes of the queue + Node *free_nodes; //< entry point for the list of free nodes + Node *head; //< head of the queue + std::size_t used_nodes_count; // number of nodes used +}; + +} // namespace eq + +#endif /* EVENTQUEUE_STACKPRIORITYQUEUE_H_ */ diff --git a/implementations/mbed/source/EventQueue/Thunk.h b/implementations/mbed/source/EventQueue/Thunk.h new file mode 100644 index 0000000..dc6784d --- /dev/null +++ b/implementations/mbed/source/EventQueue/Thunk.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_THUNK_H_ +#define EVENTQUEUE_THUNK_H_ + +#include "AlignedStorage.h" +#include "detail/ThunkVTable.h" + +namespace eq { + +// forward declaration of ThunkVTableGenerator +namespace detail { +template +class ThunkVTableGenerator; +} + +/** + * A Thunk is a container holding any kind of nullary callable. + * It wrap value semantic and function call operations of the inner callable + * held. + * \note Thunk of callable bound to arguments should be generated by the + * function make_thunk. + */ +class Thunk { + // Size for the internal buffer of the Thunk + static const std::size_t BufferSize = 24; + + template + friend class detail::ThunkVTableGenerator; + +public: + + /** + * Thunk Empty constructor. + * When this thunk is called, if does nothing. + */ + Thunk(); + + /** + * Construct a Thunk from a nullary callable of type F. + * When the call operator is invoked, it call a copy of f ( f() ). + */ + template + Thunk(const F& f); + + /** + * Special constructor for pointer to function. + * Allow references to functions to gracefully decay into pointer to function. + * Otherwise, reference to function are not copy constructible (their is no + * constructible function type in C++). + * When the call operator is invoked, it call a copy of f ( f() ). + */ + Thunk(void (*f)()); + + /** + * Copy construction of a thunk. + * Take care that the inner F is correctly copied. + */ + Thunk(const Thunk& other) : _storage(), _vtable() { + other._vtable->copy(*this, other); + } + + /** + * Destruction of the Thunk correctly call the destructor of the + * inner callable. + */ + ~Thunk() { + _vtable->destroy(*this); + } + + /** + * Copy assignement from another thunk. + * Ensure that the callable held is correctly destroyed then copy + * the correctly copy the new one. + */ + Thunk& operator=(const Thunk& other) { + if (this == &other) { + return *this; + } + _vtable->destroy(*this); + other._vtable->copy(*this, other); + return *this; + } + + /** + * Call operator. Invoke the inner callable. + */ + void operator()() const { + _vtable->call(*this); + } + +private: + static void empty_thunk() { } + + AlignedStorage _storage; + const detail::ThunkVTable* _vtable; +}; + +} // namespace eq + +#include "detail/Thunk.impl.h" + +#endif /* EVENTQUEUE_THUNK_H_ */ diff --git a/implementations/mbed/source/EventQueue/detail/FunctionAdaptor.h b/implementations/mbed/source/EventQueue/detail/FunctionAdaptor.h new file mode 100644 index 0000000..61f9da5 --- /dev/null +++ b/implementations/mbed/source/EventQueue/detail/FunctionAdaptor.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_FUNCTIONADAPTOR_H_ +#define EVENTQUEUE_DETAIL_FUNCTIONADAPTOR_H_ + +#include "MemberFunctionAdaptor.h" + +namespace eq { +namespace detail { + +/** + * In C++, several types can be used as function: + * - function pointer + * - member functions + * - function like object + * While function pointer and function like object can be used with the function + * call syntax, the function call syntax can't be applied for function pointers. + * This meta function yield takes a callable type F in input and as a result + * return a type which can be constructed from F and used with the function call + * syntax. + * + * \code + * class Foo; + * + * Foo foo; + * typedef void (Foo::*foo_function_t)(); + * foo_function_t foo_function = &Foo::some_function; + * + * //The following will fail: + * //foo_function(foo) + * + * typedef FunctionAdaptor::type foo_function_adaptor_t; + * foo_function_adaptor_t foo_function_adapted(foo_function); + * foo_function_adapted(foo); + * + * \endcode + * + * \tparam F The type of the object to adapt. + */ +template +struct FunctionAdaptor { + /** + * Common case (function pointer and function like object). + * Yield itself, no addaptation needed. + */ + typedef F type; +}; + +/** + * Partial specializetion for member function with no arguments + */ +template +struct FunctionAdaptor { + /** + * Yield a member function adaptor. + */ + typedef MemberFunctionAdaptor0 type; +}; + +/** + * Partial specializetion for member function with one argument + */ +template +struct FunctionAdaptor { + /** + * Yield a member function adaptor. + */ + typedef MemberFunctionAdaptor1 type; +}; + +/** + * Partial specializetion for member function with two arguments + */ +template +struct FunctionAdaptor { + /** + * Yield a member function adaptor. + */ + typedef MemberFunctionAdaptor2 type; +}; + +} // namespace detail +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_FUNCTIONADAPTOR_H_ */ diff --git a/implementations/mbed/source/EventQueue/detail/MemberFunctionAdaptor.h b/implementations/mbed/source/EventQueue/detail/MemberFunctionAdaptor.h new file mode 100644 index 0000000..9d42c18 --- /dev/null +++ b/implementations/mbed/source/EventQueue/detail/MemberFunctionAdaptor.h @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_MEMBERFUNCTIONADAPTOR_H_ +#define EVENTQUEUE_DETAIL_MEMBERFUNCTIONADAPTOR_H_ + +namespace eq { +namespace detail { + +/** + * Adaptor for member function without argument. + * It wrap member function into a function like object to make it usable like + * a regular function. + * \tparam T the type the class/struct holding the member function. + * \code + * struct Foo { + * void fn(); + * }; + * + * Foo foo; + * MemberFunctionAdaptor0 fn_adapted(&Foo::fn); + * + * fn_adapted(foo); // work + * fn_adapted(&foo); // work + * \endcode + */ +template +struct MemberFunctionAdaptor0 { + /** + * Construct a member function adaptor. + * \param fn The member function to addapt. + */ + MemberFunctionAdaptor0(void (T::*fn)()) : + _fn(fn) { + } + + /** + * Call operator for pointer of T + */ + void operator()(T* self) const { + (self->*_fn)(); + } + + /** + * Call operator for reference of T + */ + void operator()(T& self) const { + (self.*_fn)(); + } + +private: + void (T::* const _fn)(); +}; + + +/** + * Adaptor for member function with one argument. + * It wrap member function into a function like object to make it usable like + * a regular function. + * \tparam T the type the class/struct holding the member function. + * \code + * struct Foo { + * void fn(int); + * }; + * + * Foo foo; + * MemberFunctionAdaptor1 fn_adapted(&Foo::fn); + * + * fn_adapted(foo, 42); // work + * fn_adapted(&foo, 42); // work + * \endcode + */ +template +struct MemberFunctionAdaptor1 { + /** + * Construct a member function adaptor. + * \param fn The member function to addapt. + */ + MemberFunctionAdaptor1(void (T::*fn)(Arg0)) : + _fn(fn) { + } + + /** + * Call operator for pointer of T + */ + void operator()(T* self, Arg0 arg0) const { + (self->*_fn)(arg0); + } + + /** + * Call operator for reference of T + */ + void operator()(T& self, Arg0 arg0) const { + (self.*_fn)(arg0); + } + +private: + void (T::* const _fn)(Arg0); +}; + + +/** + * Adaptor for member function with two arguments. + * It wrap member function into a function like object to make it usable like + * a regular function. + * \tparam T the type the class/struct holding the member function. + * \code + * struct Foo { + * void fn(int, const char*); + * }; + * + * Foo foo; + * MemberFunctionAdaptor2 fn_adapted(&Foo::fn); + * + * fn_adapted(foo, 42, "toto"); // work + * fn_adapted(&foo, 42, "toto"); // work + * \endcode + */ +template +struct MemberFunctionAdaptor2 { + /** + * Construct a member function adaptor. + * \param fn The member function to addapt. + */ + MemberFunctionAdaptor2(void (T::*fn)(Arg0, Arg1)) : _fn(fn) { } + + /** + * Call operator for pointer of T + */ + void operator()(T* self, Arg0 arg0, Arg1 arg1) const { + (self->*_fn)(arg0, arg1); + } + + /** + * Call operator for reference of T + */ + void operator()(T& self, Arg0 arg0, Arg1 arg1) const { + (self.*_fn)(arg0, arg1); + } + +private: + void (T::* const _fn)(Arg0, Arg1); +}; + +} // namespace detail +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_MEMBERFUNCTIONADAPTOR_H_ */ diff --git a/implementations/mbed/source/EventQueue/detail/Thunk.impl.h b/implementations/mbed/source/EventQueue/detail/Thunk.impl.h new file mode 100644 index 0000000..bc515bc --- /dev/null +++ b/implementations/mbed/source/EventQueue/detail/Thunk.impl.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_THUNK_IMPL_H_ +#define EVENTQUEUE_DETAIL_THUNK_IMPL_H_ + +#include +#include "ThunkVTableGenerator.h" + +namespace eq { + +/** + * Thunk constructor Implementation. + * Due to the way templates and forwarding work in C++, it was not possible to + * provide this implementation in Thunk.h + */ +template +Thunk::Thunk(const F& f) : + _storage(), + _vtable(&detail::ThunkVTableGenerator::vtable) { + typedef __attribute__((unused)) char F_is_too_big_for_the_Thunk[sizeof(F) <= sizeof(_storage) ? 1 : -1]; + new(_storage.get_storage(0)) F(f); +} + +/** + * Specialization for function pointers. + * This overload will be chosen when the tyope in input is a reference to a function. + * @param f The function to transform in Thunk. + */ +inline Thunk::Thunk(void (*f)()) : + _storage(), + _vtable(&detail::ThunkVTableGenerator::vtable) { + typedef void(*F)(); + typedef __attribute__((unused)) char F_is_too_big_for_the_Thunk[sizeof(F) <= sizeof(_storage) ? 1 : -1]; + new(_storage.get_storage(0)) F(f); +} + +/** + * Thunk empty constructor Implementation. + * Due to the way templates and forwarding work in C++, it was not possible to + * provide this implementation in Thunk.h + */ +inline Thunk::Thunk() : + _storage(), + _vtable(&detail::ThunkVTableGenerator::vtable) { + typedef void(*F)(); + typedef __attribute__((unused)) char F_is_too_big_for_the_Thunk[sizeof(F) <= sizeof(_storage) ? 1 : -1]; + new(_storage.get_storage(0)) F(empty_thunk); +} + +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_THUNK_IMPL_H_ */ diff --git a/implementations/mbed/source/EventQueue/detail/ThunkVTable.h b/implementations/mbed/source/EventQueue/detail/ThunkVTable.h new file mode 100644 index 0000000..65dcf55 --- /dev/null +++ b/implementations/mbed/source/EventQueue/detail/ThunkVTable.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_THUNKVTABLE_H_ +#define EVENTQUEUE_DETAIL_THUNKVTABLE_H_ + +namespace eq { + +// forward declaration of the Thunk class +class Thunk; + +namespace detail { + +/** + * This POD is used as a vtable by Thunk implementation. + * Thunk is a value type for all type nullary callable and therefore standard + * polymorphism is not suitable for that use case. + * Instead, the vtable is generated for each type contained in a thunk. + * This structure is the prototype of such vtable. + * \note see ThunkVTableGenerator for implementation and the generation of + * Thunk vtables. + */ +struct ThunkVTable { + typedef Thunk thunk_t; + + /** + * destroy a thunk (act like a destructor). + */ + void (* const destroy)(thunk_t& self); + + /** + * Copy self into dest. + * It is expected that dest is empty. + */ + void (* const copy)(thunk_t& dest, const thunk_t& self); + + /** + * Synthetized call for the inner object of the thunk_t. + */ + void (* const call)(const thunk_t& self); +}; + +} // namespace detail +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_THUNKVTABLE_H_ */ diff --git a/implementations/mbed/source/EventQueue/detail/ThunkVTableGenerator.h b/implementations/mbed/source/EventQueue/detail/ThunkVTableGenerator.h new file mode 100644 index 0000000..bdbb117 --- /dev/null +++ b/implementations/mbed/source/EventQueue/detail/ThunkVTableGenerator.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_THUNKVTABLEGENERATOR_H_ +#define EVENTQUEUE_DETAIL_THUNKVTABLEGENERATOR_H_ + +// imported from Thunk.h + +namespace eq { +namespace detail { + +/** + * Thunk VTable Generator. + * This class generate the vtable of a type F for a Thunk. + * \tparam F The type of the callable for which the Thunk vtable should be + * generated. + */ +template +struct ThunkVTableGenerator { + typedef Thunk thunk_t; + + /** + * Implementation of destructor for Thunk holding an F. + * @param self The thunk to destroy + */ + static void destroy(thunk_t& self) { + get_ptr(self)->~F(); + } + + /** + * Implementation of copy (used by copy constructor and copy assignment) + * for a Thunk holding an F. + * @param dest The thunk receiving the copy. + * @param self The thunk to copy. + */ + static void copy(thunk_t& dest, const thunk_t& self) { + new (get_ptr(dest)) F(*get_ptr(self)); + dest._vtable = self._vtable; + } + + /** + * Implementation of call operator for a Thunk holding an F. + * @param self The thunk containing the F to call. + */ + static void call(const thunk_t& self) { + (*get_ptr(self))(); + } + + /** + * The Thunk vtable for an F. + */ + static const ThunkVTable vtable; + +private: + /** + * Accessor to the pointer to F contained in the Thunk. + */ + static F* get_ptr(thunk_t& thunk) { + return static_cast(thunk._storage.get_storage(0)); + } + + /** + * Accessor to the const pointer to F contained in the const Thunk. + */ + static const F* get_ptr(const thunk_t& thunk) { + return static_cast(thunk._storage.get_storage(0)); + } +}; + +/** + * Instantiation of the Thunk vtable of F. + */ +template +const ThunkVTable ThunkVTableGenerator::vtable = { + ThunkVTableGenerator::destroy, + ThunkVTableGenerator::copy, + ThunkVTableGenerator::call +}; + +} // namespace detail +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_THUNKVTABLEGENERATOR_H_ */ diff --git a/implementations/mbed/source/EventQueue/detail/Thunks.h b/implementations/mbed/source/EventQueue/detail/Thunks.h new file mode 100644 index 0000000..39e6822 --- /dev/null +++ b/implementations/mbed/source/EventQueue/detail/Thunks.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EVENTQUEUE_DETAIL_THUNKS_H_ +#define EVENTQUEUE_DETAIL_THUNKS_H_ + +namespace eq { +namespace detail { + +/** + * Generate a Thunk for a callable of type F with one argument. + * This class is a function like object containing the function to call and + * its argument. When it is invoked, F is invoked with the argument passed + * at construction time. + * \tparam F the type of the callable. + * \tparam Arg0 type of the first parameter of F to pass to F. + */ +template +struct Thunk_1 { + /** + * Construct the Thunk and bind its arguments. + * \param fn the callable, it will be invoked with arg0. + * \param arg0 The first argument to pass to fn when this object is called. + * \note member function should be adapted by using FunctionAdaptor + */ + Thunk_1(const F& fn, const Arg0& arg0) : + _fn(fn), _arg0(arg0) { + } + + /** + * Apply arg0 to fn. + */ + void operator()() const { + _fn(_arg0); + } + +private: + mutable F _fn; + mutable Arg0 _arg0; +}; + +/** + * Generate a Thunk for a callable of type F with two arguments. + * This class is a function like object containing the function to call and + * its arguments. When it is invoked, F is invoked with the arguments passed + * at construction time. + * \tparam F the type of the callable. + * \tparam Arg0 type of the first parameter to pass to F. + * \tparam Arg1 type of the second parameter to pass to F. + */ +template +struct Thunk_2 { + /** + * Construct the Thunk and bind its arguments. + * \param fn the callable, it will be invoked with arg0 and arg1. + * \param arg0 The first argument to pass to fn when this object is called. + * \param arg1 The second argument to pass to fn when this object is called. + * \note member function should be adapted by using FunctionAdaptor + */ + Thunk_2(const F& fn, const Arg0& arg0, const Arg1& arg1) : + _fn(fn), + _arg0(arg0), + _arg1(arg1) { + } + + /** + * Apply arg0 and arg1 to fn. + */ + void operator()() const { + _fn(_arg0, _arg1); + } + +private: + mutable F _fn; + mutable Arg0 _arg0; + mutable Arg1 _arg1; +}; + +/** + * Generate a Thunk for a callable of type F with three arguments. + * This class is a function like object containing the function to call and + * its arguments. When it is invoked, F is invoked with the arguments passed + * at construction time. + * \tparam F the type of the callable. + * \tparam Arg0 type of the first parameter to pass to F. + * \tparam Arg1 type of the second parameter to pass to F. + * \tparam Arg2 type of the third parameter to pass to F. + */ +template +struct Thunk_3 { + /** + * Construct the Thunk and bind its arguments. + * \param fn the callable, it will be invoked with arg0, arg1 and arg2. + * \param arg0 The first argument to pass to fn when this object is called. + * \param arg1 The second argument to pass to fn when this object is called. + * \param arg2 The third argument to pass to fn when this object is called. + * \note member function should be adapted by using FunctionAdaptor + */ + Thunk_3(const F& fn, const Arg0& arg0, const Arg1& arg1, const Arg2& arg2) : + _fn(fn), + _arg0(arg0), + _arg1(arg1), + _arg2(arg2){ + } + + /** + * Apply arg0, arg1 and arg2 to fn. + */ + void operator()() const { + _fn(_arg0, _arg1, _arg2); + } + +private: + mutable F _fn; + mutable Arg0 _arg0; + mutable Arg1 _arg1; + mutable Arg2 _arg2; +}; + +} // namespace detail +} // namespace eq + +#endif /* EVENTQUEUE_DETAIL_THUNKS_H_ */ diff --git a/implementations/mbed/source/EventQueue/util/CriticalSectionLock.h b/implementations/mbed/source/EventQueue/util/CriticalSectionLock.h new file mode 100644 index 0000000..792b7bb --- /dev/null +++ b/implementations/mbed/source/EventQueue/util/CriticalSectionLock.h @@ -0,0 +1,59 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MBED_UTIL_CRITICAL_SECTION_LOCK_H__ +#define __MBED_UTIL_CRITICAL_SECTION_LOCK_H__ + +#include +#include "cmsis.h" + +namespace mbed { +namespace util { + +/** RAII object for disabling, then restoring, interrupt state + * Usage: + * @code + * + * void f() { + * // some code here + * { + * CriticalSectionLock lock; + * // Code in this block will run with interrupts disabled + * } + * // interrupts will be restored to their previous state + * } + * @endcode + */ +class CriticalSectionLock { +public: + CriticalSectionLock() { + _state = __get_PRIMASK(); + __disable_irq(); + } + + ~CriticalSectionLock() { + __set_PRIMASK(_state); + } + +private: + uint32_t _state; +}; + +} // namespace util +} // namespace mbed + +#endif // #ifndef __MBED_UTIL_CRITICAL_SECTION_LOCK_H__ diff --git a/implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.cpp b/implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.cpp new file mode 100644 index 0000000..f5a369d --- /dev/null +++ b/implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.cpp @@ -0,0 +1,55 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ConfigParamsPersistence.h" + +#if !defined(TARGET_NRF51822) && !defined(TARGET_NRF52832) /* Persistent storage supported on nrf51 platforms */ + /** + * When not using an nRF51-based target then persistent storage is not available. + */ + #warning "EddystoneService is not configured to store configuration data in non-volatile memory" + + bool loadEddystoneServiceConfigParams(EddystoneService::EddystoneParams_t *paramsP) + { + /* Avoid compiler warnings */ + (void) paramsP; + + /* + * Do nothing and let the main program set Eddystone params to + * defaults + */ + return false; + } + + void saveEddystoneServiceConfigParams(const EddystoneService::EddystoneParams_t *paramsP) + { + /* Avoid compiler warnings */ + (void) paramsP; + + /* Do nothing... */ + return; + } + + void saveEddystoneTimeParams(const TimeParams_t *timeP) + { + /* Avoid compiler warnings */ + (void) timeP; + + /* Do nothing... */ + return; + } + +#endif /* #ifdef TARGET_NRF51822 */ diff --git a/implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.h b/implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.h new file mode 100644 index 0000000..05c99a2 --- /dev/null +++ b/implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.h @@ -0,0 +1,67 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BLE_CONFIG_PARAMS_PERSISTENCE_H__ +#define __BLE_CONFIG_PARAMS_PERSISTENCE_H__ + +#include "../EddystoneService.h" + +/** + * Generic API to load the Eddystone Service configuration parameters from persistent + * storage. If persistent storage isn't available, the persistenceSignature + * member of params may be left un-initialized to the MAGIC, and this will cause + * a reset to default values. + * + * @param[out] paramsP + * The parameters to be filled in from persistence storage. This + * argument can be NULL if the caller is only interested in + * discovering the persistence status of params. + * + * @return true if params were loaded from persistent storage and have usefully + * initialized fields. + */ +bool loadEddystoneServiceConfigParams(EddystoneService::EddystoneParams_t *paramsP); + +/** + * Generic API to store the Eddystone Service configuration parameters to persistent + * storage. It typically initializes the persistenceSignature member of the + * params to the MAGIC value to indicate persistence. + * + * @param[in,out] paramsP + * The params to be saved; persistenceSignature member gets + * updated if persistence is successful. + * + * @note The save operation may be asynchronous. It may be a short while before + * the request takes affect. Reading back saved configParams may not yield + * correct behaviour if attempted soon after a store. + */ +void saveEddystoneServiceConfigParams(const EddystoneService::EddystoneParams_t *paramsP); + +/** + * Generic API to store the Eddystone TimeParams (a subset of Config Params) for + * speed/power efficiency. + * + * @param[in,out] timeP + * The params to be saved; persistenceSignature member gets + * updated if persistence is successful. + * + * @note The save operation may be asynchronous. It may be a short while before + * the request takes affect. Reading back saved configParams may not yield + * correct behaviour if attempted soon after a store. + */ +void saveEddystoneTimeParams(const TimeParams_t *timeP); + +#endif /* #ifndef __BLE_CONFIG_PARAMS_PERSISTENCE_H__*/ diff --git a/implementations/mbed/source/PersistentStorageHelper/nrfPersistentStorageHelper/nrfConfigParamsPersistence.cpp b/implementations/mbed/source/PersistentStorageHelper/nrfPersistentStorageHelper/nrfConfigParamsPersistence.cpp new file mode 100644 index 0000000..ef1c977 --- /dev/null +++ b/implementations/mbed/source/PersistentStorageHelper/nrfPersistentStorageHelper/nrfConfigParamsPersistence.cpp @@ -0,0 +1,140 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined(TARGET_NRF51822) || defined(TARGET_NRF52832) /* Persistent storage supported on nrf51 platforms */ + +extern "C" { + #include "pstorage.h" +} + +#include "nrf_error.h" +#include "../../EddystoneService.h" +#include + +/** + * Nordic specific structure used to store params persistently. + * It extends EddystoneService::EddystoneParams_t with a persistence signature. + */ +struct PersistentParams_t { + EddystoneService::EddystoneParams_t params; + uint32_t persistenceSignature; /* This isn't really a parameter, but having the expected + * magic value in this field indicates persistence. */ + + static const uint32_t MAGIC = 0x1BEAC000; /* Magic that identifies persistence */ +}; + +/** + * The following is a module-local variable to hold configuration parameters for + * short periods during flash access. This is necessary because the pstorage + * APIs don't copy in the memory provided as data source. The memory cannot be + * freed or reused by the application until this flash access is complete. The + * load and store operations in this module initialize persistentParams and then + * pass it on to the 'pstorage' APIs. + */ +static PersistentParams_t persistentParams; + +static pstorage_handle_t pstorageHandle; + +/** + * Dummy callback handler needed by Nordic's pstorage module. This is called + * after every flash access. + */ +static void pstorageNotificationCallback(pstorage_handle_t *p_handle, + uint8_t op_code, + uint32_t result, + uint8_t *p_data, + uint32_t data_len) +{ + /* Supress compiler warnings */ + (void) p_handle; + (void) op_code; + (void) result; + (void) p_data; + (void) data_len; + + /* APP_ERROR_CHECK(result); */ +} + +/* Platform-specific implementation for persistence on the nRF5x. Based on the + * pstorage module provided by the Nordic SDK. */ +bool loadEddystoneServiceConfigParams(EddystoneService::EddystoneParams_t *paramsP) +{ + static bool pstorageInitied = false; + if (!pstorageInitied) { + pstorage_init(); + + static pstorage_module_param_t pstorageParams = { + .cb = pstorageNotificationCallback, + .block_size = sizeof(PersistentParams_t), + .block_count = 1 + }; + pstorage_register(&pstorageParams, &pstorageHandle); + pstorageInitied = true; + } + + if ((pstorage_load(reinterpret_cast(&persistentParams), &pstorageHandle, sizeof(PersistentParams_t), 0) != NRF_SUCCESS) || + (persistentParams.persistenceSignature != PersistentParams_t::MAGIC)) { + // On failure zero out and let the service reset to defaults + memset(paramsP, 0, sizeof(EddystoneService::EddystoneParams_t)); + return false; + } + + memcpy(paramsP, &persistentParams.params, sizeof(EddystoneService::EddystoneParams_t)); + return true; +} + +/* Platform-specific implementation for persistence on the nRF5x. Based on the + * pstorage module provided by the Nordic SDK. */ +void saveEddystoneServiceConfigParams(const EddystoneService::EddystoneParams_t *paramsP) +{ + memcpy(&persistentParams.params, paramsP, sizeof(EddystoneService::EddystoneParams_t)); + if (persistentParams.persistenceSignature != PersistentParams_t::MAGIC) { + persistentParams.persistenceSignature = PersistentParams_t::MAGIC; + pstorage_store(&pstorageHandle, + reinterpret_cast(&persistentParams), + sizeof(PersistentParams_t), + 0 /* offset */); + } else { + pstorage_update(&pstorageHandle, + reinterpret_cast(&persistentParams), + sizeof(PersistentParams_t), + 0 /* offset */); + } +} + +/* Saves only the TimeParams (a subset of Config Params) for speed/power efficiency + * Platform-specific implementation for persistence on the nRF5x. Based on the + * pstorage module provided by the Nordic SDK. */ +void saveEddystoneTimeParams(const TimeParams_t *timeP) +{ + // Copy the time params object to the main datastructure + memcpy(&persistentParams.params.timeParams, timeP, sizeof(TimeParams_t)); + // Test if this is the first pstorage update, or an update + if (persistentParams.persistenceSignature != PersistentParams_t::MAGIC) { + persistentParams.persistenceSignature = PersistentParams_t::MAGIC; + pstorage_store(&pstorageHandle, + reinterpret_cast(&persistentParams), + sizeof(TimeParams_t), + offsetof(PersistentParams_t, params.timeParams) /* offset */); + } else { + pstorage_update(&pstorageHandle, + reinterpret_cast(&persistentParams), + sizeof(TimeParams_t), + offsetof(PersistentParams_t, params.timeParams) /* offset */); + } +} + +#endif /* #ifdef TARGET_NRF51822 */ diff --git a/implementations/mbed/source/TLMFrame.cpp b/implementations/mbed/source/TLMFrame.cpp new file mode 100644 index 0000000..6df29ac --- /dev/null +++ b/implementations/mbed/source/TLMFrame.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TLMFrame.h" +#include "EddystoneService.h" + +TLMFrame::TLMFrame(uint8_t tlmVersionIn, + uint16_t tlmBatteryVoltageIn, + uint16_t tlmBeaconTemperatureIn, + uint32_t tlmPduCountIn, + uint32_t tlmTimeSinceBootIn) : + tlmVersion(tlmVersionIn), + lastTimeSinceBootRead(0), + tlmBatteryVoltage(tlmBatteryVoltageIn), + tlmBeaconTemperature(tlmBeaconTemperatureIn), + tlmPduCount(tlmPduCountIn), + tlmTimeSinceBoot(tlmTimeSinceBootIn) +{ +} + +void TLMFrame::setTLMData(uint8_t tlmVersionIn) +{ + /* According to the Eddystone spec BatteryVoltage is 0 and + * BeaconTemperature is 0x8000 if not supported + */ + tlmVersion = tlmVersionIn; + tlmBatteryVoltage = 0; + tlmBeaconTemperature = 0x8000; + tlmPduCount = 0; + tlmTimeSinceBoot = 0; +} + +void TLMFrame::setData(uint8_t *rawFrame) // add eidTime - a 4 byte quantity +{ + size_t index = 0; + rawFrame[index++] = EDDYSTONE_UUID_SIZE + FRAME_SIZE_TLM; // Length of Frame + rawFrame[index++] = EDDYSTONE_UUID[0]; // 16-bit Eddystone UUID + rawFrame[index++] = EDDYSTONE_UUID[1]; + rawFrame[index++] = FRAME_TYPE_TLM; // Eddystone frame type = Telemetry + rawFrame[index++] = tlmVersion; // TLM Version Number + rawFrame[index++] = (uint8_t)(tlmBatteryVoltage >> 8); // Battery Voltage[0] + rawFrame[index++] = (uint8_t)(tlmBatteryVoltage >> 0); // Battery Voltage[1] + rawFrame[index++] = (uint8_t)(tlmBeaconTemperature >> 8); // Beacon Temp[0] + rawFrame[index++] = (uint8_t)(tlmBeaconTemperature >> 0); // Beacon Temp[1] + rawFrame[index++] = (uint8_t)(tlmPduCount >> 24); // PDU Count [0] + rawFrame[index++] = (uint8_t)(tlmPduCount >> 16); // PDU Count [1] + rawFrame[index++] = (uint8_t)(tlmPduCount >> 8); // PDU Count [2] + rawFrame[index++] = (uint8_t)(tlmPduCount >> 0); // PDU Count [3] + rawFrame[index++] = (uint8_t)(tlmTimeSinceBoot >> 24); // Time Since Boot [0] + rawFrame[index++] = (uint8_t)(tlmTimeSinceBoot >> 16); // Time Since Boot [1] + rawFrame[index++] = (uint8_t)(tlmTimeSinceBoot >> 8); // Time Since Boot [2] + rawFrame[index++] = (uint8_t)(tlmTimeSinceBoot >> 0); // Time Since Boot [3] +} + +void TLMFrame::encryptData(uint8_t* rawFrame, uint8_t* eidIdentityKey, uint8_t rotationPeriodExp, uint32_t beaconTimeSecs) { + // Initialize AES data + mbedtls_aes_context ctx; + mbedtls_aes_init(&ctx); + mbedtls_aes_setkey_enc(&ctx, eidIdentityKey, sizeof(EidIdentityKey_t) *8 ); + // Change the TLM version number to the encrypted version + rawFrame[VERSION_OFFSET] = ETLM_VERSION; // Encrypted TLM Version number + // Create EAX Params + uint8_t nonce[ETLM_NONCE_LEN]; + // Calculate the 48-bit nonce + generateEtlmNonce(nonce, rotationPeriodExp, beaconTimeSecs); + + uint8_t* input = rawFrame + DATA_OFFSET; // array size 12 + uint8_t output[ETLM_DATA_LEN]; // array size 16 (4 bytes are added: SALT[2], MIC[2]) + memset(output, 0, ETLM_DATA_LEN); + uint8_t emptyHeader[1]; // Empty header + LOG(("EIDIdentityKey=\r\n")); EddystoneService::logPrintHex(eidIdentityKey, 16); + LOG(("ETLM Encoder INPUT=\r\n")); EddystoneService::logPrintHex(input, 12); + LOG(("ETLM SALT=\r\n")); EddystoneService::logPrintHex(nonce+4, 2); + LOG(("ETLM Nonce=\r\n")); EddystoneService::logPrintHex(nonce, 6); + // Encrypt the TLM to ETLM + eddy_aes_authcrypt_eax(&ctx, MBEDTLS_AES_ENCRYPT, nonce, sizeof(nonce), emptyHeader, 0, TLM_DATA_LEN, input, output, output + MIC_OFFSET, MIC_LEN); + +#ifndef NO_EAX_TEST + // Part of test code to confirm x == EAX_DECRYPT( EAX_ENCRYPT(x) ) + uint8_t newinput[ETLM_DATA_LEN]; + memcpy(newinput, output, ETLM_DATA_LEN); +#endif + + // Only use first 2 bytes of Nonce + output[SALT_OFFSET] = nonce[4]; // Nonce MSB + output[SALT_OFFSET+1] = nonce[5]; // Nonce LSB + LOG(("ETLM output+SALT=\r\n")); EddystoneService::logPrintHex(output, 16); + // copy the encrypted payload to the output + memcpy((rawFrame + DATA_OFFSET), output, ETLM_DATA_LEN); + +#ifndef NO_EAX_TEST + // Perform test to confirm x == EAX_DECRYPT( EAX_ENCRYPT(x) ) + uint8_t buf[ETLM_DATA_LEN]; + memset(buf, 0, ETLM_DATA_LEN); + int ret = eddy_aes_authcrypt_eax(&ctx, MBEDTLS_AES_DECRYPT, nonce, sizeof(nonce), emptyHeader, 0, TLM_DATA_LEN, newinput, buf, newinput + MIC_OFFSET, MIC_LEN); + LOG(("ETLM Decoder OUTPUT ret=%d buf=\r\n", ret)); EddystoneService::logPrintHex(buf, 12); +#endif + + // fix the frame length to the encrypted length + rawFrame[FRAME_LEN_OFFSET] = FRAME_SIZE_ETLM + EDDYSTONE_UUID_SIZE; + // Free the AES data struture + mbedtls_aes_free(&ctx); +} + + +size_t TLMFrame::getRawFrameSize(uint8_t* rawFrame) +{ + return rawFrame[FRAME_LEN_OFFSET]; +} + +uint8_t* TLMFrame::getData(uint8_t* rawFrame) +{ + if (rawFrame[VERSION_OFFSET] == TLM_VERSION) { + setData(rawFrame); + } + return &(rawFrame[TLM_DATA_OFFSET]); +} + +uint8_t TLMFrame::getDataLength(uint8_t* rawFrame) +{ + return rawFrame[FRAME_LEN_OFFSET] - EDDYSTONE_UUID_LEN; +} + +uint8_t* TLMFrame::getAdvFrame(uint8_t* rawFrame){ + return &(rawFrame[ADV_FRAME_OFFSET]); +} + +uint8_t TLMFrame::getAdvFrameLength(uint8_t* rawFrame){ + return rawFrame[FRAME_LEN_OFFSET]; +} + +void TLMFrame::updateTimeSinceLastBoot(uint32_t nowInMillis) +{ + // Measured in tenths of a second + tlmTimeSinceBoot += (nowInMillis - lastTimeSinceBootRead) / 100; + lastTimeSinceBootRead = nowInMillis; +} + +void TLMFrame::updateBatteryVoltage(uint16_t tlmBatteryVoltageIn) +{ + tlmBatteryVoltage = tlmBatteryVoltageIn; +} + +void TLMFrame::updateBeaconTemperature(uint16_t tlmBeaconTemperatureIn) +{ + tlmBeaconTemperature = tlmBeaconTemperatureIn; +} + +void TLMFrame::updatePduCount(void) +{ + tlmPduCount++; +} + +uint16_t TLMFrame::getBatteryVoltage(void) const +{ + return tlmBatteryVoltage; +} + +uint16_t TLMFrame::getBeaconTemperature(void) const +{ + return tlmBeaconTemperature; +} + +uint8_t TLMFrame::getTLMVersion(void) const +{ + return tlmVersion; +} + +int TLMFrame::generateEtlmNonce(uint8_t* nonce, uint8_t rotationPeriodExp, uint32_t beaconTimeSecs) { + int rc = 0; + if (sizeof(nonce) != ETLM_NONCE_LEN) { + rc = ETLM_NONCE_INVALID_LEN; + } + uint32_t scaledTime = (beaconTimeSecs >> rotationPeriodExp) << rotationPeriodExp; + int index = 0; + nonce[index++] = (scaledTime >> 24) & 0xff; + nonce[index++] = (scaledTime >> 16) & 0xff; + nonce[index++] = (scaledTime >> 8) & 0xff; + nonce[index++] = scaledTime & 0xff; + EddystoneService::generateRandom(nonce + index, SALT_LEN); + return rc; +} + diff --git a/implementations/mbed/source/TLMFrame.h b/implementations/mbed/source/TLMFrame.h new file mode 100644 index 0000000..9bcc6e1 --- /dev/null +++ b/implementations/mbed/source/TLMFrame.h @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TLMFRAME_H__ +#define __TLMFRAME_H__ + +#include "EddystoneTypes.h" +#include "aes_eax.h" + +/** + * Class that encapsulates data that belongs to the Eddystone-TLM frame. For + * more information refer to https://github.com/google/eddystone/tree/master/eddystone-tlm. + */ +class TLMFrame +{ +public: + /** + * Construct a new instance of this class. + * + * @param[in] tlmVersionIn + * Eddystone-TLM version number to use. + * @param[in] tlmBatteryVoltageIn + * Initial value for the Eddystone-TLM Battery Voltage. + * @param[in] tlmBeaconTemperatureIn + * Initial value for the Eddystone-TLM Beacon Temperature. + * @param[in] tlmPduCountIn + * Initial value for the Eddystone-TLM Advertising PDU Count. + * @param[in] tlmTimeSinceBootIn + * Intitial value for the Eddystone-TLM time since boot timer. + 8 This timer has a 0.1 second resolution. + */ + TLMFrame(uint8_t tlmVersionIn = 0, + uint16_t tlmBatteryVoltageIn = 0, + uint16_t tlmBeaconTemperatureIn = 0x8000, + uint32_t tlmPduCountIn = 0, + uint32_t tlmTimeSinceBootIn = 0); + + /** + * Set the Eddystone-TLM version number. + */ + void setTLMData(uint8_t tlmVersionIn = 0); + + /** + * Construct the raw bytes of the Eddystone-TLM frame that will be directly + * used in the advertising packets. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + */ + void setData(uint8_t *rawFrame); + + /** + * Construct the encrypted bytes of the Eddystone-ETLM frame that will be directly + * used in the advertising packets. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] eidIdentityKey + * Pointer to the eidIdentityKey in use + * @param[in] rotationPeriodExp + * Rotation exponent for EID + * @param[in] beaconTimeSecs + * Time in seconds since beacon boot. + */ + void encryptData(uint8_t* rawFrame, uint8_t* eidIdentityKey, uint8_t rotationPeriodExp, uint32_t beaconTimeSecs); + + /** + * Get the size of the Eddystone-TLM frame constructed with the + * current state of the TLMFrame object. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-TLM frame. + */ + size_t getRawFrameSize(uint8_t* rawFrame); + + + /** + * Get the TLM frame data from the Eddystone-TLM frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-TLM frame data. + */ + uint8_t* getData(uint8_t* rawFrame); + + /** + * Get the length of the TLM frame data from the Eddystone-TLM frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-TLM frame. + */ + uint8_t getDataLength(uint8_t* rawFrame); + + /** + * Get the TLM Adv data from the Eddystone-TLMframe. + * This is the full service data included in the BLE service data params + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-TLM Adv frame data. + */ + uint8_t* getAdvFrame(uint8_t* rawFrame); + + /** + * Get the length of the TLM Adv data from the Eddystone-TLMframe. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-TLM Adv frame data. + */ + uint8_t getAdvFrameLength(uint8_t* rawFrame); + + /** + * Update the time since last boot. + * + * @param[in] nowInMillis + * The time since boot in milliseconds. + */ + void updateTimeSinceLastBoot(uint32_t nowInMillis); + + /** + * Update the Battery Voltage. + * + * @param[in] tlmBatteryVoltageIn + * The new Battery Voltage value. + */ + void updateBatteryVoltage(uint16_t tlmBatteryVoltageIn); + + /** + * Update the Beacon Temperature. + * + * @param[in] tlmBeaconTemperatureIn + * The new Beacon Temperature value. + */ + void updateBeaconTemperature(uint16_t tlmBeaconTemperatureIn); + + /** + * Increment the current PDU counter by 1. + */ + void updatePduCount(void); + + /** + * Get the current Battery Voltage. + * + * @return The Battery Voltage. + */ + uint16_t getBatteryVoltage(void) const; + + /** + * Get the current Beacon Temperature. + * + * @return The Beacon Temperature. + */ + uint16_t getBeaconTemperature(void) const; + + /** + * Get the current TLM Version number. + * + * @return The TLM Version number. + */ + uint8_t getTLMVersion(void) const; + + /** + * The byte ID of an Eddystone-TLM frame. + */ + static const uint8_t FRAME_TYPE_TLM = 0x20; + + /** + * The verison number of the Telemetry packets being used + */ + static const uint8_t DEFAULT_TLM_VERSION = 0; + + /** + * The size of an Eddystone-TLM frame. + */ + static const uint8_t FRAME_SIZE_TLM = 14; + /** + * The size of an Eddystone-ETLM frame. + */ + static const uint8_t FRAME_SIZE_ETLM = (FRAME_SIZE_TLM + 4); + + // Nonce + static const uint8_t ETLM_NONCE_LEN = 6; + // Version + static const uint8_t VERSION_OFFSET = 4; + static const uint8_t TLM_VERSION = 0x00; + static const uint8_t ETLM_VERSION = 0x01; + // Data + static const uint8_t DATA_OFFSET = 5; + static const uint8_t TLM_DATA_LEN = 12; + static const uint8_t ETLM_DATA_LEN = 16; + // Salt + static const uint8_t SALT_OFFSET = 12; + static const uint8_t SALT_LEN = 2; + // Message Integrity Check + static const uint8_t MIC_OFFSET = 14; + static const uint8_t MIC_LEN = 2; + // Return codes + static const int ETLM_NONCE_INVALID_LEN = -1; + + /** + * Constructs 6 byte (48-bit) Nonce from an empty array, rotationExp and beacon time (secs) + * + * @param[in] nonce + * the input and target nonce[] array + * @param[in] rotationPeriodExp + * Rotation exponent for EID + * @param[in] beaconTimeSecs + * Time in seconds since beacon boot. + * @return[out] return code (success = 0) + */ + int generateEtlmNonce(uint8_t* nonce, uint8_t rotatePeriodExp, uint32_t beaconTimeSecs); + + +private: + + /** + * The size (in bytes) of an Eddystone-EID frame. + * This is the some of the Eddystone UUID(2 bytes), FrameType, AdvTxPower, + * EID Value + */ + // static const uint8_t TLM_FRAME_LEN = 16; + // static const uint8_t ETLM_FRAME_LEN = 20; + static const uint8_t FRAME_LEN_OFFSET = 0; + static const uint8_t EDDYSTONE_UUID_LEN = 2; + static const uint8_t TLM_DATA_OFFSET = 3; + static const uint8_t ADV_FRAME_OFFSET = 1; + + /** + * Eddystone-TLM version value. + */ + uint8_t tlmVersion; + /** + * Time since boot in milliseconds. + */ + uint32_t lastTimeSinceBootRead; + /** + * Eddystone-TLM Battery Voltage value. + */ + uint16_t tlmBatteryVoltage; + /** + * Eddystone-TLM Beacon temperature value. + */ + uint16_t tlmBeaconTemperature; + /** + * Eddystone-TLM Advertising PDU Count. + */ + uint32_t tlmPduCount; + /** + * Eddystone-TLM time since boot with 0.1 second resolution. + */ + uint32_t tlmTimeSinceBoot; + + +}; +#endif /* __TLMFRAME_H__ */ diff --git a/implementations/mbed/source/UIDFrame.cpp b/implementations/mbed/source/UIDFrame.cpp new file mode 100644 index 0000000..0120bac --- /dev/null +++ b/implementations/mbed/source/UIDFrame.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "UIDFrame.h" + +UIDFrame::UIDFrame(void) { +} + +void UIDFrame::clearFrame(uint8_t* frame) { + frame[FRAME_LEN_OFFSET] = 0; // Set frame length to zero to clear it +} + +void UIDFrame::setData(uint8_t *rawFrame, int8_t advTxPower, const uint8_t* uidData) { + size_t index = 0; + rawFrame[index++] = UID_HEADER_LEN + UID_LENGTH; // UID length + overhead of four bytes below + rawFrame[index++] = EDDYSTONE_UUID[0]; // LSB 16-bit Eddystone UUID (little endian) + rawFrame[index++] = EDDYSTONE_UUID[1]; // MSB + rawFrame[index++] = FRAME_TYPE_UID; // 1B Type + rawFrame[index++] = advTxPower; // 1B Power @ 0meter + + memcpy(rawFrame + index, uidData, UID_LENGTH); // UID = 10B NamespaceID + 6B InstanceID +} + +uint8_t* UIDFrame::getData(uint8_t* rawFrame) { + return &(rawFrame[UID_DATA_OFFSET]); +} + +uint8_t UIDFrame::getDataLength(uint8_t* rawFrame) +{ + return rawFrame[FRAME_LEN_OFFSET] - EDDYSTONE_UUID_LEN; +} + +uint8_t* UIDFrame::getAdvFrame(uint8_t* rawFrame) +{ + return &(rawFrame[ADV_FRAME_OFFSET]); +} + +uint8_t UIDFrame::getAdvFrameLength(uint8_t* rawFrame) +{ + return rawFrame[FRAME_LEN_OFFSET]; +} + +uint8_t* UIDFrame::getUid(uint8_t* rawFrame) +{ + return &(rawFrame[UID_VALUE_OFFSET]); +} + +uint8_t UIDFrame::getUidLength(uint8_t* rawFrame) +{ + return rawFrame[FRAME_LEN_OFFSET] - UID_HEADER_LEN; +} + +void UIDFrame::setAdvTxPower(uint8_t* rawFrame, int8_t advTxPower) +{ + rawFrame[UID_TXPOWER_OFFSET] = advTxPower; +} \ No newline at end of file diff --git a/implementations/mbed/source/UIDFrame.h b/implementations/mbed/source/UIDFrame.h new file mode 100644 index 0000000..6c02d4c --- /dev/null +++ b/implementations/mbed/source/UIDFrame.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UIDFRAME_H__ +#define __UIDFRAME_H__ + +#include +#include "EddystoneTypes.h" + +/** + * Class that encapsulates data that belongs to the Eddystone-UID frame. For + * more information refer to https://github.com/google/eddystone/tree/master/eddystone-uid. + */ +class UIDFrame +{ +public: + static const uint8_t UID_LENGTH = 16; + + /** + * Construct a new instance of this class. + */ + UIDFrame(void); + + /** + * Clear frame (intervally indicated by length = 0 ) + */ + void clearFrame(uint8_t* frame); + + /** + * Construct the raw bytes of the Eddystone-UID frame that will be directly + * used in the advertising packets. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * @param[in] uidData + * The actual 16-byte UID data in the raw frame. + */ + void setData(uint8_t* rawFrame, int8_t advTxPower, const uint8_t* uidData); + + /** + * Get the UID frame data from the Eddystone-UID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-UID frame data. + */ + uint8_t* getData(uint8_t* rawFrame); + + /** + * Get the length of the UID frame data from the Eddystone-UID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-UID frame. + */ + uint8_t getDataLength(uint8_t* rawFrame); + + /** + * Get the UID Adv data from the Eddystone-UID frame. + * This is the full service data included in the BLE service data params + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-UID Adv frame data. + */ + uint8_t* getAdvFrame(uint8_t* rawFrame); + + /** + * Get the length of the UID Adv data from the Eddystone-UID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-UID Adv frame data. + */ + uint8_t getAdvFrameLength(uint8_t* rawFrame); + + /** + * Get just the UID data from the Eddystone-UID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the UID in the Eddystone-UID frame. + */ + uint8_t* getUid(uint8_t* rawFrame); + + /** + * Get the length of just the UID data from the Eddystone-UID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the UID in the Eddystone-UID frame. + */ + uint8_t getUidLength(uint8_t* rawFrame); + + /** + * Set the Adv TX Power in the frame. This is necessary because the adv + * Tx Power might be updated independent of the data bytes + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * + */ + void setAdvTxPower(uint8_t* rawFrame, int8_t advTxPower); + + /** + * The byte ID of an Eddystone-UID frame. + */ + static const uint8_t FRAME_TYPE_UID = 0x00; + +private: + static const uint8_t UID_FRAME_LEN = 20; + static const uint8_t FRAME_LEN_OFFSET = 0; + static const uint8_t EDDYSTONE_UUID_LEN = 2; + static const uint8_t UID_DATA_OFFSET = 3; + static const uint8_t ADV_FRAME_OFFSET = 1; + static const uint8_t UID_VALUE_OFFSET = 5; + static const uint8_t UID_HEADER_LEN = 4; + static const uint8_t UID_TXPOWER_OFFSET = 4; + /** + * The size (in bytes) of an Eddystone-UID frame. + * This is the some of the Eddystone UUID(2 bytes), FrameType, AdvTxPower, + * UID Name Length, and UID Instance Length + */ + static const uint8_t FRAME_SIZE_UID = 20; + /** + * The size (in bytes) of an Eddystone-UID frame. + */ + static const uint8_t UID_NAMESPACEID_LENGTH = 10; + static const uint8_t UID_INSTANCEID_LENGTH = 6; + +}; + +#endif /* __UIDFRAME_H__ */ diff --git a/implementations/mbed/source/URLFrame.cpp b/implementations/mbed/source/URLFrame.cpp new file mode 100644 index 0000000..02b4073 --- /dev/null +++ b/implementations/mbed/source/URLFrame.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "URLFrame.h" + +/* CONSTRUCTOR */ +URLFrame::URLFrame(void) +{ +} + +void URLFrame::setUnencodedUrlData(uint8_t* rawFrame, int8_t advTxPower, const char *rawUrl) +{ + uint8_t encodedUrl[ENCODED_BUF_SIZE]; + int encodedUrlLen = encodeURL(encodedUrl, rawUrl); + encodedUrlLen = (encodedUrlLen > MAX_URL_DATA) ? MAX_URL_DATA : encodedUrlLen; + setData(rawFrame, advTxPower, reinterpret_cast(encodedUrl), encodedUrlLen); +} + +void URLFrame::clearFrame(uint8_t* frame) { + frame[FRAME_LEN_OFFSET] = 0; // Set frame length to zero to clear it +} + +void URLFrame::setData(uint8_t* rawFrame, int8_t advTxPower, const uint8_t* encodedUrlData, uint8_t encodedUrlLen) +{ + uint8_t index = 0; + rawFrame[index++] = URL_HEADER_LEN + encodedUrlLen; // INDEX=0 = Frame Length = encodedURL size + 4 bytes of header below + rawFrame[index++] = EDDYSTONE_UUID[0]; // FRAME 16-bit Eddystone UUID Low Byte (little endian) + rawFrame[index++] = EDDYSTONE_UUID[1]; // FRAME 16-bit Eddystone UUID High Byte + rawFrame[index++] = FRAME_TYPE_URL; // URL Frame Type + rawFrame[index++] = advTxPower; // Power @ 0meter + + memcpy(rawFrame + index, encodedUrlData, encodedUrlLen); +} + +uint8_t* URLFrame::getData(uint8_t* rawFrame) { + return &(rawFrame[URL_DATA_OFFSET]); +} + + +uint8_t URLFrame::getDataLength(uint8_t* rawFrame) { + return rawFrame[FRAME_LEN_OFFSET] - EDDYSTONE_UUID_LEN; +} + +uint8_t* URLFrame::getAdvFrame(uint8_t* rawFrame) +{ + return &(rawFrame[ADV_FRAME_OFFSET]); +} + +uint8_t URLFrame::getAdvFrameLength(uint8_t* rawFrame) +{ + return rawFrame[FRAME_LEN_OFFSET]; +} + +uint8_t* URLFrame::getEncodedUrl(uint8_t* rawFrame) +{ + return &(rawFrame[URL_VALUE_OFFSET]); +} + +uint8_t URLFrame::getEncodedUrlLength(uint8_t* rawFrame) +{ + return rawFrame[ADV_FRAME_OFFSET] - URL_HEADER_LEN; +} + + +uint8_t URLFrame::encodeURL(uint8_t* encodedUrl, const char *rawUrl) +{ + uint8_t urlDataLength = 0; + + const char *prefixes[] = { + "http://www.", + "https://www.", + "http://", + "https://", + }; + const size_t NUM_PREFIXES = sizeof(prefixes) / sizeof(char *); + const char *suffixes[] = { + ".com/", + ".org/", + ".edu/", + ".net/", + ".info/", + ".biz/", + ".gov/", + ".com", + ".org", + ".edu", + ".net", + ".info", + ".biz", + ".gov" + }; + const size_t NUM_SUFFIXES = sizeof(suffixes) / sizeof(char *); + + /* + * Fill with one more 0 than max url data size to ensure its null terminated + * And can be printed out for debug purposes + */ + memset(encodedUrl, 0, MAX_URL_DATA + 1); + + if ((rawUrl == NULL) || (strlen(rawUrl) == 0)) { + return urlDataLength; + } + + /* + * handle prefix + */ + for (size_t i = 0; i < NUM_PREFIXES; i++) { + size_t prefixLen = strlen(prefixes[i]); + if (strncmp(rawUrl, prefixes[i], prefixLen) == 0) { + encodedUrl[urlDataLength++] = i; + rawUrl += prefixLen; + break; + } + } + + /* + * handle suffixes + */ + while (*rawUrl && (urlDataLength <= MAX_URL_DATA)) { + /* check for suffix match */ + size_t i; + for (i = 0; i < NUM_SUFFIXES; i++) { + size_t suffixLen = strlen(suffixes[i]); + if (strncmp(rawUrl, suffixes[i], suffixLen) == 0) { + encodedUrl[urlDataLength++] = i; + rawUrl += suffixLen; + break; /* from the for loop for checking against suffixes */ + } + } + /* This is the default case where we've got an ordinary character which doesn't match a suffix. */ + if (i == NUM_SUFFIXES) { + encodedUrl[urlDataLength++] = *rawUrl; + ++rawUrl; + } + } + return urlDataLength; +} + +void URLFrame::setAdvTxPower(uint8_t* rawFrame, int8_t advTxPower) +{ + rawFrame[URL_TXPOWER_OFFSET] = advTxPower; +} diff --git a/implementations/mbed/source/URLFrame.h b/implementations/mbed/source/URLFrame.h new file mode 100644 index 0000000..36a0202 --- /dev/null +++ b/implementations/mbed/source/URLFrame.h @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __URLFRAME_H__ +#define __URLFRAME_H__ + +#include "EddystoneTypes.h" +#include + +/** + * Class that encapsulates data that belongs to the Eddystone-URL frame. For + * more information refer to https://github.com/google/eddystone/tree/master/eddystone-url. + */ +class URLFrame +{ +public: + /** + * Construct a new instance of this class. + */ + URLFrame(void); + + /** + * Construct the raw bytes of the Eddystone-URL frame from an unencoded URL + * (a null terminated string) that will be directly used in the advertising + * packets. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * @param[in] rawURL + * A null terminated string containing the URL + */ + void setUnencodedUrlData(uint8_t* rawFrame, int8_t advTxPower, const char *rawUrl); + + /** + * Clear frame (intervally indicated by length = 0 ) + */ + void clearFrame(uint8_t* frame); + + /** + * Construct the raw bytes of the Eddystone-URL frame from an encoded URL + * plus length information + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * @param[in] encodedUrlData + * A pointer to the encoded URL bytes. + * @param[in] encodedUrlLen + * The length in bytes of the encoded URL + */ + void setData(uint8_t* rawFrame, int8_t advPowerLevel, const uint8_t* encodedUrlData, uint8_t encodedUrlLen); + + /** + * Get the URL frame data from the Eddystone-URL frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-URL frame data. + */ + uint8_t* getData(uint8_t* rawFrame); + + /** + * Get the length of the URL frame data from the Eddystone-UID frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-URL frame. + */ + uint8_t getDataLength(uint8_t* rawFrame); + + /** + * Get the URL Adv data from the Eddystone-URLframe. + * This is the full service data included in the BLE service data params + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the Eddystone-URLAdv frame data. + */ + uint8_t* getAdvFrame(uint8_t* rawFrame); + + /** + * Get the length of the URLAdv data from the Eddystone-URL frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the Eddystone-URL Adv frame data. + */ + uint8_t getAdvFrameLength(uint8_t* rawFrame); + + /** + * Get just the encoded URL data from the Eddystone-URL frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return A pointer to the bytes of the encoded URL in the Eddystone-URL + * frame. + */ + uint8_t* getEncodedUrl(uint8_t* rawFrame); + + /** + * Get the length of just the encoded URL data from the Eddystone-URL frame. + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * + * @return The size in bytes of the encoded URL in the Eddystone-URL frame. + */ + uint8_t getEncodedUrlLength(uint8_t* rawFrame); + + /** + * Set the Adv TX Power in the frame. This is necessary because the adv + * Tx Power might be updated independent of the data bytes + * + * @param[in] rawFrame + * Pointer to the location where the raw frame will be stored. + * @param[in] advPowerLevel + * Power level value included in the raw frame. + * + */ + void setAdvTxPower(uint8_t* rawFrame, int8_t advTxPower); + + /** + * Helper function that encodes a URL null terminated string into the HTTP + * URL Encoding required in Eddystone-URL frames. Refer to + * https://github.com/google/eddystone/blob/master/eddystone-url/README.md#eddystone-url-http-url-encoding. + * + * @param[in] encodedUrlData + * The encoded bytes of the URL + * @param[in] rawUrl + * The null terminated string containing a URL to encode. + * @return Length of the encodedData in bytes + */ + static uint8_t encodeURL(uint8_t* encodedUrlData, const char* rawUrl); + + /** + * The max size (in bytes) of an Eddystone-URL frame. + */ + static const uint8_t ENCODED_BUF_SIZE = 32; + /** + * The byte ID of an Eddystone-URL frame. + */ + static const uint8_t FRAME_TYPE_URL = 0x10; + +private: + static const uint8_t FRAME_LEN_OFFSET = 0; + static const uint8_t EDDYSTONE_UUID_LEN = 2; + static const uint8_t URL_DATA_OFFSET = 3; + static const uint8_t ADV_FRAME_OFFSET = 1; + static const uint8_t URL_VALUE_OFFSET = 5; + static const uint8_t URL_HEADER_LEN = 4; + static const uint8_t URL_TXPOWER_OFFSET = 4; + + /** + * The minimum size (in bytes) of an Eddystone-URL frame. + */ + static const uint8_t FRAME_MIN_SIZE_URL = 2; + + /** + * Offset for playload in a rawFrame UID + */ + static const uint8_t MAX_URL_DATA = 18; +}; + +#endif /* __URLFRAME_H__ */ diff --git a/implementations/mbed/source/aes_eax.cpp b/implementations/mbed/source/aes_eax.cpp new file mode 100644 index 0000000..240d9f7 --- /dev/null +++ b/implementations/mbed/source/aes_eax.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2016, Google Inc, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +// #include "aes_eax.h" +// set defines before loading aes.h +#define MBEDTLS_CIPHER_MODE_CBC +#define MBEDTLS_CIPHER_MODE_CTR +#include "mbedtls/aes.h" + +#define EDDY_ERR_EAX_AUTH_FAILED -0x000F /**< Authenticated decryption failed. */ + +void gf128_double_( unsigned char val[16] ) +{ + int i; + int carry = val[0] >> 7; + int xv = (-carry) & 0x87; + for (i = 15; i >= 0; i--) { + carry = val[i] >> 7; + val[i] = (val[i] << 1) ^ xv; + xv = carry; + } +} + +int compute_cmac_( mbedtls_aes_context *ctx, + const unsigned char *input, + size_t length, + unsigned char param, + unsigned char mac[16] ) +{ + unsigned char buf[16], iv[16]; + memset(buf, 0, sizeof(buf)); + buf[15] = param; + memset(iv, 0, sizeof(iv)); + length += 16; + + unsigned char pad[16]; + memset(pad, 0, sizeof(pad)); + mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, pad, pad); + gf128_double_(pad); + if (length & 15) { + gf128_double_(pad); + pad[length & 15] ^= 0x80; + } + + const unsigned char *tmp_input = buf; + while (length > 16) { + mbedtls_aes_crypt_cbc(ctx, MBEDTLS_AES_ENCRYPT, 16, iv, tmp_input, buf); + if (tmp_input == buf) { + tmp_input = input; + } else { + tmp_input += 16; + } + length -= 16; + } + + size_t i; + for (i = 0; i < length; i++) + pad[i] ^= tmp_input[i]; + + mbedtls_aes_crypt_cbc(ctx, MBEDTLS_AES_ENCRYPT, 16, iv, pad, mac); + return 0; +} + +int eddy_aes_authcrypt_eax( mbedtls_aes_context *ctx, + int mode, + const unsigned char *nonce, + size_t nonce_length, + const unsigned char *header, + size_t header_length, + size_t message_length, + const unsigned char *input, + unsigned char *output, + unsigned char *tag, + size_t tag_length ) +{ + unsigned char header_mac[16]; + unsigned char nonce_mac[16]; + unsigned char ciphertext_mac[16]; + uint8_t i; + compute_cmac_(ctx, header, header_length, 1, header_mac); + compute_cmac_(ctx, nonce, nonce_length, 0, nonce_mac); + if (mode == MBEDTLS_AES_DECRYPT) { + compute_cmac_(ctx, input, message_length, 2, ciphertext_mac); + unsigned char n_ok = 0; + for (i = 0; i < tag_length; i++) { + ciphertext_mac[i] ^= header_mac[i]; + ciphertext_mac[i] ^= nonce_mac[i]; + ciphertext_mac[i] ^= tag[i]; + n_ok |= ciphertext_mac[i]; + } + if (n_ok) + return EDDY_ERR_EAX_AUTH_FAILED; + } + size_t nc_off = 0; + unsigned char nonce_copy[16]; + memcpy(nonce_copy, nonce_mac, sizeof(nonce_mac)); + unsigned char sb[16]; + mbedtls_aes_crypt_ctr(ctx, message_length, &nc_off, nonce_copy, sb, input, output); + if (mode == MBEDTLS_AES_ENCRYPT) { + compute_cmac_(ctx, output, message_length, 2, ciphertext_mac); + for (i = 0; i < tag_length; i++) + tag[i] = header_mac[i] ^ nonce_mac[i] ^ ciphertext_mac[i]; + } + return 0; +} diff --git a/implementations/mbed/source/aes_eax.h b/implementations/mbed/source/aes_eax.h new file mode 100644 index 0000000..93920a7 --- /dev/null +++ b/implementations/mbed/source/aes_eax.h @@ -0,0 +1,47 @@ +#if !defined(AES_EAX_H__INCLUDED__) +#define AES_EAX_H__INCLUDED__ + +#define MBEDTLS_CIPHER_MODE_CBC +/* + * Copyright (c) 2016, Google Inc, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define MBEDTLS_CIPHER_MODE_CTR +#include "mbedtls/aes.h" + +int compute_cmac_( mbedtls_aes_context *ctx, + const unsigned char *input, + size_t length, + unsigned char param, + unsigned char mac[16] ); + +void gf128_double_( unsigned char val[16] ); + +int eddy_aes_authcrypt_eax( mbedtls_aes_context *ctx, + int mode, /* ENCRYPT/DECRYPT */ + const unsigned char *nonce, /* 48-bit nonce */ + size_t nonce_length, /* = 6 */ + const unsigned char *header, /* Empty buffer */ + size_t header_length, /* = 0 */ + size_t message_length, /* Length of input & output buffers 12 */ + const unsigned char *input, + unsigned char *output, + unsigned char *tag, + size_t tag_length ); /* = 2 */ + + + +#endif /* defined(AES_EAX_H__INCLUDED__) */ \ No newline at end of file diff --git a/implementations/mbed/source/main.cpp b/implementations/mbed/source/main.cpp new file mode 100644 index 0000000..449c3f0 --- /dev/null +++ b/implementations/mbed/source/main.cpp @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2006-2016 Google Inc, All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef YOTTA_CFG_MBED_OS // use minar on mbed OS +# include "mbed-drivers/mbed.h" +#else +# include "mbed.h" +#endif + +#include "ble/BLE.h" +#include "EddystoneService.h" + +#include "PersistentStorageHelper/ConfigParamsPersistence.h" +#include "stdio.h" + +#if (defined(NRF51) || defined(NRF52)) + #include "nrf_soc.h" +#endif + +// Instantiation of the main event loop for this program + +#ifdef YOTTA_CFG_MBED_OS // use minar on mbed OS +# include "EventQueue/EventQueueMinar.h" + typedef eq::EventQueueMinar event_queue_t; + +#else // otherwise use the event classic queue +# include "EventQueue/EventQueueClassic.h" + typedef eq::EventQueueClassic< + /* event count */ 10 + > event_queue_t; + +#endif + +static event_queue_t eventQueue; + +EddystoneService *eddyServicePtr; + +/* Duration after power-on that config service is available. */ +static const int CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS = EDDYSTONE_DEFAULT_CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS; + +/* Values for ADV packets related to firmware levels, calibrated based on measured values at 1m */ +static const PowerLevels_t advTxPowerLevels = EDDYSTONE_DEFAULT_ADV_TX_POWER_LEVELS; +/* Values for radio power levels, provided by manufacturer. */ +static const PowerLevels_t radioTxPowerLevels = EDDYSTONE_DEFAULT_RADIO_TX_POWER_LEVELS; + +DigitalOut configLED(CONFIG_LED, LED_OFF); + +static const int BLINKY_MSEC = 500; // How long to cycle config LED on/off +static event_queue_t::event_handle_t handle = 0; // For the config mode timeout +static event_queue_t::event_handle_t BlinkyHandle = 0; // For the blinking LED when in config mode + +static void blinky(void) { configLED = !configLED; } + +static void configLED_on(void) { + configLED = !LED_OFF; + BlinkyHandle = eventQueue.post_every(blinky, BLINKY_MSEC); +} + +static void configLED_off(void) { + configLED = LED_OFF; + if (BlinkyHandle) { + eventQueue.cancel(BlinkyHandle); + BlinkyHandle = NULL; + } +} + +/** + * Callback triggered some time after application started to switch to beacon mode. + */ +static void timeoutToStartEddystoneBeaconAdvertisements(void) +{ + Gap::GapState_t state; + state = BLE::Instance().gap().getState(); + if (!state.connected) { /* don't switch if we're in a connected state. */ + eddyServicePtr->startEddystoneBeaconAdvertisements(); + configLED_off(); + } +} + +/** + * Callback triggered for a connection event. + */ +static void connectionCallback(const Gap::ConnectionCallbackParams_t *cbParams) +{ + (void) cbParams; + // Stop advertising whatever the current mode + eddyServicePtr->stopEddystoneBeaconAdvertisements(); +} + +/** + * Callback triggered for a disconnection event. + */ +static void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *cbParams) +{ + (void) cbParams; + BLE::Instance().gap().startAdvertising(); + // Save params in persistent storage + EddystoneService::EddystoneParams_t params; + eddyServicePtr->getEddystoneParams(params); + saveEddystoneServiceConfigParams(¶ms); + // Ensure LED is off at the end of Config Mode or during a connection + configLED_off(); + // 0.5 Second callback to rapidly re-establish Beaconing Service + // (because it needs to be executed outside of disconnect callback) + eventQueue.post_in(timeoutToStartEddystoneBeaconAdvertisements, 500 /* ms */); +} + +// This section defines a simple push button handler to enter config or shutdown the beacon +// Only compiles if "reset_button" is set in config.json in the "platform" section +// +#ifdef RESET_BUTTON + +InterruptIn button(RESET_BUTTON); +DigitalOut shutdownLED(SHUTDOWN_LED, LED_OFF); + +static void shutdownLED_on(void) { shutdownLED = !LED_OFF; } +static void shutdownLED_off(void) { shutdownLED = LED_OFF; } + +static bool beaconIsOn = true; // Button handler boolean to switch on or off +static bool buttonBusy; // semaphore to make prevent switch bounce problems + +static void freeButtonBusy(void) { buttonBusy = false; } + +// Callback used to handle button presses from thread mode (not IRQ) +static void button_task(void) { + bool locked = eddyServicePtr->isLocked(); + + // only shutdown if ON and unlocked + if (beaconIsOn && !locked) { + eventQueue.cancel(handle); // kill any pending callback tasks + beaconIsOn = false; + eddyServicePtr->stopEddystoneBeaconAdvertisements(); + configLED_off(); // just in case it's still running... + shutdownLED_on(); // Flash shutdownLED to let user know we're turning off + eventQueue.post_in(shutdownLED_off, 1000); + // only go into configMode if OFF or locked and not in configMode + } else if (!beaconIsOn || (locked && BlinkyHandle == NULL)) { + eventQueue.cancel(handle); // kill any pending callback tasks + beaconIsOn = true; + eddyServicePtr->startEddystoneConfigAdvertisements(); + configLED_on(); + handle = eventQueue.post_in( + timeoutToStartEddystoneBeaconAdvertisements, + CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS * 1000 /* ms */ + ); + } + eventQueue.post_in(freeButtonBusy, 750 /* ms */); +} + +/** + * Raw IRQ handler for the reset button. We don't want to actually do any work here. + * Instead, we queue work to happen later using an event queue, by posting a callback. + * This has the added avantage of serialising actions, so if the button press happens + * during the config->beacon mode transition timeout, the button_task won't happen + * until the previous task has finished. + * + * If your buttons aren't debounced, you should do this in software, or button_task + * might get queued multiple times. + */ +static void reset_rise(void) +{ + if (!buttonBusy) { + buttonBusy = true; + eventQueue.post(button_task); + } +} +#endif + +static void onBleInitError(BLE::InitializationCompleteCallbackContext* initContext) +{ + /* Initialization error handling goes here... */ + (void) initContext; +} + + +static void bleInitComplete(BLE::InitializationCompleteCallbackContext* initContext) +{ + BLE &ble = initContext->ble; + ble_error_t error = initContext->error; + + if (error != BLE_ERROR_NONE) { + onBleInitError(initContext); + return; + } + + ble.gap().onDisconnection(disconnectionCallback); + + ble.gap().onConnection(connectionCallback); + + EddystoneService::EddystoneParams_t params; + + wait_ms(35); // Allow the RNG number generator to collect data + + // Determine if booting directly after re-Flash or not + if (loadEddystoneServiceConfigParams(¶ms)) { + // 2+ Boot after reflash, so get parms from Persistent Storage + eddyServicePtr = new EddystoneService(ble, params, radioTxPowerLevels, eventQueue); + } else { + // 1st Boot after reflash, so reset everything to defaults + /* NOTE: slots are initialized in the constructor from the config.json file */ + eddyServicePtr = new EddystoneService(ble, advTxPowerLevels, radioTxPowerLevels, eventQueue); + } + + // Save Default params in persistent storage ready for next boot event + eddyServicePtr->getEddystoneParams(params); + saveEddystoneServiceConfigParams(¶ms); + // Start the Eddystone Config service - This will never stop (only connectability will change) + eddyServicePtr->startEddystoneConfigService(); + + /* Start Eddystone config Advertizements (to initialize everything properly) */ + configLED_on(); + eddyServicePtr->startEddystoneConfigAdvertisements(); + handle = eventQueue.post_in( + timeoutToStartEddystoneBeaconAdvertisements, + CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS * 1000 /* ms */ + ); + +#if (defined(NRF51) || defined(NRF52)) + sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE); // set the DCDC mode for the Nordic chip to lower power consumption +#endif + + // now shut everything off (used for final beacon that ships w/ battery) +#ifdef RESET_BUTTON + eventQueue.post_in(button_task, 2000 /* ms */); +#endif +} + +void app_start(int, char *[]) +{ + +#ifdef NO_LOGGING + /* Tell standard C library to not allocate large buffers for these streams */ + // setbuf(stdout, NULL); + // setbuf(stderr, NULL); + // setbuf(stdin, NULL); +#endif + +#ifndef NO_4SEC_START_DELAY + // delay ~4secs before starting to allow time the nRF51 hardware to settle + // Also allows time to attach a virtual terimal to read logging output during init + wait_ms(4000); +#endif + +#ifdef RESET_BUTTON + beaconIsOn = true; // Booting up, initialize for button handler + buttonBusy = false; // software debouncing of the reset button + button.rise(&reset_rise); // setup reset button +#endif + + BLE &ble = BLE::Instance(); + ble.init(bleInitComplete); +} + +#if !defined(YOTTA_CFG_MBED_OS) + +void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { + eventQueue.post(&BLE::processEvents, &context->ble); + } + +int main() { + + BLE &ble = BLE::Instance(); + ble.onEventsToProcess(scheduleBleEventsProcessing); + + app_start(0, NULL); + + while (true) { + eventQueue.dispatch(); + sleep(); + } + + return 0; +} + + +#endif diff --git a/implementations/mbed/source/mbedtls_config.h b/implementations/mbed/source/mbedtls_config.h new file mode 100644 index 0000000..e463729 --- /dev/null +++ b/implementations/mbed/source/mbedtls_config.h @@ -0,0 +1,112 @@ +#ifndef MBEDTLS_EDDYSTONE_CONFIG_H +#define MBEDTLS_EDDYSTONE_CONFIG_H + +/* System support */ +//#define MBEDTLS_HAVE_ASM +#undef MBEDTLS_HAVE_ASM +#define MBEDTLS_HAVE_TIME +#undef MBEDTLS_HAVE_TIME_DATE + +#define MBEDTLS_CIPHER_MODE_CBC +#define MBEDTLS_CIPHER_MODE_CTR +#undef MBEDTLS_CIPHER_PADDING_PKCS7 +#undef MBEDTLS_REMOVE_ARC4_CIPHERSUITES + +/* mbed TLS feature support */ +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED +#undef MBEDTLS_ECP_DP_SECP384R1_ENABLED +#define MBEDTLS_ECP_DP_CURVE25519_ENABLED + +#undef MBEDTLS_ECP_NIST_OPTIM +#undef MBEDTLS_ECDSA_DETERMINISTIC +#undef MBEDTLS_KEY_EXCHANGE_PSK_ENABLED +#undef MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED +#undef MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED +#undef MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED +#undef MBEDTLS_ERROR_STRERROR_DUMMY +#undef MBEDTLS_PK_RSA_ALT_SUPPORT +#undef MBEDTLS_PKCS1_V15 +#undef MBEDTLS_PKCS1_V21 +#undef MBEDTLS_SELF_TEST +#undef MBEDTLS_SSL_ALL_ALERT_MESSAGES +#undef MBEDTLS_SSL_ENCRYPT_THEN_MAC +#undef MBEDTLS_SSL_EXTENDED_MASTER_SECRET +#undef MBEDTLS_SSL_RENEGOTIATION +#undef MBEDTLS_SSL_MAX_FRAGMENT_LENGTH +#undef MBEDTLS_SSL_PROTO_TLS1_2 +#undef MBEDTLS_SSL_PROTO_DTLS +#undef MBEDTLS_SSL_ALPN +#undef MBEDTLS_SSL_DTLS_ANTI_REPLAY +#undef MBEDTLS_SSL_DTLS_HELLO_VERIFY +#undef MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE +#undef MBEDTLS_SSL_DTLS_BADMAC_LIMIT +#undef MBEDTLS_SSL_SESSION_TICKETS +#undef MBEDTLS_SSL_EXPORT_KEYS +#undef MBEDTLS_SSL_SESSION_TICKETS +#undef MBEDTLS_SSL_EXPORT_KEYS +#undef MBEDTLS_SSL_SERVER_NAME_INDICATION +#undef MBEDTLS_VERSION_FEATURES +#undef MBEDTLS_X509_CHECK_KEY_USAGE +#undef MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE + +/* mbed TLS modules */ +#define MBEDTLS_AES_C +#undef MBEDTLS_ASN1_PARSE_C +#undef MBEDTLS_ASN1_WRITE_C +#undef MBEDTLS_BASE64_C +#define MBEDTLS_BIGNUM_C +#undef MBEDTLS_CCM_C +#undef MBEDTLS_CERTS_C +#undef MBEDTLS_CIPHER_C +#define MBEDTLS_CTR_DRBG_C +#undef MBEDTLS_DEBUG_C +#define MBEDTLS_ECDH_C +#undef MBEDTLS_ECDSA_C +#define MBEDTLS_ECP_C +#define MBEDTLS_ENTROPY_C +#undef MBEDTLS_ERROR_C +#undef MBEDTLS_GCM_C +#undef MBEDTLS_HMAC_DRBG_C +#define MBEDTLS_MD_C +#undef MBEDTLS_OID_C +#undef MBEDTLS_PEM_PARSE_C +#undef MBEDTLS_PK_C +#undef MBEDTLS_PK_PARSE_C +#undef MBEDTLS_PK_WRITE_C +#undef MBEDTLS_PLATFORM_C +#undef MBEDTLS_RSA_C +#define MBEDTLS_SHA256_C +#undef MBEDTLS_SHA512_C +#undef MBEDTLS_SSL_CACHE_C +#undef MBEDTLS_SSL_COOKIE_C +#undef MBEDTLS_SSL_TICKET_C +#undef MBEDTLS_SSL_CLI_C +#undef MBEDTLS_SSL_SRV_C +#undef MBEDTLS_SSL_TLS_C +#undef MBEDTLS_VERSION_C +#undef MBEDTLS_X509_USE_C +#undef MBEDTLS_X509_CRT_PARSE_C +#undef MBEDTLS_X509_CRL_PARSE_C + +/* Save RAM at the expense of ROM */ +#define MBEDTLS_AES_ROM_TABLES + +/* Save RAM by adjusting to our exact needs */ +#define MBEDTLS_ECP_MAX_BITS 256 +#define MBEDTLS_MPI_MAX_SIZE 32 + +/* Save RAM at the expense of speed, see ecp.h */ +#define MBEDTLS_ECP_WINDOW_SIZE 2 +#define MBEDTLS_ECP_FIXED_POINT_OPTIM 0 + +/* Significant speed benefit at the expense of some ROM */ +#define MBEDTLS_ECP_NIST_OPTIM +/* +* You should adjust this to the exact number of sources you're using: default +* is the "mbedtls_platform_entropy_poll" source, but you may want to add other ones. +* Minimum is 2 for the entropy test suite. +*/ +#define MBEDTLS_ENTROPY_MAX_SOURCES 2 +#define MBEDTLS_NO_PLATFORM_ENTROPY + +#endif /* MBEDTLS_EDDYSTONE_CONFIG_H */ From 75a08fee60645832c97bda6e9c1c6d2b4f40e674 Mon Sep 17 00:00:00 2001 From: Scott Jenson Date: Tue, 7 Feb 2017 15:20:40 -0800 Subject: [PATCH 32/36] Small edits --- implementations/mbed/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/implementations/mbed/README.md b/implementations/mbed/README.md index 958836e..500deb7 100644 --- a/implementations/mbed/README.md +++ b/implementations/mbed/README.md @@ -3,10 +3,10 @@ Eddystone beacons broadcast a small amount of information, such as URLs, to near This repo contains an fully functional Eddystone image that supports all 4 frame types (URL, UUID, TLM, and EID) as well as the complete Eddystone GATT configuration service. -To compile this image you'll need the [mbed toolchain from ARM](mbed.org). mbed is one of the most widely used embedded OS platforms. Unfortunately, we can't offer support for mbed or ARM tools. +To compile this image you'll need the [mbed toolchain from ARM](mbed.org). mbed is one of the most widely used embedded OS platforms. Unfortunately, we can't offer support for mbed or ARM tools. ### Goal 1 - Lots of beacons -The first goal of this repo is to encourage a wide distribution of Eddystone beacon hardware with an open source version that anyone can freely use. If you do port this to your platform, please consider a pull request so others can compile to your hardware. +The first goal of this repo is to encourage a wide distribution of Eddystone beacon hardware with an open source version that anyone can freely use. If you do port this to your platform, please consider a pull request so others can compile to your hardware. There is already one comercial beacon using this image mde by [MinewTech](http://www.minewtech.com/eddystone.html) (we home many more will follow) ### Goal 2 - Lots of devices The second goal is to encourage other devices beyond just beacons. These would be interative devices that use new GATT services characteristics. We hope to see forks for products such as vending machines or remote control toys. With Bluetooth Javascript support in modern web browsers, it's important we have an easy way for device makers to not only broadcast a URL but to connect and control it directly. From 3b7fc7c6f060bc3e81a05c377762c19c0b0c1044 Mon Sep 17 00:00:00 2001 From: Scott Jenson Date: Tue, 7 Feb 2017 15:21:14 -0800 Subject: [PATCH 33/36] fix home->hope typo --- implementations/mbed/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/implementations/mbed/README.md b/implementations/mbed/README.md index 500deb7..a166c06 100644 --- a/implementations/mbed/README.md +++ b/implementations/mbed/README.md @@ -6,7 +6,7 @@ This repo contains an fully functional Eddystone image that supports all 4 frame To compile this image you'll need the [mbed toolchain from ARM](mbed.org). mbed is one of the most widely used embedded OS platforms. Unfortunately, we can't offer support for mbed or ARM tools. ### Goal 1 - Lots of beacons -The first goal of this repo is to encourage a wide distribution of Eddystone beacon hardware with an open source version that anyone can freely use. If you do port this to your platform, please consider a pull request so others can compile to your hardware. There is already one comercial beacon using this image mde by [MinewTech](http://www.minewtech.com/eddystone.html) (we home many more will follow) +The first goal of this repo is to encourage a wide distribution of Eddystone beacon hardware with an open source version that anyone can freely use. If you do port this to your platform, please consider a pull request so others can compile to your hardware. There is already one comercial beacon using this image mde by [MinewTech](http://www.minewtech.com/eddystone.html) (we hope many more will follow) ### Goal 2 - Lots of devices The second goal is to encourage other devices beyond just beacons. These would be interative devices that use new GATT services characteristics. We hope to see forks for products such as vending machines or remote control toys. With Bluetooth Javascript support in modern web browsers, it's important we have an easy way for device makers to not only broadcast a URL but to connect and control it directly. From 365b8ac725de3eed1b15f780c1d09d89733f47ff Mon Sep 17 00:00:00 2001 From: Scott Jenson Date: Thu, 9 Feb 2017 09:20:53 -0800 Subject: [PATCH 34/36] add http:// to Physical Web link --- implementations/mbed/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/implementations/mbed/README.md b/implementations/mbed/README.md index a166c06..99a2c14 100644 --- a/implementations/mbed/README.md +++ b/implementations/mbed/README.md @@ -1,5 +1,5 @@ # Eddystone for mbed -Eddystone beacons broadcast a small amount of information, such as URLs, to nearby devices that scan for them. If you'd like to learn more, please see the [Physical Web](physical-web.org) page. +Eddystone beacons broadcast a small amount of information, such as URLs, to nearby devices that scan for them. If you'd like to learn more, please see the [Physical Web](http://physical-web.org) page. This repo contains an fully functional Eddystone image that supports all 4 frame types (URL, UUID, TLM, and EID) as well as the complete Eddystone GATT configuration service. From 93bff7a87d0e8cd78d4499f2991198d48408a3c6 Mon Sep 17 00:00:00 2001 From: Roy Want Date: Thu, 6 Apr 2017 13:06:21 -0700 Subject: [PATCH 35/36] adding ignore files --- implementations/mbed/.gitignore | 34 ++++++++++++++++++++++++++++++++ implementations/mbed/.mbedignore | 9 +++++++++ 2 files changed, 43 insertions(+) create mode 100644 implementations/mbed/.gitignore create mode 100644 implementations/mbed/.mbedignore diff --git a/implementations/mbed/.gitignore b/implementations/mbed/.gitignore new file mode 100644 index 0000000..7c9d80f --- /dev/null +++ b/implementations/mbed/.gitignore @@ -0,0 +1,34 @@ + # Compiled Object files + *.slo + *.lo + *.o + *.obj + + # Precompiled Headers + *.gch + *.pch + + # Compiled Dynamic libraries + *.so + *.dylib + *.dll + + # Fortran module files + *.mod + + # Compiled Static libraries + *.lai + *.la + *.a + -*.lib + + # Executables + *.exe + *.out + *.app + + .yotta.json + build/ + yotta_modules/ + yotta_targets/ + .DS_Store diff --git a/implementations/mbed/.mbedignore b/implementations/mbed/.mbedignore new file mode 100644 index 0000000..06aa14c --- /dev/null +++ b/implementations/mbed/.mbedignore @@ -0,0 +1,9 @@ +mbed-os/rtos/* +mbed-os/features/FEATURE_CLIENT/* +mbed-os/features/FEATURE_COMMON_PAL/* +mbed-os/features/FEATURE_UVISOR/* +mbed-os/features/frameworks/* +mbed-os/features/net/* +mbed-os/features/netsocket/* +mbed-os/features/storage/* +mbed-os/events/* From 1ed9721b842f0089a8df9534da12ea0c42d49cb7 Mon Sep 17 00:00:00 2001 From: Mikhail Zinov Date: Mon, 8 Jan 2018 14:26:36 +1000 Subject: [PATCH 36/36] Update swift scanner sample to Swift v4.0 --- .../project.pbxproj | 2 + .../BeaconScanner.swift | 69 +++++++++---------- .../DispatchTimer.swift | 42 +++++------ .../Eddystone.swift | 32 ++++----- 4 files changed, 67 insertions(+), 78 deletions(-) diff --git a/tools/ios-eddystone-scanner-sample/EddystoneScannerSample.xcodeproj/project.pbxproj b/tools/ios-eddystone-scanner-sample/EddystoneScannerSample.xcodeproj/project.pbxproj index a048ac2..eb1a840 100644 --- a/tools/ios-eddystone-scanner-sample/EddystoneScannerSample.xcodeproj/project.pbxproj +++ b/tools/ios-eddystone-scanner-sample/EddystoneScannerSample.xcodeproj/project.pbxproj @@ -441,6 +441,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.google.sample.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -453,6 +454,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.google.sample.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/BeaconScanner.swift b/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/BeaconScanner.swift index 3a6f802..a7b2f77 100644 --- a/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/BeaconScanner.swift +++ b/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/BeaconScanner.swift @@ -42,17 +42,16 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { var onLostTimeout: Double = 15.0 private var centralManager: CBCentralManager! - private let beaconOperationsQueue: dispatch_queue_t = - dispatch_queue_create("beacon_operations_queue", nil) - private var shouldBeScanning: Bool = false + private let beaconOperationsQueue = DispatchQueue(label: "beacon_operations_queue") + private var shouldBeScanning = false private var seenEddystoneCache = [String : [String : AnyObject]]() - private var deviceIDCache = [NSUUID : NSData]() + private var deviceIDCache = [UUID : NSData]() override init() { super.init() - self.centralManager = CBCentralManager(delegate: self, queue: self.beaconOperationsQueue) + self.centralManager = CBCentralManager(delegate: self, queue: beaconOperationsQueue) self.centralManager.delegate = self } @@ -61,7 +60,7 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { /// scanning. /// func startScanning() { - dispatch_async(self.beaconOperationsQueue) { + beaconOperationsQueue.async { self.startScanningSynchronized() } } @@ -76,8 +75,8 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { /// /// MARK - private methods and delegate callbacks /// - func centralManagerDidUpdateState(central: CBCentralManager) { - if central.state == CBCentralManagerState.PoweredOn && self.shouldBeScanning { + func centralManagerDidUpdateState(_ central: CBCentralManager) { + if central.state == .poweredOn && self.shouldBeScanning { self.startScanningSynchronized(); } } @@ -86,32 +85,31 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { /// Core Bluetooth CBCentralManager callback when we discover a beacon. We're not super /// interested in any error situations at this point in time. /// - func centralManager(central: CBCentralManager, - didDiscoverPeripheral peripheral: CBPeripheral, - advertisementData: [String : AnyObject], - RSSI: NSNumber) { + func centralManager(_ central: CBCentralManager, + didDiscover peripheral: CBPeripheral, + advertisementData: [String : Any], + rssi RSSI: NSNumber) { if let serviceData = advertisementData[CBAdvertisementDataServiceDataKey] as? [NSObject : AnyObject] { var eft: BeaconInfo.EddystoneFrameType - eft = BeaconInfo.frameTypeForFrame(serviceData) + eft = BeaconInfo.frameTypeForFrame(advertisementFrameList: serviceData) // If it's a telemetry frame, stash it away and we'll send it along with the next regular // frame we see. Otherwise, process the UID frame. if eft == BeaconInfo.EddystoneFrameType.TelemetryFrameType { - deviceIDCache[peripheral.identifier] = BeaconInfo.telemetryDataForFrame(serviceData) + deviceIDCache[peripheral.identifier] = BeaconInfo.telemetryDataForFrame(advertisementFrameList: serviceData) } else if eft == BeaconInfo.EddystoneFrameType.UIDFrameType || eft == BeaconInfo.EddystoneFrameType.EIDFrameType { let telemetry = self.deviceIDCache[peripheral.identifier] let serviceUUID = CBUUID(string: "FEAA") - let _RSSI: Int = RSSI.integerValue + let _RSSI: Int = RSSI.intValue - if let - beaconServiceData = serviceData[serviceUUID] as? NSData, - beaconInfo = + if let beaconServiceData = serviceData[serviceUUID] as? NSData, + let beaconInfo = (eft == BeaconInfo.EddystoneFrameType.UIDFrameType - ? BeaconInfo.beaconInfoForUIDFrameData(beaconServiceData, telemetry: telemetry, + ? BeaconInfo.beaconInfoForUIDFrameData(frameData: beaconServiceData, telemetry: telemetry, RSSI: _RSSI) - : BeaconInfo.beaconInfoForEIDFrameData(beaconServiceData, telemetry: telemetry, + : BeaconInfo.beaconInfoForEIDFrameData(frameData: beaconServiceData, telemetry: telemetry, RSSI: _RSSI)) { // NOTE: At this point you can choose whether to keep or get rid of the telemetry @@ -119,7 +117,7 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { // for this beacon, or delete it until we get a new / "fresh" TLM frame. // We'll treat it as "report it only when you see it", so we'll delete it // each time. - self.deviceIDCache.removeValueForKey(peripheral.identifier) + self.deviceIDCache.removeValue(forKey: peripheral.identifier) if (self.seenEddystoneCache[beaconInfo.beaconID.description] != nil) { // Reset the onLost timer and fire the didUpdate. @@ -129,22 +127,22 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { timer.reschedule() } - self.delegate?.didUpdateBeacon(self, beaconInfo: beaconInfo) + self.delegate?.didUpdateBeacon(beaconScanner: self, beaconInfo: beaconInfo) } else { // We've never seen this beacon before - self.delegate?.didFindBeacon(self, beaconInfo: beaconInfo) + self.delegate?.didFindBeacon(beaconScanner: self, beaconInfo: beaconInfo) let onLostTimer = DispatchTimer.scheduledDispatchTimer( - self.onLostTimeout, - queue: dispatch_get_main_queue()) { + delay: self.onLostTimeout, + queue: DispatchQueue.main) { (timer: DispatchTimer) -> () in let cacheKey = beaconInfo.beaconID.description if let beaconCache = self.seenEddystoneCache[cacheKey], - lostBeaconInfo = beaconCache["beaconInfo"] as? BeaconInfo { - self.delegate?.didLoseBeacon(self, beaconInfo: lostBeaconInfo) - self.seenEddystoneCache.removeValueForKey( - beaconInfo.beaconID.description) + let lostBeaconInfo = beaconCache["beaconInfo"] as? BeaconInfo { + self.delegate?.didLoseBeacon(beaconScanner: self, beaconInfo: lostBeaconInfo) + self.seenEddystoneCache.removeValue( + forKey: beaconInfo.beaconID.description) } } @@ -156,12 +154,11 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { } } else if eft == BeaconInfo.EddystoneFrameType.URLFrameType { let serviceUUID = CBUUID(string: "FEAA") - let _RSSI: Int = RSSI.integerValue + let _RSSI: Int = RSSI.intValue - if let - beaconServiceData = serviceData[serviceUUID] as? NSData, - URL = BeaconInfo.parseURLFromFrame(beaconServiceData) { - self.delegate?.didObserveURLBeacon(self, URL: URL, RSSI: _RSSI) + if let beaconServiceData = serviceData[serviceUUID] as? NSData, + let URL = BeaconInfo.parseURLFromFrame(frameData: beaconServiceData) { + self.delegate?.didObserveURLBeacon(beaconScanner: self, URL: URL, RSSI: _RSSI) } } } else { @@ -170,14 +167,14 @@ class BeaconScanner: NSObject, CBCentralManagerDelegate { } private func startScanningSynchronized() { - if self.centralManager.state != CBCentralManagerState.PoweredOn { + if self.centralManager.state != .poweredOn { NSLog("CentralManager state is %d, cannot start scan", self.centralManager.state.rawValue) self.shouldBeScanning = true } else { NSLog("Starting to scan for Eddystones") let services = [CBUUID(string: "FEAA")] let options = [CBCentralManagerScanOptionAllowDuplicatesKey : true] - self.centralManager.scanForPeripheralsWithServices(services, options: options) + self.centralManager.scanForPeripherals(withServices: services, options: options) } } } diff --git a/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/DispatchTimer.swift b/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/DispatchTimer.swift index 641aa52..cd79527 100644 --- a/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/DispatchTimer.swift +++ b/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/DispatchTimer.swift @@ -27,24 +27,23 @@ class DispatchTimer: NSObject { typealias TimerHandler = (DispatchTimer) -> Void private let timerBlock: TimerHandler - private let queue: dispatch_queue_t - private let delay: NSTimeInterval + private let queue: DispatchQueue + private let delay: TimeInterval private var wrappedBlock: (() -> Void)? - private let source: dispatch_source_t + private let source: DispatchSourceTimer - init(delay: NSTimeInterval, queue: dispatch_queue_t, block: TimerHandler) { + init(delay: TimeInterval, queue: DispatchQueue, block: @escaping TimerHandler) { timerBlock = block self.queue = queue self.delay = delay - - self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue) + self.source = DispatchSource.makeTimerSource(queue: queue) super.init() let wrapper = { () -> Void in - if dispatch_source_testcancel(self.source) == 0 { - dispatch_source_cancel(self.source) + if !self.source.isCancelled { + self.source.cancel() self.timerBlock(self) } } @@ -52,38 +51,33 @@ class DispatchTimer: NSObject { self.wrappedBlock = wrapper } - class func scheduledDispatchTimer(delay: NSTimeInterval, - queue: dispatch_queue_t, - block: TimerHandler) -> DispatchTimer { - let dt = DispatchTimer(delay: delay, queue: queue, block: block) - dt.schedule() - return dt + class func scheduledDispatchTimer(delay: TimeInterval, queue: DispatchQueue, block: @escaping TimerHandler) -> DispatchTimer { + let dt = DispatchTimer(delay: delay, queue: queue, block: block) + dt.schedule() + + return dt } func schedule() { self.reschedule() - dispatch_source_set_event_handler(self.source, self.wrappedBlock) - dispatch_resume(self.source) + self.source.setEventHandler(handler: self.wrappedBlock) + self.source.resume() } func reschedule() { - let start = dispatch_time(DISPATCH_TIME_NOW, Int64(self.delay * Double(NSEC_PER_SEC))) - - // Leeway is 10% of timer delay - dispatch_source_set_timer(self.source, start, DISPATCH_TIME_FOREVER, - UInt64((self.delay / 10.0) * Double(NSEC_PER_SEC))) + self.source.schedule(deadline: .now() + self.delay) } func suspend() { - dispatch_suspend(self.source) + self.source.suspend() } func resume() { - dispatch_resume(self.source) + self.source.resume() } func cancel() { - dispatch_source_cancel(self.source) + self.source.cancel() } } diff --git a/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/Eddystone.swift b/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/Eddystone.swift index adbdd33..2e9309e 100644 --- a/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/Eddystone.swift +++ b/tools/ios-eddystone-scanner-sample/EddystoneScannerSampleSwift/Eddystone.swift @@ -34,14 +34,14 @@ class BeaconID : NSObject { /// let beaconID: [UInt8] - private init(beaconType: BeaconType!, beaconID: [UInt8]) { + fileprivate init(beaconType: BeaconType!, beaconID: [UInt8]) { self.beaconID = beaconID self.beaconType = beaconType } override var description: String { if self.beaconType == BeaconType.Eddystone || self.beaconType == BeaconType.EddystoneEID { - let hexid = hexBeaconID(self.beaconID) + let hexid = hexBeaconID(beaconID: self.beaconID) return "BeaconID beacon: \(hexid)" } else { return "BeaconID with invalid type (\(beaconType))" @@ -52,7 +52,7 @@ class BeaconID : NSObject { var retval = "" for byte in beaconID { var s = String(byte, radix:16, uppercase: false) - if s.characters.count == 1 { + if s.count == 1 { s = "0" + s } retval += s @@ -121,13 +121,12 @@ class BeaconInfo : NSObject { self.telemetry = telemetry } - class func frameTypeForFrame(advertisementFrameList: [NSObject : AnyObject]) - -> EddystoneFrameType { + class func frameTypeForFrame(advertisementFrameList: [NSObject : AnyObject]) -> EddystoneFrameType { let uuid = CBUUID(string: "FEAA") if let frameData = advertisementFrameList[uuid] as? NSData { if frameData.length > 1 { let count = frameData.length - var frameBytes = [UInt8](count: count, repeatedValue: 0) + var frameBytes = [UInt8](repeating: 0, count: count) frameData.getBytes(&frameBytes, length: count) if frameBytes[0] == EddystoneUIDFrameTypeID { @@ -154,11 +153,10 @@ class BeaconInfo : NSObject { /// in the Swift compiler — it can't tear-down partially initialised objects, so we'll have to /// wait until this gets fixed. For now, class method will do. /// - class func beaconInfoForUIDFrameData(frameData: NSData, telemetry: NSData?, RSSI: Int) - -> BeaconInfo? { + class func beaconInfoForUIDFrameData(frameData: NSData, telemetry: NSData?, RSSI: Int) -> BeaconInfo? { if frameData.length > 1 { let count = frameData.length - var frameBytes = [UInt8](count: count, repeatedValue: 0) + var frameBytes = [UInt8](repeating: 0, count: count) frameData.getBytes(&frameBytes, length: count) if frameBytes[0] != EddystoneUIDFrameTypeID { @@ -177,11 +175,10 @@ class BeaconInfo : NSObject { return nil } - class func beaconInfoForEIDFrameData(frameData: NSData, telemetry: NSData?, RSSI: Int) - -> BeaconInfo? { + class func beaconInfoForEIDFrameData(frameData: NSData, telemetry: NSData?, RSSI: Int) -> BeaconInfo? { if frameData.length > 1 { let count = frameData.length - var frameBytes = [UInt8](count: count, repeatedValue: 0) + var frameBytes = [UInt8](repeating: 0, count: count) frameData.getBytes(&frameBytes, length: count) if frameBytes[0] != EddystoneEIDFrameTypeID { @@ -203,14 +200,14 @@ class BeaconInfo : NSObject { class func parseURLFromFrame(frameData: NSData) -> NSURL? { if frameData.length > 0 { let count = frameData.length - var frameBytes = [UInt8](count: count, repeatedValue: 0) + var frameBytes = [UInt8](repeating: 0, count: count) frameData.getBytes(&frameBytes, length: count) - if let URLPrefix = URLPrefixFromByte(frameBytes[2]) { + if let URLPrefix = URLPrefixFromByte(schemeID: frameBytes[2]) { var output = URLPrefix for i in 3..

    H&3SfE8OHWjlc(*a!|Kgq)7=4`Tf7Y$*b+S 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 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfigActivity.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfigActivity.java new file mode 100644 index 0000000..fa69e46 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfigActivity.java @@ -0,0 +1,965 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.TabLayout; +import android.support.v4.view.ViewPager; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.github.google.beaconfig.dialogs.ConfirmationDialog; +import com.github.google.beaconfig.dialogs.SaveConfigurationDialog; +import com.github.google.beaconfig.dialogs.UnlockDialog; +import com.github.google.beaconfig.gatt.GattClient; +import com.github.google.beaconfig.gatt.GattClientException; +import com.github.google.beaconfig.gatt.GattConstants; +import com.github.google.beaconfig.gatt.GattOperationException; +import com.github.google.beaconfig.utils.BroadcastCapabilities; +import com.github.google.beaconfig.utils.UiUtils; +import com.github.google.beaconfig.utils.Utils; +import layout.BeaconTabFragment; +import layout.GlobalFragment; +import layout.SlotFragment; + +/** + * Activity for connecting to the beacon, unlocking it, reading its characteristics + * and configuring them. + */ +public class BeaconConfigActivity extends AppCompatActivity + implements SlotFragment.ConfigurationListener { + private static final String TAG = BeaconConfigActivity.class.getSimpleName(); + + private BroadcastCapabilities capabilities; + private GattClient gattClient; + private String unlockCode; + private String address; + private String name; + + private SlotsAdapter slotsAdapter; + private ViewPager viewPager; + private SwipeRefreshLayout swipeRefreshLayout; + + private boolean intendedDisconnection = false; + + private ExecutorService executor; + private SavedConfigurationsManager configurationsManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_beacon_config); + + name = getIntent().getStringExtra(BeaconListAdapter.ViewHolder.BEACON_NAME); + address = getIntent().getStringExtra(BeaconListAdapter.ViewHolder.BEACON_ADDRESS); + + setupToolbar(name, address); + setUpThrobber(); + executor = Executors.newSingleThreadExecutor(); + configurationsManager = new SavedConfigurationsManager(this); + + findViewById(R.id.grey_out_slot).setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + return swipeRefreshLayout.isRefreshing(); + } + }); + + accessBeacon(); + } + + /** + * Starts the process of connecting to the beacon, discovering its services, unlocking it and + * reading all available information from it. + */ + private void accessBeacon() { + disableDisplay(); + executor.execute(new Runnable() { + @Override + public void run() { + connectToGatt(address); + } + }); + //if connected, discovering devices takes place in onGattConnected() in the GattListener + } + + private void connectToGatt(String address) { + Log.d(TAG, "Connecting..."); + UiUtils.showToast(this, "Connecting..."); + gattClient = new GattClient(getApplicationContext(), address, gattListener); + if (gattClient == null) { + return; + } + gattClient.connect(); + } + + private GattClient.GattListener gattListener = new GattClient.GattListener() { + @Override + public void onGattConnected() { + Log.d(TAG, "Connected to GATT service."); + gattClient.discoverServices(); + } + + @Override + public void onGattServicesDiscovered() { + Log.d(TAG, "Discovered GATT services."); + if (gattClient.isEddystoneGattServicePresent()) { + try { + byte[] lockState = gattClient.readLockState(); + if (lockState[0] == GattConstants.LOCK_STATE_LOCKED) { + unlock(); + } else { + setupBeaconInformationDisplay(); + } + + } catch (GattClientException e) { + Log.e(TAG, "Gatt Client Error when discovering devices", e); + displayConnectionFailScreen("Something went wrong when discovering services " + + "of beacon"); + } catch (GattOperationException e) { + Log.e(TAG, "Gatt Operation Error when discovering devices", e); + displayConnectionFailScreen("Something went wrong when discovering services " + + "of beacon"); + } + } else { + gattClient.disconnect(); + } + } + + @Override + public void onGattDisconnected() { + Log.d(TAG, "Beacon disconnected."); + if (intendedDisconnection) { + UiUtils.showToast(BeaconConfigActivity.this, "Beacon disconnected."); + intendedDisconnection = false; + } else if (!gattClient.isEddystoneGattServicePresent()){ + displayConnectionFailScreen("This beacon does not support the GATT service " + + "and cannot be configured with this app. \n \n"); + } else { + displayConnectionFailScreen("Connection to beacon was lost unexpectedly. \n \n" + + getResources().getString(R.string.connect_to_beacon_message)); + } + } + }; + + /** + * Starts the process of unlocking a beacon. First it tries to automatically unlock the beacon + * by applying the most common lock codes like all "f"s or all "0"s. If this fails, it pops up + * a dialog to ask the user for the lock code of the beacon. + */ + private void unlock() { + Runnable setupBeaconInformationDisplay = new Runnable() { + @Override + public void run() { + setupBeaconInformationDisplay(); + } + }; + + attemptAutomaticUnlock(setupBeaconInformationDisplay); + } + + private void attemptAutomaticUnlock(final Runnable runnable) { + executor.execute(new Runnable() { + @Override + public void run() { + ArrayList commonPasswords = new ArrayList<>(); + commonPasswords.add("ffffffffffffffffffffffffffffffff"); + commonPasswords.add("00000000000000000000000000000000"); + + for (String password : commonPasswords) { + if (gattClient.unlock(Utils.toByteArray(password))) { + Log.d(TAG, "Beacon unlocked automatically"); + unlockCode = password; + runnable.run(); + return; + } + } + + //if automatic unlock fails, a dialog pops up to ask the user for the beacon's lock + // code + attemptManualUnlock(runnable); + } + }); + } + + private void attemptManualUnlock(final Runnable runnable) { + executor.execute(new Runnable() { + @Override + public void run() { + UnlockDialog.show(BeaconConfigActivity.this, new UnlockDialog.UnlockListener() { + @Override + public void unlockingDismissed() { + displayConnectionFailScreen("This beacon is locked. \n \n" + + "It has to be unlocked before accessing its characteristics."); + } + + @Override + public void unlock(byte[] unlockCode) { + String unlockCodeString = Utils.toHexString(unlockCode); + Log.d(TAG, "Trying " + unlockCodeString); + if (gattClient.unlock(unlockCode)) { + BeaconConfigActivity.this.unlockCode = unlockCodeString; + if (runnable != null) { + runnable.run(); + } + } else { + UiUtils.showToast(BeaconConfigActivity.this, + "Incorrect lock code. Try again?"); + attemptManualUnlock(runnable); + } + } + }); + } + }); + } + + /** + * Displays a screen with a message and a "try again" button. Pressing the button will attempt + * to connect to the beacon from beginning + * + * @param message message which we want to be printed on the screen + */ + private void displayConnectionFailScreen(final String message) { + runOnUiThread(new Runnable() { + @Override + public void run() { + enableDisplay(); + ViewGroup configContentView + = (ViewGroup) findViewById(R.id.beacon_config_page_content); + UiUtils.makeChildrenInvisible(configContentView); + ViewGroup connectionFailSlot = (ViewGroup) findViewById(R.id.connection_fail); + connectionFailSlot.findViewById(R.id.connection_fail_btn) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + accessBeacon(); + findViewById(R.id.connection_fail).setVisibility(View.GONE); + } + }); + ((TextView) connectionFailSlot.findViewById(R.id.connection_fail_message)) + .setText(message); + connectionFailSlot.setVisibility(View.VISIBLE); + } + }); + + } + + /** + * Called after successful connection to the beacon is made and services are + * discovered successfully. + * + * It sets up the beacon configuration screen with tabs which are controlled by a view pager and + * an adapter. + */ + private void setupBeaconInformationDisplay() { + runOnUiThread(new Runnable() { + @Override + public void run() { + viewPager = (ViewPager) findViewById(R.id.view_pager); + slotsAdapter = new SlotsAdapter(getSupportFragmentManager()); + viewPager.setAdapter(slotsAdapter); + + TabLayout tabs = (TabLayout) findViewById(R.id.tabs); + tabs.setupWithViewPager(viewPager); + tabs.setTabGravity(TabLayout.GRAVITY_CENTER); + tabs.setTabMode(TabLayout.MODE_SCROLLABLE); + setUpFragments(); + } + }); + } + + /** + * Reads information about the beacon from the gatt client. It creates a fragment + * for each slot of the beacon and puts it in the tab layout. Then all the available information + * about this slot is read and displayed on the screen + * + * All operations do not involve UI are done on the background thread + */ + private void setUpFragments() { + executor.execute(new Runnable() { + @Override + public void run() { + try { + byte[] data = gattClient.readBroadcastCapabilities(); + capabilities = new BroadcastCapabilities(data); + + Bundle globalDataBundle = new Bundle(); + globalDataBundle.putByteArray(Constants.BROADCAST_CAPABILITIES, data); + globalDataBundle.putString(Constants.BEACON_ADDRESS, address); + globalDataBundle.putString(Constants.BEACON_NAME, name); + + byte[] remainConnectable = gattClient.readRemainConnectable(); + globalDataBundle.putByte(Constants.REMAIN_CONNECTABLE, remainConnectable[0]); + + if (!capabilities.isVariableTxPowerSupported()) { + String radioTxPower = Integer.toString(gattClient.readRadioTxPower()[0]); + String advTxPower = Integer.toString(gattClient.readAdvertisedTxPower()[0]); + globalDataBundle.putString(Constants.TX_POWER, radioTxPower); + globalDataBundle.putString(Constants.ADV_POWER, advTxPower); + } + if (!capabilities.isVariableAdvSupported()) { + String advInterval + = Integer.toString(Utils.toInt + (gattClient.readAdvertisingInterval())); + globalDataBundle.putString(Constants.ADV_INTERVAL, advInterval); + } + + GlobalFragment globalFragment = GlobalFragment.newInstance(globalDataBundle); + slotsAdapter.addFragment(globalFragment); + + for (int i = 0; i < capabilities.getMaxSupportedTotalSlots(); i++) { + gattClient.writeActiveSlot(i); + final Bundle slotInfoBundle = new Bundle(); + final byte[] slotData = gattClient.readAdvSlotData(); + slotInfoBundle.putByteArray(Constants.SLOT_DATA, slotData); + + if (capabilities.isVariableTxPowerSupported()) { + String radioTxPower = Integer.toString + (gattClient.readRadioTxPower()[0]); + String advTxPower = Integer.toString + (gattClient.readAdvertisedTxPower()[0]); + slotInfoBundle.putString(Constants.TX_POWER, radioTxPower); + slotInfoBundle.putString(Constants.ADV_POWER, advTxPower); + } + + if (capabilities.isVariableAdvSupported()) { + String advInterval = Integer.toString + (Utils.toInt(gattClient.readAdvertisingInterval())); + slotInfoBundle.putString(Constants.ADV_INTERVAL, advInterval); + } + + slotInfoBundle.putByteArray(Constants.BROADCAST_CAPABILITIES, data); + + slotInfoBundle.putInt(Constants.SLOT_NUMBER, i); + + slotsAdapter.createNewFragment(slotInfoBundle); + runOnUiThread(new Runnable() { + @Override + public void run() { + slotsAdapter.notifyDataSetChanged(); + } + }); + } + + runOnUiThread(new Runnable() { + @Override + public void run() { + viewPager.setOffscreenPageLimit( + capabilities.getMaxSupportedTotalSlots()); + setTabTitles(); + enableDisplay(); + findViewById(R.id.tab_layout).setVisibility(View.VISIBLE); + } + }); + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when getting information from beacon", e); + displayConnectionFailScreen("Something went wrong when getting information " + + "from beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when getting information from beacon", e); + displayConnectionFailScreen("Something went wrong when getting information " + + "from beacon"); + } + + } + }); + } + + private void setTabTitles() { + runOnUiThread(new Runnable() { + @Override + public void run() { + ((TabLayout) findViewById(R.id.tabs)).getTabAt(0).setIcon(R.drawable.globe); + TabLayout tabs = (TabLayout) findViewById(R.id.tabs); + for (int i = 1; i < tabs.getTabCount(); i++) { + tabs.getTabAt(i).setText(slotsAdapter.getItem(i).name); + } + } + }); + } + + private void setUpThrobber() { + runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.throbber); + swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, + android.R.color.holo_green_light, + android.R.color.holo_orange_light, + android.R.color.holo_red_light); + swipeRefreshLayout.setEnabled(false); + } + }); + } + + private void setupToolbar(final String name, final String address) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + toolbar.setSubtitle(address); + getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary)); + setTitle(name); + } + }); + } + + /** + * Attempts to save all the changes that the user has introduced to any of the beacon's slots + * by writing values to the gatt client + * + * Runs on the background thread + */ + private void saveChangesAcrossAllTabs() { + disableDisplay(); + + Utils.hideKeyboard(this, findViewById(R.id.tab_layout)); + + final Runnable saveAllChangesTask = new Runnable() { + @Override + public void run() { + for (int i = 0; i < slotsAdapter.getCount(); i++) { + slotsAdapter.getItem(i).saveChanges(); + } + } + }; + + executor.execute(new Runnable() { + @Override + public void run() { + if (areAllSlotsAreEmpty()) { + ConfirmationDialog.confirm("Save empty beacon", "You are about to configure " + + "this beacon to broadcast empty frame from all of its slots. This " + + "means that you will not be able to detect this beacon with this " + + "app anymore and will not be able to configure it. \n\n Are you " + + "sure you want to do this?", "YES", "NO", BeaconConfigActivity.this, + new ConfirmationDialog.ConfirmationListener() { + @Override + public void confirm() { + saveAllChangesTask.run(); + } + + @Override + public void cancel() { + + } + }); + } else { + saveAllChangesTask.run(); + } + + + enableDisplay(); + UiUtils.showToast(BeaconConfigActivity.this, + getResources().getString(R.string.changes_save_successful)); + } + }); + } + + private boolean areAllSlotsAreEmpty() { + for (int i = 1; i < slotsAdapter.getCount(); i++) { + if (!((SlotFragment) slotsAdapter.getItem(i)).isEmpty()) { + return false; + } + } + return true; + } + + /** + * Starts the process of saving the configuration of the connected beacon on a background + * thread. It pops a dialog asking the user to enter a name under which the current + * configuration will be saved. After this the user will be able to choose this name to apply + * this configuration to any beacon. + */ + private void saveCurrentConfiguration() { + disableDisplay(); + + SaveConfigurationDialog.show(this, new SaveConfigurationDialog.SaveConfigListener() { + @Override + public void configNameChosen(String configName) { + saveCurrentConfigurationWithName(configName); + } + }); + } + + /** + * Saves the current configuration of the connected beacon. This includes information about all + * slots - slotData, tx power, adv tx power, adv interval. + * + * All of this is done on a background thread + * + * @param configName name of the new configuration. Has to be unique.The user will have to + * choose this name whenever he wants to apply this configuration to a beacon + */ + private void saveCurrentConfigurationWithName(final String configName) { + executor.execute(new Runnable() { + @Override + public void run() { + BeaconConfiguration currentConfiguration = new BeaconConfiguration(configName); + + GlobalFragment globalFragment = (GlobalFragment) slotsAdapter.getItem(0); + + for (int i = 0; i < capabilities.getMaxSupportedTotalSlots(); i++) { + SlotFragment currFragment = (SlotFragment) slotsAdapter.getItem(i + 1); + if (!currFragment.isEmpty()) { + byte[] newSlotData = currFragment.buildNewSlotDataInfo(); + + String txPowerString; + String advPowerString; + String advIntervalString; + if (capabilities.isVariableTxPowerSupported()) { + txPowerString = currFragment.getTxPower(); + advPowerString = currFragment.getAdvTxPower(); + } else { + txPowerString = globalFragment.getTxPower(); + advPowerString = globalFragment.getAdvTxPower(); + } + + if (capabilities.isVariableAdvSupported()) { + advIntervalString = currFragment.getAdvInterval(); + } else { + advIntervalString = globalFragment.getAdvInterval(); + } + + currentConfiguration.addSlot(newSlotData, Integer.parseInt(txPowerString), + Integer.parseInt(advPowerString), + Integer.parseInt(advIntervalString)); + } + + } + + configurationsManager.saveNewConfiguration(currentConfiguration); + + enableDisplay(); + UiUtils.showToast(BeaconConfigActivity.this, + "Configuration saved successfully"); + } + }); + } + + /** + * Starts the process of applying a saved configuration to the current beacon. This pops up a + * dialog which shows the names of all saved configurations. The user can choose one of those + * and it will be applied and saved to current beacon + */ + private void applyConfiguration() { + AlertDialog.Builder b = new AlertDialog.Builder(this); + b.setTitle("Apply Configuration"); + final ArrayList configNames = configurationsManager.getConfigurationNamesList(); + b.setItems(configNames.toArray(new String[configNames.size()]), + new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + applyConfigurationWithName(configNames.get(which)); + dialog.dismiss(); + } + }); + b.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + enableDisplay(); + } + }); + + b.show(); + + + } + + /** + * Applies the saved configuration with name "configName" to the current beacon + * + * @param configName the name of the configuration which the user wants to apply to the current + * beacon. It has to be the name of a configuration which the user has + * previously saved. If a configuration with this name does not exist, this + * method does nothing. + */ + private void applyConfigurationWithName(final String configName) { + disableDisplay(); + + executor.execute(new Runnable() { + @Override + public void run() { + BeaconConfiguration config = configurationsManager.getConfiguration(configName); + + if (config == null) { + return; + } + + // These three are used only when per slot tx power and adv interval are not + // supported. They will record the highest value of the relevant variable + // out of all slots and then set that as the global value. + int maxAdvInterval = Integer.MIN_VALUE; + int maxTxPower = Integer.MIN_VALUE; + int maxAdvTxPower = Integer.MIN_VALUE; + for (int i = 0; i < capabilities.getMaxSupportedTotalSlots(); i++) { + SlotFragment slotFragment = (SlotFragment) slotsAdapter.getItem(i+1); + if (i >= config.getNumberOfConfiguredSlots()) { + // There are more available slots on this beacon than the saved + // configuration has defined. Configuring them as empty. + if (!slotFragment.isEmpty()) { + Log.d(TAG, "Configuring empty slot " + i); + slotDataChanged(i, new byte[0]); + } + continue; + } + + slotDataChanged(i, config.getSlotDataForSlot(i)); + + if (capabilities.isVariableTxPowerSupported()) { + slotFragment.setTxPower(config.getRadioTxPowerForSlot(i)); + slotFragment.setAdvTxPower(config.getAdvTxPowerForSlot(i)); + } else { + if (config.getRadioTxPowerForSlot(i) > maxTxPower) { + maxTxPower = config.getRadioTxPowerForSlot(i); + } + + if (config.getAdvTxPowerForSlot(i) > maxAdvTxPower) { + maxAdvTxPower = config.getAdvTxPowerForSlot(i); + } + } + + if (capabilities.isVariableAdvSupported()) { + slotFragment.setAdvInterval(config.getAdvIntervalForSlot(i)); + } else if (config.getAdvIntervalForSlot(i) > maxAdvInterval) { + maxAdvInterval = config.getAdvIntervalForSlot(i); + } + } + + GlobalFragment globalFragment = (GlobalFragment) slotsAdapter.getItem(0); + if (!capabilities.isVariableTxPowerSupported()) { + globalFragment.setTxPower(maxTxPower); + globalFragment.setAdvTxPower(maxAdvTxPower); + } + + if (!capabilities.isVariableAdvSupported()) { + globalFragment.setAdvInterval(maxAdvInterval); + } + + saveChangesAcrossAllTabs(); + } + }); + } + + /** + * Stops the swipeRefreshLayout from rotating (if it was rotating at the time of call) and + * disables all click events on the screen until a call to enableDisplay() is made. + * + * Runs on the UI thread + */ + private void disableDisplay() { + swipeRefreshLayout.post(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(true); + } + }); + runOnUiThread(new Runnable() { + @Override + public void run() { + findViewById(R.id.grey_out_slot).setVisibility(View.VISIBLE); + } + }); + } + + /** + * Enables the display after it has been previously disabled by disableDisplay() + * + * Runs on the UI thread + */ + private void enableDisplay() { + swipeRefreshLayout.post(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + } + }); + runOnUiThread(new Runnable() { + @Override + public void run() { + findViewById(R.id.grey_out_slot).setVisibility(View.GONE); + } + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_beacon_config, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + case R.id.save_changes: + saveChangesAcrossAllTabs(); + return false; + case R.id.save_configuration: + saveCurrentConfiguration(); + return false; + case R.id.apply_configuration: + applyConfiguration(); + return false; + case R.id.manage_configurations: + Intent intent = new Intent(this, ManageConfigurationsActivity.class); + startActivity(intent); + return false; + default: + return super.onOptionsItemSelected(item); + } + } + + /** + * If the current beacon has unsaved changes and the user presses the back button, this will pop + * up a dialog asking whether to save the changes or not. + */ + @Override + public void onBackPressed() { + if (tabChangesPending()) { + ConfirmationDialog.confirm("Save Changes", "There are some " + + "unsaved changes to this slot. \n \n Would you like to " + + "save those changes?", "SAVE", "DISCARD", BeaconConfigActivity.this, + new ConfirmationDialog.ConfirmationListener() { + + @Override + public void confirm() { + saveChangesAcrossAllTabs(); + intendedDisconnection = true; + BeaconConfigActivity.super.onBackPressed(); + } + + @Override + public void cancel() { + intendedDisconnection = true; + BeaconConfigActivity.super.onBackPressed(); + } + }); + } else { + super.onBackPressed(); + } + } + + /** + * @return true if there are changes to the ui which have not been written to the beacon + */ + private boolean tabChangesPending() { + if (slotsAdapter != null) { + boolean changesPending = false; + for (int i = 0; i < slotsAdapter.getCount(); i++) { + changesPending = changesPending || slotsAdapter.getItem(i).changesPending(); + } + return changesPending; + } + + return false; + } + + @Override + public void onDestroy() { + super.onDestroy(); + gattClient.disconnect(); + } + + @Override + public void txPowerChanged(final int slot, final int txPower) { + try { + if (capabilities.isVariableTxPowerSupported()) { + gattClient.writeActiveSlot(slot); + } + gattClient.writeRadioTxPower(txPower); + int newlyReadTxPower = gattClient.readRadioTxPower()[0]; + if (txPower == newlyReadTxPower) { + Bundle newTxPowerBundle = new Bundle(); + newTxPowerBundle.putString(Constants.TX_POWER, Integer.toString(newlyReadTxPower)); + slotsAdapter.getItem(slot + 1).updateInformation(newTxPowerBundle); + Log.d(TAG, "Radio Tx Power changed to " + newlyReadTxPower); + } + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when writing radio tx power to beacon", e); + displayConnectionFailScreen("Something went wrong when writing tx power to beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when writing tx power to beacon", e); + displayConnectionFailScreen("Something went wrong when writing tx power to beacon"); + } + } + + @Override + public void advTxPowerChanged(final int slot, final int advTxPower) { + try { + if (capabilities.isVariableTxPowerSupported()) { + gattClient.writeActiveSlot(slot); + } + gattClient.writeAdvertisedTxPower(advTxPower); + int newlyReadAdvTx = gattClient.readAdvertisedTxPower()[0]; + if (advTxPower == newlyReadAdvTx) { + Bundle newAdvTxBundle = new Bundle(); + newAdvTxBundle.putString(Constants.ADV_POWER, Integer.toString(newlyReadAdvTx)); + slotsAdapter.getItem(slot + 1).updateInformation(newAdvTxBundle); + Log.d(TAG, "Advertised Tx Power changed to " + newlyReadAdvTx); + } + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when adv tx power to beacon", e); + displayConnectionFailScreen("Something went wrong when writing adv tx power to beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when writing adv tx power to beacon", e); + displayConnectionFailScreen("Something went wrong when writing adv tx power to beacon"); + } + } + + @Override + public void advIntervalChanged(final int slot, final int advInterval) { + final BeaconTabFragment currentFragment = slotsAdapter.getItem(slot + 1); + try { + if (capabilities.isVariableAdvSupported()) { + gattClient.writeActiveSlot(slot); + } + gattClient.writeAdvertisingInterval(advInterval); + int newlyReadAdvInt = Utils.toInt(gattClient.readAdvertisingInterval()); + if (advInterval == newlyReadAdvInt) { + Bundle newAdvIntBundle = new Bundle(); + newAdvIntBundle.putString(Constants.ADV_INTERVAL, + Integer.toString(newlyReadAdvInt)); + currentFragment.updateInformation(newAdvIntBundle); + Log.d(TAG, "Advertising interval changed to " + advInterval); + } + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Exception when writing adv interval to beacon", e); + displayConnectionFailScreen("Something went wrong when writing adv interval to beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when writing adv interval to beacon", e); + displayConnectionFailScreen("Something went wrong when writing adv interval to beacon"); + } + } + + @Override + public void slotDataChanged(final int slot, final byte[] newSlotData) { + try { + Log.d(TAG, "New slot data: " + Arrays.toString(newSlotData)); + gattClient.writeActiveSlot(slot); + gattClient.writeAdvSlotData(newSlotData); + byte[] newlyReadSlotData = gattClient.readAdvSlotData(); + Bundle newSlotDataBundle = new Bundle(); + changeTabName(slot + 1, newlyReadSlotData); + newSlotDataBundle.putByteArray(Constants.SLOT_DATA, newlyReadSlotData); + slotsAdapter.getItem(slot + 1).updateInformation(newSlotDataBundle); + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when writing slot data to beacon", e); + displayConnectionFailScreen("Something went wrong when writing slot data to beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when writing slot data to beacon", e); + displayConnectionFailScreen("Something went wrong when writing slot data to beacon"); + } + } + + private void changeTabName(final int tabNo, final byte[] slotData) { + runOnUiThread(new Runnable() { + @Override + public void run() { + TabLayout.Tab tab = ((TabLayout) findViewById(R.id.tabs)).getTabAt(tabNo); + if (Utils.slotIsEmpty(slotData)) { + tab.setText("--"); + } else { + tab.setText(Utils.getStringFromFrameType(slotData[0])); + } + } + }); + } + + @Override + public void lockCodeChanged(final String newLockCode) { + byte[] newCodeBytes = Utils.toByteArray(newLockCode); + byte[] encryptedCode = Utils.aes128Encrypt(newCodeBytes, Utils.toByteArray(unlockCode)); + + byte[] newLockCodeBytes = new byte[17]; + newLockCodeBytes[0] = 0; + newLockCodeBytes = Utils.rewriteBytes(newLockCodeBytes, 1, 16, encryptedCode); + try { + gattClient.writeLockState(newLockCodeBytes); + gattClient.unlock(newCodeBytes); + UiUtils.showToast(BeaconConfigActivity.this, "Lock code changed successfully"); + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when changing lock code of beacon", e); + displayConnectionFailScreen("Something went wrong when changing lock code of beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when changing lock code of beacon", e); + displayConnectionFailScreen("Something went wrong when changing lock code of beacon"); + } + } + + @Override + public void factoryResetCalled() { + disableDisplay(); + executor.execute(new Runnable() { + @Override + public void run() { + try { + byte[] factoryResetCode = Utils.toByteArray("0b"); + gattClient.writeFactoryReset(factoryResetCode); + setupBeaconInformationDisplay(); + // setupBeaconInformationDisplay() will enable display after execution + UiUtils.showToast(BeaconConfigActivity.this, "Beacon was reset successfully"); + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when factory resetting beacon", e); + displayConnectionFailScreen("Something went wrong when resetting beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when factory resetting beacon", e); + displayConnectionFailScreen("Something went wrong when resetting beacon"); + } + } + }); + + } + + @Override + public void remainConnectableChanged(final boolean remainConnectable) { + try { + byte[] remainConnectableBytes = new byte[1]; + remainConnectableBytes[0] = (byte) (remainConnectable ? 1 : 0); + gattClient.writeRemainConnectable(remainConnectableBytes); + } catch (GattClientException e) { + Log.d(TAG, "Gatt Client Error when writing remain connectable to beacon", e); + displayConnectionFailScreen("Something went wrong when writing remain connectable " + + "to beacon"); + } catch (GattOperationException e) { + Log.d(TAG, "Gatt Operation Error when writing remain connectable to beacon", e); + displayConnectionFailScreen("Something went wrong when writing remain connectable " + + "to beacon"); + } + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfiguration.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfiguration.java new file mode 100644 index 0000000..ba21501 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconConfiguration.java @@ -0,0 +1,90 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import java.util.ArrayList; +import java.util.List; + +/**Keeps one configuration of a beacon. This includes all the slots specific + * information, tx power, adv tx power and advertised interval. This class only holds + * slot information about UID, URL and TLM frames. EID frames will not be saved. + */ +public class BeaconConfiguration { + private String configurationName; + private List slots; + + public BeaconConfiguration(String configurationName) { + this.configurationName = configurationName; + slots = new ArrayList<>(); + } + + /** + * Saved this information about a beacon's slot. It does not save EID configured slots. + * + * @param slotData slotData of this slot of the configuration + * @param txPower radio tx power of this slot of the configuration + * @param advTxPower advertised tx power of this slot of the configuration + * @param advInterval advertised interval of this slot of the configuration + */ + public void addSlot(byte[] slotData, int txPower, int advTxPower, int advInterval) { + if (slotData[0] == Constants.EID_FRAME_TYPE) { + return; + } + slots.add(new Slot(slotData, txPower, advTxPower, advInterval)); + } + + public String getName() { + return configurationName; + } + + public int getNumberOfConfiguredSlots() { + return slots.size(); + } + + public byte[] getSlotDataForSlot(int slotNumber) { + return slots.get(slotNumber).slotData; + } + + public int getRadioTxPowerForSlot(int slotNumber) { + return slots.get(slotNumber).txPower; + } + + public int getAdvTxPowerForSlot(int slotNumber) { + return slots.get(slotNumber).advTxPower; + } + + public int getAdvIntervalForSlot(int slotNumber) { + return slots.get(slotNumber).advInterval; + } + + public void setName(String newConfigurationName) { + this.configurationName = newConfigurationName; + } + + private class Slot { + byte[] slotData; + int txPower; + int advTxPower; + int advInterval; + + Slot(byte[] slotData, int txPower, int advTxPower, int advInterval) { + this.slotData = slotData; + this.txPower = txPower; + this.advTxPower = advTxPower; + this.advInterval = advInterval; + } + } + +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconListAdapter.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconListAdapter.java new file mode 100644 index 0000000..faae48f --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconListAdapter.java @@ -0,0 +1,224 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.github.google.beaconfig.utils.SlotDataManager; +import com.github.google.beaconfig.utils.Utils; + +import java.util.List; + +/** + * Adapter for the recyclerView displaying all the results from scanning for beacons nearby in + * ScanningActivity. Each list entry is a CardView whose structure changes depending on the + * information available from the scan result. It is inflated for every frame which the beacon + * is broadcasting with 1 row which displays this information. + */ + +public class BeaconListAdapter extends RecyclerView.Adapter { + private List scanDataList; + private Context context; + + public BeaconListAdapter(List scanDataList, Context context) { + this.scanDataList = scanDataList; + this.context = context; + } + + @Override + public BeaconListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.scan_result_layout, parent, false); + ViewHolder vh = new ViewHolder(v); + return vh; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + BeaconScanData b = scanDataList.get(position); + holder.name.setText(b.name); + holder.address.setText(b.deviceAddress); + holder.distance.setText(Integer.toString(b.rssi)); + + holder.bottom.removeAllViews(); + boolean uidPresent = false; + for (byte[] uidFrameType : b.uidFrameTypes) { + uidPresent = setupUidFrameView(uidFrameType, holder); + } + boolean urlPresent = false; + for (byte[] urlFrameType : b.urlFrameTypes) { + urlPresent = setupUrlFrameView(urlFrameType, holder); + } + boolean tlmPresent = setupTlmFrameView(b.tlmFrameType, holder); + boolean eidPresent = setupEidFrameView(b.eidFrameType, holder); + + //This part is making sure that "Device is configurable" is displayed only when there is + // no frame data available to display. The card looks very empty is there wasn't a + // message like that. + if (b.connectable) { + ((GradientDrawable) holder.connectable.getBackground()).setColor( + context.getResources().getColor(R.color.colorPrimary)); + if (!(uidPresent || urlPresent || tlmPresent || eidPresent)) { + holder.bottom.addView(holder.connectableRow); + } + } else { + ((GradientDrawable) holder.connectable.getBackground()).setColor( + context.getResources().getColor(R.color.red)); + } + } + + private boolean setupUidFrameView(byte[] data, ViewHolder holder) { + if (data != null) { + LayoutInflater inflater = holder.inflater; + LinearLayout row = (LinearLayout) inflater.inflate(R.layout.frame_row_uid, null); + TextView namespaceView = (TextView) row.findViewById(R.id.namespace); + namespaceView.setText(SlotDataManager.getNamespaceFromSlotData(data)); + TextView instanceView = (TextView) row.findViewById(R.id.instance); + instanceView.setText(SlotDataManager.getInstanceFromSlotData(data)); + holder.bottom.addView(row); + return true; + } + return false; + } + + private boolean setupUrlFrameView(byte[] data, ViewHolder holder) { + if (data != null) { + LayoutInflater inflater = holder.inflater; + LinearLayout row = (LinearLayout) inflater.inflate(R.layout.frame_row_url, null); + TextView serviceDataView = (TextView) row.findViewById(R.id.url); + serviceDataView.setText(SlotDataManager.getUrlFromSlotData(data)); + holder.bottom.addView(row); + return true; + } + return false; + } + + private boolean setupTlmFrameView(byte[] data, ViewHolder holder) { + if (data != null) { + String voltage = Short.toString(SlotDataManager.getVersionFromSlotData(data)); + + String temperature = Float.toString(SlotDataManager.getTemperatureFromSlotData(data)); + + String advCnt + = Integer.toString(SlotDataManager.getAdvertisingPDUCountFromSlotData(data)); + + String timeOn = Utils.getTimeString(SlotDataManager.getTimeSinceOnFromSlotData(data)); + + LayoutInflater inflater = holder.inflater; + LinearLayout row = (LinearLayout) inflater.inflate(R.layout.frame_row_tlm, null); + TextView voltageView = (TextView) row.findViewById(R.id.voltage); + voltageView.setText(voltage); + + TextView temperatureView = (TextView) row.findViewById(R.id.temperature); + temperatureView.setText(temperature); + TextView pduView = (TextView) row.findViewById(R.id.pdu_cnt); + pduView.setText(advCnt); + + TextView timeOnView = (TextView) row.findViewById(R.id.time_on); + timeOnView.setText(timeOn); + holder.bottom.addView(row); + return true; + } + return false; + } + + private boolean setupEidFrameView(byte[] data, ViewHolder holder) { + if (data != null) { + LayoutInflater inflater = holder.inflater; + LinearLayout row = (LinearLayout) inflater.inflate(R.layout.frame_type_row, null); + ((TextView) row.findViewById(R.id.frame_type)).setText(Constants.EID); + TextView serviceDataView = (TextView) row.findViewById(R.id.service_data); + serviceDataView.setText(SlotDataManager.getEphemeralIdFromSlotData(data)); + holder.bottom.addView(row); + return true; + } + return false; + } + + @Override + public int getItemCount() { + return scanDataList.size(); + } + + public void setData(List scanData) { + this.scanDataList = scanData; + notifyDataSetChanged(); + } + + /** + * View holder for each displaying card in the recycler view. + */ + public static class ViewHolder extends RecyclerView.ViewHolder { + public static final String BEACON_ADDRESS = "com.bluetooth.beaconconfig.BEACON_ADDRESS"; + public static final String BEACON_NAME = "com.bluetooth.beaconconfig.BEACON_NAME"; + + private CardView cardView; + LinearLayout bottom; + + private TextView name; + private TextView address; + private TextView distance; + + LayoutInflater inflater; + + View connectable; + + private LinearLayout connectableRow; + + public ViewHolder(View itemView) { + super(itemView); + this.cardView = (CardView) itemView.findViewById(R.id.card_view); + cardView.setUseCompatPadding(true); + + cardView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent configBeacon = + new Intent(cardView.getContext(), BeaconConfigActivity.class); + configBeacon.putExtra(BEACON_ADDRESS, address.getText()); + configBeacon.putExtra(BEACON_NAME, name.getText()); + cardView.getContext().startActivity(configBeacon); + } + }); + + name = (TextView) cardView.findViewById(R.id.name); + address = (TextView) cardView.findViewById(R.id.address); + distance = (TextView) cardView.findViewById(R.id.rssi); + + bottom = (LinearLayout) itemView.findViewById(R.id.bottom); + inflater = (LayoutInflater) cardView.getContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + connectable = cardView.findViewById(R.id.connectable); + connectableRow = (LinearLayout) inflater.inflate(R.layout.frame_type_row, null); + connectableRow.removeAllViews(); + TextView textView = new TextView(connectableRow.getContext()); + textView.setText("Device is configurable."); + textView.setTextColor(Color.GRAY); + connectableRow.addView(textView); + } + + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanData.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanData.java new file mode 100644 index 0000000..420167b --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanData.java @@ -0,0 +1,103 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.bluetooth.le.ScanResult; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.github.google.beaconfig.utils.Utils; + +/** + * Holder for all the data that the scanner from the Scanning Activity receives about a particular + * beacon. This data will then be displayed in the recyclerView. + */ + +public class BeaconScanData { + public static final String TAG = BeaconScanData.class.getSimpleName(); + + final String deviceAddress; + int rssi; + String name; + boolean connectable = false; + + final List uidFrameTypes; + byte[] tlmFrameType; + final List urlFrameTypes; + byte[] eidFrameType; + + BeaconScanData(ScanResult sr) { + this.deviceAddress = sr.getDevice().getAddress(); + if (sr.getDevice().getName() != null) { + name = sr.getDevice().getName(); + } else { + name = "[no name]"; + } + uidFrameTypes = new ArrayList<>(); + urlFrameTypes = new ArrayList<>(); + + update(sr); + } + + public void update(ScanResult sr) { + rssi = sr.getRssi(); + byte[] serviceData = sr.getScanRecord().getServiceData(Constants.EDDYSTONE_SERVICE_UUID); + if (serviceData == null || serviceData.length == 0) { + serviceData = sr.getScanRecord().getServiceData(Constants.EDDYSTONE_CONFIGURATION_UUID); + if (serviceData == null || Utils.slotIsEmpty(serviceData)) { + connectable = true; + return; + } else { + String err = "No suitable service data."; + Log.d(TAG, err); + } + } + + switch (serviceData[0]) { + case Constants.UID_FRAME_TYPE: + synchronized (uidFrameTypes) { + for (byte[] uidServiceData : uidFrameTypes) { + if (Arrays.equals(serviceData, uidServiceData)) { + return; + } + } + uidFrameTypes.add(serviceData); + } + break; + case Constants.URL_FRAME_TYPE: + synchronized (urlFrameTypes) { + for (byte[] urlServiceData : urlFrameTypes) { + if (Arrays.equals(serviceData, urlServiceData)) { + return; + } + } + urlFrameTypes.add(serviceData); + } + break; + case Constants.TLM_FRAME_TYPE: + tlmFrameType = serviceData; + break; + case Constants.EID_FRAME_TYPE: + eidFrameType = serviceData; + break; + default: + String err = String.format("Invalid frame type byte %02X", serviceData[0]); + Log.d(TAG, err); + } + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanner.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanner.java new file mode 100644 index 0000000..b44c926 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/BeaconScanner.java @@ -0,0 +1,135 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.le.BluetoothLeScanner; +import android.bluetooth.le.ScanCallback; +import android.bluetooth.le.ScanFilter; +import android.bluetooth.le.ScanResult; +import android.util.Log; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import com.github.google.beaconfig.utils.UiUtils; + +/** + * Scanner class using the BluetoothLeScanner to scan for beacons and convoy the result in a + * ready-to-use way to the scanningActivity. + * + * It uses a list of scan filters to filter through the scan results and saves each good scan result + * in a BeaconScanData structure. All the results are stored in a List which is sent back to the + * ScanningActivity to display in the UI. + * + * ScanResults from the same beacon are used to update the same BeaconScanData object, so that in + * the end each BeaconScanData corresponds to a unique beacon. + */ +class BeaconScanner { + private static final String TAG = BeaconScanner.class.getSimpleName(); + + private Activity currentActivity; + private BluetoothLeScanner scanner; + private ScanCallback scanCallback; + private List scanFilters; + final private List scanDataList; + final private Map addrToBeacons; + + public BeaconScanner(final Activity currentActivity, BluetoothAdapter bluetoothAdapter) { + this.currentActivity = currentActivity; + scanner = bluetoothAdapter.getBluetoothLeScanner(); + + scanCallback = new ScanCallback() { + @Override + public void onScanResult(int callbackType, ScanResult result) { + BeaconScanData beaconScanData; + String address = result.getDevice().getAddress(); + synchronized (addrToBeacons) { + if (addrToBeacons.isEmpty() || !addrToBeacons.containsKey(address)) { + beaconScanData = new BeaconScanData(result); + + addrToBeacons.put(address, beaconScanData); + scanDataList.add(beaconScanData); + } else { + beaconScanData = addrToBeacons.get(address); + beaconScanData.update(result); + } + } + } + + @Override + public void onScanFailed(int errorCode) { + switch (errorCode) { + case SCAN_FAILED_ALREADY_STARTED: + Log.d(TAG, "SCAN_FAILED_ALREADY_STARTED"); + break; + case SCAN_FAILED_APPLICATION_REGISTRATION_FAILED: + Log.d(TAG, "SCAN_FAILED_APPLICATION_REGISTRATION_FAILED"); + UiUtils.showToast(currentActivity, "Scan failed. Try to turn bluetooth " + + "OFF and ON again"); + break; + case SCAN_FAILED_FEATURE_UNSUPPORTED: + Log.d(TAG, "SCAN_FAILED_FEATURE_UNSUPPORTED"); + break; + case SCAN_FAILED_INTERNAL_ERROR: + Log.d(TAG, "SCAN_FAILED_INTERNAL_ERROR"); + break; + default: + Log.d(TAG, "Scan failed, unknown error code"); + break; + } + } + }; + + scanFilters = new ArrayList<>(); + scanFilters.add(new ScanFilter.Builder().setServiceUuid + (Constants.EDDYSTONE_SERVICE_UUID).build()); + scanFilters.add(new ScanFilter.Builder().setServiceUuid + (Constants.EDDYSTONE_CONFIGURATION_UUID).build()); + addrToBeacons = new HashMap<>(); + scanDataList = new ArrayList<>(); + } + + private boolean isScanning = false; + public void scan() { + if (isScanning) { + return; + } + isScanning = true; + scanDataList.clear(); + addrToBeacons.clear(); + scanner.startScan(scanFilters, Constants.SCAN_SETTINGS, scanCallback); + final ScheduledExecutorService worker = + Executors.newSingleThreadScheduledExecutor(); + Runnable stop = new Runnable() { + public void run() { + synchronized (scanDataList) { + scanner.stopScan(scanCallback); + isScanning = false; + ((ScanningActivity) currentActivity).scanComplete(scanDataList); + } + } + }; + + worker.schedule(stop, Constants.SCAN_TIME_SECS, TimeUnit.SECONDS); + } + +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/Constants.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/Constants.java new file mode 100644 index 0000000..a51adc8 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/Constants.java @@ -0,0 +1,74 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.bluetooth.le.ScanSettings; +import android.os.ParcelUuid; + +/** + * Constants used by other classes. + */ + +public class Constants { + static final int SCAN_TIME_SECS = 4; + static final int REQUEST_ENABLE_BLUETOOTH = 1; + static final ScanSettings SCAN_SETTINGS = + new ScanSettings.Builder() + .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) + .setReportDelay(0) + .build(); + static final ParcelUuid EDDYSTONE_SERVICE_UUID = + ParcelUuid.fromString("0000FEAA-0000-1000-8000-00805F9B34FB"); + public static final ParcelUuid EDDYSTONE_CONFIGURATION_UUID = + ParcelUuid.fromString("a3c87500-8ed3-4bdf-8a39-a01bebede295"); + + /** + * Eddystone-UID frame type value. + */ + public static final byte UID_FRAME_TYPE = 0x00; + + /** + * Eddystone-URL frame type value. + */ + public static final byte URL_FRAME_TYPE = 0x10; + + /** + * Eddystone-TLM frame type value. + */ + public static final byte TLM_FRAME_TYPE = 0x20; + + /** + * Eddystone-EID frame type value. + */ + public static final byte EID_FRAME_TYPE = 0x30; + public static final byte EMPTY_FRAME_TYPE = 0x40; + + public static final String SLOT_DATA = "slot_data"; + public static final String TX_POWER = "tx_power"; + public static final String ADV_POWER = "adv_power"; + public static final String UID = "UID"; + public static final String URL = "URL"; + public static final String TLM = "TLM"; + public static final String EID = "EID"; + public static final String ADV_INTERVAL = "advertising_interval"; + public static final String BEACON_ADDRESS = "beacon_address"; + public static final String BEACON_NAME = "beacon_name"; + public static final String BROADCAST_CAPABILITIES = "BROADCAST_CAPABILITIES"; + public static final String SLOT_NUMBER = "SLOT_NUMBER"; + public static final String REMAIN_CONNECTABLE = "REMAIN_CONNECTABLE"; + + public static final String CONFIG_NAMES = "CONFIG_NAMES"; + public static final String SAVED_CONFIGURATIONS = "SAVED_CONFIGURATIONS"; +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsActivity.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsActivity.java new file mode 100644 index 0000000..92b7381 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsActivity.java @@ -0,0 +1,68 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; + +import java.util.ArrayList; +import java.util.List; + +/** + * This activity shows all the configurations that the user has saved from different beacons. + * + * Configurations are presented in a RecyclerListView with each entry presented in a CardView. + * Each entry has a delete button and can be clicked to extend the cardView and show all the + * settings of this configuration. + * + * The back button navigates to the BeaconConfigActivity from which this activity was opened. + */ +public class ManageConfigurationsActivity extends AppCompatActivity { + private List configurations; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.fragment_manage_configurations); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary)); + setTitle("Manage configurations"); + + RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + configurations = new ArrayList<>(); + recyclerView.setAdapter(new ManageConfigurationsAdapter(this)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsAdapter.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsAdapter.java new file mode 100644 index 0000000..5c9c6aa --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ManageConfigurationsAdapter.java @@ -0,0 +1,210 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.github.google.beaconfig.dialogs.ConfirmationDialog; +import com.github.google.beaconfig.dialogs.SaveConfigurationDialog; +import com.github.google.beaconfig.utils.SlotDataManager; + +/** + * Adapter used for the RecyclerView which presents the saved configurations that the user has saved + * from all beacons. It is shows inside ManageConfigurationsActivity. Each list entry presents one + * saved configuration. + */ +public class ManageConfigurationsAdapter + extends RecyclerView.Adapter { + + private static final String TAG = ManageConfigurationsAdapter.class.getSimpleName(); + private final ManageConfigurationsActivity activity; + private final SavedConfigurationsManager configurationsManager; + + public ManageConfigurationsAdapter(ManageConfigurationsActivity activity) { + this.activity = activity; + configurationsManager = new SavedConfigurationsManager(activity); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.fragment_manage_configurations_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, final int position) { + final BeaconConfiguration configuration + = configurationsManager.getConfigurationAtPosition(position); + holder.configNameView.setText(configuration.getName()); + + holder.deleteView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ConfirmationDialog.confirm("Delete configuration", "Are you sure you want to " + + "delete configuration \"" + configuration.getName() + "\"?", "yes", "no", + activity, new ConfirmationDialog.ConfirmationListener() { + @Override + public void confirm() { + deleteConfiguration(configuration.getName()); + } + + @Override + public void cancel() { + + } + }); + } + }); + + // on click the card inflates to show detailed information about this configuration + holder.cardView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + holder.clickCard(); + holder.contentView.removeAllViews(); + + LayoutInflater inflater = activity.getLayoutInflater(); + for (int i = 0; i < configuration.getNumberOfConfiguredSlots(); i++) { + Log.d(TAG, "Printing slot " + i); + View child = inflater.inflate(R.layout.saved_slot_configuration, null); + holder.contentView.addView(child); + + ((TextView) child.findViewById(R.id.header)).setText("Slot " + i + ": "); + setUpSlotDataConfigurationViews(child, configuration.getSlotDataForSlot(i)); + ((TextView) child.findViewById(R.id.radio_tx_power)) + .setText(Integer.toString(configuration.getRadioTxPowerForSlot(i))); + ((TextView) child.findViewById(R.id.adv_tx_power)) + .setText(Integer.toString(configuration.getAdvTxPowerForSlot(i))); + ((TextView) child.findViewById(R.id.adv_interval)) + .setText(Integer.toString(configuration.getAdvIntervalForSlot(i))); + } + } + }); + + //long click opens a window to change the name of this configuration + holder.cardView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + SaveConfigurationDialog.show(activity, + new SaveConfigurationDialog.SaveConfigListener() { + @Override + public void configNameChosen(String configName) { + deleteConfiguration(configuration.getName()); + configuration.setName(configName); + new SavedConfigurationsManager(activity) + .saveNewConfiguration(configuration); + notifyDataSetChanged(); + } + }); + return false; + } + }); + } + + private void setUpSlotDataConfigurationViews(View view, byte[] slotData) { + TextView header = (TextView) view.findViewById(R.id.header); + switch (slotData[0]) { + case Constants.UID_FRAME_TYPE: + header.setText(header.getText() + Constants.UID); + ((TextView) view.findViewById(R.id.namespace)) + .setText(SlotDataManager.getNamespaceFromWriteByteArray(slotData)); + ((TextView) view.findViewById(R.id.instance)) + .setText(SlotDataManager.getInstanceFromWriteByteArray(slotData)); + view.findViewById(R.id.uid_config).setVisibility(View.VISIBLE); + break; + case Constants.URL_FRAME_TYPE: + header.setText(header.getText() + Constants.URL); + ((TextView) view.findViewById(R.id.url)) + .setText(SlotDataManager.getUrlFromWriteByteArray(slotData)); + view.findViewById(R.id.url_config).setVisibility(View.VISIBLE); + break; + case Constants.TLM_FRAME_TYPE: + header.setText(header.getText() + Constants.TLM); + break; + } + } + + @Override + public int getItemCount() { + return configurationsManager.getNumberOfConfigurations(); + } + + private void deleteConfiguration(String name) { + configurationsManager.deleteConfigurationWithName(name); + notifyDataSetChanged(); + } + + /** + * Holder for a single configuration inside the list of saved configurations. It shows the + * name of the configuration and on click, shows the configuration in detail: + * - number of configured slots + * - frame that each slot is configured to + * - slot data + * - radio tx power + * - advertised tx power + * advertised interval + * + * There is also an option to delete this list entry by clicking on the deleteView. + */ + public class ViewHolder extends RecyclerView.ViewHolder { + public CardView cardView; + public final TextView configNameView; + public final ImageView deleteView; + public final LinearLayout contentView; + + public ViewHolder(final View itemView) { + super(itemView); + configNameView = (TextView) itemView.findViewById(R.id.config_name); + deleteView = (ImageView) itemView.findViewById(R.id.config_delete); + contentView = (LinearLayout) itemView.findViewById(R.id.config_content); + + cardView = (CardView) itemView.findViewById(R.id.configuration_item_card); + cardView.setUseCompatPadding(true); + + final ImageView expandArrow + = (ImageView) itemView.findViewById(R.id.expand_configuration); + expandArrow.setOnClickListener(new View.OnClickListener() { + private boolean expanded = false; + @Override + public void onClick(View view) { + if (expanded) { + itemView.findViewById(R.id.configuration_view).setVisibility(View.GONE); + expandArrow.setImageResource(R.drawable.expand_arrow); + expanded = false; + } else { + itemView.findViewById(R.id.configuration_view).setVisibility(View.VISIBLE); + expandArrow.setImageResource(R.drawable.close_arrow); + expanded = true; + } + + } + }); + } + + public void clickCard() { + cardView.findViewById(R.id.expand_configuration).performClick(); + } + + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SavedConfigurationsManager.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SavedConfigurationsManager.java new file mode 100644 index 0000000..492eae6 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SavedConfigurationsManager.java @@ -0,0 +1,165 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import com.google.gson.Gson; + +import java.util.ArrayList; + +/** + * This class is used from the BeaconConfig activity for saving the beacon's current configuration. + * It uses SharedPreferences to save or recover beacon configurations. + * + * It accepts a BeaconConfiguration object to save a configuration and serializes it to a String + * which it puts in the SharedPreferences. + * + * It returns a BeaconConfiguration object when a configuration with a certain name is requested. + */ +public class SavedConfigurationsManager { + private static final String TAG = SavedConfigurationsManager.class.getSimpleName(); + private final Activity activity; + private final Gson gson; + + public SavedConfigurationsManager(Activity activity) { + this.activity = activity; + this.gson = new Gson(); + } + + /** + * This function must be called before any other call to this class. It initialises the list of + * configuration names + */ + public void initialiseConfigurationSaving() { + ArrayList configurationNames = new ArrayList<>(); + SharedPreferences.Editor spe = activity.getSharedPreferences(Constants.SAVED_CONFIGURATIONS, + Context.MODE_PRIVATE).edit(); + spe.putString(Constants.CONFIG_NAMES, gson.toJson(configurationNames)); + spe.apply(); + } + + /** + * This method serializes the BeaconConfiguration object to a String which it puts in a shared + * preferences file with name "SAVED_CONFIGURATIONS". The new configuration is saved with key + * the name of the configuration (configuration.getName()). + * + * @param configuration the configuration which we want to save + */ + public void saveNewConfiguration(BeaconConfiguration configuration) { + SharedPreferences.Editor spEditor = activity.getSharedPreferences( + Constants.SAVED_CONFIGURATIONS, Context.MODE_PRIVATE).edit(); + + String serializedConfiguration = gson.toJson(configuration); + spEditor.putString(configuration.getName(), serializedConfiguration); + addNewName(configuration.getName()); + spEditor.apply(); + } + + /** + * At the beginning of the application an array was put in the "SAVED_CONFIGURATIONS" shared + * preferences file which is a list of all saved configurations' names. This method adds a new + * name to this list. + * + * This method should only be called when a new configuration is saved to the shared preferences + * file and the configNameView is the key with which the configuration was saved in the shared + * preferences map. + * + * @param configName + */ + private void addNewName(String configName) { + ArrayList spConfigNames = getConfigurationNamesList(); + spConfigNames.add(configName); + + SharedPreferences.Editor spe = activity.getSharedPreferences(Constants.SAVED_CONFIGURATIONS, + Context.MODE_PRIVATE).edit(); + spe.remove(Constants.CONFIG_NAMES); + spe.putString(Constants.CONFIG_NAMES, gson.toJson(spConfigNames)); + spe.apply(); + } + + /** + * Retrieves a configuration from the "SAVED_CONFIGURATIONS" shared preferences file with name + * configNameView. This configuration must have previously been saved to the shared preferences + * file + * + * @param configName the name of the configuration we want to retrieve + * @return the saved configuration with this name or null if no such configuration was found + */ + public BeaconConfiguration getConfiguration(String configName) { + SharedPreferences sp = activity.getSharedPreferences( + Constants.SAVED_CONFIGURATIONS, Context.MODE_PRIVATE); + String serializedConfiguration = sp.getString(configName, ""); + BeaconConfiguration configuration + = gson.fromJson(serializedConfiguration, BeaconConfiguration.class); + + if (configuration == null) { + Log.d(TAG, "Configuration \"" + configName + "\" not found"); + return null; + } + Log.d(TAG, "Retrieved configuration " + configuration.getName()); + return configuration; + } + + /** + * This looks up the configuration name which stays in position "position" in the list of + * configuration names (which is saved in the "SAVED_CONFIGURATIONS" shared preferences file). + * Then uses this name to retrieve the relevant configuration from this file. + * + * @param position position of the configuration in the array of configuration names + * @return the configuration at position "position" or null if no such configuration was found + */ + public BeaconConfiguration getConfigurationAtPosition(int position) { + ArrayList spConfigNames = getConfigurationNamesList(); + String configName = spConfigNames.get(position); + return getConfiguration(configName); + } + + public void deleteConfigurationWithName(String name) { + ArrayList spConfigNames = getConfigurationNamesList(); + spConfigNames.remove(name); + SharedPreferences.Editor spEditor = activity.getSharedPreferences( + Constants.SAVED_CONFIGURATIONS, Context.MODE_PRIVATE).edit(); + spEditor.remove(name); + spEditor.remove(Constants.CONFIG_NAMES); + spEditor.putString(Constants.CONFIG_NAMES, gson.toJson(spConfigNames)); + spEditor.commit(); + } + + /** + * @return the list of all names of configurations saved to the "SAVED_CONFIGURATIONS" shared + * preferences file + */ + public ArrayList getConfigurationNamesList() { + SharedPreferences sp = activity.getSharedPreferences(Constants.SAVED_CONFIGURATIONS, + Context.MODE_PRIVATE); + String serializedConfigNames = sp.getString(Constants.CONFIG_NAMES, null); + final ArrayList configNames + = gson.fromJson(serializedConfigNames, ArrayList.class); + return configNames; + } + + public int getNumberOfConfigurations() { + SharedPreferences sp = activity.getSharedPreferences( + Constants.SAVED_CONFIGURATIONS, Context.MODE_PRIVATE); + String serializedConfigNames = sp.getString(Constants.CONFIG_NAMES, null); + ArrayList spConfigNames + = gson.fromJson(serializedConfigNames, ArrayList.class); + return spConfigNames.size(); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ScanningActivity.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ScanningActivity.java new file mode 100644 index 0000000..5eff4fb --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/ScanningActivity.java @@ -0,0 +1,274 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.Manifest; +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.github.google.beaconfig.utils.UiUtils; + +/** + * This is the main activity in Beaconfig. It asks for location permissions, turns on bluetooth and + * initialises the BLE Scanner. Then it scans for nearby beacons and displays the results in a list. + * + * Each entry in the list represents a unique beacon with information from several scan results + * whose information is saved in a BeaconScanData object. + * + * On click of any of the list entries, a new activity starts - BeaconConfigActivity. It connects + * to the beacon and allows per slot configuration of the beacon. + */ +public class ScanningActivity extends AppCompatActivity { + private static final int PERMISSION_COARSE_LOCATION = 2; + + private static final String TAG = ScanningActivity.class.getSimpleName(); + + private BeaconListAdapter beaconsListAdapter; + private BluetoothAdapter btAdapter; + private BeaconScanner scanner; + + private SwipeRefreshLayout swipeRefreshLayout; + + private ExecutorService executor; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + new SavedConfigurationsManager(this).initialiseConfigurationSaving(); + executor = Executors.newSingleThreadExecutor(); + + beaconsListAdapter + = new BeaconListAdapter(new ArrayList(), getApplication()); + RecyclerView beaconsRecyclerView = (RecyclerView) findViewById(R.id.rv); + beaconsRecyclerView.setAdapter(beaconsListAdapter); + beaconsRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + + final FloatingActionButton refresh = (FloatingActionButton) findViewById(R.id.fab); + refresh.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + scan(); + } + }); + + setUpThrobber(); + getRequiredPermissions(); + + beaconsRecyclerView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + return swipeRefreshLayout.isRefreshing(); + } + }); + + beaconsRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { + @Override + public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { + Log.d(TAG, "On interception touch listener " + swipeRefreshLayout.isRefreshing()); + return swipeRefreshLayout.isRefreshing(); + } + + @Override + public void onTouchEvent(RecyclerView rv, MotionEvent e) { + + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + + } + }); + + } + + /** + * Attempts to scan for beacons. First checks whether bluetooth is turned on and deals with + * the case when it is not. During this, the screen is disabled and the swipeRefreshLayout is + * refreshing. + */ + private void scan() { + Log.d(TAG, "Scanning..."); + if (btAdapter == null || !btAdapter.isEnabled()) { + requestBluetoothOn(); + } else { + swipeRefreshLayout.post(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(true); + } + }); + findViewById(R.id.grey_out_slot).setVisibility(View.VISIBLE); + UiUtils.showToast(this, "Scanning..."); + + executor.submit(new Runnable() { + @Override + public void run() { + scanner.scan(); + } + }); + } + } + + /** + * Callback for when the scan has finished. This enables the screen again and informs the + * RecyclerViewAdapter that new data is available to be displayed. + * + * @param scanDataList the information gathered about each beacon over the whole time of the + * scan. + */ + public void scanComplete(final List scanDataList) { + Log.d(TAG, "Scanning complete."); + Collections.sort(scanDataList, new Comparator() { + @Override + public int compare(BeaconScanData b1, BeaconScanData b2) { + return (b2.rssi - b1.rssi); + } + }); + + + runOnUiThread(new Runnable() { + @Override + public void run() { + beaconsListAdapter.setData(scanDataList); + swipeRefreshLayout.post(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(false); + findViewById(R.id.grey_out_slot).setVisibility(View.GONE); + String message = scanDataList.size() + " results were found"; + UiUtils.showToast(ScanningActivity.this,message); + } + }); + } + }); + } + + private void setupScanner() { + Log.d(TAG, "Setting up scanner..."); + BluetoothManager manager = (BluetoothManager) getApplicationContext() + .getSystemService(Context.BLUETOOTH_SERVICE); + btAdapter = manager.getAdapter(); + + requestBluetoothOn(); + } + + private void requestBluetoothOn() { + if (btAdapter == null || !btAdapter.isEnabled()) { + Log.d(TAG, "Bluetooth not enabled, requesting permission."); + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + this.startActivityForResult(enableBtIntent, Constants.REQUEST_ENABLE_BLUETOOTH); + } else if (scanner == null) { + scanner = new BeaconScanner(this, btAdapter); + scan(); + } + } + + private void getRequiredPermissions() { + Log.d(TAG, "Getting Permissions..."); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, + PERMISSION_COARSE_LOCATION); + } else { + setupScanner(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == Constants.REQUEST_ENABLE_BLUETOOTH) { + if (resultCode == Activity.RESULT_OK) { + Log.d(TAG, "Bluetooth enable permission granted."); + scanner = new BeaconScanner(this, btAdapter); + scan(); + } else { + Log.d(TAG, "Bluetooth enable permission denied. Closing..."); + showFinishingAlertDialog("Bluetooth is required", + "App will close since the permission was denied"); + } + } + } + + @Override + public void onRequestPermissionsResult(int code, String permissions[], int[] grantResults) { + switch (code) { + case PERMISSION_COARSE_LOCATION: + + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + setupScanner(); + Log.d(TAG, "PERMISSION_REQUEST_COARSE_LOCATION granted"); + } else { + showFinishingAlertDialog("Coarse location access is required", + "App will close since the permission was denied"); + } + } + } + + private void showFinishingAlertDialog(String title, String message) { + new AlertDialog.Builder(this).setTitle(title).setMessage(message) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + finish(); + } + }).show(); + } + + private void setUpThrobber() { + swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.throbber); + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + scan(); + } + }); + swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, + android.R.color.holo_green_light, + android.R.color.holo_orange_light, + android.R.color.holo_red_light); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SlotsAdapter.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SlotsAdapter.java new file mode 100644 index 0000000..d676393 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/SlotsAdapter.java @@ -0,0 +1,58 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig; + +import android.os.Bundle; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; + +import java.util.ArrayList; +import java.util.List; + +import layout.BeaconTabFragment; +import layout.SlotFragment; + +/** + * The SlotsAdapter handles transforming slot data to corresponding fragments which will then be + * displayed as tabs in the configuration page of BeaconConfig. + */ +public class SlotsAdapter extends FragmentStatePagerAdapter { + private List slotFragments; + + public SlotsAdapter(FragmentManager fm) { + super(fm); + slotFragments = new ArrayList<>(); + } + + public void createNewFragment(final Bundle bundle) { + SlotFragment newSlotFragment = SlotFragment.newInstance(bundle); + slotFragments.add(newSlotFragment); + } + + public void addFragment(BeaconTabFragment fragment) { + slotFragments.add(fragment); + } + + @Override + public BeaconTabFragment getItem(int position) { + return slotFragments.get(position); + } + + @Override + public int getCount() { + return slotFragments.size(); + } + +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ChangePasswordDialog.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ChangePasswordDialog.java new file mode 100644 index 0000000..e1f7c60 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ChangePasswordDialog.java @@ -0,0 +1,224 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.TextView; + +import com.github.google.beaconfig.R; + +/** + * Dialog for when a lock code change is requested + */ +public class ChangePasswordDialog { + public static void show(final Activity activity, final PasswordChangeListener l) { + final AlertDialog passwordChangeDialog = new AlertDialog.Builder(activity).show(); + + // This is needed because there are some flags being set which prevent the keyboard from + // popping up when an EditText is clicked + passwordChangeDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + + passwordChangeDialog.setContentView(R.layout.dialog_change_lock_code); + passwordChangeDialog.setCanceledOnTouchOutside(false); + + final EditText newPasswordView + = (EditText) passwordChangeDialog.findViewById(R.id.enter_new_lock_code); + final TextView newPasswordLengthTracker + = (TextView) passwordChangeDialog.findViewById(R.id.new_code_tracker); + + newPasswordView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + newPasswordLengthTracker.setText("(" + newPasswordView.getText().length() + "/32)"); + } + }); + + newPasswordView.setOnEditorActionListener(new EditText.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + if (newPasswordView.getText().toString().length() < 32) { + newPasswordView.setError + ("Lock code too short!"); + return true; + } else { + return false; + } + } + return false; + } + }); + + newPasswordView.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View view, boolean hasFocus) { + if (!hasFocus) { + String input = newPasswordView.getText().toString(); + if (input.length() < 32) { + newPasswordView.setError("Lock code too short!"); + } + } + } + }); + + + final EditText repeatPasswordView + = (EditText) passwordChangeDialog.findViewById(R.id.repeat_new_lock_code); + final TextView repeatLengthTracker + = (TextView) passwordChangeDialog.findViewById(R.id.repeat_code_tracker); + + repeatPasswordView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + repeatLengthTracker.setText("(" + repeatPasswordView.getText().length() + "/32)"); + } + }); + + repeatPasswordView.setOnEditorActionListener(new EditText.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + final String input = repeatPasswordView.getText().toString(); + + if (newPasswordView.getText().toString().length() < 32) { + newPasswordView.setError("Lock code too short!"); + } + + if (input.length() < 32) { + repeatPasswordView.setError("Lock code too short!"); + } else if (!input.equals(newPasswordView.getText().toString())) { + repeatPasswordView.setError("Lock codes do not match."); + } else if (input.equals(newPasswordView.getText().toString())) { + ConfirmationDialog.confirm("Change Lock Code", "Are you sure you want " + + "to change the lock code of this beacon? \n \n You will not be " + + "able to restore the previous lock code.", "YES", "NO", activity, + new ConfirmationDialog.ConfirmationListener() { + @Override + public void confirm() { + l.passwordChangeRequest(input); + passwordChangeDialog.dismiss(); + } + + @Override + public void cancel() { + } + }); + return false; + } + } + return false; + } + }); + + repeatPasswordView.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View view, boolean hasFocus) { + if (!hasFocus) { + String input = repeatPasswordView.getText().toString(); + if (input.length() < 32) { + repeatPasswordView.setError("Lock code too short!"); + } else if (!input.equals(newPasswordView.getText().toString())) { + repeatPasswordView.setError("Lock codes do not match."); + } + } + } + }); + + + +// Override the button so we can prevent closing the dialog if the input is bogus. + passwordChangeDialog.findViewById(R.id.confirm_button).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + final String newPassword = newPasswordView.getText().toString(); + String repeatNewPassword = repeatPasswordView.getText().toString(); + + if (newPassword.isEmpty()) { + newPasswordView.setError("Lock code too short!"); + } + + if (repeatNewPassword.isEmpty()) { + repeatPasswordView.setError("Lock code too short!"); + } else if (newPassword.equals(repeatNewPassword)) { + ConfirmationDialog.confirm("Change Lock Code", "Are you sure you want " + + "to change the lock code of this beacon? \n \n You will not be " + + "able to restore the previous lock code.", "OK", "CANCEL", + activity, new ConfirmationDialog.ConfirmationListener() { + @Override + public void confirm() { + l.passwordChangeRequest(newPassword); + passwordChangeDialog.getWindow().setSoftInputMode( + WindowManager.LayoutParams. + SOFT_INPUT_STATE_ALWAYS_HIDDEN); + passwordChangeDialog.dismiss(); + } + + @Override + public void cancel() { + } + }); + } else if (!newPassword.equals(repeatNewPassword)) { + repeatPasswordView.setError("Lock codes do not match."); + } + } + }); + + passwordChangeDialog.findViewById(R.id.cancel_change_password).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + passwordChangeDialog.dismiss(); + } + }); + } + + /** + * Used for communication between the activity calling ChangePasswordListener + * and ChangePasswordListener. + */ + public interface PasswordChangeListener { + void passwordChangeRequest(String newPassword); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ConfirmationDialog.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ConfirmationDialog.java new file mode 100644 index 0000000..05440ee --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/ConfirmationDialog.java @@ -0,0 +1,65 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; + +/** + * This dialog is displayed whenever there is a risky request from the user. It asks for + * confirmation before executing the request. + */ +public class ConfirmationDialog { + public static void confirm(final String title, final String message, final String confirmText, + final String cancelText, final Activity ctx, + final ConfirmationListener listener) { + ctx.runOnUiThread(new Runnable() { + @Override + public void run() { + final AlertDialog confirmDialog = new AlertDialog.Builder(ctx) + .setTitle(title) + .setMessage(message) + .setPositiveButton(confirmText, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + listener.confirm(); + dialog.dismiss(); + } + }) + .setNegativeButton(cancelText, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + listener.cancel(); + dialog.dismiss(); + } + }) + .show(); + + confirmDialog.setCanceledOnTouchOutside(false); + + } + }); + } + + /** + * Used for communication between the activity calling ConfirmationDialog + * and ConfirmationDialog. + */ + public interface ConfirmationListener { + void confirm(); + void cancel(); + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/SaveConfigurationDialog.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/SaveConfigurationDialog.java new file mode 100644 index 0000000..c6a4d0a --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/SaveConfigurationDialog.java @@ -0,0 +1,78 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; + +import com.github.google.beaconfig.R; +import com.github.google.beaconfig.SavedConfigurationsManager; + +/** + * This dialog pops up when the user wants to save the current configuration of the beacon. It asks + * the user for a name which will uniquely identify this configuration. It does not allow the user + * to choose a name which laready exists. + */ +public class SaveConfigurationDialog { + + public static void show(final Activity ctx, final SaveConfigListener saveConfigListener) { + final AlertDialog saveConfigDialog = new AlertDialog.Builder(ctx).show(); + saveConfigDialog.setContentView(R.layout.dialog_save_config); + saveConfigDialog.setCanceledOnTouchOutside(false); + + // This is needed because there are some flags being set which prevent the keyboard from + // popping up when an EditText is clicked + saveConfigDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + + final EditText configNameView + = (EditText) saveConfigDialog.findViewById(R.id.configuration_name); + + saveConfigDialog.findViewById(R.id.confirm_button).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + String configName = configNameView.getText().toString(); + if (configName == null || configName.isEmpty()) { + configNameView.setError("Please enter a name"); + } else if (new SavedConfigurationsManager(ctx) + .getConfigurationNamesList().contains(configName)) { + configNameView.setError("This configuration is already in use"); + } else { + saveConfigListener.configNameChosen(configName); + saveConfigDialog.dismiss(); + } + } + }); + + saveConfigDialog.findViewById(R.id.cancel_save_config).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + saveConfigDialog.dismiss(); + } + }); + } + + /** + * Listener interface to be called when a name has been chosen for this configuration + */ + public interface SaveConfigListener { + void configNameChosen(String configName); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UidSlotDataChangeDialog.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UidSlotDataChangeDialog.java new file mode 100644 index 0000000..6270ca4 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UidSlotDataChangeDialog.java @@ -0,0 +1,126 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.dialogs; + +import android.app.AlertDialog; +import android.content.Context; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.TextView; + +import com.github.google.beaconfig.R; + +/** + * Dialog which pops up when the user wants to change either the namespace or the instance of the + * Uid slot. It verifies the input and doesn't allow invalid information to be sent to the beacon. + */ +public class UidSlotDataChangeDialog { + public static void show(String oldNamespace, String oldInstance, + final Context ctx, final UidChangeListener uidChangeListener) { + final AlertDialog editUidDialog = new AlertDialog.Builder(ctx).show(); + editUidDialog.setContentView(R.layout.dialog_change_uid); + editUidDialog.setCanceledOnTouchOutside(false); + + // This is needed because there are some flags being set which prevent the keyboard from + // popping up when an EditText is clicked + editUidDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + + final EditText editNamespaceView + = (EditText) editUidDialog.findViewById(R.id.edit_namespace); + final TextView namespaceTracker + = (TextView) editUidDialog.findViewById(R.id.namespace_tracker); + editNamespaceView.setText(oldNamespace); + editNamespaceView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + namespaceTracker.setText("(" + editNamespaceView.getText().length() + "/20)"); + } + }); + + final EditText editInstanceView + = (EditText) editUidDialog.findViewById(R.id.edit_instance); + editInstanceView.setText(oldInstance); + final TextView instanceTracker + = (TextView) editUidDialog.findViewById(R.id.instance_tracker); + + editInstanceView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + instanceTracker.setText("(" + editInstanceView.getText().length() + "/12)"); + } + }); + + editUidDialog.findViewById(R.id.confirm_button).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + final String newNamespace = editNamespaceView.getText().toString(); + final String newInstance = editInstanceView.getText().toString(); + + if (newNamespace.length() < 20) { + editNamespaceView.setError("Must be exactly 20 hex characters"); + } + + if (newInstance.length() < 12) { + editInstanceView.setError("Must be exactly 12 hex characters"); + } + + if (newNamespace.length() == 20 && newInstance.length() == 12) { + uidChangeListener.setNewUid(newNamespace, newInstance); + editUidDialog.dismiss(); + } + } + }); + + editUidDialog.findViewById(R.id.cancel_change_uid).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + editUidDialog.dismiss(); + } + }); + } + + /** + * Listener interface to be called when password has been types in. + */ + public interface UidChangeListener { + void setNewUid(String namespace, String instance); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UnlockDialog.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UnlockDialog.java new file mode 100644 index 0000000..3e1629f --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UnlockDialog.java @@ -0,0 +1,150 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.TextView; + +import com.github.google.beaconfig.R; +import com.github.google.beaconfig.utils.Utils; + +/** + * This Dialog pops up when a password is required by the user to unlock the beacon manually. + */ +public class UnlockDialog { + public static void show(final Activity ctx, final UnlockListener unlockListener) { + ctx.runOnUiThread(new Runnable() { + @Override + public void run() { + final AlertDialog unlockDialog = new AlertDialog.Builder(ctx).show(); + unlockDialog.setContentView(R.layout.dialog_unlock); + unlockDialog.setCanceledOnTouchOutside(false); + + // This is needed because there are some flags being set which prevent the keyboard + // from popping up when an EditText is clicked + unlockDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + + final EditText unlockCodeView + = (EditText) unlockDialog.findViewById(R.id.enter_lock_code); + final TextView newPasswordLengthTracker + = (TextView) unlockDialog.findViewById(R.id.lock_code_tracker); + + unlockCodeView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, + int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + newPasswordLengthTracker.setText("(" + + unlockCodeView.getText().length() + "/32)"); + } + }); + + unlockCodeView.setOnEditorActionListener(new EditText.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + if (unlockCodeView.getText().toString().length() < 32) { + unlockCodeView.setError("Lock code must be 32 hex characters."); + return true; + } else { + return false; + } + } + return false; + } + }); + + unlockCodeView.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View view, boolean hasFocus) { + if (!hasFocus) { + String input = unlockCodeView.getText().toString(); + if (input.length() < 32 && input.length() > 0) { + unlockCodeView.setError("Lock code too short!"); + } + } + } + }); + + unlockDialog.findViewById(R.id.confirm_button).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + final String newPassword = unlockCodeView.getText().toString(); + + if (newPassword.length() < 32) { + unlockCodeView.setError( + "Please enter a 32 character lock code"); + return; + } + unlockListener.unlock(Utils.toByteArray + (unlockCodeView.getText().toString())); + unlockDialog.dismiss(); + } + }); + + unlockDialog.findViewById(R.id.exit).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + unlockListener.unlockingDismissed(); + unlockDialog.dismiss(); + } + }); + + unlockDialog.setOnKeyListener(new Dialog.OnKeyListener() { + + @Override + public boolean onKey(DialogInterface arg0, int keyCode, + KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + unlockListener.unlockingDismissed(); + unlockDialog.dismiss(); + } + return true; + } + }); + } + }); + } + + /** + * Listener interface to be called when password has been types in. + */ + public interface UnlockListener { + void unlockingDismissed(); + void unlock(byte[] unlockCode); + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UrlChangeDialog.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UrlChangeDialog.java new file mode 100644 index 0000000..66733a0 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/dialogs/UrlChangeDialog.java @@ -0,0 +1,77 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.dialogs; + +import android.app.AlertDialog; +import android.content.Context; +import android.view.View; +import android.view.WindowManager; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; + +import com.github.google.beaconfig.R; + +/** + * Dialog used to change url in a url frame. It detects when the input is wrongly formulated and + * does not allow wrong urls to be sent to the beacon. + */ +public class UrlChangeDialog { + public static void show(final Context ctx, final UrlChangeListener urlChangeListener) { + final AlertDialog editUrlDialog = new AlertDialog.Builder(ctx).show(); + editUrlDialog.setContentView(R.layout.dialog_change_url); + editUrlDialog.setCanceledOnTouchOutside(false); + + // This is needed because there are some flags being set which prevent the keyboard from + // popping up when an EditText is clicked + editUrlDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + + final EditText editUrlView + = (EditText) editUrlDialog.findViewById(R.id.edit_url); + + ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(ctx, + R.array.url_schemes, R.layout.spinner_item); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + final Spinner urlSpinner = (Spinner) editUrlDialog.findViewById(R.id.url_spinner); + urlSpinner.setAdapter(spinnerAdapter); + + editUrlDialog.findViewById(R.id.confirm_button).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + String newUrl = urlSpinner.getSelectedItem() + + editUrlView.getText().toString(); + urlChangeListener.setNewUrl(newUrl); + editUrlDialog.dismiss(); + } + }); + + editUrlDialog.findViewById(R.id.cancel_change_url).setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + editUrlDialog.dismiss(); + } + }); + } + + /** + * Listener interface to be called when password has been types in. + */ + public interface UrlChangeListener { + void setNewUrl(String newUrl); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClient.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClient.java new file mode 100644 index 0000000..e53c938 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClient.java @@ -0,0 +1,534 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.gatt; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.util.Log; + +import com.github.google.beaconfig.Constants; +import com.github.google.beaconfig.utils.Utils; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.UUID; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * Gatt Client to take care of reading and writing operations using the Gatt service. It makes + * calls to the GATT service synchronous. + */ +public class GattClient { + private static final String TAG = GattClient.class.getSimpleName(); + + // When asked to read, write, or discover services after connecting, we'll sleep the current + // thread for this long. This is HIGHLY non-scientific. I have a lose theory that the BT stack + // on some devices doesn't like being thrashed, and if the beacon responds very quickly to + // requests we can get the phone into a bad state. This seems to help, but it's really just + // cargo-cult programming. + private static final int INTER_OP_SLEEP_MILLIS = 20; + + // The amount of time we allow reads/writes to return. It looks like Android L/M will wait + // for up to 30 secs for completion, but my experience is that a disconnection happens if + // the beacon is blocking the call and won't return. + private static final int READ_WRITE_TIMEOUT_SECS = 20; + private static final int MAX_EID_SLOT_READ_ATTEMPTS = 5; + private static final int VALID_EID_SLOT_DATA_LENGTH = 14; + private BluetoothGattCharacteristic cBroadcastCapabilities; + private BluetoothGattCharacteristic cActiveSlot; + private BluetoothGattCharacteristic cAdvertisingInterval; + private BluetoothGattCharacteristic cRadioTxPower; + private BluetoothGattCharacteristic cAdvertisedTxPower; + private BluetoothGattCharacteristic cLockState; + private BluetoothGattCharacteristic cUnlock; + private BluetoothGattCharacteristic cPublicEcdhKey; + private BluetoothGattCharacteristic cEidIdentityKey; + private BluetoothGattCharacteristic cAdvSlotData; + private BluetoothGattCharacteristic cFactoryReset; + private BluetoothGattCharacteristic cRemainConnectable; + + // Callbacks in BluetoothGattCallback are delivered on a thread pool that the system owns. + // Don't try to use a newSingleThreadExecutor service here -- trying to read the Future<> + // from the executor will likely be blocked on the callback trying to use the same thread. + private ExecutorService executor = Executors.newFixedThreadPool(3); + private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { + + @Override + public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { + if (newState == BluetoothProfile.STATE_CONNECTED) { + listener.onGattConnected(); + } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { + gatt.close(); + listener.onGattDisconnected(); + } + } + + @Override + public void onServicesDiscovered(BluetoothGatt gatt, int status) { + executor.execute(new Runnable() { + @Override + public void run() { + handleServicesDiscovered(); + listener.onGattServicesDiscovered(); + } + }); + } + + @Override + public void onCharacteristicRead(final BluetoothGatt gatt, + final BluetoothGattCharacteristic characteristic, + final int status) { + executor.execute(new Runnable() { + @Override + public void run() { + byte[] data = characteristic.getValue(); + Log.d(TAG, "onCharacteristicRead for " + + GattConstants.getReadableName(characteristic) + + ", data: " + Utils.toHexString(data)); + + resultQueue.add(new GattResult(status, data)); + } + }); + } + + @Override + public void onCharacteristicWrite(final BluetoothGatt gatt, + final BluetoothGattCharacteristic characteristic, + final int status) { + executor.execute(new Runnable() { + @Override + public void run() { + byte[] data = characteristic.getValue(); + Log.d(TAG, "onCharacteristicWrite for " + + GattConstants.getReadableName(characteristic) + + ", data: " + Utils.toHexString(data)); + + resultQueue.add(new GattResult(status, data)); + } + }); + } + }; + + private final Context context; + private final String deviceAddress; + private final GattListener listener; + private BluetoothAdapter bluetoothAdapter; + private BluetoothGatt bluetoothGatt; + private boolean isEddystoneGattServicePresent = false; + private List missingCharacteristics = new ArrayList<>(); + + // Basic blocking queue of size 1. Every operation through this client is synchronous. It's the + // caller's job to chain together operations based on the success of each function implemented + // by this client. + private BlockingQueue resultQueue = new ArrayBlockingQueue<>(1); + + /** + * The activity handles the connection and disconnection events. + */ + public interface GattListener { + void onGattConnected(); + void onGattServicesDiscovered(); + void onGattDisconnected(); + } + + private class GattResult { + public final int status; + public final byte[] data; + public GattResult(int status, byte[] data) { + this.status = status; + this.data = data; + } + } + + public GattClient(Context context, String deviceAddress, GattListener listener) { + this.context = context; + this.deviceAddress = deviceAddress; + this.listener = listener; + BluetoothManager bluetoothManager = (BluetoothManager) context + .getSystemService(Context.BLUETOOTH_SERVICE); + bluetoothAdapter = bluetoothManager.getAdapter(); + } + + public boolean connect() { + if (bluetoothAdapter == null) { + Log.e(TAG, "Unable to obtain a BluetoothAdapter"); + return false; + } + + BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(deviceAddress); + if (bluetoothDevice == null) { + Log.e(TAG, "Device " + deviceAddress + " not found, unable to connect"); + return false; + } + + bluetoothGatt = bluetoothDevice.connectGatt(context, false, gattCallback); + Log.d(TAG, "Trying to create a new connection"); + return true; + } + + public void discoverServices() { + if (bluetoothGatt != null) { + Utils.sleep(INTER_OP_SLEEP_MILLIS); + bluetoothGatt.discoverServices(); + } + } + + private void handleServicesDiscovered() { + for (BluetoothGattService service : bluetoothGatt.getServices()) { + Log.d(TAG, "discovered service " + service.getUuid()); + + if (service.getUuid().equals(Constants.EDDYSTONE_CONFIGURATION_UUID.getUuid())) { + isEddystoneGattServicePresent = true; + Log.d(TAG, "this is the eddystone service"); + + for (BluetoothGattCharacteristic c : service.getCharacteristics()) { + String uuid = c.getUuid().toString(); + if (uuid.equalsIgnoreCase(GattConstants.CHAR_BROADCAST_CAPABILITIES)) { + cBroadcastCapabilities = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_ACTIVE_SLOT)) { + cActiveSlot = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_ADVERTISING_INTERVAL)) { + cAdvertisingInterval = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_RADIO_TX_POWER)) { + cRadioTxPower = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_ADVERTISED_TX_POWER)) { + cAdvertisedTxPower = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_LOCK_STATE)) { + cLockState = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_UNLOCK)) { + cUnlock = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_PUBLIC_ECDH_KEY)) { + cPublicEcdhKey = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_EID_IDENTITY_KEY)) { + cEidIdentityKey = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_ADV_SLOT_DATA)) { + cAdvSlotData = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_FACTORY_RESET)) { + cFactoryReset = c; + } else if (uuid.equalsIgnoreCase(GattConstants.CHAR_REMAIN_CONNECTABLE)) { + cRemainConnectable = c; + } + } + + Log.d(TAG, cUnlock.toString()); + Log.d(TAG, "Checking characteristics"); + + for (UUID uuid : GattConstants.CHAR_UUIDS) { + if (service.getCharacteristic(uuid) == null) { + missingCharacteristics.add(uuid); + Log.d(TAG, GattConstants.getReadableName(uuid) + " missing"); + } + } + break; + } + } + } + + public void disconnect() { + if (bluetoothGatt == null) { + return; + } + bluetoothGatt.close(); + bluetoothGatt.disconnect(); + Log.d(TAG, "Just disconnected."); + bluetoothGatt = null; + } + + public boolean isEddystoneGattServicePresent() { + return isEddystoneGattServicePresent; + } + + public List getMissingCharacteristics() { + return missingCharacteristics; + } + + private class GattCallable implements Callable { + @Override + public GattResult call() throws Exception { + try { + return resultQueue.take(); + } catch (InterruptedException e) { + Log.d(TAG, "InterruptedException, returning error result"); + return new GattResult(-1, null); + } + } + } + + // Read and writes of raw data for each characteristic. + public byte[] readBroadcastCapabilities() throws GattClientException, GattOperationException { + return read(cBroadcastCapabilities); + } + + public byte[] readActiveSlot() throws GattClientException, GattOperationException { + return read(cActiveSlot); + } + + public byte[] writeActiveSlot(int slot) throws GattClientException, GattOperationException { + byte[] data = new byte[] {(byte) slot}; + return write(cActiveSlot, data); + } + + public byte[] readAdvertisingInterval() throws GattClientException, GattOperationException { + return read(cAdvertisingInterval); + } + + public byte[] writeAdvertisingInterval(int millis) + throws GattClientException, GattOperationException { + byte[] data = Utils.toTwoByteArray(millis); + return write(cAdvertisingInterval, data); + } + + public byte[] readRadioTxPower() throws GattClientException, GattOperationException { + return read(cRadioTxPower); + } + + public byte[] writeRadioTxPower(int dbm) throws GattClientException, GattOperationException { + byte[] data = new byte[] {(byte) dbm}; + return write(cRadioTxPower, data); + } + + public byte[] readAdvertisedTxPower() throws GattClientException, GattOperationException { + return read(cAdvertisedTxPower); + } + + public byte[] writeAdvertisedTxPower(int dbm) + throws GattClientException, GattOperationException { + byte[] data = new byte[] {(byte) dbm}; + return write(cAdvertisedTxPower, data); + } + + public byte[] readLockState() throws GattClientException, GattOperationException { + return read(cLockState); + } + + public byte[] writeLockState(byte[] data) throws GattClientException, GattOperationException { + return write(cLockState, data); + } + + public byte[] readUnlock() throws GattClientException, GattOperationException { + return read(cUnlock); + } + + public byte[] writeUnlock(byte[] data) throws GattClientException, GattOperationException { + return write(cUnlock, data); + } + + public byte[] readPublicEcdhKey() throws GattClientException, GattOperationException { + return read(cPublicEcdhKey); + } + + public byte[] readEidIdentityKey() throws GattClientException, GattOperationException { + return read(cEidIdentityKey); + } + + public byte[] writeEidIdentityKey(byte[] data) + throws GattClientException, GattOperationException { + return write(cEidIdentityKey, data); + } + + public byte[] readAdvSlotData() throws GattClientException, GattOperationException { + byte[] result = read(cAdvSlotData); + return result; + } + + public byte[] writeAdvSlotData(byte[] data) throws GattClientException, GattOperationException { + return write(cAdvSlotData, data); + } + + public byte[] writeFactoryReset(byte[] data) + throws GattClientException, GattOperationException { + return write(cFactoryReset, data); + } + + public byte[] readRemainConnectable() throws GattClientException, GattOperationException { + return read(cRemainConnectable); + } + + public byte[] writeRemainConnectable(byte[] data) + throws GattClientException, GattOperationException { + return write(cRemainConnectable, data); + } + + private byte[] read(BluetoothGattCharacteristic characteristic) + throws GattClientException, GattOperationException { + Utils.sleep(INTER_OP_SLEEP_MILLIS); + Log.d(TAG, "reading " + GattConstants.getReadableName(characteristic)); + if (bluetoothGatt != null) { + bluetoothGatt.readCharacteristic(characteristic); + return getResult(characteristic, GattOperation.OP_READ); + } else { + throw new GattClientException(characteristic.getUuid(), GattOperation.OP_READ, + GattClientException.ERROR_GATT_DISCONNECTED, + "Bluetooth Gatt disconnected unexpectedly"); + } + } + + private byte[] write(BluetoothGattCharacteristic characteristic, byte[] data) + throws GattClientException, GattOperationException { + Utils.sleep(INTER_OP_SLEEP_MILLIS); + Log.d(TAG, "writing " + GattConstants.getReadableName(characteristic) + + ", data: " + Utils.toHexString(data)); + characteristic.setValue(data); + + if (bluetoothGatt != null) { + bluetoothGatt.writeCharacteristic(characteristic); + return getResult(characteristic, GattOperation.OP_WRITE); + } else { + throw new GattClientException(characteristic.getUuid(), GattOperation.OP_WRITE, + GattClientException.ERROR_GATT_DISCONNECTED, + "Bluetooth Gatt disconnected unexpectedly"); + } + } + + private byte[] getResult(BluetoothGattCharacteristic c, int op) + throws GattClientException, GattOperationException { + Future future = executor.submit(new GattCallable()); + try { + GattResult result = future.get(READ_WRITE_TIMEOUT_SECS, TimeUnit.SECONDS); + Log.d(TAG, "future returned status " + result.status + + ", data " + Utils.toHexString(result.data)); + + if (result.status != BluetoothGatt.GATT_SUCCESS) { + throw new GattOperationException(c.getUuid(), op, result.status, result.data); + } + + return result.data; + } catch (InterruptedException e) { + Log.d(TAG, "InterruptedException in future.get, returning error result"); + throw new GattClientException(c.getUuid(), op, + GattOperationException.ERROR_INTERRUPTED); + } catch (ExecutionException e) { + Log.d(TAG, "ExecutionException in future.get, returning error result"); + throw new GattClientException(c.getUuid(), op, GattOperationException.ERROR_EXECUTION); + } catch (TimeoutException e) { + Log.d(TAG, "TimeoutException in future.get, returning error result"); + throw new GattClientException(c.getUuid(), op, GattOperationException.ERROR_TIMEOUT); + } + } + + /** + * Convenience methods. + * Simple struct representing a parsed slot data byte array for an EID slot. + */ + public class EidSlotData { + public final byte exponent; + public final long clock; + public final byte[] eid; + public EidSlotData(final byte exponent, final long clock, final byte[] eid) { + this.exponent = exponent; + this.clock = clock; + this.eid = eid; + } + + @Override + public String toString() { + return String.format(Locale.UK, "exponent=%d, clock=%d, eid=%s", + (int) exponent, (int) clock, Utils.toHexString(eid)); + } + } + + /** + * This is a special-case of readAdvSlotData(). Some devices are slow about their cryptographic + * computations and can take a while to return the EID data. Instead of blocking on the read + * call, they either return a zeroed EID value, or an incorrect length. We deal with these cases + * here by checking and re-reading after a pause, giving up if necessary. + */ + public EidSlotData readEidSlotData() throws GattClientException, GattOperationException { + int attempt = 1; + Log.d(TAG, "readEidSlotData attempt " + attempt); + byte[] data = readAdvSlotData(); + while (data.length != VALID_EID_SLOT_DATA_LENGTH || isEidValueZeroed(data)) { + if (attempt == MAX_EID_SLOT_READ_ATTEMPTS) { + Log.d(TAG, "readEidSlotData max attempts of " + + MAX_EID_SLOT_READ_ATTEMPTS + + " reached, giving up"); + throw new GattClientException(cAdvSlotData.getUuid(), GattClientException.OP_READ, + -1, "Repeated reads from slot data characteristic returned invalid data. " + + "Expected 14 bytes, last value read was " + Utils.toHexString(data)); + } + attempt++; + Log.d(TAG, "readEidSlotData, data is wrong length or zeroed, " + + "retrying after 2 secs, attempt " + attempt); + Utils.sleep(2000); + data = readAdvSlotData(); + } + + ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.BIG_ENDIAN); + byte frameType = buf.get(); + + if (frameType != Constants.EID_FRAME_TYPE) { + throw new GattClientException(cAdvSlotData.getUuid(), GattClientException.OP_READ, -1, + "Reading EID slot returned invalid frame type. " + + "Expected 0x30, got " + frameType); + } + byte exponent = buf.get(); + + // We want an unsigned int, so get the long and mask it. + long clock = (long) buf.getInt() & 0xffffffffL; + byte[] eidValue = new byte[8]; + buf.get(eidValue); + return new EidSlotData(exponent, clock, eidValue); + } + + // Caller guarantees length is 14. + private boolean isEidValueZeroed(final byte[] eidSlotData) { + byte[] value = new byte[8]; + System.arraycopy(eidSlotData, 6, value, 0, 8); + return Utils.isZeroed(value); + } + + // Convenience methods. + public void performFactoryReset() throws GattClientException, GattOperationException { + writeFactoryReset(new byte[]{0x0B}); + } + + public boolean unlock(byte[] unlockCode) { + Log.d(TAG, "Starting unlocking..."); + try { + byte[] readUnlockResult = readUnlock(); + byte[] encrypted = Utils.aes128Encrypt(readUnlockResult, unlockCode); + if (encrypted == null) { + return false; + } + + writeUnlock(encrypted); + byte[] lockState = readLockState(); + return lockState != null + && lockState.length > 0 + && lockState[0] == GattConstants.LOCK_STATE_UNLOCKED; + } catch (GattClientException | GattOperationException e) { + Log.e(TAG, "Failed to unlock beacon", e); + return false; + } + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClientException.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClientException.java new file mode 100644 index 0000000..3765401 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattClientException.java @@ -0,0 +1,79 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.gatt; + +import java.util.Locale; +import java.util.UUID; +/** + * Basic wrapper for an error in the GattClient. + */ +public class GattClientException extends Exception { + // Supported operations. + public static final int OP_READ = 1; + public static final int OP_WRITE = 2; + // Errors beyond the canonical errors in the BluetoothGatt class. + public static final int ERROR_INTERRUPTED = -1; + public static final int ERROR_EXECUTION = -2; + public static final int ERROR_TIMEOUT = -3; + public static final int ERROR_GATT_DISCONNECTED = -4; + public final UUID uuid; + public final int op; + public final int error; + public final String customMessage; + /** + * Wraps a GATT client error that prevented the GATT operation from completing. + * + * @param uuid the UUID of the characteristic that triggered the error. + * @param op the operation that triggered the error, defined by one of the constants in + * the GattOperation class. + * @param error maps to one of the ERROR_XXX constants in this class. The data field will be + * null since the GATT operation did not complete. + * @param customMessage if not null, provides a custom message to return in getMessage() + */ + public GattClientException(UUID uuid, int op, int error, String customMessage) { + this.uuid = uuid; + this.op = op; + this.error = error; + this.customMessage = customMessage; + } + /** + * Wraps a GATT client error that prevented the GATT operation from completing. + * + * @param uuid the UUID of the characteristic that triggered the error. + * @param op the operation that triggered the error, defined by one of the constants in + * the GattOperation class. + * @param error maps to one of the ERROR_XXX constants in this class. The data field will be + * null since the GATT operation did not complete. + */ + public GattClientException(UUID uuid, int op, int error) { + this(uuid, op, error, null); + } + @Override + public String getMessage() { + String errStr = error == ERROR_INTERRUPTED + ? "InterruptionException" : error == ERROR_EXECUTION + ? "ExecutionException" : "TimeoutException"; + String opStr = op == GattOperation.OP_READ ? "reading" : "writing"; + String message = String.format(Locale.UK, + "Client error %s when %s characteristic %s", + errStr, + opStr, + GattConstants.getReadableName(uuid)); + if (customMessage != null) { + message += "Detail: " + customMessage; + } + return message; + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattConstants.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattConstants.java new file mode 100644 index 0000000..6166d78 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattConstants.java @@ -0,0 +1,135 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.gatt; + +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +/** + * Constants for the Eddystone GATT configuration service. + */ +public class GattConstants { + private GattConstants() {} + private static final String UNKNOWN_NAME = "Unknown characteristic"; + private static HashMap attributes = new HashMap<>(); + public static final String ES_CONFIGURATION_SERVICE_UUID + = "a3c87500-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_BROADCAST_CAPABILITIES = "a3c87501-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_ACTIVE_SLOT = "a3c87502-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_ADVERTISING_INTERVAL = "a3c87503-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_RADIO_TX_POWER = "a3c87504-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_ADVERTISED_TX_POWER = "a3c87505-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_LOCK_STATE = "a3c87506-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_UNLOCK = "a3c87507-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_PUBLIC_ECDH_KEY = "a3c87508-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_EID_IDENTITY_KEY = "a3c87509-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_ADV_SLOT_DATA = "a3c8750a-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_FACTORY_RESET = "a3c8750b-8ed3-4bdf-8a39-a01bebede295"; + public static final String CHAR_REMAIN_CONNECTABLE = "a3c8750c-8ed3-4bdf-8a39-a01bebede295"; + public static final List CHAR_UUIDS = new ArrayList<>(); + static { + CHAR_UUIDS.add(UUID.fromString(CHAR_BROADCAST_CAPABILITIES)); + CHAR_UUIDS.add(UUID.fromString(CHAR_ACTIVE_SLOT)); + CHAR_UUIDS.add(UUID.fromString(CHAR_ADVERTISING_INTERVAL)); + CHAR_UUIDS.add(UUID.fromString(CHAR_RADIO_TX_POWER)); + CHAR_UUIDS.add(UUID.fromString(CHAR_ADVERTISED_TX_POWER)); + CHAR_UUIDS.add(UUID.fromString(CHAR_LOCK_STATE)); + CHAR_UUIDS.add(UUID.fromString(CHAR_UNLOCK)); + CHAR_UUIDS.add(UUID.fromString(CHAR_PUBLIC_ECDH_KEY)); + CHAR_UUIDS.add(UUID.fromString(CHAR_EID_IDENTITY_KEY)); + CHAR_UUIDS.add(UUID.fromString(CHAR_ADV_SLOT_DATA)); + CHAR_UUIDS.add(UUID.fromString(CHAR_FACTORY_RESET)); + CHAR_UUIDS.add(UUID.fromString(CHAR_REMAIN_CONNECTABLE)); + } + static { + attributes.put(ES_CONFIGURATION_SERVICE_UUID, "Eddystone Configuration Service"); + attributes.put(CHAR_BROADCAST_CAPABILITIES, "Broadcast Capabilities"); + attributes.put(CHAR_ACTIVE_SLOT, "Active Slot"); + attributes.put(CHAR_ADVERTISING_INTERVAL, "Advertising Interval"); + attributes.put(CHAR_RADIO_TX_POWER, "Radio Tx Power"); + attributes.put(CHAR_ADVERTISED_TX_POWER, "(Advanced) Advertised Tx Power"); + attributes.put(CHAR_LOCK_STATE, "Lock State"); + attributes.put(CHAR_UNLOCK, "Unlock"); + attributes.put(CHAR_PUBLIC_ECDH_KEY, "Public ECDH Key"); + attributes.put(CHAR_EID_IDENTITY_KEY, "EID Identity Key"); + attributes.put(CHAR_ADV_SLOT_DATA, "ADV Slot Data"); + attributes.put(CHAR_FACTORY_RESET, "(Advanced) Factory reset"); + attributes.put(CHAR_REMAIN_CONNECTABLE, "(Advanced) Remain Connectable"); + } + public static final byte CAPABILITIES_IS_VARIABLE_ADV_SUPPORTED = 0x01; + public static final byte CAPABILITIES_IS_VARIABLE_TX_POWER_SUPPORTED = 0x02; + public static final byte CAPABILITIES_IS_UID_FRAME_SUPPORTED = 0x0001; + public static final byte CAPABILITIES_IS_URL_FRAME_SUPPORTED = 0x0002; + public static final byte CAPABILITIES_IS_TLM_FRAME_SUPPORTED = 0x0004; + public static final byte CAPABILITIES_IS_EID_FRAME_SUPPORTED = 0x0008; + public static final byte LOCK_STATE_UNKNOWN = Byte.MIN_VALUE; + public static final byte LOCK_STATE_LOCKED = 0x00; + public static final byte LOCK_STATE_UNLOCKED = 0x01; + public static final byte LOCK_STATE_UNLOCKED_AND_AUTOMATIC_RELOCK_DISABLED = 0x02; + public static String lockStateAsString(byte lockState) { + switch (lockState) { + case LOCK_STATE_LOCKED: + return "locked"; + case LOCK_STATE_UNLOCKED: + return "unlocked"; + case LOCK_STATE_UNLOCKED_AND_AUTOMATIC_RELOCK_DISABLED: + return "unlocked, autolock disabled"; + default: return "unknown lock state"; + } + } + public static final byte REMAIN_CONNECTABLE_NOT_SUPPORTED = 0x00; + public static String getReadableName(String uuid) { + String name = attributes.get(uuid); + return name == null ? UNKNOWN_NAME : name; + } + public static String getReadableName(UUID uuid) { + return getReadableName(uuid.toString()); + } + public static String getReadableName(BluetoothGattCharacteristic characteristic) { + return getReadableName(characteristic.getUuid()); + } + public static String getStatusString(int status) { + switch (status) { + case BluetoothGatt.GATT_SUCCESS: return "GATT_SUCCESS"; + case BluetoothGatt.GATT_READ_NOT_PERMITTED: return "READ_NOT_PERMITTED"; + case BluetoothGatt.GATT_WRITE_NOT_PERMITTED: return "WRITE_NOT_PERMITTED"; + case BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION: + return "INSUFFICIENT_AUTHENTICATION"; + case BluetoothGatt.GATT_REQUEST_NOT_SUPPORTED: return "REQUEST_NOT_SUPPORTED"; + case BluetoothGatt.GATT_INVALID_OFFSET: return "INVALID_OFFSET"; + case BluetoothGatt.GATT_INVALID_ATTRIBUTE_LENGTH: return "INVALID_ATTRIBUTE_LENGTH"; + case BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION: return "INSUFFICIENT_ENCRYPTION"; + case BluetoothGatt.GATT_CONNECTION_CONGESTED: return "CONNECTION_CONGESTED"; + case BluetoothGatt.GATT_FAILURE: return "GATT_FAILURE"; + // Not first-class errors in Android, but iOS calls them out: + // https://developer.apple.com/library/mac/documentation/CoreBluetooth/Reference/ + // CoreBluetooth_Constants/#//apple_ref/c/tdef/CBATTError + case 1: return "INVALID_HANDLE"; + case 4: return "INVALID_PDU"; + case 8: return "INSUFFICIENT_AUTHORIZATION"; + case 9: return "PREPARE_QUEUE_FULL"; + case 10: return "ATTRIBUTE_NOT_FOUND"; + case 11: return "ATTRIBUTE_NOT_LONG"; + case 12: return "INSUFFICIENT_ENCRYPTION_KEY_SIZE"; + case 14: return "UNLIKELY_ERROR"; + case 16: return "UNSUPPORTED_GROUP_TYPE"; + case 17: return "INSUFFICIENT_RESOURCES"; + default: return "unknown error status: " + status; + } + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperation.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperation.java new file mode 100644 index 0000000..6fe64f6 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperation.java @@ -0,0 +1,24 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.gatt; + +/** + * Supported GATT operations. + */ +public class GattOperation { + private GattOperation() {} + public static final int OP_READ = 1; + public static final int OP_WRITE = 2; +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperationException.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperationException.java new file mode 100644 index 0000000..75e2937 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/gatt/GattOperationException.java @@ -0,0 +1,61 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.github.google.beaconfig.gatt; + +import com.github.google.beaconfig.utils.Utils; + +import java.util.Locale; +import java.util.UUID; + +/** + * Basic wrapper for an error during a GATT operation. + */ +public class GattOperationException extends Exception { + // Errors beyond the canonical errors in the BluetoothGatt class. + public static final int ERROR_INTERRUPTED = -1; + public static final int ERROR_EXECUTION = -2; + public static final int ERROR_TIMEOUT = -3; + public final UUID uuid; + public final int op; + public final int status; + public final byte[] data; + /** + * Wraps a GATT error from a completed operation that returned a canonical error code. + * @param uuid the UUID of the characteristic that triggered the error. + * @param op the operation that triggered the error, defined by one of the constants in + * the GattOperation class. + * @param status maps to one of the constants defined in the platform's BluetoothGatt class. + * @param data the data returned by the operation. + */ + public GattOperationException(UUID uuid, int op, int status, byte[] data) { + this.uuid = uuid; + this.op = op; + this.status = status; + this.data = data; + } + @Override + public String getMessage() { + String opStr = op == GattOperation.OP_READ ? "reading" : "writing"; + String dataStr + = data == null ? "null" : data.length == 0 ? "[empty]" : Utils.toHexString(data); + String message = String.format(Locale.UK, + "GATT Error %s when %s characteristic %s, data: %s", + GattConstants.getStatusString(status), + opStr, + GattConstants.getReadableName(uuid), + dataStr); + return message; + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/BroadcastCapabilities.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/BroadcastCapabilities.java new file mode 100644 index 0000000..7119a2d --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/BroadcastCapabilities.java @@ -0,0 +1,97 @@ +package com.github.google.beaconfig.utils; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import com.github.google.beaconfig.gatt.GattConstants; + +/** + * Class to parse and hold all the broadcast capabilities of a beacon + */ +public class BroadcastCapabilities { + private int version; + private int maxSupportedTotalSlots; + private int maxSupportedEidSlots; + private byte[] supportedTxPowers; + + private boolean isVariableTxPowerSupported; + private boolean isVariableAdvSupported; + + private boolean isUidSupported; + private boolean isUrlSupported; + private boolean isTlmSupported; + private boolean isEidSupported; + + public BroadcastCapabilities(byte[] data) { + ByteBuffer buf = ByteBuffer.wrap(data); + version = buf.get(); + maxSupportedTotalSlots = (int) buf.get(); + maxSupportedEidSlots = (int) buf.get(); + + byte capabilitiesBitField = buf.get(); + isVariableAdvSupported = + (capabilitiesBitField & GattConstants.CAPABILITIES_IS_VARIABLE_ADV_SUPPORTED) + == GattConstants.CAPABILITIES_IS_VARIABLE_ADV_SUPPORTED; + isVariableTxPowerSupported = + (capabilitiesBitField + & GattConstants.CAPABILITIES_IS_VARIABLE_TX_POWER_SUPPORTED) + == GattConstants.CAPABILITIES_IS_VARIABLE_TX_POWER_SUPPORTED; + + short supportedFrameTypesBitField = buf.getShort(); + isUidSupported = + (supportedFrameTypesBitField & GattConstants.CAPABILITIES_IS_UID_FRAME_SUPPORTED) + == GattConstants.CAPABILITIES_IS_UID_FRAME_SUPPORTED; + isUrlSupported = + (supportedFrameTypesBitField & GattConstants.CAPABILITIES_IS_URL_FRAME_SUPPORTED) + == GattConstants.CAPABILITIES_IS_URL_FRAME_SUPPORTED; + isTlmSupported = + (supportedFrameTypesBitField & GattConstants.CAPABILITIES_IS_TLM_FRAME_SUPPORTED) + == GattConstants.CAPABILITIES_IS_TLM_FRAME_SUPPORTED; + isEidSupported = + (supportedFrameTypesBitField & GattConstants.CAPABILITIES_IS_EID_FRAME_SUPPORTED) + == GattConstants.CAPABILITIES_IS_EID_FRAME_SUPPORTED; + + supportedTxPowers = Arrays.copyOfRange(data, buf.position(), data.length); + Arrays.sort(supportedTxPowers); + } + + public int getVersion() { + return version; + } + + public int getMaxSupportedTotalSlots() { + return maxSupportedTotalSlots; + } + + public int getMaxSupportedEidSlots() { + return maxSupportedEidSlots; + } + + public byte[] getSupportedTxPowers() { + return supportedTxPowers; + } + + public boolean isVariableTxPowerSupported() { + return isVariableTxPowerSupported; + } + + public boolean isVariableAdvSupported() { + return isVariableAdvSupported; + } + + public boolean isUidSupported() { + return isUidSupported; + } + + public boolean isUrlSupported() { + return isUrlSupported; + } + + public boolean isTlmSupported() { + return isTlmSupported; + } + + public boolean isEidSupported() { + return isEidSupported; + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/SlotDataManager.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/SlotDataManager.java new file mode 100644 index 0000000..549bc64 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/SlotDataManager.java @@ -0,0 +1,212 @@ +package com.github.google.beaconfig.utils; + +import android.util.Log; + +import java.util.Arrays; + +import com.github.google.beaconfig.Constants; + +/** + * This class is composed of static methods to be used to either parse information from given + * slotData or to build slotData from given strings and integers. + */ +public class SlotDataManager { + private static final String TAG = SlotDataManager.class.getSimpleName(); + + public static byte getFrameTypeFromSlotData(byte[] slotData) { + return slotData[0]; + } + + /** + * @param slotData has to be the slot data read from a UID frame of a beacon + * @return namespace String parsed from the slot data byte array + */ + public static String getNamespaceFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.UID_FRAME_TYPE) { + Log.d(TAG, "Attempt to get namespace from a non-uid frame failed."); + return ""; + } + byte[] namespaceBytes = Arrays.copyOfRange(slotData, 2, 12); + return Utils.byteArrayToHexString(namespaceBytes); + } + + /**@param writeSlotData has to be the byte array to be written to a beacon slot in order to + * configure it as a UID slot + * @return namespace String parsed from the write byte array + */ + public static String getNamespaceFromWriteByteArray(byte[] writeSlotData) { + if (getFrameTypeFromSlotData(writeSlotData) != Constants.UID_FRAME_TYPE) { + Log.d(TAG, "Attempt to get namespace from a non-uid frame failed."); + return ""; + } + byte[] namespaceBytes = Arrays.copyOfRange(writeSlotData, 1, 11); + return Utils.byteArrayToHexString(namespaceBytes); + } + + /** + * @param slotData has to be the slot data of a UID configured slot of a beacon + * @return instance String parsed from the slot data byte array + */ + public static String getInstanceFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.UID_FRAME_TYPE) { + Log.d(TAG, "Attempt to get instance from a non-uid frame failed."); + return ""; + } + byte[] instanceBytes = Arrays.copyOfRange(slotData, 12, 18); + return Utils.byteArrayToHexString(instanceBytes); + } + + /** + * @param writeSlotData has to be the byte array to be written to a beacon slot in order to + * configure it as a UID slot + * @return namespace String parsed from the write byte array + */ + public static String getInstanceFromWriteByteArray(byte[] writeSlotData) { + if (getFrameTypeFromSlotData(writeSlotData) != Constants.UID_FRAME_TYPE) { + Log.d(TAG, "Attempt to get instance from a non-uid frame failed."); + return ""; + } + byte[] instanceBytes = Arrays.copyOfRange(writeSlotData, 11, 17); + return Utils.byteArrayToHexString(instanceBytes); + } + + /** + * @param slotData has to be the slot data of a URL configured slot of a beacon + * @return url as a String parsed from the slot data byte array + */ + public static String getUrlFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.URL_FRAME_TYPE) { + Log.d(TAG, "Attempt to get URL from a non-url frame failed."); + return ""; + } + return URLEncodeDecoder.decodeUrlFromUrlBytes( + Arrays.copyOfRange(slotData, 2, slotData.length)); + } + + /** + * @param writeSlotData has to be the byte array to be written to a beacon slot in order to + * configure it as a URL slot + * @return url as a String parsed from the write byte array + */ + public static String getUrlFromWriteByteArray(byte[] writeSlotData) { + if (getFrameTypeFromSlotData(writeSlotData) != Constants.URL_FRAME_TYPE) { + Log.d(TAG, "Attempt to get URL from a non-url frame failed."); + return ""; + } + return URLEncodeDecoder.decodeUrlFromUrlBytes( + Arrays.copyOfRange(writeSlotData, 1, writeSlotData.length)); + } + + /** + * @param slotData has to be the slot data of a TLM configured slot of a beacon + * @return version parsed from the slot data byte array + */ + public static byte getVersionFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.TLM_FRAME_TYPE) { + Log.d(TAG, "Attempt to get version from a non-tlm frame failed."); + return 0; + } + return slotData[1]; + } + + /** + * @param slotData has to be the slot data of a TLM configured slot of a beacon + * @return voltage parsed from the slot data byte array + */ + public static short getVoltageFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.TLM_FRAME_TYPE) { + Log.d(TAG, "Attempt to get voltage from a non-tlm frame failed."); + return 0; + } + return (short) (((slotData[2] & 0xff) << 8) | (slotData[3] & 0xff)); + } + + /** + * @param slotData has to be the slot data of a TLM configured slot of a beacon + * @return temperature parsed from the slot data byte array + */ + public static float getTemperatureFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.TLM_FRAME_TYPE) { + Log.d(TAG, "Attempt to get temperature from a non-tlm frame failed."); + return 0; + } + byte tempIntegral = slotData[4]; + int tempFractional = (slotData[5] & 0xff); + return tempIntegral + (tempFractional / 256.0f); + } + + /** + * @param slotData has to be the slot data of a TLM configured slot of a beacon + * @return advertising PDU count parsed from the slot data byte array + */ + public static int getAdvertisingPDUCountFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.TLM_FRAME_TYPE) { + Log.d(TAG, "Attempt to get advertising PDU count from a non-tlm frame failed."); + return 0; + } + return ((slotData[6] & 0xff) << 24) + | ((slotData[7] & 0xff) << 16) + | ((slotData[8] & 0xff) << 8) + | (slotData[9] & 0xff); + } + + /** + * @param slotData TLM slot data read from beacon + * @return time since on in milliseconds + */ + public static int getTimeSinceOnFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.TLM_FRAME_TYPE) { + Log.d(TAG, "Attempt to get time since on from a non-tlm frame failed."); + return 0; + } + return ((slotData[10] & 0xff) << 24) + | ((slotData[11] & 0xff) << 16) + | ((slotData[12] & 0xff) << 8) + | (slotData[13] & 0xff); + } + + public static String getEphemeralIdFromSlotData(byte[] slotData) { + if (getFrameTypeFromSlotData(slotData) != Constants.EID_FRAME_TYPE) { + Log.d(TAG, "Attempt to get ephemeral id from a non-eid frame failed."); + return ""; + } + return Utils.byteArrayToHexString(Arrays.copyOfRange(slotData, 2, 10)); + } + + + public static byte[] buildNewUidSlotData(String namespace, String instance) { + byte[] newUidSlotData = new byte[17]; + + newUidSlotData[0] = Constants.UID_FRAME_TYPE; + + if (namespace != null && namespace.length() == 20) { + byte[] namespaceBytes = Utils.toByteArray(namespace); + newUidSlotData = Utils.rewriteBytes(newUidSlotData, 1, 10, namespaceBytes); + } + + if (instance != null && instance.length() == 12) { + byte[] instanceBytes = Utils.toByteArray(instance); + newUidSlotData = Utils.rewriteBytes(newUidSlotData, 11, 6, instanceBytes); + } + + return newUidSlotData; + } + + public static byte[] buildNewUrlSlotData(String newUrl) { + byte[] urlBytes = URLEncodeDecoder.encodeUri(newUrl); + byte[] newSlotData = new byte[urlBytes.length + 1]; + newSlotData[0] = Constants.URL_FRAME_TYPE; + newSlotData = Utils.rewriteBytes(newSlotData, 1, urlBytes.length, urlBytes); + return newSlotData; + } + + public static byte[] buildNewTlmSlotData() { + byte[] newSlotData = new byte[1]; + newSlotData[0] = Constants.TLM_FRAME_TYPE; + return newSlotData; + } + + public static byte[] buildNewEidSlotData() { + return new byte[0]; + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/URLEncodeDecoder.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/URLEncodeDecoder.java new file mode 100644 index 0000000..a381e88 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/URLEncodeDecoder.java @@ -0,0 +1,195 @@ +package com.github.google.beaconfig.utils; + +import android.util.Log; +import android.util.SparseArray; +import android.webkit.URLUtil; +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Locale; +import java.util.UUID; + +/** + * Manages decoding of URL from a url service data. + */ +public class URLEncodeDecoder { + private static final String TAG = URLEncodeDecoder.class.getSimpleName(); + + private static final SparseArray URI_SCHEMES = new SparseArray() {{ + put((byte) 0, "http://www."); + put((byte) 1, "https://www."); + put((byte) 2, "http://"); + put((byte) 3, "https://"); + put((byte) 4, "urn:uuid:"); + }}; + + private static final SparseArray URL_CODES = new SparseArray() {{ + put((byte) 0, ".com/"); + put((byte) 1, ".org/"); + put((byte) 2, ".edu/"); + put((byte) 3, ".net/"); + put((byte) 4, ".info/"); + put((byte) 5, ".biz/"); + put((byte) 6, ".gov/"); + put((byte) 7, ".com"); + put((byte) 8, ".org"); + put((byte) 9, ".edu"); + put((byte) 10, ".net"); + put((byte) 11, ".info"); + put((byte) 12, ".biz"); + put((byte) 13, ".gov"); + }}; + + public static String decodeUrlFromUrlBytes(byte[] serviceData) { + if (serviceData == null || (serviceData != null && serviceData.length == 0)) { + return null; + } + StringBuilder url = new StringBuilder(); + int offset = 0; + byte b = serviceData[offset++]; + String scheme = URI_SCHEMES.get(b); + if (scheme != null) { + url.append(scheme); // too cramped in UI to show scheme. + if (URLUtil.isNetworkUrl(scheme)) { + return decodeUrl(serviceData, offset, url); + } else if ("urn:uuid:".equals(scheme)) { + return decodeUrnUuid(serviceData, offset, url); + } + } + return url.toString(); + } + + public static String decodeUrl(byte[] serviceData, int offset, StringBuilder urlBuilder) { + while (offset < serviceData.length) { + byte b = serviceData[offset++]; + String code = URL_CODES.get(b); + if (code != null) { + urlBuilder.append(code); + } else { + urlBuilder.append((char) b); + } + } + return urlBuilder.toString(); + } + + static String decodeUrnUuid(byte[] serviceData, int offset, StringBuilder urnBuilder) { + ByteBuffer bb = ByteBuffer.wrap(serviceData); + // UUIDs are ordered as byte array, which means most significant first + bb.order(ByteOrder.BIG_ENDIAN); + long mostSignificantBytes, leastSignificantBytes; + try { + bb.position(offset); + mostSignificantBytes = bb.getLong(); + leastSignificantBytes = bb.getLong(); + } catch (BufferUnderflowException e) { + Log.d(TAG, "Decoding UrnUuid failed."); + return null; + } + UUID uuid = new UUID(mostSignificantBytes, leastSignificantBytes); + urnBuilder.append(uuid.toString()); + return urnBuilder.toString(); + } + + /** + * Creates the Uri string with embedded expansion codes. + * + * @param uri to be encoded + * @return the Uri string with expansion codes. + */ + public static byte[] encodeUri(String uri) { + if (uri.length() == 0) { + return new byte[0]; + } + ByteBuffer bb = ByteBuffer.allocate(uri.length()); + // UUIDs are ordered as byte array, which means most significant first + bb.order(ByteOrder.BIG_ENDIAN); + int position = 0; + + // Add the byte code for the scheme or return null if none + Byte schemeCode = encodeUriScheme(uri); + if (schemeCode == null) { + return null; + } + String scheme = URI_SCHEMES.get(schemeCode); + bb.put(schemeCode); + position += scheme.length(); + + if (URLUtil.isNetworkUrl(scheme)) { + return encodeUrl(uri, position, bb); + } else if ("urn:uuid:".equals(scheme)) { + return encodeUrnUuid(uri, position, bb); + } + return null; + } + + private static Byte encodeUriScheme(String uri) { + String lowerCaseUri = uri.toLowerCase(Locale.ENGLISH); + for (int i = 0; i < URI_SCHEMES.size(); i++) { + // get the key and value. + int key = URI_SCHEMES.keyAt(i); + String value = URI_SCHEMES.valueAt(i); + if (lowerCaseUri.startsWith(value)) { + return (byte) key; + } + } + return null; + } + + private static byte[] encodeUrl(String url, int position, ByteBuffer bb) { + while (position < url.length()) { + byte expansion = findLongestExpansion(url, position); + if (expansion >= 0) { + bb.put(expansion); + position += URL_CODES.get(expansion).length(); + } else { + bb.put((byte) url.charAt(position++)); + } + } + return byteBufferToArray(bb); + } + + private static byte[] encodeUrnUuid(String urn, int position, ByteBuffer bb) { + String uuidString = urn.substring(position, urn.length()); + UUID uuid; + try { + uuid = UUID.fromString(uuidString); + } catch (IllegalArgumentException e) { + Log.w("TAG", "encodeUrnUuid invalid urn:uuid format - " + urn); + return null; + } + // UUIDs are ordered as byte array, which means most significant first + bb.order(ByteOrder.BIG_ENDIAN); + bb.putLong(uuid.getMostSignificantBits()); + bb.putLong(uuid.getLeastSignificantBits()); + return byteBufferToArray(bb); + } + + /** + * Finds the longest expansion from the uri at the current position. + * + * @param uriString the Uri + * @param pos start position + * @return an index in URI_MAP or 0 if none. + */ + private static byte findLongestExpansion(String uriString, int pos) { + byte expansion = -1; + int expansionLength = 0; + for (int i = 0; i < URL_CODES.size(); i++) { + // get the key and value. + int key = URL_CODES.keyAt(i); + String value = URL_CODES.valueAt(i); + if (value.length() > expansionLength && uriString.startsWith(value, pos)) { + expansion = (byte) key; + expansionLength = value.length(); + } + } + return expansion; + } + + private static byte[] byteBufferToArray(ByteBuffer bb) { + byte[] bytes = new byte[bb.position()]; + bb.rewind(); + bb.get(bytes, 0, bytes.length); + return bytes; + } +} \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/UiUtils.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/UiUtils.java new file mode 100644 index 0000000..ce3e3db --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/UiUtils.java @@ -0,0 +1,53 @@ +package com.github.google.beaconfig.utils; + +import android.app.Activity; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +/** + * Static methods helpful throughout the program. + */ +public class UiUtils { + + public static void showToast(final Activity activity, final String message) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast toast = Toast.makeText(activity.getApplicationContext(), + message, Toast.LENGTH_SHORT); + toast.setGravity(Gravity.CENTER_VERTICAL | Gravity.BOTTOM, 0, 80); + toast.show(); + } + }); + } + + public static void makeChildrenInvisible(ViewGroup view) { + for (int i = 0; i < view.getChildCount(); i++) { + view.getChildAt(i).setVisibility(View.GONE); + } + } + + public static void enableAllChildren(View view) { + if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + View child = viewGroup.getChildAt(i); + child.setEnabled(true); + enableAllChildren(child); + } + } + } + + public static void disableAllChildren(View view) { + if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + View child = viewGroup.getChildAt(i); + child.setEnabled(false); + disableAllChildren(child); + } + } + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/Utils.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/Utils.java new file mode 100644 index 0000000..11d13fa --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/com/github/google/beaconfig/utils/Utils.java @@ -0,0 +1,266 @@ +package com.github.google.beaconfig.utils; + +import android.app.Activity; +import android.content.Context; +import android.support.annotation.NonNull; +import android.util.Log; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import com.github.google.beaconfig.BeaconConfigActivity; +import com.github.google.beaconfig.Constants; +import com.github.google.beaconfig.R; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + +/** + * Helper functions throughout the program. + */ + +public class Utils { + private static final String TAG = BeaconConfigActivity.class.getSimpleName(); + + private static final char[] HEX = "0123456789ABCDEF".toCharArray(); + + public static String byteArrayToHexString(byte[] bytes) { + if (bytes == null) { + Log.d(TAG, "Error. byteArrayToHexString() - input null"); + return ""; + } + char[] charArray = new char[bytes.length * 2]; + int charIndex = 0; + for (byte currentByte : bytes) { + charArray[charIndex++] = HEX[(currentByte >> 4) & 0x0f]; + charArray[charIndex++] = HEX[currentByte & 0x0f]; + } + return new String(charArray); + } + + public static byte[] toByteArray(String s) { + // s guaranteed valid by caller. + int len = s.length(); + byte[] bytes = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + bytes[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i + 1), 16)); + } + return bytes; + } + + public static byte[] aes128Encrypt(byte[] challenge, byte[] unlockCode) { + Cipher cipher; + try { + cipher = Cipher.getInstance("AES/ECB/NoPadding"); + } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { + Log.e(TAG, "Error constructing cipher instance", e); + return null; + } + try { + SecretKeySpec keySpec = new SecretKeySpec(unlockCode, "AES"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec); + } catch (InvalidKeyException e) { + Log.e(TAG, "Error initializing cipher instance", e); + return null; + } + byte[] ret; + try { + ret = cipher.doFinal(challenge); + } catch (IllegalBlockSizeException | BadPaddingException e) { + Log.e(TAG, "Error executing cipher", e); + return null; + } + return ret; + } + + public static String toHexString(byte[] bytes) { + if (bytes == null || bytes.length == 0) { + return ""; + } + char[] chars = new char[bytes.length * 2]; + for (int i = 0; i < bytes.length; i++) { + int c = bytes[i] & 0xFF; + chars[i * 2] = HEX[c >>> 4]; + chars[i * 2 + 1] = HEX[c & 0x0F]; + } + return new String(chars).toLowerCase(); + } + + public static byte[] toTwoByteArray(int i) { + byte[] out = new byte[2]; + out[0] = (byte) ((i >> 8) & 0xFF); + out[1] = (byte) (i & 0xFF); + return out; + } + + public static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + Log.e(TAG, "sleep interruption", e); + } + } + + public static boolean isZeroed(byte[] bytes) { + for (byte b : bytes) { + if (b != 0x00) { + return false; + } + } + return true; + } + + // Caller guarantees data is two bytes. + public static int toInt(byte[] data) { + return ((data[0] & 0xff) << 8 | data[1] & 0xff); + } + + public static boolean isHex(char c) { + return ((c >= '0') && (c <= '9')) + || ((c >= 'a') && (c <= 'f')) + || ((c >= 'A') && (c <= 'F')); + } + + public static byte findMaxValue(byte[] array) { + byte max = array[0]; + + for (byte a : array) { + if (a > max) { + max = a; + } + } + return max; + } + + public static byte findMinValue(byte[] array) { + byte max = array[0]; + + for (byte a : array) { + if (a < max) { + max = a; + } + } + return max; + } + + public static int findValueClosestTo(int value, byte[] allowedValues) { + int smallestDistance = Math.abs(allowedValues[0] - value); + int index = 0; + for (int i = 1; i < allowedValues.length; i++) { + int currDistance = Math.abs(allowedValues[i] - value); + if (currDistance < smallestDistance) { + index = i; + smallestDistance = currDistance; + } + } + return allowedValues[index]; + } + + public static byte[] rewriteBytes(byte[] original, int beginIndex, + int howMany, byte[] replaceWith) { + for (int i = beginIndex; i < beginIndex + howMany; i++) { + original[i] = replaceWith[i - beginIndex]; + } + + return original; + } + + public static String getStringFromFrameType(byte frameType) { + switch (frameType) { + case Constants.UID_FRAME_TYPE: + return Constants.UID; + + case Constants.URL_FRAME_TYPE: + return Constants.URL; + + case Constants.TLM_FRAME_TYPE: + return Constants.TLM; + + case Constants.EID_FRAME_TYPE: + return Constants.EID; + + default: + return "--"; + } + } + + public static byte getFrameTypeFromString(String frameString) { + switch (frameString) { + case Constants.UID: + return Constants.UID_FRAME_TYPE; + + case Constants.URL: + return Constants.URL_FRAME_TYPE; + + case Constants.TLM: + return Constants.TLM_FRAME_TYPE; + + case Constants.EID: + return Constants.EID_FRAME_TYPE; + + default: + return Constants.EMPTY_FRAME_TYPE; + } + } + + public static String getFrameNameFromSlotData(byte[] slotData) { + if (slotIsEmpty(slotData)) { + return "--"; + } else { + return getStringFromFrameType(slotData[0]); + } + } + + public static boolean slotIsEmpty(byte[] slotData) { + return slotData.length < 2; + } + + /** + * @param uptime has to be in milliseconds + * @return String representation rounded down to seconds, minutes, hours or days + */ + @NonNull + public static String getTimeString(int uptime) { + int uptimeSecs = uptime / 10; + String timeOn; + if (TimeUnit.SECONDS.toMinutes(uptimeSecs) == 0) { + timeOn = uptimeSecs + (uptimeSecs == 1 ? " sec" : " secs"); + } else if (TimeUnit.SECONDS.toHours(uptimeSecs) == 0) { + long uptimeMins = TimeUnit.SECONDS.toMinutes(uptimeSecs); + timeOn = uptimeMins + (uptimeMins == 1 ? " min" : " mins"); + } else if (TimeUnit.SECONDS.toDays(uptimeSecs) == 0) { + long uptimeHours = TimeUnit.SECONDS.toHours(uptimeSecs); + timeOn = uptimeHours + (uptimeHours == 1 ? " hour" : " hours"); + } else { + long uptimeDays = TimeUnit.SECONDS.toDays(uptimeSecs); + timeOn = uptimeDays + (uptimeDays == 1 ? " day" : " days"); + } + return timeOn; + } + + public static void hideKeyboard(Activity activity, View view) { + InputMethodManager imm + = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + public static String[] generateArrayWithStringValuesInRange(int min, int max) { + ArrayList arrayList = new ArrayList<>(); + for (int i = min; i < max; i++) { + arrayList.add(Integer.toString(i)); + } + String[] stringArray = new String[arrayList.size()]; + for (int i = 0; i < arrayList.size(); i++) { + stringArray[i] = arrayList.get(i); + } + return stringArray; + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/BeaconTabFragment.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/BeaconTabFragment.java new file mode 100644 index 0000000..633042d --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/BeaconTabFragment.java @@ -0,0 +1,352 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package layout; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v7.app.AlertDialog; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.SeekBar; +import android.widget.TextView; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.github.google.beaconfig.Constants; +import com.github.google.beaconfig.R; +import com.github.google.beaconfig.dialogs.ConfirmationDialog; +import com.github.google.beaconfig.utils.BroadcastCapabilities; +import com.github.google.beaconfig.utils.UiUtils; +import com.github.google.beaconfig.utils.Utils; + +/** + * Abstract class to unite common behaviour between global fragment (displaying features of the + * beacon) and slot fragments (displaying features of each particular slot of the beacon). + */ +public abstract class BeaconTabFragment extends Fragment { + public String name; + protected ConfigurationListener configurationListener; + protected ExecutorService executor; + + private String txPower; + private String advTxPower; + private String advInterval; + protected int slotNumber; + protected BroadcastCapabilities capabilities; + + private boolean txPowerChanged; + private boolean advTxPowerChanged; + private boolean advIntervalChanged; + + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + executor = Executors.newSingleThreadExecutor(); + configurationListener = (ConfigurationListener) getActivity(); + + updateInformation(getArguments()); + setHasOptionsMenu(true); + } + + /** + * Updates slot information by pulling values from the bundle. These values can be: + * - broadcast capabilities type: byte[] key: BROADCAST_CAPABILITIES + * - radio tx power type: String key: TX_POWER + * - adv tx power type: String key: ADV_POWER + * - adv interval type: String key: ADV_INTERVAL + * + * @param bundle bundle containing all the information to be updated + */ + public void updateInformation(Bundle bundle) { + byte[] data = bundle.getByteArray(Constants.BROADCAST_CAPABILITIES); + if (data != null) { + capabilities = new BroadcastCapabilities(data); + } + + String txPower = bundle.getString(Constants.TX_POWER); + if (txPower != null) { + this.txPower = txPower; + } + + String advTxPower = bundle.getString(Constants.ADV_POWER); + if (advTxPower != null) { + this.advTxPower = advTxPower; + } + + String advInterval = bundle.getString(Constants.ADV_INTERVAL); + if (advInterval != null) { + this.advInterval = advInterval; + } + } + + protected void setUpFragment(View v) { + setUpRadioTxPower(v); + setUpAdvertisedTxPower(v); + setUpAdvertisingInterval(v); + } + + /** + * Sets up the advertising tx power view. It is initially disabled. It is enabled by clicking + * on the radio button in the UI. This opens a dialog to confirm that the user really wants to + * change the advertising radio tx power. After this the advertising interval can be configured. + * A list pops up where the user can choose which value they want to be broadcast as the + * advertising tx power. + */ + private void setUpAdvertisedTxPower(final View v) { + if (advTxPower != null) { + LinearLayout advTxPowerContainer + = (LinearLayout) v.findViewById(R.id.change_adv_tx_slot); + + final TextView advTxPowerView = (TextView) v.findViewById(R.id.adv_tx_power); + advTxPowerView.setText(advTxPower); + advTxPowerView.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View view, boolean hasFocus) { + if (!hasFocus) { + String newAdvTxPower = advTxPowerView.getText().toString(); + if (newAdvTxPower.length() == 0) { + advTxPowerView.setText(advTxPower); + } + + } else { + advTxPowerChanged = true; + } + } + }); + + advTxPowerContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + advTxPowerChanged = true; + final String[] possibleValues = Utils.generateArrayWithStringValuesInRange( + Utils.findMinValue(capabilities.getSupportedTxPowers()) - 5, + Utils.findMaxValue(capabilities.getSupportedTxPowers()) + 5); + new AlertDialog.Builder(getActivity()) + .setTitle("Choose advertising tx power:") + .setItems(possibleValues, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + advTxPower = possibleValues[i]; + advTxPowerView.setText(possibleValues[i]); + } + }) + .show(); + } + }); + + UiUtils.disableAllChildren(advTxPowerContainer); + + final RadioButton enableChangeAdvTxPowerButton + = (RadioButton) v.findViewById(R.id.change_slot_adv_tx_power); + enableChangeAdvTxPowerButton.setChecked(false); + enableChangeAdvTxPowerButton.setOnClickListener(new View.OnClickListener() { + private boolean enabled = false; + @Override + public void onClick(View view) { + if (enabled) { + UiUtils.disableAllChildren(v.findViewById(R.id.change_adv_tx_slot)); + enableChangeAdvTxPowerButton.setChecked(false); + enabled = false; + } else { + ConfirmationDialog.confirm("Change Advertising Interval", "Are you sure " + + "you want to change the advertising interval of this beacon?", + "YES", "NO", getActivity(), + new ConfirmationDialog.ConfirmationListener() { + @Override + public void confirm() { + UiUtils.enableAllChildren( + v.findViewById(R.id.change_adv_tx_slot)); + enableChangeAdvTxPowerButton.setChecked(true); + enabled = true; + } + + @Override + public void cancel() { + enableChangeAdvTxPowerButton.setChecked(false); + enabled = false; + } + }); + } + } + }); + } + } + + /** + * Setting up the radio tx power component with a seek bar which reads the supported tx powers + * and only allows the user to set these. There is also a tracking TextView which shows the + * numeric representation of the tx power. + * + * @param v container for the radio tx power component. This is usually the main container in + * the tab. It has to be added to the activity before calling this method. + */ + private void setUpRadioTxPower(View v) { + if (txPower != null) { + v.findViewById(R.id.tx_power_info).setVisibility(View.VISIBLE); + + final TextView txPowerView = (TextView) v.findViewById(R.id.radio_tx_power); + txPowerView.setText(txPower); + SeekBar seekBar = (SeekBar) v.findViewById(R.id.tx_power_seek_bar); + + final byte[] allowedValues = capabilities.getSupportedTxPowers(); + final int maxValue = Utils.findMaxValue(allowedValues); + final int minValue = Utils.findMinValue(allowedValues); + + seekBar.setMax(maxValue - minValue); + seekBar.setProgress(Integer.parseInt(txPower) - minValue); + + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + int newValue; + if (allowedValues != null) { + newValue = Utils.findValueClosestTo(progress + minValue, allowedValues); + } else { + newValue = progress + minValue; + } + seekBar.setProgress(newValue - minValue); + txPowerView.setText(Integer.toString(newValue)); + BeaconTabFragment.this.txPower = Integer.toString(newValue); + } + }); + } + } + + /** + * Setting up the advertising interval component with a seek bar which can be set to values from + * 100 to 1024. There is also a tracking TextView which shows the numeric representation of the + * advertising interval. + * + * @param v container for the advertising interval component. This is usually the main container + * in the tab. It has to be added to the activity before calling this method. + */ + private void setUpAdvertisingInterval(View v) { + if (advInterval != null) { + + v.findViewById(R.id.adv_int_info).setVisibility(View.VISIBLE); + final TextView advIntervalView = (TextView) v.findViewById(R.id.adv_interval); + advIntervalView.setText(advInterval); + SeekBar advInterSeekBar = (SeekBar) v.findViewById(R.id.adv_interval_seek_bar); + advInterSeekBar.setMax(1024 - 100); + int progress = Integer.parseInt(advInterval) - 100; + advInterSeekBar.setProgress(progress); + advInterSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + int progress = seekBar.getProgress() + 100; + advIntervalView.setText(Integer.toString(progress)); + advIntervalChanged = true; + advInterval = advIntervalView.getText().toString(); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + } + } + + /** + * Reads the state variables txPowerChanged, advTxPowerChanged and advIntervalChanged and + * uses the ConfigurationListener to send signals to the activity to write data to the beacon. + */ + public void saveChanges() { + if (txPowerChanged) { + int newRadioTxPower = Integer.parseInt(txPower); + configurationListener.txPowerChanged(slotNumber, newRadioTxPower); + txPowerChanged = false; + } + + if (advTxPowerChanged) { + int newAdvTxPower = Integer.parseInt(advTxPower); + configurationListener.advTxPowerChanged(slotNumber, newAdvTxPower); + advTxPowerChanged = false; + } + + if (advIntervalChanged) { + int newAdvInterval = Integer.parseInt(advInterval); + configurationListener.advIntervalChanged(slotNumber, newAdvInterval); + advIntervalChanged = false; + } + } + + @Override + public void onDetach() { + super.onDetach(); + configurationListener = null; + } + + public boolean changesPending() { + return advIntervalChanged || advTxPowerChanged || txPowerChanged; + } + + public String getTxPower() { + return txPower; + } + + public String getAdvTxPower() { + return advTxPower; + } + + public String getAdvInterval() { + return advInterval; + } + + public void setTxPower(int txPower) { + this.txPower = Integer.toString(txPower); + txPowerChanged = true; + } + + public void setAdvTxPower(int advTxPower) { + this.advTxPower = Integer.toString(advTxPower); + advTxPowerChanged = true; + } + + public void setAdvInterval(int advInterval) { + this.advInterval = Integer.toString(advInterval); + advIntervalChanged = true; + } + + /** + * Used for communication between the configuration activity + * and all the fragments in it. + */ + public interface ConfigurationListener { + void txPowerChanged(int slot, int txPower); + void advTxPowerChanged(int slot, int advTxPower); + void advIntervalChanged(int slot, int advInterval); + void slotDataChanged(int slot, byte[] slotData); + void lockCodeChanged(String newLockCode); + void factoryResetCalled(); + void remainConnectableChanged(boolean remainConnectable); + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/GlobalFragment.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/GlobalFragment.java new file mode 100644 index 0000000..03d434c --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/GlobalFragment.java @@ -0,0 +1,261 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package layout; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.TextView; + +import com.github.google.beaconfig.Constants; +import com.github.google.beaconfig.R; +import com.github.google.beaconfig.dialogs.ChangePasswordDialog; +import com.github.google.beaconfig.dialogs.ConfirmationDialog; + +/** + * First fragment in the tab layout in the Beacon Activity. It shows global information about the + * beacon and provides a way to set global configurations. If per slot radio tx power is not + * supported, it will show here. Same with advertising interval. Also factory reset, change of lock + * code and remain connectable configuration is set from here. + */ +public class GlobalFragment extends BeaconTabFragment { + private String beaconAddress; + private String beaconName; + + private boolean isRemainConnectableSupported; + + private boolean remainConnectableChanged; + private boolean remainConnectable; + + public static GlobalFragment newInstance(Bundle bundle) { + GlobalFragment globalFragment = new GlobalFragment(); + globalFragment.setArguments(bundle); + globalFragment.slotNumber = -1; + return globalFragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_frame_slot, + (LinearLayout) container.findViewById(R.id.global_content), false); + + setUpFragment(v); + return v; + } + + /** + * Updates slot information by pulling values from the bundle. These values can be: + * - beacon address type: String key: BEACON_ADDRESS + * - beacon name type: String key: BEACON_NAME + * - remainConnectable type: Byte key: REMAIN_CONNECTABLE + * - broadcast capabilities type: byte[] key: BROADCAST_CAPABILITIES + * - radio tx power type: String key: TX_POWER + * - adv tx power type: String key: ADV_POWER + * - adv interval type: String key: ADV_INTERVAL + * + * @param bundle bundle containing all the information to be updated + */ + public void updateInformation(final Bundle bundle) { + executor.execute(new Runnable() { + @Override + public void run() { + GlobalFragment.super.updateInformation(bundle); + + String beaconAddress = bundle.getString(Constants.BEACON_ADDRESS); + if (beaconAddress != null) { + GlobalFragment.this.beaconAddress = beaconAddress; + } + + String beaconName = bundle.getString(Constants.BEACON_NAME); + if (beaconName != null) { + GlobalFragment.this.beaconName = beaconName; + } + + Byte remainConnectable = bundle.getByte(Constants.REMAIN_CONNECTABLE); + if (remainConnectable != null) { + GlobalFragment.this.isRemainConnectableSupported = (remainConnectable != 0); + } + } + }); + } + + @Override + protected void setUpFragment(final View v) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + GlobalFragment.super.setUpFragment(v); + setUpGlobalInformation(v); + setupRemainConnectable(v); + setUpLockCodeChange(v); + setUpFactoryReset(v); + } + }); + } + + /** + * Changing the lock code opens a dialog which asks to give new lock code and repeat it. + * When the user is done, the new lock code is written to the beacon. + * + * @param v container for the change lock code component. This is usually the main container in + * the tab. It has to be added to the activity before calling this method. + */ + private void setUpLockCodeChange(View v) { + v.findViewById(R.id.lock_code_slot).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ChangePasswordDialog.show(getActivity(), + new ChangePasswordDialog.PasswordChangeListener() { + @Override + public void passwordChangeRequest(String newPassword) { + configurationListener.lockCodeChanged(newPassword); + } + }); + } + }); + } + + /** + * This sets all the TextViews in the UI to show the information read from the beacon. + * + * @param v container for the global information component. This is usually the main container + * in the tab. It has to be added to the activity before calling this method. + */ + private void setUpGlobalInformation(View v) { + v.findViewById(R.id.global_content).setVisibility(View.VISIBLE); + ((TextView) v.findViewById(R.id.beacon_address)).setText(beaconAddress); + ((TextView) v.findViewById(R.id.beacon_name)).setText(beaconName); + ((TextView) v.findViewById(R.id.max_eid_slots)) + .setText(Integer.toString(capabilities.getMaxSupportedEidSlots())); + ((TextView) v.findViewById(R.id.max_total_slots)) + .setText(Integer.toString(capabilities.getMaxSupportedTotalSlots())); + } + + /** + * This asks for confirmation before factory resetting the beacon. + * + * @param v container for the factory reset component. This is usually the main container in + * the tab. It has to be added to the activity before calling this method. + */ + private void setUpFactoryReset(View v) { + v.findViewById(R.id.factory_reset).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ConfirmationDialog.confirm("Factory Reset", "Are you sure you want to factory " + + "reset this beacon? \n \n The beacon will be reset to its initial state" + + " set by its manufacturer. \n \n Its unlock code will NOT be changed.", + "RESET", "CANCEL", getActivity(), + new ConfirmationDialog.ConfirmationListener() { + @Override + public void confirm() { + configurationListener.factoryResetCalled(); + } + + @Override + public void cancel() { + + } + }); + } + }); + } + + /** + * Remain connectable is controlled by a radio group of 2 buttons. Initially these buttons are + * hidden and on click the buttons show and remain connectable will be configured. + * + * @param v container for the remain connectable component. This is usually the main container + * in the tab. It has to be added to the activity before calling this method. + */ + private void setupRemainConnectable(final View v) { + ViewGroup connectableSlot = (ViewGroup) v.findViewById(R.id.remain_connectable_slot); + if (isRemainConnectableSupported) { + connectableSlot.setVisibility(View.VISIBLE); + + // Set expand and hide of radio group buttons on click of remain connectable field + connectableSlot.setOnClickListener(new View.OnClickListener() { + boolean expanded = false; + @Override + public void onClick(View view) { + if (expanded) { + v.findViewById(R.id.set_remain_connectable).setVisibility(View.GONE); + ((ImageView) v.findViewById(R.id.remain_connectable_icon)) + .setImageResource(R.drawable.expand_arrow); + expanded = false; + } else { + v.findViewById(R.id.set_remain_connectable).setVisibility(View.VISIBLE); + ((ImageView) v.findViewById(R.id.remain_connectable_icon)) + .setImageResource(R.drawable.close_arrow); + expanded = true; + } + } + }); + + // Set first radio button to configure turning ON of remain connectable + final RadioButton onButton = (RadioButton) v.findViewById(R.id.remain_connectable_on); + onButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + remainConnectableChanged = true; + RadioButton offBtn = (RadioButton) v.findViewById(R.id.remain_connectable_off); + if (b) { + offBtn.setChecked(false); + onButton.setChecked(true); + remainConnectable = true; + } + } + }); + + // Set first radio button to configure turning OFF of remain connectable + final RadioButton offButton = (RadioButton) v.findViewById(R.id.remain_connectable_on); + offButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + remainConnectableChanged = true; + RadioButton onBtn = (RadioButton) v.findViewById(R.id.remain_connectable_off); + if (b) { + onBtn.setChecked(false); + offButton.setChecked(true); + remainConnectable = false; + } + } + }); + } else { + connectableSlot.setVisibility(View.GONE); + } + } + + @Override + public void saveChanges() { + super.saveChanges(); + + if (remainConnectableChanged) { + configurationListener.remainConnectableChanged(remainConnectable); + remainConnectableChanged = false; + } + } + + @Override + public boolean changesPending() { + return super.changesPending() || remainConnectableChanged; + } + +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/SlotFragment.java b/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/SlotFragment.java new file mode 100644 index 0000000..dfdfa83 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/java/layout/SlotFragment.java @@ -0,0 +1,373 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package layout; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.TextView; + +import com.github.google.beaconfig.Constants; +import com.github.google.beaconfig.R; +import com.github.google.beaconfig.dialogs.UidSlotDataChangeDialog; +import com.github.google.beaconfig.dialogs.UrlChangeDialog; +import com.github.google.beaconfig.utils.SlotDataManager; +import com.github.google.beaconfig.utils.Utils; + +/** + * Fragment for displaying and configuring information of a frame slot in the beacon. This is a + * unifying fragment which can be used for a UID, URL, TLM or EID frame. + */ +public class SlotFragment extends BeaconTabFragment implements AdapterView.OnItemSelectedListener { + public static final String TAG = SlotFragment.class.getSimpleName(); + private boolean slotDataChanged; + + private byte currFrameType; + private byte[] slotData; + + /* UID fields */ + private String namespace; + private String instance; + + /* URL field */ + private String url; + + /* TLM fields */ + private String voltage; + private String temperature; + private String advCnt; + private String secCnt; + + /* EID field */ + private String ephemeralId; + + public static SlotFragment newInstance(Bundle bundle) { + SlotFragment newSlotFragment = new SlotFragment(); + newSlotFragment.slotNumber = bundle.getInt(Constants.SLOT_NUMBER); + newSlotFragment.setArguments(bundle); + newSlotFragment.name + = Utils.getFrameNameFromSlotData(bundle.getByteArray(Constants.SLOT_DATA)); + return newSlotFragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + Log.d(TAG, "SlotFragment.onCreateView"); + View v = inflater.inflate(R.layout.fragment_frame_slot, + (LinearLayout) container.findViewById(R.id.global_content), false); + v.findViewById(R.id.slot_information).setVisibility(View.VISIBLE); + + setUpFrameTypeSpinner(v); + setUpFragment(v); + return v; + } + + /** + * Setting up the spinner which configures the frame type of a beacon slot. + * + * @param v container for the spinner. This is usually the main container in + * the tab. It has to be added to the activity before calling this method. + */ + private void setUpFrameTypeSpinner(View v) { + final Spinner frameTypeSpinner = (Spinner) v.findViewById(R.id.frame_type_spinner); + ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(getContext(), + R.array.frame_types, android.R.layout.simple_spinner_item); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + frameTypeSpinner.setAdapter(spinnerAdapter); + frameTypeSpinner.setOnItemSelectedListener(this); + v.findViewById(R.id.frame_type_slot).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + frameTypeSpinner.performClick(); + } + }); + } + + /** + * Reads information from the bundle according to which frame type this fragment is set to. + * The values which can be read from the bundle are: + * - slot data type: byte[] key: SLOT_DATA + * - broadcast capabilities type: byte[] key: BROADCAST_CAPABILITIES + * - radio tx power type: String key: TX_POWER + * - adv tx power type: String key: ADV_POWER + * - adv interval type: String key: ADV_INTERVAL + * + * @param dataBundle bundle containing all the information to be updated + */ + public void updateInformation(final Bundle dataBundle) { + if (dataBundle == null) { + Log.d(TAG, "Updating information for slot " + slotNumber + + " failed due to empty bundle"); + return; + } + executor.execute(new Runnable() { + @Override + public void run() { + SlotFragment.super.updateInformation(dataBundle); + byte[] slotData = dataBundle.getByteArray(Constants.SLOT_DATA); + if (slotData != null) { + SlotFragment.this.slotData = slotData; + if (Utils.slotIsEmpty(slotData)) { + currFrameType = Constants.EMPTY_FRAME_TYPE; + } else { + currFrameType = slotData[0]; + switch (currFrameType) { + case Constants.UID_FRAME_TYPE: + name = Constants.UID; + namespace = SlotDataManager.getNamespaceFromSlotData(slotData); + instance = SlotDataManager.getInstanceFromSlotData(slotData); + break; + case Constants.URL_FRAME_TYPE: + name = Constants.URL; + + url = SlotDataManager.getUrlFromSlotData(slotData); + break; + case Constants.TLM_FRAME_TYPE: + name = Constants.TLM; + voltage = Short.toString(SlotDataManager + .getVoltageFromSlotData(slotData)); + + temperature = Float.toString(SlotDataManager + .getTemperatureFromSlotData(slotData)); + + advCnt = Integer.toString(SlotDataManager + .getAdvertisingPDUCountFromSlotData(slotData)); + + secCnt = Utils.getTimeString(SlotDataManager + .getTimeSinceOnFromSlotData(slotData)); + break; + case Constants.EID_FRAME_TYPE: + name = Constants.EID; + + ephemeralId = SlotDataManager.getEphemeralIdFromSlotData(slotData); + break; + default: + name = "--"; + } + } + } + } + }); + } + + /** + * Sets up the fragment according to the frame type this slot is configured to broadcast + * + * @param v container for the tab. It has to be added to the activity before calling this method + */ + protected void setUpFragment(final View v) { + if (getActivity() != null) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + hideAllViews(v); + + switch (currFrameType) { + case Constants.UID_FRAME_TYPE: + setUpFragmentAsUidSlot(v); + break; + case Constants.URL_FRAME_TYPE: + setUpFragmentAsUrlSlot(v); + break; + case Constants.TLM_FRAME_TYPE: + setUpFragmentAsTlmSlot(v); + break; + case Constants.EID_FRAME_TYPE: + setUpFragmentAsEidSlot(v); + break; + default: + ((Spinner) v.findViewById(R.id.frame_type_spinner)).setSelection(4); + name = "--"; + return; + } + + SlotFragment.super.setUpFragment(v); + } + }); + } + } + + @Override + public boolean changesPending() { + return super.changesPending() || slotDataChanged; + } + + /** + * @return true whenever the frame this slot is configured to is empty + */ + public boolean isEmpty() { + return currFrameType == Constants.EMPTY_FRAME_TYPE; + } + + private void hideAllViews(final View v) { + v.findViewById(R.id.uid_frame_slot).setVisibility(View.GONE); + v.findViewById(R.id.url_frame_slot).setVisibility(View.GONE); + v.findViewById(R.id.tlm_frame_slot).setVisibility(View.GONE); + v.findViewById(R.id.eid_frame_slot).setVisibility(View.GONE); + v.findViewById(R.id.tx_power_info).setVisibility(View.GONE); + v.findViewById(R.id.adv_int_info).setVisibility(View.GONE); + } + + /** + * Called when a new entry in the frame type spinner is selected. This will trigger reloading + * of the fragment as new fields will need to be shown. + */ + private boolean firstTime = true; + @Override + public void onItemSelected(AdapterView parent, View view, int pos, long id) { + String newFrameSelected = (String) parent.getItemAtPosition(pos); + currFrameType = Utils.getFrameTypeFromString(newFrameSelected); + if (firstTime) { + firstTime = false; + } else { + slotDataChanged = true; + } + setUpFragment(getView()); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + + private void setUpFragmentAsEidSlot(View v) { + Log.d(TAG, "Setting tab " + slotNumber + " as EID slot"); + ((Spinner) v.findViewById(R.id.frame_type_spinner)).setSelection(3); + v.findViewById(R.id.eid_frame_slot).setVisibility(View.VISIBLE); + + ((TextView) v.findViewById(R.id.ephemeral_id)).setText(ephemeralId); + } + + private void setUpFragmentAsTlmSlot(View v) { + Log.d(TAG, "Setting tab " + slotNumber + " as TLM slot"); + ((Spinner) v.findViewById(R.id.frame_type_spinner)).setSelection(2); + v.findViewById(R.id.tlm_frame_slot).setVisibility(View.VISIBLE); + + ((TextView) v.findViewById(R.id.voltage)).setText(voltage); + ((TextView) v.findViewById(R.id.temperature)).setText(temperature); + ((TextView) v.findViewById(R.id.adv_pdu_count)).setText(advCnt); + ((TextView) v.findViewById(R.id.time_since_alive)).setText(secCnt); + } + + private void setUpFragmentAsUrlSlot(View v) { + Log.d(TAG, "Setting tab " + slotNumber + " as URL slot"); + ((Spinner) v.findViewById(R.id.frame_type_spinner)).setSelection(1); + final ViewGroup urlSlot = (ViewGroup) v.findViewById(R.id.url_frame_slot); + urlSlot.setVisibility(View.VISIBLE); + + final TextView urlView = (TextView) urlSlot.findViewById(R.id.url); + urlView.setText(url); + + + urlSlot.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + UrlChangeDialog.show(getContext(), new UrlChangeDialog.UrlChangeListener() { + @Override + public void setNewUrl(String newUrl) { + urlView.setText(newUrl); + url = newUrl; + slotDataChanged = true; + } + }); + } + }); + } + + private void setUpFragmentAsUidSlot(View v) { + Log.d(TAG, "Setting tab " + slotNumber + " as UID slot"); + ((Spinner) v.findViewById(R.id.frame_type_spinner)).setSelection(0); + ViewGroup uidFrameSlot = (ViewGroup) v.findViewById(R.id.uid_frame_slot); + uidFrameSlot.setVisibility(View.VISIBLE); + + final TextView namespaceView = (TextView) v.findViewById(R.id.namespace); + namespaceView.setText(namespace); + + final TextView instanceView = (TextView) v.findViewById(R.id.instance); + instanceView.setText(instance); + + uidFrameSlot.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + slotDataChanged = true; + UidSlotDataChangeDialog.show(namespace, instance, getContext(), + new UidSlotDataChangeDialog.UidChangeListener() { + @Override + public void setNewUid(String namespace, String instance) { + SlotFragment.this.namespace = namespace; + SlotFragment.this.instance = instance; + namespaceView.setText(namespace); + instanceView.setText(instance); + } + }); + } + }); + + + } + + @Override + public void saveChanges() { + super.saveChanges(); + + if (slotDataChanged) { + slotData = buildNewSlotDataInfo(); + configurationListener.slotDataChanged(slotNumber, slotData); + slotDataChanged = false; + } + + setUpFragment(getView()); + } + + /** + * Whenever the slot data has been changed and the user wishes to save this change, a new + * byte[] will have to be written to the beacon. This method uses the SlotDataManager to + * build the byte[] according to the current frame the spinner is set to. + * + * @return byte[] to be written to the beacon to configure new slot data information + */ + public byte[] buildNewSlotDataInfo() { + byte[] newSlotData; + switch(currFrameType) { + case Constants.UID_FRAME_TYPE: + String namespace + = ((TextView) getView().findViewById(R.id.namespace)).getText().toString(); + String instance + = ((TextView) getView().findViewById(R.id.instance)).getText().toString(); + newSlotData = SlotDataManager.buildNewUidSlotData(namespace, instance); + break; + case Constants.URL_FRAME_TYPE: + String newUrl = ((TextView) getView().findViewById(R.id.url)).getText().toString(); + newSlotData = SlotDataManager.buildNewUrlSlotData(newUrl); + break; + case Constants.TLM_FRAME_TYPE: + newSlotData = SlotDataManager.buildNewTlmSlotData(); + break; + case Constants.EID_FRAME_TYPE: + newSlotData = SlotDataManager.buildNewEidSlotData(); + break; + default: + //empty slot + newSlotData = new byte[0]; + } + return newSlotData; + } +} diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/apply_default_config.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/apply_default_config.xml new file mode 100644 index 0000000..8031fd5 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/apply_default_config.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/arrow_right.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/arrow_right.xml new file mode 100644 index 0000000..51f880f --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/arrow_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/circle.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/circle.xml new file mode 100644 index 0000000..680dcaf --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/circle.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/close_arrow.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/close_arrow.xml new file mode 100644 index 0000000..9b799d7 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/close_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/cross.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/cross.xml new file mode 100644 index 0000000..c820415 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/cross.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/delete_grey.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/delete_grey.xml new file mode 100644 index 0000000..cfd6c49 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/delete_grey.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/expand_arrow.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/expand_arrow.xml new file mode 100644 index 0000000..4b5c22a --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/expand_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/factory_reset_icon.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/factory_reset_icon.xml new file mode 100644 index 0000000..b34d539 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/factory_reset_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/globe.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/globe.xml new file mode 100644 index 0000000..f596e49 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/globe.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/pencil.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/pencil.xml new file mode 100644 index 0000000..63c8944 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/pencil.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/refresh.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/refresh.xml new file mode 100644 index 0000000..5c15f62 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_changes.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_changes.xml new file mode 100644 index 0000000..6b251ff --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_changes.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_config.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_config.xml new file mode 100644 index 0000000..fe53a44 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/save_config.xml @@ -0,0 +1,9 @@ + + + diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/shadow.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/shadow.xml new file mode 100644 index 0000000..6fcaf53 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/shadow.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/side_nav_bar.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..458b4b0 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/activity_beacon_config.xml b/tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/activity_beacon_config.xml new file mode 100644 index 0000000..7606912 --- /dev/null +++ b/tools/gatt-config/android/BeaconConfig/app/src/main/res/layout/activity_beacon_config.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconDetailsViewController.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconDetailsViewController.swift new file mode 100644 index 0000000..a63b405 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconDetailsViewController.swift @@ -0,0 +1,517 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import CoreBluetooth + +enum ChangeLockCodeStatus { + case Success + case IncorrectOldPasskey + case Fail +} + +let kButtonWidth: CGFloat = 110 + +class BeaconDetailsViewController: UIViewController, + UIGestureRecognizerDelegate { + var beacon: CBPeripheral? + var beaconScanner: BeaconScanner? + var beaconGATTOperations: GATTOperations? + var slotDataContentViews: [SlotDataContentView] = [] + @IBOutlet weak var slotTabsScrollView: UIScrollView! + @IBOutlet weak var beaconNameLabel: UILabel! + @IBOutlet weak var tabsContentView: UIView! + @IBOutlet weak var beaconConnectionView: UIView! + @IBOutlet weak var saveButton: UIBarButtonItem! + var unlockView: UIView? + var globalView: SlotDataContentView! + var previousButton: UIButton? + var beaconName: String? + var slotViews: [UIView] = [] + var beaconPasskey: String? + var beaconInvestigation: BeaconInvestigation? + var beaconConfiguration: ConfigureBeaconSlotData? + var slotData: Dictionary > = [:] + var slotUpdateData: Dictionary > = [:] + var beaconCapabilities: NSDictionary = [:] + var connectionViewObject: ConnectionView! + var scrollingView: HorizontalScrollButtonList? + var connectionTimer: NSTimer? + /// + /// the passkey must have 16 bytes in hex format, which makes it + /// 32 characters when inserted as String + /// + let passkeyRequiredLength = 32 + var scanningTime = 0 + var timer: NSTimer? + var viewToDisable: UIView? + var selectHolder: UIView? + var userInfo: UserInformation! + var throbberAlert: UIAlertController! + + override func viewDidLoad() { + super.viewDidLoad() + if let name = self.beaconName { + beaconNameLabel.text = name + } + tabsContentView.backgroundColor = kLightGrayColor + slotTabsScrollView.backgroundColor = kLightGrayColor + beaconConnectionView.backgroundColor = kLightGrayColor + /// Dismiss keyboard when user touches outside it. + let tap: UITapGestureRecognizer = + UITapGestureRecognizer(target: self, + action: #selector(UIInputViewController.dismissKeyboard)) + tap.delegate = self + view.addGestureRecognizer(tap) + /// Swipe the tab views left and right. + let swipeRight = UISwipeGestureRecognizer(target: self, + action: #selector(BeaconDetailsViewController.respondToSwipeGesture(_:))) + let swipeLeft = UISwipeGestureRecognizer(target: self, + action: #selector(BeaconDetailsViewController.respondToSwipeGesture(_:))) + swipeRight.direction = UISwipeGestureRecognizerDirection.Right + swipeLeft.direction = UISwipeGestureRecognizerDirection.Left + self.view.addGestureRecognizer(swipeRight) + self.view.addGestureRecognizer(swipeLeft) + connectToBeacon() + } + + func dismissKeyboard() { + view.endEditing(true) + } + + func slotButtonPressed(buttonNumber: Int) { + for view in slotViews { + if !view.hidden { + view.hidden = true + } + } + slotViews[buttonNumber].hidden = false + } + + func signInWithGoogle(viewToDisable: UIView, selectHolder: UIView) { + self.viewToDisable = viewToDisable + self.selectHolder = selectHolder + self.performSegueWithIdentifier("signInSegue", sender: self) + } + + /// + /// When the user decides to save the changes for the beacon configuration, we want to + /// collect all the information and to create a dictionary with it. We must also display + /// errors in case if we know that the desired configuration is incorrect. + /// + @IBAction func saveBeaconData(sender: AnyObject) { + view.endEditing(true) + slotUpdateData.removeAll() + var EIDConfiguration = false + var URLConflict = false + var i = 0 + for slotView in slotDataContentViews { + if slotUpdateData[i] == nil { + slotUpdateData[i] = [:] + } + if let data = slotView.getUpdateData() { + if data[slotDataEIDKey] != nil { + EIDConfiguration = true + } + slotUpdateData[i] = data + } else { + return + } + i += 1 + } + + if EIDConfiguration { + i = 0 + for _ in slotDataContentViews { + if slotUpdateData[i]?[slotDataURLKey] != nil { + URLConflict = true + } + i += 1 + } + } + + /// + /// Broadcasting an URL frame while also broadcasting EID is a huge security problem + /// and it should not be allowed, because it makes the beacon easily recognisable. + /// + if URLConflict { + showAlert("URL Conflict", + description: "Broadcasting URL while also broadcasting EID would " + + "make your beacon easy to be recognised. Please " + + "consider removing the URL frame.", + buttonText: "Dismiss") + } else { + for slotView in slotDataContentViews { + slotView.slotContentView.removeFromSuperview() + } + displayThrobber("Saving...") + if let currentBeacon = beacon { + /// We have all the data we need in order to update the beacon's configuration. + beaconConfiguration = ConfigureBeaconSlotData(peripheral: currentBeacon) + beaconConfiguration!.beginBeaconConfiguration(beaconCapabilities, + statusInfoAlert: throbberAlert!, + slotUpdateData: slotUpdateData) { + dispatch_async(dispatch_get_main_queue()) { + /// + /// If everything in the update went well, + /// we want to investigate the beacon + /// again, because some values, such as + /// advertising interval, can be changed + /// by the beacon with the closest + /// available value. + /// + self.investigateBeacon() + } + } + } + } + } + + /// Creates the Global settings tab view for specific beacon configurations. + func createGlobalView() -> UIView { + globalView = SlotDataContentView() + slotDataContentViews.append(globalView) + if let data = slotData[0] { + globalView.setAsGlobalContentView(beaconCapabilities, slotData: data) + } + slotDataContentViews.last!.setUICallbacks(changeLockCode, + factoryResetCallback: startFactoryReset, + remainConnectableCallback: changeRemainConnectable, + showAlert: showAlert, + signIn: signInWithGoogle) + return slotDataContentViews.last!.slotContentView + } + + func changeRemainConnectable(on: Bool) { + displayThrobber("Changing state...") + if let operations = beaconGATTOperations { + operations.changeRemainConnectableState(on) { + dispatch_async(dispatch_get_main_queue()) { + self.dismissViewControllerAnimated(false, completion: nil) + } + } + } + } + + func startFactoryReset() { + displayThrobber("Factory resetting...") + if let operations = beaconGATTOperations { + operations.factoryReset() { + dispatch_async(dispatch_get_main_queue()) { + for view in self.slotDataContentViews { + view.slotContentView.removeFromSuperview() + } + self.slotDataContentViews.removeAll() + self.investigateBeacon() + } + } + } + } + + func changeLockCode(oldCode: String, newCode: String) { + if oldCode == beaconPasskey { + displayThrobber("Changing lock code...") + if let operations = beaconGATTOperations { + operations.changeLockCode(oldCode, newCode: newCode) { lockState in + dispatch_async(dispatch_get_main_queue()) { + self.dismissViewControllerAnimated(false, completion: nil) + if lockState == LockState.Unlocked { + self.globalView.lockCodeChanged() + } else { + /// + /// The lock code is changed and it is not the one that the user wanted. + /// This IS a disaster. + /// + assert(false) + } + } + } + } + } else { + self.showAlert("Passkey", + description: "The old passkey is incorrect.", + buttonText: "Dismiss") + } + } + + func respondToSwipeGesture(gesture: UIGestureRecognizer) { + + if let swipeGesture = gesture as? UISwipeGestureRecognizer { + + switch swipeGesture.direction { + + case UISwipeGestureRecognizerDirection.Right: + scrollingView?.swipeRight() + case UISwipeGestureRecognizerDirection.Left: + scrollingView?.swipeLeft() + default: + break + } + } + } + + func slotDataContentView(slotNumber: Int, slotData: Dictionary ) -> UIView? { + /// Creates the content views for each slot of the beacon + let object = SlotDataContentView() + slotDataContentViews.append(object) + if let frameType = slotData[slotDataFrameTypeKey] { + let frameTypeName = NSString(data:frameType, encoding:NSUTF8StringEncoding) as String! + switch frameTypeName { + case BeaconInfo.EddystoneFrameType.URLFrameType.description: + slotDataContentViews.last!.setAsURLTypeContentView(slotData, + capabilities: beaconCapabilities) + case BeaconInfo.EddystoneFrameType.UIDFrameType.description: + slotDataContentViews.last!.setAsUIDTypeContentView(slotData, + capabilities: beaconCapabilities) + case BeaconInfo.EddystoneFrameType.TelemetryFrameType.description: + slotDataContentViews.last!.setAsTLMTypeContentView(slotData, + capabilities: beaconCapabilities) + case BeaconInfo.EddystoneFrameType.EIDFrameType.description: + slotDataContentViews.last!.setAsEIDTypeContentView(slotData, + capabilities: beaconCapabilities) + default: + slotDataContentViews.last!.setAsNoFrameTypeContentView(beaconCapabilities) + } + } + slotDataContentViews.last!.setUICallbacks(changeLockCode, + factoryResetCallback: startFactoryReset, + remainConnectableCallback: changeRemainConnectable, + showAlert: showAlert, + signIn: signInWithGoogle) + return slotDataContentViews.last!.slotContentScrollView + } + + func showAlert(title: String, description: String, buttonText:String) { + let alertController = UIAlertController(title: title, + message: description, + preferredStyle: UIAlertControllerStyle.Alert) + alertController.addAction(UIAlertAction(title: buttonText, + style: UIAlertActionStyle.Default, + handler: nil)) + alertController.view.tintColor = kGreenColor + + self.presentViewController(alertController, animated: true, completion: nil) + } + + func displayThrobber(message: String) { + throbberAlert = UIAlertController(title: nil, message: message, preferredStyle: .Alert) + + throbberAlert.view.tintColor = UIColor.blackColor() + /// Need to give UIActivityIndicator nonzero values at init. + let loadingIndicator: UIActivityIndicatorView = + UIActivityIndicatorView(frame: CGRectMake(10, 5, 50, 50)) as UIActivityIndicatorView + loadingIndicator.hidesWhenStopped = true + loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray + loadingIndicator.startAnimating() + throbberAlert.view.addSubview(loadingIndicator) + self.presentViewController(throbberAlert, animated: true, completion: nil) + } + + func unlockBeacon(passkey: String) { + dismissKeyboard() + if let + beaconOperations = beaconGATTOperations { + beaconOperations.beginUnlockingBeacon(passkey) { lockState in + dispatch_async(dispatch_get_main_queue()) { + if lockState == LockState.Locked { + /// User inserted a wrong password. + self.showAlert("Password", + description: "The password is incorrect.", + buttonText: "Dismiss") + } else if lockState == LockState.Unlocked { + /// The beacon is now unlocked! + self.beaconPasskey = passkey + self.displayThrobber("Reading slot data...") + self.investigateBeacon() + } + } + } + } + } + + func displayScrollBar(beaconSlotDataCount: Int) { + // +1 for 'Global' settings button / tab + let buttonsToDisplay = beaconSlotDataCount + 1 + let buttonNames: NSMutableArray = [] + for i in 0...buttonsToDisplay - 1 { + if i == 0 { + buttonNames.addObject("GLOBAL") + } else { + buttonNames.addObject("SLOT \(i)") + } + } + if scrollingView == nil { + scrollingView = HorizontalScrollButtonList(buttonSize: + CGSizeMake(kButtonWidth, + slotTabsScrollView.frame.height - 5), + buttonNames: buttonNames, + callback: slotButtonPressed(_:)) + self.slotTabsScrollView.addSubview(scrollingView!) + self.slotTabsScrollView.showsHorizontalScrollIndicator = true + self.slotTabsScrollView.indicatorStyle = .Default + self.slotTabsScrollView.contentSize = CGSize(width: scrollingView!.frame.size.width, + height: 1.0) + self.slotTabsScrollView.backgroundColor = UIColor.whiteColor() + } else { + scrollingView!.slotButtonPressed(scrollingView!.previousButtonPressed!) + } + } + + func createContentViews(beaconDataSlotsCount: Int) { + slotViews.removeAll() + slotDataContentViews.removeAll() + let globalView = createGlobalView() + slotViews.append(globalView) + tabsContentView.addSubview(globalView) + if slotDataContentViews.count == 0 { + globalView.hidden = false + } + for i in 0...beaconDataSlotsCount - 1 { + if let data = slotData[i as NSNumber] { + if let slotView = slotDataContentView(i, slotData: data) { + slotView.hidden = true + slotViews.append(slotView) + self.tabsContentView.addSubview(slotView) + } + } + } + } + + func investigateBeacon() { + if let connectedBeacon = self.beacon { + self.beaconInvestigation = BeaconInvestigation(peripheral: connectedBeacon) + if let investigation = self.beaconInvestigation { + investigation.finishedUnlockingBeacon() { beaconCapabilities, slotData in + /// Creates the buttons and the pages for them and populate them with the information. + dispatch_async(dispatch_get_main_queue()) { + self.beaconConnectionView.hidden = true + self.dismissViewControllerAnimated(false, completion: nil) + self.slotData = slotData + self.beaconCapabilities = beaconCapabilities + if let beaconDataSlotsCount = beaconCapabilities[maxSupportedSlotsKey] as? NSNumber { + self.createContentViews(beaconDataSlotsCount as Int) + self.displayScrollBar(beaconDataSlotsCount as Int) + self.saveButton.enabled = true + } + } + } + } + } + } + + func prepareForUseWithBeacon(beaconScanner: BeaconScanner, + beacon: CBPeripheral, + operations: GATTOperations, + beaconName: String?, + userInfo: UserInformation) { + self.beaconScanner = beaconScanner + self.beacon = beacon + self.beaconGATTOperations = operations + self.beaconName = beaconName + self.userInfo = userInfo + } + + func activityIndicatorChanger() { + self.connectionViewObject.stateTextView!.text.appendContentsOf(".") + } + + func connectToBeacon() { + connectionViewObject = ConnectionView() + connectionTimer = NSTimer.scheduledTimerWithTimeInterval( + 1.0, + target: self, + selector: #selector(BeaconDetailsViewController.activityIndicatorChanger), + userInfo: nil, + repeats: true) + + let connectionView = connectionViewObject.configureView(connectToBeacon, + unlockBeaconCallback: unlockBeacon) + beaconConnectionView.addSubview(connectionView) + if let + scanner = beaconScanner, + currentBeacon = beacon { + scanner.connectToBeacon(currentBeacon) { operationState in + dispatch_async(dispatch_get_main_queue()) { + /// + /// There are several reasons why a connection to the beacon cannot be established, + /// some of them being that the beacon does not implement the GATT Configuration + /// Service, that the beacon is too far or that it is not in a connectable state. + /// + if let + _ = operationState.name, + errorDescription = operationState.description { + self.connectionTimer?.invalidate() + self.connectionViewObject.stateTextView!.text = errorDescription + self.connectionViewObject.addRetryButton() + } else { + /// + /// If we managed to connect to the beacon, we want to check its lock state and + /// as the user to unlock it if that's necessary. + /// + self.connectionTimer?.invalidate() + self.connectionViewObject.stateTextView!.text = "Connection successful!" + self.checkLockState() + } + } + } + } + } + + func checkLockState() { + saveButton.enabled = false + if let + beaconOperations = beaconGATTOperations { + beaconOperations.checkLockState(nil) { lockState in + dispatch_async(dispatch_get_main_queue()) { + if lockState == LockState.Locked { + /// Display the view that asks the user to insert passkey for unlocking. + self.connectionViewObject.createUnlockingView() + } else if lockState == LockState.Unlocked + || lockState == LockState.UnlockedPreventAutolock { + /// We have an unlocked beacon. We can now start reading all its slot data. + self.displayThrobber("Reading slot data...") + self.investigateBeacon() + } + } + } + } + } + + override func viewWillDisappear(animated : Bool) { + super.viewWillDisappear(animated) + + /// + /// The user pressed the "Back" key. There's no reason for us to mentain the connection + /// to the beacon and we're disconnecting. + /// + if (self.isMovingFromParentViewController()){ + if let peripheral = beacon, scanner = beaconScanner { + scanner.disconnectFromBeacon(peripheral) + } + } + } + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if segue.identifier == "signInSegue" { + if let + signInController = segue.destinationViewController as? UserLoginViewController, + view = viewToDisable, + selectView = selectHolder { + signInController.userInfo = userInfo + signInController.viewToDisable = view + signInController.selectHolder = selectView + } + } + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconFramesSupported.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconFramesSupported.swift new file mode 100644 index 0000000..2499438 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconFramesSupported.swift @@ -0,0 +1,67 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit + +/// +/// Identifies the frames broadcasted by a beacon during the scan and +/// parses the information for each type. It is used to provide the frame +/// types for each beacon. +/// +class BeaconFramesSupported { + var UIDFrameSupported: Bool = false + var EIDFrameSupported: Bool = false + var TLMFrameSupported: Bool = false + var URLFrameSupported: Bool = false + var EddystoneGATTServiceFrameSupported: Bool = false + var URLData: String? + var UIDData: String? + var EIDData: String? + var TLMData: String? + var operations: GATTOperations + + init(operations: GATTOperations) { + self.operations = operations + } + + /// We check if the beacon we scanned for has any frame that is useful for us. + func containsUsefulFrames() -> Bool { + return UIDFrameSupported || EIDFrameSupported || EddystoneGATTServiceFrameSupported || + URLFrameSupported || TLMFrameSupported + } + + func setUIDframe(UID: String) { + UIDFrameSupported = true + UIDData = UID + } + + func setEIDframe(EID: String) { + EIDFrameSupported = true + EIDData = EID + } + + func setTLMframe(TLM: String) { + TLMFrameSupported = true + TLMData = TLM + } + + func setURLframe(URL: String) { + URLFrameSupported = true + URLData = URL + } + + func setEddystoneGATTServiceFrame() { + EddystoneGATTServiceFrameSupported = true + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconInvestigation.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconInvestigation.swift new file mode 100644 index 0000000..d77347c --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconInvestigation.swift @@ -0,0 +1,391 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import Foundation +import CoreBluetooth + +let kBroadCastCapabilitiesVersion: UInt8 = 0 +let kBroadcastCapabilitiesPerSlotAdvIntervals: UInt8 = 0x1 +let kBroadcastCapabilitiesPerSlotTxPower: UInt8 = 0x2 +let kBroadcastCapabilitiesSupportsUID: UInt8 = 0x1 +let kBroadcastCapabilitiesSupportsURL: UInt8 = 0x2 +let kBroadcastCapabilitiesSupportsTLM: UInt8 = 0x4 +let kBroadcastCapabilitiesSupportsEID: UInt8 = 0x8 + +let maxSupportedSlotsKey = "maxSupportedSlots" +let maxSupportedEIDSlotsKey = "maxSupportedEIDSlots" +let perSlotAdvIntervalsSupportedKey = "advertismentIntervalSupported" +let perSlotTxPowerSupportedKey = "txPowerSupported" +let UIDSupportedKey = "UIDSupportedKey" +let URLSupportedKey = "URLSupportedKey" +let TLMSupportedKey = "TLMSupportedKey" +let EIDSupportedKey = "EIDSupportedKey" +let BroadcastCapabilitiesSupportsEID = "BroadcastCapabilitiesSupportsEID" + +let slotDataFrameTypeKey = "slotDataFrameTypeKey" +let slotDataUIDKey = "slotDataUIDKey" +let slotDataURLKey = "slotDataURLKey" +let slotDataTLMKey = "slotDataTLMKey" +let slotDataEIDKey = "slotDataEIDKey" +let slotDataAdvIntervalKey = "slotDataAdvIntervalKey" +let slotDataTxPowerKey = "slotDataTxPowerKey" +let slotDataNoFrameKey = "slotDataNoFrameKey" +let slotDataRemainConnectableKey = "slotDataRemainCOnnectableKey" + + +/// +/// The class wants to read all the information for the beacon. +/// We have to discover the capabilities and get information such as the maximum number of +/// slots that are available, and then, for each slot, we want to read the TX Power, the +/// advertising interval and the actual slot data. We actually created a nice flow for this +/// to make things look cleaner and to be able to handle errors. +/// +class BeaconInvestigation: GATTOperations { + + var currentlyScannedSlot: UInt8 = 0 + var beaconBroadcastCapabilities: NSDictionary = [:] + var slotData = [NSNumber : [ String : NSData]]() + var callback: ((beaconBroadcastCapabilities: NSDictionary, + slotData: Dictionary >) -> Void)? + + enum InvestigationState { + case BeaconUnlocked + case DiscoveredCapabilities + case ErrorDiscoveringCapabilities + case DidSetActiveSlot + case ErrorSettingActiveSlot + case ScannedSlot + case ScannedAllSlots + case ErrorScanningSlot + case DidReadTxPower + case ErrorReadingTxPower + case DidReadAdvertisingInterval + case ErrorReadingAdvertisingInterval + case DidReadRemainConnectableState + case ErrorReadingRemainCOnectableState + } + + func didUpdateInvestigationState(investigationState: InvestigationState) { + switch investigationState { + case InvestigationState.BeaconUnlocked: + discoverCapabilities() + case InvestigationState.DiscoveredCapabilities: + setSlotForScan() + case InvestigationState.DidSetActiveSlot: + scanSlot() + case InvestigationState.ScannedSlot: + readTxPower() + case InvestigationState.DidReadTxPower: + readAdvertisingInterval() + case InvestigationState.DidReadAdvertisingInterval: + readRemainConnectableState() + case InvestigationState.DidReadRemainConnectableState: + setSlotForScan() + case InvestigationState.ScannedAllSlots: + if let investigationCallback = callback { + investigationCallback(beaconBroadcastCapabilities: beaconBroadcastCapabilities, + slotData: slotData) + } + case InvestigationState.ErrorScanningSlot: + currentlyScannedSlot += 1; + setSlotForScan() + default: + return + } + } + + func finishedUnlockingBeacon(investigationCallback: + (beaconBroadcastCapabilities: NSDictionary, + slotData: Dictionary >) -> Void) { + callback = investigationCallback + peripheral.delegate = self + didUpdateInvestigationState(InvestigationState.BeaconUnlocked) + } + + func discoverCapabilities() { + if let characteristic = findCharacteristicByID(CharacteristicID.capabilities.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + override func peripheral(peripheral: CBPeripheral, + didUpdateValueForCharacteristic characteristic: CBCharacteristic, + error: NSError?) { + NSLog("did update value for characteristic \(characteristic.UUID)") + if let identifiedError = error { + NSLog("Error reading characteristic: \(identifiedError)") + } else { + switch characteristic.UUID { + case CharacteristicID.capabilities.UUID: + didReadBroadcastCapabilities() + case CharacteristicID.ADVSlotData.UUID: + didReadSlotData() + case CharacteristicID.radioTxPower.UUID: + didReadTxPower() + case CharacteristicID.advertisingInterval.UUID: + didReadAdvertisingInterval() + case CharacteristicID.remainConnectable.UUID: + didReadRemainConnectableState() + default: + return + } + } + } + + override func peripheral(peripheral: CBPeripheral, + didWriteValueForCharacteristic characteristic: CBCharacteristic, + error: NSError?) { + + NSLog("did write value for characteristic \(characteristic.UUID)") + if characteristic.UUID == CharacteristicID.activeSlot.UUID { + if error != nil { + didUpdateInvestigationState(InvestigationState.ErrorSettingActiveSlot) + } else { + didUpdateInvestigationState(InvestigationState.DidSetActiveSlot) + } + } + } + + struct EddystoneGATTBroadcastCapabilities { + var version: UInt8 + var maxSupportedTotalSlots: UInt8 + var maxSupportedEidSlots: UInt8 + var capabilitiesBitField: UInt8 + var supportedFrameTypesBitFieldHigh: UInt8 + var supportedFrameTypesBitFieldLow: UInt8 + + init() { + version = 0 + maxSupportedTotalSlots = 0 + maxSupportedEidSlots = 0 + supportedFrameTypesBitFieldLow = 0 + supportedFrameTypesBitFieldHigh = 0 + capabilitiesBitField = 0 + } + } + + func isBitOn(field: UInt8, mask: UInt8) -> Bool { + return (field & mask) != 0 + } + + func didReadBroadcastCapabilities() { + if let + capabilitiesCharacteristic = findCharacteristicByID(CharacteristicID.capabilities.UUID), + capabilities = capabilitiesCharacteristic.value { + + if capabilities.length < sizeof(EddystoneGATTBroadcastCapabilities) { + didUpdateInvestigationState(InvestigationState.ErrorDiscoveringCapabilities) + } else { + var broadcastCapabilities = EddystoneGATTBroadcastCapabilities() + capabilities.getBytes(&broadcastCapabilities, length: capabilities.length) + if broadcastCapabilities.version != kBroadCastCapabilitiesVersion { + didUpdateInvestigationState(InvestigationState.ErrorDiscoveringCapabilities) + } else { + let txPowers: NSMutableArray = [] + var i = 6 + while i < capabilities.length { + var txPower: Int8 = 0 + capabilities.getBytes(&txPower, range:NSMakeRange(i, sizeof(Int8))) + txPowers.addObject(NSNumber(char: txPower)) + i += 1 + } + + beaconBroadcastCapabilities = + [maxSupportedSlotsKey : + NSNumber(unsignedChar: broadcastCapabilities.maxSupportedTotalSlots), + maxSupportedEIDSlotsKey : + NSNumber(unsignedChar: broadcastCapabilities.maxSupportedEidSlots), + perSlotAdvIntervalsSupportedKey : + isBitOn(broadcastCapabilities.capabilitiesBitField, + mask: kBroadcastCapabilitiesPerSlotAdvIntervals), + perSlotTxPowerSupportedKey : + isBitOn(broadcastCapabilities.capabilitiesBitField, + mask: kBroadcastCapabilitiesPerSlotTxPower), + UIDSupportedKey : + isBitOn(broadcastCapabilities.supportedFrameTypesBitFieldLow, + mask: kBroadcastCapabilitiesSupportsUID), + URLSupportedKey : + isBitOn(broadcastCapabilities.supportedFrameTypesBitFieldLow, + mask: kBroadcastCapabilitiesSupportsURL), + TLMSupportedKey : + isBitOn(broadcastCapabilities.supportedFrameTypesBitFieldLow, + mask: kBroadcastCapabilitiesSupportsTLM), + EIDSupportedKey : + isBitOn(broadcastCapabilities.supportedFrameTypesBitFieldLow, + mask: kBroadcastCapabilitiesSupportsEID)] + currentlyScannedSlot = 0 + didUpdateInvestigationState(InvestigationState.DiscoveredCapabilities) + } + } + } + } + + func setSlotForScan() { + if let maxSupportedSlots = beaconBroadcastCapabilities[maxSupportedSlotsKey] { + let intMaxSupportedSlots: Int = maxSupportedSlots as! Int + if currentlyScannedSlot >= UInt8(intMaxSupportedSlots) { + didUpdateInvestigationState(InvestigationState.ScannedAllSlots) + } else { + if let characteristic = findCharacteristicByID(CharacteristicID.activeSlot.UUID) { + let currentSlot = NSData(bytes: ¤tlyScannedSlot, length: 1) + peripheral.writeValue(currentSlot, + forCharacteristic: characteristic, + type: CBCharacteristicWriteType.WithResponse) + } + } + } + } + + func scanSlot() { + if let characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + func didReadSlotData() { + if let + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID), + value = characteristic.value { + updateSlotData(value) + } + } + + func updateSlotData(value: NSData) { + var frameTypeName: String! + if value.length > 0 { + let scannedSlot: NSNumber = NSNumber(unsignedChar: currentlyScannedSlot) + var frameType: UInt8 = 0 + value.getBytes(&frameType, range: NSMakeRange(0, 1)) + + if slotData[scannedSlot] == nil { + slotData[scannedSlot] = [String : NSData]() + } + + if frameType == BeaconInfo.EddystoneUIDFrameTypeID { + frameTypeName = BeaconInfo.EddystoneFrameType.UIDFrameType.description + slotData[scannedSlot]![slotDataFrameTypeKey] = + frameTypeName.dataUsingEncoding(NSUTF8StringEncoding) + /// + /// If the frame doesn't have enough characters, it means that the UID is malformed + /// and no data is saved for this slot. + /// + if value.length >= 18 { + /// + /// The first two bytes represent frame type and ranging data. The rest of 16 bytes + /// represent the UID - 10-byte Namespace and 6-byte Instance. If the frame has more + /// bytes, we will simply truncate it to the ones we need. + /// + slotData[scannedSlot]![slotDataUIDKey] = value.subdataWithRange(NSMakeRange(2, 16)) + } + } else if frameType == BeaconInfo.EddystoneURLFrameTypeID { + frameTypeName = BeaconInfo.EddystoneFrameType.URLFrameType.description + slotData[scannedSlot]![slotDataFrameTypeKey] = + frameTypeName.dataUsingEncoding(NSUTF8StringEncoding) + if let + urlData = BeaconInfo.parseURLFromFrame(value), + urlNSData = urlData.absoluteString!.dataUsingEncoding(NSUTF8StringEncoding) { + NSLog("\(slotData[scannedSlot]![slotDataFrameTypeKey])") + slotData[scannedSlot]![slotDataURLKey] = urlNSData + } + } else if frameType == BeaconInfo.EddystoneTLMFrameTypeID { + frameTypeName = BeaconInfo.EddystoneFrameType.TelemetryFrameType.description + slotData[scannedSlot]![slotDataFrameTypeKey] = + frameTypeName.dataUsingEncoding(NSUTF8StringEncoding) + slotData[scannedSlot]![slotDataTLMKey] = value + } else if frameType == BeaconInfo.EddystoneEIDFrameTypeID { + frameTypeName = BeaconInfo.EddystoneFrameType.EIDFrameType.description + slotData[scannedSlot]![slotDataFrameTypeKey] = + frameTypeName.dataUsingEncoding(NSUTF8StringEncoding) + } + didUpdateInvestigationState(InvestigationState.ScannedSlot) + } else { + let scannedSlot: NSNumber = NSNumber(unsignedChar: currentlyScannedSlot) + if slotData[scannedSlot] == nil { + slotData[scannedSlot] = [String : NSData]() + } + frameTypeName = BeaconInfo.EddystoneFrameType.NotSetFrameType.description + slotData[scannedSlot]![slotDataFrameTypeKey] = + frameTypeName.dataUsingEncoding(NSUTF8StringEncoding) + + didUpdateInvestigationState(InvestigationState.ErrorScanningSlot) + } + } + + func readTxPower() { + if let characteristic = findCharacteristicByID(CharacteristicID.radioTxPower.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + func getValueForCharacteristic(characteristicID: CBUUID) -> NSData? { + if let + characteristic = findCharacteristicByID(characteristicID), + value = characteristic.value { + return value + } + return nil + } + + func didReadTxPower() { + let scannedSlot: NSNumber = NSNumber(unsignedChar: currentlyScannedSlot) + var txPower: Int8 = 0 + if let value = getValueForCharacteristic(CharacteristicID.radioTxPower.UUID) { + value.getBytes(&txPower, length: sizeof(Int8)) + } + if slotData[scannedSlot] != nil { + slotData[scannedSlot]![slotDataTxPowerKey] = NSData(bytes: &txPower, length: sizeof(Int8)) + } + didUpdateInvestigationState(InvestigationState.DidReadTxPower) + } + + func readAdvertisingInterval() { + if let characteristic = findCharacteristicByID(CharacteristicID.advertisingInterval.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + + func didReadAdvertisingInterval() { + let scannedSlot: NSNumber = NSNumber(unsignedChar: currentlyScannedSlot) + var advertisingInterval: UInt16 = 0 + if let value = getValueForCharacteristic(CharacteristicID.advertisingInterval.UUID) { + value.getBytes(&advertisingInterval, length: sizeof(UInt16)) + } + if slotData[scannedSlot] != nil { + var littleEndianAdvInterval: UInt16 = CFSwapInt16BigToHost(advertisingInterval) + let bytes = NSData(bytes: &littleEndianAdvInterval, + length: sizeof(UInt16)) + slotData[scannedSlot]![slotDataAdvIntervalKey] = bytes + } + didUpdateInvestigationState(InvestigationState.DidReadAdvertisingInterval) + } + + func readRemainConnectableState() { + if let characteristic = findCharacteristicByID(CharacteristicID.remainConnectable.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + func didReadRemainConnectableState() { + let scannedSlot: NSNumber = NSNumber(unsignedChar: currentlyScannedSlot) + if let value = getValueForCharacteristic(CharacteristicID.remainConnectable.UUID) { + if slotData[scannedSlot] != nil { + slotData[scannedSlot]![slotDataRemainConnectableKey] = value + } + } + currentlyScannedSlot += 1 + didUpdateInvestigationState(InvestigationState.DidReadRemainConnectableState) + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconItem.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconItem.swift new file mode 100644 index 0000000..e02a013 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconItem.swift @@ -0,0 +1,116 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import CoreBluetooth + +/// +/// We're interested in having all the information that we need about each beacon that we find +/// while scanning in one place in order to use it when displaying the results. The frames for +/// each beacon are discovered at different moments of time and we need to be able to update the +/// information all the time. +/// +class BeaconItem { + var peripheral: CBPeripheral + var frames: BeaconFramesSupported + var operations: GATTOperations? + var framesView: UIView + + init(peripheral: CBPeripheral, frames: BeaconFramesSupported, operations: GATTOperations) { + self.peripheral = peripheral + self.frames = frames + self.operations = operations + self.framesView = UIView() + var topView: UIView = self.framesView + var pinTop: NSLayoutAttribute = .Top + if let UID = frames.UIDData { + topView = CustomViews.createFrameDisplayView(.UIDFrameType, + data:UID, + holder: self.framesView, + topView: topView, + pinTop: pinTop, + setBottomConstraints: + UIDNeedBottomConstraints(frames)) + } + + if let EID = frames.EIDData { + if topView != self.framesView { + pinTop = .Bottom + } + topView = CustomViews.createFrameDisplayView(.EIDFrameType, + data: EID, + holder: self.framesView, + topView: topView, + pinTop: pinTop, + setBottomConstraints: + EIDNeedBottomConstraints(frames)) + } + + if let URL = frames.URLData { + if topView != self.framesView { + pinTop = .Bottom + } + topView = CustomViews.createFrameDisplayView(.URLFrameType, + data:URL, + holder: self.framesView, + topView: topView, + pinTop: pinTop, + setBottomConstraints: + URLNeedBottomConstraints(frames)) + } + + if let TLM = frames.TLMData { + if topView != self.framesView { + pinTop = .Bottom + } + topView = CustomViews.createFrameDisplayView(.TelemetryFrameType, + data: TLM, + holder: self.framesView, + topView: topView, + pinTop: pinTop, + setBottomConstraints: + TLMNeedBottomConstraints(frames)) + } + + if frames.EddystoneGATTServiceFrameSupported { + if topView != self.framesView { + pinTop = .Bottom + } + CustomViews.displayConfigurableBeacon(self.framesView, topView: topView, pinTop: pinTop) + } + } + + func UIDNeedBottomConstraints(frames: BeaconFramesSupported) -> Bool { + return !frames.EIDFrameSupported && + !frames.URLFrameSupported && + !frames.TLMFrameSupported && + !frames.EddystoneGATTServiceFrameSupported + } + + func EIDNeedBottomConstraints(frames: BeaconFramesSupported) -> Bool { + return !frames.URLFrameSupported && + !frames.TLMFrameSupported && + !frames.EddystoneGATTServiceFrameSupported + } + + func URLNeedBottomConstraints(frames: BeaconFramesSupported) -> Bool { + return !frames.TLMFrameSupported && + !frames.EddystoneGATTServiceFrameSupported + } + + func TLMNeedBottomConstraints(frames: BeaconFramesSupported) -> Bool { + return !frames.EddystoneGATTServiceFrameSupported + } + +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconScanner.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconScanner.swift new file mode 100644 index 0000000..b002fd9 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconScanner.swift @@ -0,0 +1,463 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import CoreBluetooth + +let kBeaconConnectionMaxTimePermitted = 10 +let kGetBeaconsServer = "https://proximitybeacon.googleapis.com/v1beta1/beacons/" +let kEddystoneEIDCode = 4 +let kBeaconScanTime = 5 +let kBeaconDataRequestTimeout = 15 + +enum OperationState: String { + case Connected + case DidDiscoverServices + case DiscoveringServicesError + case NotImplementingGATTConfigService + case DidDiscoverCharacteristics + case DiscoveringCharacteristicsError + case ConnectionTimeout + case CentralManagerConnectionError + case DidFailToConnect + case Unknown + + var name: String? { + switch self { + case .DiscoveringServicesError: + return "Discovering Services Error" + case .DiscoveringCharacteristicsError: + return "Discovering Characteristics Error" + case .ConnectionTimeout: + return "Connection Timeout" + case .CentralManagerConnectionError: + return "Central Manager Error" + case .DidFailToConnect: + return "Connect Failed" + case .NotImplementingGATTConfigService: + return "GATT Configuratin Service" + default: + return nil + } + } + + var description: String? { + switch self { + case .DiscoveringServicesError: + return "The services could not be discovered." + case .DiscoveringCharacteristicsError: + return "The characteristics could not be discovered." + case .ConnectionTimeout: + return "The process of connecting to the beacon timed out." + case .CentralManagerConnectionError: + return "Central Manager is not ready." + case .DidFailToConnect: + return "Connecting to the beacon failed." + case .NotImplementingGATTConfigService: + return "The beacon does not implement the GATT configuration service." + default: + return nil + } + } + +} + +extension CBCentralManager { + internal var centralManagerState: CBCentralManagerState { + get { + return CBCentralManagerState(rawValue: state.rawValue) ?? .Unknown + } + } +} + +/// +/// BeaconScanner +/// +class BeaconScanner: NSObject, CBCentralManagerDelegate { + /// Dictionary holding the frames supported by each beacon that we find while scanning + var beaconsFound = [CBPeripheral : BeaconFramesSupported]() + var connectingTime = 0 + var scanningTime = 0 + var gettingBeaconDataTime = 0 + var scanningTimer: NSTimer? + var connectionTimer: NSTimer? + var gettingBeaconDataTimer: NSTimer? + var lockQueue: dispatch_queue_t + var lockQueueForBeaconData: dispatch_queue_t + var didFinishScanningCallback: (() -> Void)? + var outstandingBeaconRequests: Int = 0 + var activelyScanning = false + + /// + /// When discovering a beacon which broadcasts an EID frame, we need to make a HTTP Get + /// request to see if the beacon was registered with the project that the current user + /// has selected, which means that the beacon belongs to the user. + /// + var myEIDBeacons: NSMutableDictionary = [:] + private var operationState: OperationState + private var centralManager: CBCentralManager! + private var connectingPeripheral: CBPeripheral! + private let beaconOperationsQueue: dispatch_queue_t = + dispatch_queue_create("beacon_operations_queue", nil) + private var shouldBeScanning: Bool = false + private var GATTOperationCallback:((operationState: OperationState) -> Void)? + + override init() { + self.operationState = OperationState.Unknown + self.lockQueue = dispatch_queue_create("LockQueue", nil) + self.lockQueueForBeaconData = dispatch_queue_create("LockQueueForBeaconData", nil) + super.init() + self.centralManager = CBCentralManager(delegate: self, queue: self.beaconOperationsQueue) + self.centralManager.delegate = self + } + + /// + /// Start scanning. If Core Bluetooth isn't ready for us just yet, then waits and THEN starts + /// scanning. + /// + func startScanning(completionHandler: () -> Void) { + myEIDBeacons.removeAllObjects() + didFinishScanningCallback = completionHandler + scanningTime = kBeaconScanTime + activelyScanning = true + scanningTimer = NSTimer.scheduledTimerWithTimeInterval( + 1.0, + target: self, + selector: #selector(BeaconScanner.subtractScanningTime), + userInfo: nil, + repeats: true) + dispatch_async(self.beaconOperationsQueue) { + self.startScanningSynchronized() + } + if EIDConfiguration.projectID != nil { + gettingBeaconDataTime = kBeaconDataRequestTimeout + gettingBeaconDataTimer = NSTimer.scheduledTimerWithTimeInterval( + 1.0, + target: self, + selector: #selector(BeaconScanner.subtractGettingBeaconDataTime), + userInfo: nil, + repeats: true) + } + } + + func subtractScanningTime() { + scanningTime -= 1 + if scanningTime == 0 { + self.stopScanning() + } + } + + func subtractGettingBeaconDataTime() { + gettingBeaconDataTime -= 1 + if gettingBeaconDataTime == 0 { + if let currentTimer = gettingBeaconDataTimer { + currentTimer.invalidate() + gettingBeaconDataTimer = nil + } + if let callback = didFinishScanningCallback { + callback() + } + } + } + + /// + /// Stops scanning for Eddystone beacons. + /// + func stopScanning() { + self.centralManager.stopScan() + if let currentTimer = scanningTimer { + currentTimer.invalidate() + } + activelyScanning = false + + /// Check if we received all the beacon data by now. + var outstandingRequests: Int = 0 + dispatch_sync(lockQueueForBeaconData) { + outstandingRequests = self.outstandingBeaconRequests + } + + if (outstandingRequests == 0 || gettingBeaconDataTimer == nil) { + if let callback = didFinishScanningCallback { + callback() + } + } + } + + /// + /// MARK - private methods and delegate callbacks + /// + func centralManagerDidUpdateState(central: CBCentralManager) { + if central.centralManagerState == CBCentralManagerState.PoweredOn && self.shouldBeScanning { + self.startScanningSynchronized() + } + } + + /// + /// Core Bluetooth CBCentralManager callback when we discover a beacon. We're not super + /// interested in any error situations at this point in time, we only parse each frame + /// and save it. + /// + func centralManager(central: CBCentralManager, + didDiscoverPeripheral peripheral: CBPeripheral, + advertisementData: [String : AnyObject], + RSSI: NSNumber) { + if let serviceData = advertisementData[CBAdvertisementDataServiceDataKey] + as? [NSObject : AnyObject] { + var eft: BeaconInfo.EddystoneFrameType + eft = BeaconInfo.frameTypeForFrame(advertisementData) + if beaconsFound[peripheral] == nil { + let beaconGATTOperations = GATTOperations(peripheral: peripheral) + beaconsFound[peripheral] = BeaconFramesSupported(operations: beaconGATTOperations) + } + + if eft == BeaconInfo.EddystoneFrameType.TelemetryFrameType { + let serviceUUID = CBUUID(string: "FEAA") + if let + beaconServiceData = serviceData[serviceUUID] as? NSData, + (battery, temperature, PDU, time) = BeaconInfo.parseTLMFromFrame(beaconServiceData) { + let (days, hours, _) = BeaconInfo.convertDeciseconds(time) + let TLM = "\(battery)mV/bit\n\(temperature) °C\n\(PDU)\n\(days) days, \(hours) hours" + beaconsFound[peripheral]?.setTLMframe(TLM) + } + } else if eft == BeaconInfo.EddystoneFrameType.UIDFrameType + || eft == BeaconInfo.EddystoneFrameType.EIDFrameType { + + let serviceUUID = CBUUID(string: "FEAA") + let _RSSI: Int = RSSI.integerValue + + if let + beaconServiceData = serviceData[serviceUUID] as? NSData, + beaconInfo = + (eft == BeaconInfo.EddystoneFrameType.UIDFrameType + ? BeaconInfo.beaconInfoForUIDFrameData(beaconServiceData, RSSI: _RSSI) + : BeaconInfo.beaconInfoForEIDFrameData(beaconServiceData, RSSI: _RSSI)) { + + if eft == BeaconInfo.EddystoneFrameType.UIDFrameType { + if let beacon = beaconsFound[peripheral] { + beacon.setUIDframe(String(beaconInfo.beaconID)) + } + } + else if eft == BeaconInfo.EddystoneFrameType.EIDFrameType { + beaconsFound[peripheral]?.setEIDframe(String(beaconInfo.beaconID)) + /// + /// If we already have information whether the EID Beacon was registered with the + /// selected project, there's no need for us to make another request. + /// + if myEIDBeacons[String(beaconInfo.beaconID)] == nil { + /// + /// The user can use the app without being logged in or having a project selected, + /// so we will simply not check if the beacon belongs to the user if the user is not + /// authenticated. + //// + if let projectID = EIDConfiguration.projectID { + dispatch_sync(lockQueueForBeaconData) { + //// + /// We want to know how many requestst we made, in order to keep track of how + /// many of them return to us. + //// + self.outstandingBeaconRequests += 1 + } + /// + /// We're interested to find if the EID-Beacon that we have was registered + /// using the project that is currently selected. + /// + getBeaconHTTPRequest(String(beaconInfo.beaconID), projectID: projectID) + } + } + } + } + } else if eft == BeaconInfo.EddystoneFrameType.URLFrameType { + let serviceUUID = CBUUID(string: "FEAA") + + if let + beaconServiceData = serviceData[serviceUUID] as? NSData, + URL = BeaconInfo.parseURLFromFrame(beaconServiceData) { + beaconsFound[peripheral]?.setURLframe(String(URL)) + } + } else if eft == BeaconInfo.EddystoneFrameType.EddystoneGATTServiceFrameType { + beaconsFound[peripheral]?.setEddystoneGATTServiceFrame() + } + } + } + + func didUpdateState(operationState: OperationState) { + self.operationState = operationState + + if let currentTimer = connectionTimer { + currentTimer.invalidate() + } + if operationState == OperationState.Connected { + if let beaconGATTOperations = beaconsFound[connectingPeripheral]?.operations { + if let callback = GATTOperationCallback { + beaconGATTOperations.discoverServices(callback) + } + } + } else if let UICallback = GATTOperationCallback { + UICallback(operationState: operationState) + } + } + + /// + /// Attempts to connect to a beacon if the CB Central Manager is ready; + /// We set a timer because we assume that if the connection can't be established in that + /// amount of time, there's a problem that the user needs to consider. + /// + func connectToBeacon(peripheral: CBPeripheral, + callback: (operationState: OperationState) -> Void) { + GATTOperationCallback = callback + if self.centralManager.centralManagerState == CBCentralManagerState.PoweredOn { + connectingPeripheral = peripheral + if peripheral.state != CBPeripheralState.Connected { + self.connectToPeripheralWithTimeout(connectingPeripheral) + } else { + if let beaconGATTOperations = beaconsFound[connectingPeripheral]?.operations { + beaconGATTOperations.discoverServices(callback) + } + } + } else { + NSLog("CentralManager state is %d, cannot connect", self.centralManager.state.rawValue) + didUpdateState(OperationState.CentralManagerConnectionError) + } + } + + func connectToPeripheralWithTimeout(peripheral: CBPeripheral) { + self.setupTimer() + centralManager.connectPeripheral(connectingPeripheral, options: nil) + } + + func setupTimer() { + connectingTime = kBeaconConnectionMaxTimePermitted + connectionTimer = NSTimer.scheduledTimerWithTimeInterval( + 1.0, + target: self, + selector: #selector(BeaconScanner.subtractConnectingTime), + userInfo: nil, + repeats: true) + } + + func subtractConnectingTime() { + connectingTime -= 1 + if connectingTime == 0 { + centralManager.cancelPeripheralConnection(connectingPeripheral) + didUpdateState(OperationState.ConnectionTimeout) + } + } + + func centralManager(central: CBCentralManager, + didFailToConnectPeripheral peripheral: CBPeripheral, + error: NSError?) { + NSLog("Connecting failed"); + /// + /// Other situations in which the connection attempt fails, + /// the timeout being treated separately. + /// + if operationState != OperationState.ConnectionTimeout { + didUpdateState(OperationState.DidFailToConnect) + } + } + + func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { + NSLog("Beacon connected") + didUpdateState(OperationState.Connected) + } + + func disconnectFromBeacon(peripheral: CBPeripheral) { + if self.centralManager.centralManagerState == CBCentralManagerState.PoweredOn { + centralManager.cancelPeripheralConnection(peripheral) + } else { + NSLog("CentralManager state is %d, cannot disconnect", self.centralManager.state.rawValue) + } + } + + private func startScanningSynchronized() { + if self.centralManager.centralManagerState != CBCentralManagerState.PoweredOn { + NSLog("CentralManager state is %d, cannot start scan", self.centralManager.state.rawValue) + self.shouldBeScanning = true + } else { + NSLog("Starting to scan for Eddystones") + let services = [CBUUID(string: "FEAA")] + let options = [CBCentralManagerScanOptionAllowDuplicatesKey : true] + self.centralManager.scanForPeripheralsWithServices(services, options: options) + } + } + + /// Creates the array with all the necessary information to be displayed. + func populateBeaconItems() -> [BeaconItem] { + var beaconItems: [BeaconItem] = [BeaconItem]() + for (beacon, frames) in beaconsFound { + let beaconGATTOperations = beaconsFound[beacon]!.operations + let beaconItem: BeaconItem = BeaconItem(peripheral: beacon, + frames: frames, + operations: beaconGATTOperations) + if frames.containsUsefulFrames() { + beaconItems.append(beaconItem) + } + + } + return beaconItems + } + + /// Checkes whether or not an EID beacon was registered using this projectID. + func getBeaconHTTPRequest(EID: String, projectID: String) { + if GIDSignIn.sharedInstance().currentUser != nil { + let bearer = GIDSignIn.sharedInstance().currentUser.authentication.accessToken + let bearerHeader = "Bearer \(bearer)" + let server = "\(kGetBeaconsServer)\(kEddystoneEIDCode)!\(EID)?projectId=\(projectID)" + let url = NSURL(string: server) + let httpHeaders = ["Authorization" : bearerHeader, + "Accept" : "application/json"] + if let requestURL = url { + /// + /// The actual response of the request is not important; we're just checking if we are + /// able to get the beacon information, which would mean that it was registered using + /// the current project. + /// + HTTPRequest.makeHTTPRequest(requestURL, + method: "GET", + postBody: nil, + requestHeaders: httpHeaders) { statusCode, _, _ in + if self.gettingBeaconDataTimer != nil { + var outstandingRequests: Int = 0 + dispatch_sync(self.lockQueueForBeaconData) { + self.outstandingBeaconRequests -= 1 + outstandingRequests = self.outstandingBeaconRequests + } + dispatch_sync(self.lockQueue) { + /// We're not interested in any statusCode other than 200. + if statusCode == 200 { + self.myEIDBeacons[EID] = true + } else { + self.myEIDBeacons[EID] = false + } + } + /// + /// If we are not currently scanning and we have no active + /// requests, it means that we're done and we have all the + /// information that we need. + /// + if outstandingRequests == 0 && !self.activelyScanning { + if let + currentTimer = self.gettingBeaconDataTimer, + callback = self.didFinishScanningCallback { + currentTimer.invalidate() + self.gettingBeaconDataTimer = nil + callback() + } + } + } + } + } + } + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconTableViewCell.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconTableViewCell.swift new file mode 100644 index 0000000..c2c154f --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BeaconTableViewCell.swift @@ -0,0 +1,41 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import CoreBluetooth + +/// +/// Customizes each cell from the scanned beacons table view in order to display all the information +/// that can be found without connecting to the beacon. +/// +class BeaconTableViewCell: UITableViewCell { + + @IBOutlet weak var nameLabel: UILabel! + @IBOutlet weak var framesLabel: UITextView! + @IBOutlet weak var cellBackgroundView: UIView! + @IBOutlet weak var connectableDot: UIView! + @IBOutlet weak var framesView: UIView! + /// Holds a reference to the beacon in order to be able to connect to it. + var beacon: CBPeripheral! + var operations: GATTOperations? + + override func awakeFromNib() { + super.awakeFromNib() + CustomViews.addShadow(cellBackgroundView) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/Beaconfig.xcdatamodeld/.xccurrentversion b/tools/gatt-config/ios/Beaconfig/Beaconfig/Beaconfig.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..7b2749a --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/Beaconfig.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + Beaconfig.xcdatamodel + + diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/Beaconfig.xcdatamodeld/Beaconfig.xcdatamodel/contents b/tools/gatt-config/ios/Beaconfig/Beaconfig/Beaconfig.xcdatamodeld/Beaconfig.xcdatamodel/contents new file mode 100644 index 0000000..193f33c --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/Beaconfig.xcdatamodeld/Beaconfig.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/BridgingHeader.h b/tools/gatt-config/ios/Beaconfig/Beaconfig/BridgingHeader.h new file mode 100644 index 0000000..4675f55 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/BridgingHeader.h @@ -0,0 +1,8 @@ +#ifndef BridgingHeader_h +#define BridgingHeader_h + +#endif + +#import +#import +#import diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/ConfigureBeaconSlotData.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/ConfigureBeaconSlotData.swift new file mode 100644 index 0000000..6bb2e37 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/ConfigureBeaconSlotData.swift @@ -0,0 +1,384 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import Foundation +import CoreBluetooth + +let kEIDFrameLength = 14 +/// +/// Beacons need a couple of seconds to generate the correct EID ADV Slot data after writing out to +/// that slot and to generate the beacon ECDH public key, so we're waiting for them. +/// +let kWaitingForBeaconTime: Double = 3 +let kECDHLengthKey = 32 +let kEIDLength = 8 + +/// +/// We need a couple of things both from the beacon and the service and we want to make sure we +/// gather all of it and that it's correct. +/// +class EIDRegistrationData { + var beaconEcdhPublicKey: String? + var serviceEcdhPublicKey: String? + var rotationPeriodExponent: NSNumber? + var initialClockValue: String? + var initialEid: String? + + func isValid() -> Bool { + return beaconEcdhPublicKey != nil && + serviceEcdhPublicKey != nil && + rotationPeriodExponent != nil && + initialClockValue != nil && + initialEid != nil + } +} + +class ConfigureBeaconSlotData: GATTOperations { + var maxSupportedTotalSlots = 0 + var currentlyUpdatedSlot = 0 + var slotUpdateData = [NSNumber : [String : NSData]]() + var beaconCapabilities: NSDictionary = [:] + var callback: (() -> Void)? + var isEIDSlot = false + var registrationEIDData: EIDRegistrationData? + var statusInfoUpdateAlert: UIAlertController? + + enum ConfigurationState { + case ReceivedUpdateData + case DidSetActiveSlot + case ErrorSettingActiveSlot + case DidUpdateTxPower + case ErrorUpdatingTxPower + case DidUpdateAdvInterval + case ErrorUpdatingAdvInterval + case DidUpdateSlotData + case ErrorUpdatingSlotData + case UpdatedAllSlots + } + + func didUpdateConfigurationState(configurationState: ConfigurationState) { + switch configurationState { + case .ReceivedUpdateData: + setActiveSlot() + case .DidSetActiveSlot: + updateTxPower() + case .DidUpdateTxPower: + updateAdvInterval() + case .DidUpdateAdvInterval: + updateSlotData() + case .DidUpdateSlotData: + /// + /// The EID slot configuration is special and requires some extra steps: + /// * reading the exponent, the value and the initial EID from the slot + /// * reading the public ECDH Key + /// + if isEIDSlot { + let delayTime = dispatch_time(DISPATCH_TIME_NOW, + Int64(kWaitingForBeaconTime * Double(NSEC_PER_SEC))) + dispatch_after(delayTime, dispatch_get_main_queue()) { + self.readEIDFrame() + } + isEIDSlot = false + } else { + currentlyUpdatedSlot += 1; setActiveSlot() + } + /// We're done! + case .UpdatedAllSlots: + if let UICallback = callback { + UICallback() + } + /// + /// If we have any problem with the update of the current slot, we just try to update the next + /// one; there's no point in discarding all changes just because one failed. + /// + case .ErrorUpdatingSlotData: + currentlyUpdatedSlot += 1; setActiveSlot() + default: + break + } + } + + func setActiveSlot() { + if currentlyUpdatedSlot >= maxSupportedTotalSlots { + didUpdateConfigurationState(ConfigurationState.UpdatedAllSlots) + } else { + if let characteristic = findCharacteristicByID(CharacteristicID.activeSlot.UUID) { + let currentSlot = NSData(bytes: ¤tlyUpdatedSlot, length: 1) + peripheral.writeValue(currentSlot, + forCharacteristic: characteristic, + type: CBCharacteristicWriteType.WithResponse) + } + } + } + + override func peripheral(peripheral: CBPeripheral, + didWriteValueForCharacteristic characteristic: CBCharacteristic, + error: NSError?) { + + if error != nil { + switch characteristic.UUID { + case CharacteristicID.activeSlot.UUID: + didUpdateConfigurationState(ConfigurationState.ErrorSettingActiveSlot) + case CharacteristicID.radioTxPower.UUID: + didUpdateConfigurationState(ConfigurationState.ErrorUpdatingTxPower) + case CharacteristicID.advertisingInterval.UUID: + didUpdateConfigurationState(ConfigurationState.ErrorUpdatingAdvInterval) + case CharacteristicID.ADVSlotData.UUID: + didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + default: + break + } + } else { + switch characteristic.UUID { + case CharacteristicID.activeSlot.UUID: + didUpdateConfigurationState(ConfigurationState.DidSetActiveSlot) + case CharacteristicID.radioTxPower.UUID: + didUpdateConfigurationState(ConfigurationState.DidUpdateTxPower) + case CharacteristicID.advertisingInterval.UUID: + didUpdateConfigurationState(ConfigurationState.DidUpdateAdvInterval) + case CharacteristicID.ADVSlotData.UUID: + didUpdateConfigurationState(ConfigurationState.DidUpdateSlotData) + default: + break + } + } + } + + override func peripheral(peripheral: CBPeripheral, + didUpdateValueForCharacteristic characteristic: CBCharacteristic, + error: NSError?) { + NSLog("did update value for characteristic \(characteristic.UUID)") + if let identifiedError = error { + NSLog("Error reading characteristic: \(identifiedError)") + } else { + switch characteristic.UUID { + case CharacteristicID.ADVSlotData.UUID: + parseEIDFrame() + case CharacteristicID.publicECDHKey.UUID: + didReadPublicECDH() + default: break + } + } + } + + func readEIDFrame() { + if let characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + func readPublicECDH() { + if let characteristic = findCharacteristicByID(CharacteristicID.publicECDHKey.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + func didReadPublicECDH() { + if let + characteristic = findCharacteristicByID(CharacteristicID.publicECDHKey.UUID), + value = characteristic.value { + // The ECDH public key's length is 32 bytes + if value.length == kECDHLengthKey { + var publicECDH = [UInt8](count: kECDHLengthKey, repeatedValue: 0) + value.getBytes(&publicECDH, length: kECDHLengthKey * sizeof(UInt8)) + let publicECDHBase64String = StringUtils.convertNSDataToBase64String(value) + if let registrationData = registrationEIDData { + registrationData.beaconEcdhPublicKey = publicECDHBase64String + if registrationData.isValid() { + /// If we have all the registration data, we can finally register the beacon. + let configureEID = EIDConfiguration() + configureEID.registerBeacon(registrationData) { didRegister in + if didRegister { + self.didUpdateConfigurationState(ConfigurationState.DidUpdateSlotData) + } else { + self.didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + } + } + } else { + didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + } + } else { + didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + } + } + } + } + + func parseEIDFrame() { + if let + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID), + value = characteristic.value { + var frameType: UInt8 = 0 + value.getBytes(&frameType, length: sizeof(UInt8)) + if frameType == BeaconInfo.EddystoneEIDFrameTypeID && value.length == kEIDFrameLength { + // The EID Slot Data has the following structure: + // 1 byte frame type + // 1 byte exponent + // 4 byte clock value + // 8 byte EID + var exponent: UInt8 = 0 + var clockValue: UInt32 = 0 + var EIDValue = [UInt8](count: kEIDLength, repeatedValue: 0) + value.getBytes(&exponent, range: NSMakeRange(1, 1)) + value.getBytes(&clockValue, range: NSMakeRange(2, 4)) + value.getBytes(&EIDValue, range: NSMakeRange(6, 8)) + /// The clock value is in big endian format, so we want to convert it to little endian. + clockValue = CFSwapInt32BigToHost(clockValue) + if let registrationData = registrationEIDData { + registrationData.rotationPeriodExponent = NSNumber(unsignedChar: exponent) + let clockValueString = "\(clockValue)" + registrationData.initialClockValue = clockValueString + let EIDData = NSData(bytes: EIDValue, length: kEIDLength) + let EIDBase64String = StringUtils.convertNSDataToBase64String(EIDData) + registrationData.initialEid = EIDBase64String + } + + /// We're giving the beacon it needs to compute its public ECDH key. + let delayTime = dispatch_time(DISPATCH_TIME_NOW, + Int64(kWaitingForBeaconTime * Double(NSEC_PER_SEC))) + dispatch_after(delayTime, dispatch_get_main_queue()) { + self.readPublicECDH() + } + } else { + didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + } + } + } + + // TODO: possibly send as callback a list of errors that appeared while configuring slots + func beginBeaconConfiguration(beaconCapabilities: NSDictionary, + statusInfoAlert: UIAlertController, + slotUpdateData: Dictionary >, + callback: () -> Void) { + self.callback = callback + self.maxSupportedTotalSlots = beaconCapabilities[maxSupportedSlotsKey] as! Int + self.currentlyUpdatedSlot = 0 + self.slotUpdateData = slotUpdateData + self.beaconCapabilities = beaconCapabilities + self.statusInfoUpdateAlert = statusInfoAlert + peripheral.delegate = self + didUpdateConfigurationState(ConfigurationState.ReceivedUpdateData) + } + + func updateTxPower() { + var slotNumber = currentlyUpdatedSlot + 1 + if let perSlotTxPowerSupported = beaconCapabilities[perSlotTxPowerSupportedKey] { + if !(perSlotTxPowerSupported as! Bool) { + slotNumber = 0 + } + } + if let + currentSlotData = slotUpdateData[slotNumber], + value = currentSlotData[slotDataTxPowerKey], + characteristic = findCharacteristicByID(CharacteristicID.radioTxPower.UUID) { + var txPower: Int8 = 0 + value.getBytes(&txPower, length: sizeof(Int8)) + let val = NSData(bytes: &txPower, length: sizeof(Int8)) + peripheral.writeValue(val, forCharacteristic: characteristic, type: .WithResponse) + } else { + updateAdvInterval() + } + } + + func updateAdvInterval() { + var slotNumber = currentlyUpdatedSlot + 1 + if let perSlotAdvIntervalSupported = beaconCapabilities[perSlotAdvIntervalsSupportedKey] { + if !(perSlotAdvIntervalSupported as! Bool) { + slotNumber = 0 + } + } + if let + currentSlotData = slotUpdateData[slotNumber], + value = currentSlotData[slotDataAdvIntervalKey], + characteristic = findCharacteristicByID(CharacteristicID.advertisingInterval.UUID) { + var advInterval: UInt16 = 0 + value.getBytes(&advInterval, length: sizeof(UInt16)) + var bigEndianAdvInterv: UInt16 = CFSwapInt16HostToBig(advInterval) + let val = NSData(bytes: &bigEndianAdvInterv, length: sizeof(UInt16)) + peripheral.writeValue(val, forCharacteristic: characteristic, type: .WithResponse) + } else { + updateSlotData() + } + } + + /// + /// We usually get the slot data in the right format from the moment when we create a dictionary + /// with it. There's no need to do more computations. + /// + func updateSlotData() { + isEIDSlot = false + let slotNumber = currentlyUpdatedSlot + 1 + if let + currentSlotData = slotUpdateData[slotNumber], + value = currentSlotData[slotDataURLKey], + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + peripheral.writeValue(value, forCharacteristic: characteristic, type: .WithResponse) + } else if let + currentSlotData = slotUpdateData[slotNumber], + value = currentSlotData[slotDataUIDKey], + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + peripheral.writeValue(value, forCharacteristic: characteristic, type: .WithResponse) + } else if let + currentSlotData = slotUpdateData[slotNumber], + value = currentSlotData[slotDataTLMKey], + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + peripheral.writeValue(value, forCharacteristic: characteristic, type: .WithResponse) + } else if let + currentSlotData = slotUpdateData[slotNumber], + value = currentSlotData[slotDataNoFrameKey], + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + peripheral.writeValue(value, forCharacteristic: characteristic, type: .WithResponse) + } else if let + currentSlotData = slotUpdateData[slotNumber], + _ = currentSlotData[slotDataEIDKey], + characteristic = findCharacteristicByID(CharacteristicID.ADVSlotData.UUID) { + /// + /// The EID configuration requires additional steps; we don't have the frameData yet and + /// we must take it from the server. After writing it, we're still not done with this! + /// + isEIDSlot = true + let configurationEID = EIDConfiguration() + configurationEID.getEIDParams() {serviceKey, minRotationExponent, maxRotationExponent in + if let + key = serviceKey, + minExponent = minRotationExponent, + _ = maxRotationExponent { + let frameData = NSMutableData() + frameData.appendBytes([BeaconInfo.EddystoneEIDFrameTypeID], length: sizeof(UInt8)) + if let + serviceKeyData = NSData(base64EncodedString: key, + options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { + frameData.appendData(serviceKeyData) + if serviceKeyData.length == kECDHLengthKey { + self.registrationEIDData = EIDRegistrationData() + self.registrationEIDData?.serviceEcdhPublicKey = key + frameData.appendBytes([minExponent], length: sizeof(UInt8)) + self.peripheral.writeValue(frameData, + forCharacteristic: characteristic, + type: .WithResponse) + } else { + self.didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + } + } + } else { + self.didUpdateConfigurationState(ConfigurationState.ErrorUpdatingSlotData) + } + } + } else { + currentlyUpdatedSlot += 1 + setActiveSlot() + } + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/ConnectionView.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/ConnectionView.swift new file mode 100644 index 0000000..92a3427 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/ConnectionView.swift @@ -0,0 +1,323 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +import UIKit + +/// +/// Displays the state of the attempt to connect to the beacon and unlocking beacon options. +/// The class was created in order to provide details about connection problems and +/// to allow the user to retry to connect to the beacon. +/// +class ConnectionView: UIViewController, UITextFieldDelegate, UIGestureRecognizerDelegate { + let connectionView = UIView() + var stateTextView: UITextView? + var retryButtonView: UIView? + var holderView: UIView! + var unlockHolderView: UIView! + var textField: UITextField! + var connectionHolderView: UIView! + var retryConnectionCallback: (() -> Void)? + var unlockBeaconCallback: ((passkey: String) -> Void)? + var unlockButton: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + } + + func textField(textField: UITextField, + shouldChangeCharactersInRange range: NSRange, + replacementString string: String) -> Bool { + if string.characters.count == 0 { + return true + } + let currentText = textField.text ?? "" + let text = (currentText as NSString).stringByReplacingCharactersInRange(range, + withString: string) + + let currentCharacterCount = textField.text?.characters.count ?? 0 + if (range.length + range.location > currentCharacterCount){ + return false + } + let newLength = currentCharacterCount + string.characters.count - range.length + var hasRightLength: Bool = false + if textField == self.textField { + if newLength <= kPassCodeLength { + hasRightLength = true + } + if newLength == kPassCodeLength { + unlockButton.enabled = true + } + } + return StringUtils.inHexadecimalString(text) && hasRightLength + } + + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return false + } + + func createHolderView(topView: UIView, pinTop: NSLayoutAttribute) -> UIView { + let holder: UIView = UIView() + connectionView.addSubview(holder) + CustomViews.setConstraints(holder, + holderView: connectionView, + topView: topView, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: pinTop, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + holder.backgroundColor = UIColor.whiteColor() + CustomViews.addShadow(holder) + return holder + } + + + func createLabelWithText(text: String, holder: UIView, image: UIImageView) -> UILabel { + let textLabel = UILabel() + textLabel.text = text + textLabel.textColor = kGreenColor + textLabel.font = UIFont.systemFontOfSize(19, weight: UIFontWeightSemibold) + holder.addSubview(textLabel) + + holder.addSubview(image) + CustomViews.setConstraints(image, + holderView: holder, + topView: holder, + leftView: nil, + rightView: nil, + height: 20, + width: 20, + pinTopAttribute: .Top, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + CustomViews.setConstraints(textLabel, + holderView: holder, + topView: holder, + leftView: image, + rightView: nil, + height: kLabelHeight, + width: kLabelWidth, + pinTopAttribute: .Top, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + + return textLabel + } + + func createTextView(text: String, holder: UIView, topView: UIView) -> UITextView { + let textView = UITextView() + holder.addSubview(textView) + textView.textAlignment = NSTextAlignment.Left + textView.text = text + textView.editable = false + textView.dataDetectorTypes = UIDataDetectorTypes.All + textView.textContainer.maximumNumberOfLines = 3 + textView.scrollEnabled = false + CustomViews.setConstraints(textView, + holderView: holder, + topView: topView, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + textView.textColor = UIColor.darkGrayColor() + + return textView + } + + func addRetryButton() { + let retryButton = UIButton() + retryButtonView?.addSubview(retryButton) + CustomViews.setConstraints(retryButton, + holderView: retryButtonView!, + topView: retryButtonView!, + leftView: nil, + rightView: retryButtonView, + height: 20, + width: 100, + pinTopAttribute: .Top, + setBottomConstraints: true, + marginConstraint: kTableViewCellMargin) + retryButton.setTitle("RETRY", forState: UIControlState.Normal) + retryButton.setTitleColor(kGreenColor, forState: UIControlState.Normal) + retryButton.titleLabel!.font = UIFont.systemFontOfSize(14, weight: UIFontWeightSemibold) + retryButton.titleLabel!.font = UIFont(name: "Arial-BoldMT", size: kTextFontSize) + retryButton.titleLabel?.textAlignment = .Right + retryButton.addTarget(self, + action: #selector(ConnectionView.retryButtonPressed), + forControlEvents: .TouchUpInside) + } + + func retryButtonPressed() { + if let callback = retryConnectionCallback { + callback() + } + } + + func createConnectionView() { + connectionHolderView = createHolderView(connectionView, pinTop: .Top) + let connectionImage = UIImage(named: "bluetoothConnection") + let connectionImageView = UIImageView(image: connectionImage!) + connectionImageView.alpha = 0.5 + let label = createLabelWithText("Connection", + holder: connectionHolderView, + image: connectionImageView) + stateTextView = createTextView("Attempting to connect to the beacon...", + holder: connectionHolderView, + topView: label) + retryButtonView = UIView() + connectionHolderView.addSubview(retryButtonView!) + CustomViews.setConstraints(retryButtonView!, + holderView: connectionHolderView, + topView: stateTextView!, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + let progressView = UIProgressView() + connectionHolderView.addSubview(progressView) + CustomViews.setConstraints(progressView, + holderView: connectionHolderView, + topView: retryButtonView!, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + } + + func createUnlockingView() -> UIView { + unlockHolderView = createHolderView(connectionHolderView, pinTop: .Bottom) + let unlockingImage = UIImage(named: "unlock") + let unlockingImageView = UIImageView(image: unlockingImage) + unlockingImageView.alpha = 0.5 + let label = createLabelWithText("Unlock Beacon", + holder: unlockHolderView, + image: unlockingImageView) + stateTextView = createTextView("Enter the key to unlock the beacon.\n" + + "The key should be a 32 hex characters string.", + holder: unlockHolderView, + topView: label) + textField = createTextField("Insert unlock code", + holderView: unlockHolderView, + topView: stateTextView!, + leftView: nil, + topAttribute: .Bottom) + textField.delegate = self + createUnlockButton(unlockHolderView, topView: textField) + return unlockHolderView + } + + func configureView(retryConnectionCallback: () -> Void, + unlockBeaconCallback: (passkey: String) -> Void) -> UIView { + self.retryConnectionCallback = retryConnectionCallback + self.unlockBeaconCallback = unlockBeaconCallback + connectionView.frame = view.bounds + connectionView.backgroundColor = kLightGrayColor + createConnectionView() + connectionView.addSubview(connectionHolderView) + CustomViews.setConstraints(connectionHolderView, + holderView: connectionView, + topView: connectionView, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Top, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + + return connectionView + } + func dismissKeyboard() { + view.endEditing(true) + } + + func createTextField(placeholder: String, + holderView: UIView, + topView: UIView, + leftView: UIView?, + topAttribute: NSLayoutAttribute) -> UITextField { + let textField = UITextField() + holderView.addSubview(textField) + textField.attributedPlaceholder = NSAttributedString(string:placeholder, + attributes:[NSForegroundColorAttributeName: + UIColor.grayColor()]) + CustomViews.setConstraints(textField, + holderView: holderView, + topView: topView, + leftView: leftView, + rightView: nil, + height: kTextFieldHeight, + width: nil, + pinTopAttribute: topAttribute, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + + textField.layer.backgroundColor = UIColor.whiteColor().CGColor + textField.layer.borderColor = UIColor.grayColor().CGColor + textField.layer.borderWidth = 0.0 + textField.layer.masksToBounds = false + CustomViews.addShadow(textField) + textField.font = UIFont(name: "Menlo-Regular", size: kTextFieldFontSize) + textField.autocapitalizationType = .None + textField.layer.sublayerTransform = CATransform3DMakeTranslation(3, 0, 0) + textField.userInteractionEnabled = true + textField.enabled = true + return textField + } + + func createUnlockButton(holder: UIView, topView: UIView) -> UIView { + unlockButton = UIButton() + holder.addSubview(unlockButton) + CustomViews.setConstraints(unlockButton, + holderView: holder, + topView: topView, + leftView: nil, + rightView: holder, + height: kButtonWidth/5, + width: kButtonWidth, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + unlockButton.setTitle("UNLOCK", forState: UIControlState.Normal) + unlockButton.setTitleColor(kGreenColor, forState: UIControlState.Normal) + unlockButton.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Disabled) + unlockButton.titleLabel!.font = UIFont(name: "Arial-BoldMT", size: kTextFontSize) + unlockButton.titleLabel?.textAlignment = .Right + unlockButton.addTarget(self, + action: #selector(ConnectionView.unlockButtonPressed), + forControlEvents: .TouchUpInside) + unlockButton.enabled = false + return unlockButton + } + + func unlockButtonPressed() { + if let callback = unlockBeaconCallback { + callback(passkey: textField.text!) + } + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/CustomViews.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/CustomViews.swift new file mode 100644 index 0000000..ce19b83 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/CustomViews.swift @@ -0,0 +1,264 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import Foundation + +let kTableViewCellMargin: CGFloat = 4 +let kFrameDescriptionWidth: CGFloat = 250 +let kFrameTitleWidth: CGFloat = 50 +let kUIDRequiredLength = 32 +let kShadowOpacity: Float = 0.5 +let kShadowOffsetWidth: CGFloat = 0.3 +let kShadowOffsetHeight: CGFloat = 0.7 +let kTitleFontSize: CGFloat = 15 +let kTextFontSize: CGFloat = 14 +let kTextFieldFontSize: CGFloat = 12.5 +let kLabelFontSize: CGFloat = 11 + +/// +/// Class that enables setting constraints to views and placing them in +/// certain places of the screen, in relation to other views; this is useful +/// because it makes layout easier - all views are designed using this class +/// which saves from a lot of repetitive code. +/// +class CustomViews { + /// + /// Places the current view inside the holder view, surrounded by the top, left and right views, + /// with a certain margin constraint. In order to establish the size of the holderView, + /// if the current view is the last one, then bottom constraints must be set. + /// + class func setConstraints(view: UIView, + holderView: UIView, + topView: UIView, + leftView: UIView?, + rightView: UIView?, + height: CGFloat?, + width: CGFloat?, + pinTopAttribute: NSLayoutAttribute, + setBottomConstraints: Bool, + marginConstraint: CGFloat) { + if rightView == nil { + if leftView == nil { + let leadingConstraint = NSLayoutConstraint(item: view, + attribute:.LeadingMargin, + relatedBy: .Equal, + toItem: holderView, + attribute: .LeadingMargin, + multiplier: 1.0, + constant: marginConstraint) + NSLayoutConstraint.activateConstraints([leadingConstraint]) + } else { + let leadingConstraint = NSLayoutConstraint(item: view, + attribute:.LeadingMargin, + relatedBy: .Equal, + toItem: leftView, + attribute: .TrailingMargin, + multiplier: 1.0, + constant: marginConstraint * 2) + NSLayoutConstraint.activateConstraints([leadingConstraint]) + } + } + + if width != nil { + let widthConstraint = NSLayoutConstraint(item: view, + attribute:.Width, + relatedBy: .Equal, + toItem: nil, + attribute: .NotAnAttribute, + multiplier: 1.0, + constant: width!) + NSLayoutConstraint.activateConstraints([widthConstraint]) + } else if rightView == nil { + let trailingConstraints = NSLayoutConstraint(item: view, + attribute:.TrailingMargin, + relatedBy: .Equal, + toItem: holderView, + attribute: .TrailingMargin, + multiplier: 1.0, + constant: -marginConstraint) + NSLayoutConstraint.activateConstraints([trailingConstraints]) + } + if rightView != nil { + let marginAttribute: NSLayoutAttribute! + if rightView == holderView { + marginAttribute = .TrailingMargin + } else { + marginAttribute = .LeadingMargin + } + let trailingConstraints = NSLayoutConstraint(item: view, + attribute:.TrailingMargin, + relatedBy: .Equal, + toItem: rightView, + attribute: marginAttribute, + multiplier: 1.0, + constant: -marginConstraint) + NSLayoutConstraint.activateConstraints([trailingConstraints]) + } + if height != nil { + let heightConstraint = NSLayoutConstraint(item: view, + attribute: .Height, + relatedBy: .Equal, + toItem: nil, + attribute: .NotAnAttribute, + multiplier: 1.0, + constant: height!) + NSLayoutConstraint.activateConstraints([heightConstraint]) + } + + let pinTopConstraints = NSLayoutConstraint(item: view, + attribute: .Top, + relatedBy: .Equal, + toItem: topView, + attribute: pinTopAttribute, + multiplier: 1.0, + constant: marginConstraint) + if setBottomConstraints { + let bottomConstraints = NSLayoutConstraint(item: view, + attribute: .Bottom, + relatedBy: .Equal, + toItem: holderView, + attribute: .Bottom, + multiplier: 1.0, + constant: -marginConstraint) + NSLayoutConstraint.activateConstraints([bottomConstraints]) + } + + view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activateConstraints([pinTopConstraints]) + } + + class func createFrameDisplayView(type: BeaconInfo.EddystoneFrameType, + data: String, + holder: UIView, + topView: UIView, + pinTop: NSLayoutAttribute, + setBottomConstraints: Bool) -> UIView { + var title: String + var description: String + var dataDescription: String + switch type { + case .UIDFrameType: + title = "UID" + description = "Namespace: \nInstance:" + dataDescription = getUIDDescription(data) + case .URLFrameType: + title = "URL" + description = "Link:" + dataDescription = data + case .TelemetryFrameType: + title = "TLM" + description = "Battery:\nTemperature:\nTime working:\nPDU Count:" + dataDescription = data + case .EIDFrameType: + title = "EID" + description = "Ephemeral ID:" + dataDescription = data + default: + return UIView() + } + + let titleLabel = UILabel() + holder.addSubview(titleLabel) + titleLabel.font = UIFont(name: "Arial-BoldMT", size: kTitleFontSize) + CustomViews.setConstraints(titleLabel, + holderView: holder, + topView: topView, + leftView: nil, + rightView: nil, + height: nil, + width: kFrameTitleWidth, + pinTopAttribute: pinTop, + setBottomConstraints: setBottomConstraints, + marginConstraint: kTableViewCellMargin) + titleLabel.text = title + titleLabel.textColor = UIColor.darkGrayColor() + + let infoLabel = UILabel() + holder.addSubview(infoLabel) + CustomViews.setConstraints(infoLabel, + holderView: holder, + topView: topView, + leftView: titleLabel, + rightView: nil, + height: nil, + width: kFrameDescriptionWidth, + pinTopAttribute: pinTop, + setBottomConstraints: setBottomConstraints, + marginConstraint: kTableViewCellMargin) + infoLabel.text = description + infoLabel.numberOfLines = 4 + infoLabel.font = UIFont(name: "Arial", size: kLabelFontSize) + infoLabel.textColor = UIColor.darkGrayColor() + + let dataLabel = UILabel() + holder.addSubview(dataLabel) + CustomViews.setConstraints(dataLabel, + holderView: holder, + topView: topView, + leftView: infoLabel, + rightView: holder, + height: nil, + width: nil, + pinTopAttribute: pinTop, + setBottomConstraints: setBottomConstraints, + marginConstraint: kTableViewCellMargin) + + dataLabel.text = dataDescription + dataLabel.textAlignment = .Right + dataLabel.numberOfLines = 4 + dataLabel.font = UIFont(name: "Arial", size: kLabelFontSize) + dataLabel.textColor = UIColor.darkGrayColor() + return dataLabel + } + + class func getUIDDescription(data: String) -> String { + var description = "" + if data.characters.count == kUIDRequiredLength { + /// + /// The first 20 characters represent the 10 bytes of namespace, + /// the following 12 characters are the 6 bytes of instance. + /// + let namespace = (data as NSString).substringWithRange(NSRange(location: 0, length: 20)) + let instance = (data as NSString).substringWithRange(NSRange(location: 20, length: 12)) + description = "\(namespace)\n\(instance)" + } + return description + } + + class func displayConfigurableBeacon(holder: UIView, topView: UIView, pinTop: NSLayoutAttribute) { + let textLabel = UILabel() + holder.addSubview(textLabel) + textLabel.font = UIFont(name: "Arial", size: kTextFieldFontSize) + CustomViews.setConstraints(textLabel, + holderView: holder, + topView: topView, + leftView: nil, + rightView: nil, + height: nil, + width: kFrameDescriptionWidth, + pinTopAttribute: pinTop, + setBottomConstraints: true, + marginConstraint: kTableViewCellMargin) + textLabel.text = "Configurable beacon" + textLabel.textColor = UIColor.darkGrayColor() + } + + class func addShadow(view: UIView) { + view.layer.shadowColor = UIColor.darkGrayColor().CGColor + view.layer.shadowOpacity = kShadowOpacity + view.layer.shadowOffset = CGSize(width: kShadowOffsetWidth, height: kShadowOffsetHeight) + view.layer.shadowRadius = 1 + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/EIDConfiguration.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/EIDConfiguration.swift new file mode 100644 index 0000000..7c90a09 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/EIDConfiguration.swift @@ -0,0 +1,164 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import Foundation + +/// We want to wait no more than 10 seconds to wait for the HTTP request to give us an answer +let kRequestTimeout: Double = 10 +let kGetEIDParamsServer = "https://proximitybeacon.googleapis.com/v1beta1/eidparams" +let kRegisterBeaconServer = "https://proximitybeacon.googleapis.com/v1beta1/beacons:register" +let kInstanceLength = 6 +let kNamespaceLength = 10 + +/// +/// The class implements all the functions that are necessary for configuring the EID and +/// cannot be included in the regular flow of other frame types configurations, +/// especially the HTTP requests. +/// +class EIDConfiguration { + /// + /// Callback to the general configuration class saying whether or not the registration was + /// successful. + /// + var EIDRegistrationCallback: ((didRegister: Bool) -> Void)? + + /// + /// Project ID is needed whenever the user intends to select a new project ID in order to perform + /// any EID registrations or beacons scannings (if the user wants to know if any of the beacons + /// in the nearby area are related to the currently selected project). + /// + static var projectID: String? + + func parseEIDParams(data: NSData) -> (String, UInt8, UInt8)? { + do { + let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) + if let + servicePublicKey = json["serviceEcdhPublicKey"] as? String, + minRotationExponent = json["minRotationPeriodExponent"] as? NSNumber, + maxRotationExponent = json["maxRotationPeriodExponent"] as? NSNumber { + return (servicePublicKey, UInt8(Int(minRotationExponent)), UInt8(Int(maxRotationExponent))) + } + } catch { + print("error serializing JSON: \(error)") + } + return nil + } + + func httpRegisterRequest(beacon: Dictionary ) { + let bearer = GIDSignIn.sharedInstance().currentUser.authentication.accessToken + let bearerHeader = "Bearer \(bearer)" + let server = "\(kRegisterBeaconServer)?projectId=\(EIDConfiguration.projectID!)" + let url = NSURL(string: server) + let httpHeaders = ["Authorization" : bearerHeader, + "Content-Type" : "application/json", + "Accept" : "application/json"] + var body: NSData + do { + body = try NSJSONSerialization.dataWithJSONObject(beacon, options: .PrettyPrinted) + } catch { + print(error) + return + } + if let serverURL = url { + HTTPRequest.makeHTTPRequest(serverURL, + method: "POST", + postBody: body, + requestHeaders: httpHeaders) { statusCode, content, error in + if let callback = self.EIDRegistrationCallback { + if statusCode == 200 { + callback(didRegister: true) + } else { + callback(didRegister: false) + } + } + } + } + } + + /// + /// We make a request to the server to get the service's public ECDH Key and the minimum + /// and maximum accepted values for the exponent. + /// + func getEIDParams(callback: (key: String?, minExponent:UInt8?, maxExponent: UInt8?) -> Void) { + let bearer = GIDSignIn.sharedInstance().currentUser.authentication.accessToken + let bearerHeader = "Bearer \(bearer)" + let server = kGetEIDParamsServer + let url = NSURL(string: server) + let httpHeaders = ["Authorization" : bearerHeader, + "Accept" : "application/json"] + if let serverURL = url { + HTTPRequest.makeHTTPRequest(serverURL, + method: "GET", + postBody: nil, + requestHeaders: httpHeaders) { statusCode, content, error in + if statusCode == 200 { + let (serviceKey, minExp, maxExp) = + self.parseEIDParams(content!)! + callback(key: serviceKey, + minExponent: minExp, + maxExponent: maxExp) + } else { + callback(key: nil, minExponent: nil, maxExponent: nil) + } + } + } + } + + func registerBeacon(registrationData: EIDRegistrationData, + callback: (didRegister: Bool) -> Void) { + EIDRegistrationCallback = callback + + /// + /// When registering a beacon that broadcasts Eddystone-EID, we must generate a 16-byte code + /// that identifies the beacon; it will only be used for administering the beacon. + /// + let IDData = generateEddystone16ByteStableID() + let IDString = IDData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) + let advertisedID = ["type" : "EDDYSTONE", + "id" : IDString] + let eidRegistration = ["beaconEcdhPublicKey" : registrationData.beaconEcdhPublicKey!, + "serviceEcdhPublicKey" : registrationData.serviceEcdhPublicKey!, + "rotationPeriodExponent" : registrationData.rotationPeriodExponent!, + "initialClockValue" : registrationData.initialClockValue!, + "initialEid" : registrationData.initialEid!] + let beacon = ["advertisedId" : advertisedID, + "status" : "ACTIVE", + "ephemeralIdRegistration" : eidRegistration] + httpRegisterRequest(beacon as! Dictionary) + } + + /// The namespace is a 10-byte code that is the first part of a MD5 hash of our projectID. + func stableIDNamespace() -> NSData { + let projectID: String = EIDConfiguration.projectID! + let digest = StringUtils.md5(projectID) + return digest.subdataWithRange(NSMakeRange(0, kNamespaceLength)) + } + + /// + /// The "stable" Eddystone identifier is composed of: + /// - 10 bytes of namespace, which is taken from the MD5 hash of the project ID + /// - 6 bytes of instance, which is just a random number. + /// + func generateEddystone16ByteStableID() -> NSData { + let namespace = stableIDNamespace() + var instance = [UInt8](count: kInstanceLength, repeatedValue: 0) + arc4random_buf(&instance, kInstanceLength) + let instanceData = NSData(bytes: instance, length: kInstanceLength) + let beaconID = NSMutableData() + beaconID.appendData(namespace) + beaconID.appendData(instanceData) + return beaconID + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/Eddystone.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/Eddystone.swift new file mode 100644 index 0000000..a4465f5 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/Eddystone.swift @@ -0,0 +1,404 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +import CoreBluetooth + +/// +/// BeaconID +/// +/// Uniquely identifies an Eddystone compliant beacon. +/// +class BeaconID : NSObject { + + enum BeaconType { + case Eddystone // 10 bytes namespace + 6 bytes instance = 16 byte ID + case EddystoneEID // 8 byte ID + } + + let beaconType: BeaconType + + /// + /// The raw beaconID data. This is typically printed out in hex format. + /// + let beaconID: [UInt8] + + private init(beaconType: BeaconType!, beaconID: [UInt8]) { + self.beaconID = beaconID + self.beaconType = beaconType + } + + override var description: String { + if self.beaconType == BeaconType.Eddystone || self.beaconType == BeaconType.EddystoneEID { + let hexid = hexBeaconID(self.beaconID) + return "\(hexid)" + } else { + return "BeaconID with invalid type (\(beaconType))" + } + } + + private func hexBeaconID(beaconID: [UInt8]) -> String { + var retval = "" + for byte in beaconID { + var s = String(byte, radix:16, uppercase: false) + if s.characters.count == 1 { + s = "0" + s + } + retval += s + } + return retval + } + +} + +func ==(lhs: BeaconID, rhs: BeaconID) -> Bool { + if lhs == rhs { + return true; + } else if lhs.beaconType == rhs.beaconType + && rhs.beaconID == rhs.beaconID { + return true; + } + + return false; +} + +/// +/// BeaconInfo +/// +/// Contains information fully describing a beacon, including its beaconID, transmission power, +/// RSSI, and possibly telemetry information. +/// +class BeaconInfo : NSObject { + + static let EddystoneUIDFrameTypeID: UInt8 = 0x00 + static let EddystoneURLFrameTypeID: UInt8 = 0x10 + static let EddystoneTLMFrameTypeID: UInt8 = 0x20 + static let EddystoneEIDFrameTypeID: UInt8 = 0x30 + static let GATTServiceID = "A3C87500-8ED3-4BDF-8A39-A01BEBEDE295" + + enum EddystoneFrameType { + case UnknownFrameType + case UIDFrameType + case URLFrameType + case TelemetryFrameType + case EIDFrameType + case EddystoneGATTServiceFrameType + case NotSetFrameType + + var description: String { + switch self { + case .UnknownFrameType: + return "Unknown Frame Type" + case .UIDFrameType: + return "UID Frame" + case .URLFrameType: + return "URL Frame" + case .TelemetryFrameType: + return "TLM Frame" + case .EIDFrameType: + return "EID Frame" + case .EddystoneGATTServiceFrameType: + return "EddystoneGATTService Frame" + case .NotSetFrameType: + return "Frame type not set" + } + } + } + + let beaconID: BeaconID + let txPower: Int + let RSSI: Int + + private init(beaconID: BeaconID, txPower: Int, RSSI: Int) { + self.beaconID = beaconID + self.txPower = txPower + self.RSSI = RSSI + } + + class func frameTypeForFrame(advertisementData: [NSObject : AnyObject]) + -> EddystoneFrameType { + if let advertisementFrameList = advertisementData[CBAdvertisementDataServiceDataKey] + as? [NSObject : AnyObject] { + let uuid = CBUUID(string: "FEAA") + if let frameData = advertisementFrameList[uuid] as? NSData { + if frameData.length > 1 { + let count = frameData.length + var frameBytes = [UInt8](count: count, repeatedValue: 0) + frameData.getBytes(&frameBytes, length: count) + + if frameBytes[0] == EddystoneUIDFrameTypeID { + return EddystoneFrameType.UIDFrameType + } else if frameBytes[0] == EddystoneTLMFrameTypeID { + return EddystoneFrameType.TelemetryFrameType + } else if frameBytes[0] == EddystoneEIDFrameTypeID { + return EddystoneFrameType.EIDFrameType + } else if frameBytes[0] == EddystoneURLFrameTypeID { + return EddystoneFrameType.URLFrameType + } + } else { + if let serviceUUIDs = advertisementData[CBAdvertisementDataServiceUUIDsKey] { + for service in serviceUUIDs as! NSArray { + let stringServiceUUID = String(service) + if GATTServiceID.compare(stringServiceUUID, options: .CaseInsensitiveSearch) == + NSComparisonResult.OrderedSame { + return EddystoneFrameType.EddystoneGATTServiceFrameType + } + } + } + } + } + } + + return EddystoneFrameType.UnknownFrameType + } + + class func telemetryDataForFrame(advertisementFrameList: [NSObject : AnyObject]!) -> NSData? { + return advertisementFrameList[CBUUID(string: "FEAA")] as? NSData + } + + /// + /// Unfortunately, this can't be a failable convenience initialiser just yet because of a "bug" + /// in the Swift compiler — it can't tear-down partially initialised objects, so we'll have to + /// wait until this gets fixed. For now, class method will do. + /// + class func beaconInfoForUIDFrameData(frameData: NSData, RSSI: Int) + -> BeaconInfo? { + if frameData.length > 1 { + let count = frameData.length + var frameBytes = [UInt8](count: count, repeatedValue: 0) + frameData.getBytes(&frameBytes, length: count) + + if frameBytes[0] != EddystoneUIDFrameTypeID { + NSLog("Unexpected non UID Frame passed to BeaconInfoForUIDFrameData.") + return nil + } else if frameBytes.count < 18 { + NSLog("Frame Data for UID Frame unexpectedly truncated in BeaconInfoForUIDFrameData.") + } + + let txPower = Int(Int8(bitPattern:frameBytes[1])) + let beaconID: [UInt8] = Array(frameBytes[2..<18]) + let bid = BeaconID(beaconType: BeaconID.BeaconType.Eddystone, beaconID: beaconID) + return BeaconInfo(beaconID: bid, txPower: txPower, RSSI: RSSI) + } + + return nil + } + + class func beaconInfoForEIDFrameData(frameData: NSData, RSSI: Int) + -> BeaconInfo? { + if frameData.length > 1 { + let count = frameData.length + var frameBytes = [UInt8](count: count, repeatedValue: 0) + frameData.getBytes(&frameBytes, length: count) + + if frameBytes[0] != EddystoneEIDFrameTypeID { + NSLog("Unexpected non EID Frame passed to BeaconInfoForEIDFrameData.") + return nil + } else if frameBytes.count < 10 { + NSLog("Frame Data for EID Frame unexpectedly truncated in BeaconInfoForEIDFrameData.") + } + + let txPower = Int(Int8(bitPattern:frameBytes[1])) + let beaconID: [UInt8] = Array(frameBytes[2..<10]) + let bid = BeaconID(beaconType: BeaconID.BeaconType.EddystoneEID, beaconID: beaconID) + return BeaconInfo(beaconID: bid, txPower: txPower, RSSI: RSSI) + } + + return nil + } + + class func parseURLFromFrame(frameData: NSData) -> NSURL? { + if frameData.length > 0 { + let count = frameData.length + var frameBytes = [UInt8](count: count, repeatedValue: 0) + frameData.getBytes(&frameBytes, length: count) + let frameTypeLength = 2 + /// Check if the URL was corrupted. + if count > frameTypeLength { + if let URLPrefix = URLPrefixFromByte(frameBytes[2]) { + var output = URLPrefix + for i in 3.. (UInt16, Double, UInt32, UInt32)? { + + /// + /// The unencrypted telemetry frame has the length of 14 bytes; we want to display information + /// in the scan results list, but we're not interested for now in the encrypted telemetry. + /// + if frameData.length == 14 { + var batteryVoltage: UInt16 = 0 + var beaconTemperature: UInt16 = 0 + var advPDUCount: UInt32 = 0 + var timeSinceReboot: UInt32 = 0 + + frameData.getBytes(&batteryVoltage, range: NSMakeRange(2, 2)) + frameData.getBytes(&beaconTemperature, range: NSMakeRange(4, 2)) + frameData.getBytes(&advPDUCount, range: NSMakeRange(6, 4)) + frameData.getBytes(&timeSinceReboot, range: NSMakeRange(10, 4)) + batteryVoltage = CFSwapInt16BigToHost(batteryVoltage) + beaconTemperature = CFSwapInt16BigToHost(beaconTemperature) + /// Convert temperature from 8.8 fixed point notation. + let realBeaconTemperature: Double = Double(beaconTemperature) / 256.0 + advPDUCount = CFSwapInt32BigToHost(advPDUCount) + timeSinceReboot = CFSwapInt32BigToHost(timeSinceReboot) + return (batteryVoltage, realBeaconTemperature, advPDUCount, timeSinceReboot) + } + return nil + } + + override var description: String { + switch self.beaconID.beaconType { + case .Eddystone: + return "Eddystone \(self.beaconID), txPower: \(self.txPower), RSSI: \(self.RSSI)" + case .EddystoneEID: + return "Eddystone EID \(self.beaconID), txPower: \(self.txPower), RSSI: \(self.RSSI)" + } + } + + class func URLPrefixFromByte(schemeID: UInt8) -> String? { + switch schemeID { + case 0x00: + return "http://www." + case 0x01: + return "https://www." + case 0x02: + return "http://" + case 0x03: + return "https://" + default: + return nil + } + } + + class func encodedStringFromByte(charVal: UInt8) -> String? { + switch charVal { + case 0x00: + return ".com/" + case 0x01: + return ".org/" + case 0x02: + return ".edu/" + case 0x03: + return ".net/" + case 0x04: + return ".info/" + case 0x05: + return ".biz/" + case 0x06: + return ".gov/" + case 0x07: + return ".com" + case 0x08: + return ".org" + case 0x09: + return ".edu" + case 0x0a: + return ".net" + case 0x0b: + return ".info" + case 0x0c: + return ".biz" + case 0x0d: + return ".gov" + default: + return String(data: NSData(bytes: [ charVal ] as [UInt8], length: 1), + encoding: NSUTF8StringEncoding) + } + } + + /// + /// Swift if goofy when working with Strings because characters can't be accessed + /// using integer indexes. The function tries to match the beginning of the string + /// and encodes it, returning the byte and the truncated string. The function + /// is called until the string has no more characters. + /// + class func byteFromEncodedString(urlText: String) -> (UInt8, String?) { + var index = urlText.startIndex + if urlText.hasPrefix("http://www.") { + index = urlText.startIndex.advancedBy(11) + return (0x00, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix("https://www.") { + index = urlText.startIndex.advancedBy(12) + return (0x01, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix("http://") { + index = urlText.startIndex.advancedBy(7) + return (0x02, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix("https://") { + index = urlText.startIndex.advancedBy(8) + return (0x03, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".com/") { + index = urlText.startIndex.advancedBy(5) + return (0x00, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".org/") { + index = urlText.startIndex.advancedBy(5) + return (0x01, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".edu/") { + index = urlText.startIndex.advancedBy(5) + return (0x02, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".net/") { + index = urlText.startIndex.advancedBy(5) + return (0x03, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".info/") { + index = urlText.startIndex.advancedBy(6) + return (0x04, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".biz/") { + index = urlText.startIndex.advancedBy(5) + return (0x05, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".gov/") { + index = urlText.startIndex.advancedBy(5) + return (0x06, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".com") { + index = urlText.startIndex.advancedBy(4) + return (0x07, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".org") { + index = urlText.startIndex.advancedBy(4) + return (0x08, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".edu") { + index = urlText.startIndex.advancedBy(4) + return (0x09, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".net") { + index = urlText.startIndex.advancedBy(4) + return (0x0a, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".info") { + index = urlText.startIndex.advancedBy(5) + return (0x0b, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".biz") { + index = urlText.startIndex.advancedBy(4) + return (0x0c, urlText.substringFromIndex(index)) + } else if urlText.hasPrefix(".gov") { + index = urlText.startIndex.advancedBy(4) + return (0x0d, urlText.substringFromIndex(index)) + } + return ([UInt8](String(urlText.characters.first!).utf8)[0], + String(urlText.characters.dropFirst())) + } + + class func convertDeciseconds(deciseconds: UInt32) -> (Int, Int, Int) { + let days: Int = Int(deciseconds) / (24 * 60 * 60 * 10) + let hours: Int = Int(deciseconds) / (60 * 60 * 10) - days * 24 + let minutes: Int = Int(deciseconds / 600) - days * 24 * 60 - hours * 60 + return (days, hours, minutes) + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/GATTOperations.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/GATTOperations.swift new file mode 100644 index 0000000..0e17f3d --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/GATTOperations.swift @@ -0,0 +1,366 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import CoreBluetooth + +enum LockState: UInt8 { + case Locked = 0 + case Unlocked + case UnlockedPreventAutolock + case Unknown = 255 +} + +enum CharacteristicID { + case capabilities + case activeSlot + case advertisingInterval + case radioTxPower + case advertisedTxPower + case lockState + case unlock + case publicECDHKey + case EIDIdentityKey + case ADVSlotData + case factoryReset + case remainConnectable + + var UUID: CBUUID { + switch self { + case .capabilities: + return CBUUID(string: "A3C87501-8ED3-4BDF-8A39-A01BEBEDE295") + case .activeSlot: + return CBUUID(string: "A3C87502-8ED3-4BDF-8A39-A01BEBEDE295") + case .advertisingInterval: + return CBUUID(string: "A3C87503-8ED3-4BDF-8A39-A01BEBEDE295") + case .radioTxPower: + return CBUUID(string: "A3C87504-8ED3-4BDF-8A39-A01BEBEDE295") + case .advertisedTxPower: + return CBUUID(string: "A3C87505-8ED3-4BDF-8A39-A01BEBEDE295") + case .lockState: + return CBUUID(string: "A3C87506-8ED3-4BDF-8A39-A01BEBEDE295") + case .unlock: + return CBUUID(string: "A3C87507-8ED3-4BDF-8A39-A01BEBEDE295") + case .publicECDHKey: + return CBUUID(string: "A3C87508-8ED3-4BDF-8A39-A01BEBEDE295") + case .EIDIdentityKey: + return CBUUID(string: "A3C87509-8ED3-4BDF-8A39-A01BEBEDE295") + case .ADVSlotData: + return CBUUID(string: "A3C8750A-8ED3-4BDF-8A39-A01BEBEDE295") + case .factoryReset: + return CBUUID(string: "A3C8750B-8ED3-4BDF-8A39-A01BEBEDE295") + case .remainConnectable: + return CBUUID(string: "A3C8750C-8ED3-4BDF-8A39-A01BEBEDE295") + } + } +} + +let GATTCharacteristics: [CBUUID] = [CharacteristicID.capabilities.UUID, + CharacteristicID.activeSlot.UUID, + CharacteristicID.advertisingInterval.UUID, + CharacteristicID.radioTxPower.UUID, + CharacteristicID.advertisedTxPower.UUID, + CharacteristicID.lockState.UUID, + CharacteristicID.unlock.UUID, + CharacteristicID.publicECDHKey.UUID, + CharacteristicID.EIDIdentityKey.UUID, + CharacteristicID.ADVSlotData.UUID, + CharacteristicID.factoryReset.UUID, + CharacteristicID.remainConnectable.UUID] + +class GATTOperations: NSObject, CBPeripheralDelegate { + var peripheral: CBPeripheral! + let GATTServiceID = "A3C87500-8ED3-4BDF-8A39-A01BEBEDE295" + var gotUnlockChallenge: Bool + var unlockChallenge: NSData? + var beaconOperationsCallback: ((operationState: OperationState) -> Void)? + var lockStateCallback: ((lockState: LockState) -> Void)? + var updateLockStateCallback: ((lockState: LockState) -> Void)? + var remainConnectableCallback: (() -> Void)? + var factoryResetCallback: (() -> Void)? + var userPasskey: String? + var didAttemptUnlocking = false + + init(peripheral: CBPeripheral) { + gotUnlockChallenge = false + super.init() + self.peripheral = peripheral + } + + func didUpdateOperationState(operationState: OperationState) { + switch operationState { + case OperationState.DidDiscoverServices: + discoverCharacteristics() + default: + if let callback = beaconOperationsCallback { + callback(operationState: operationState) + } + } + } + + func discoverServices(callback: (operationState: OperationState) -> Void) { + peripheral.delegate = self + beaconOperationsCallback = callback + if let _ = peripheral.services { + /// services were already discovered + discoverCharacteristics() + } else { + let service = CBUUID(string: GATTServiceID) + peripheral.discoverServices([service]) + } + } + + func peripheral(peripheral: CBPeripheral, + didDiscoverServices error: NSError?) { + if let identifiedError = error { + NSLog("Error discovering services: \(identifiedError)") + didUpdateOperationState(OperationState.DiscoveringServicesError) + } else { + didUpdateOperationState(OperationState.DidDiscoverServices) + } + } + + func discoverCharacteristics() { + if let services = peripheral.services { + for service in services { + if service.UUID == CBUUID(string: GATTServiceID) { + peripheral.discoverCharacteristics(GATTCharacteristics, forService: service) + return + } + } + NSLog("The beacon does not implement the GATT Configuration Service.") + didUpdateOperationState(OperationState.NotImplementingGATTConfigService) + } + } + + func peripheral(peripheral: CBPeripheral, + didDiscoverCharacteristicsForService service: CBService, + error: NSError?) { + if let identifiedError = error { + NSLog("Error discovering characteristics: \(identifiedError)") + didUpdateOperationState(OperationState.DiscoveringCharacteristicsError) + } else { + didUpdateOperationState(OperationState.DidDiscoverCharacteristics) + } + } + + func peripheral(peripheral: CBPeripheral, + didWriteValueForCharacteristic characteristic: CBCharacteristic, + error: NSError?) { + + print("did write value for characteristic \(characteristic.UUID)") + if error != nil { + print("there was an error while writing to the characteristis \(characteristic)") + } + if characteristic.UUID == CharacteristicID.unlock.UUID { + if let callback = lockStateCallback { + checkLockState(nil, lockStateCallback: callback) + } + } else if characteristic.UUID == CharacteristicID.lockState.UUID { + if let callback = updateLockStateCallback { + lockStateCallback = callback + getUnlockChallenge() + } + } else if characteristic.UUID == CharacteristicID.factoryReset.UUID { + if let callback = factoryResetCallback { + callback() + } + } else if characteristic.UUID == CharacteristicID.remainConnectable.UUID { + if let callback = remainConnectableCallback { + callback() + } + } + } + + func peripheral(peripheral: CBPeripheral, + didUpdateValueForCharacteristic characteristic: CBCharacteristic, + error: NSError?) { + print("did update value for characteristic \(characteristic.UUID)") + if let identifiedError = error { + NSLog("Error reading characteristic: \(identifiedError)") + } else { + if characteristic.UUID == CharacteristicID.lockState.UUID { + parseLockStateValue() + } else if characteristic.UUID == CharacteristicID.unlock.UUID { + unlockBeacon() + } + } + } + + func parseLockStateValue() { + if let + characteristic = findCharacteristicByID(CharacteristicID.lockState.UUID), + value = characteristic.value { + if value.length == 1 { + var lockState: UInt8 = 0 + value.getBytes(&lockState, length: 1) + if lockState == LockState.Locked.rawValue { + NSLog("The beacon is locked :( .") + didUpdateLockState(LockState.Locked) + } else { + NSLog("The beacon is unlocked!") + didUpdateLockState(LockState.Unlocked) + } + } + } + } + + func didUpdateLockState(lockState: LockState) { + if let callback = lockStateCallback { + switch lockState { + case LockState.Locked: + if userPasskey != nil { + if didAttemptUnlocking { + callback(lockState: LockState.Locked) + } else { + getUnlockChallenge() + } + } else { + callback(lockState: LockState.Locked) + } + case LockState.Unlocked: + callback(lockState: LockState.Unlocked) + default: + callback(lockState: LockState.Unknown) + } + } + } + + func checkLockState(passkey: String?, + lockStateCallback: (lockState: LockState) -> Void) { + self.lockStateCallback = lockStateCallback + if passkey != nil { + userPasskey = passkey + } + if let lockStateCharacteristic = findCharacteristicByID(CharacteristicID.lockState.UUID) { + peripheral.readValueForCharacteristic(lockStateCharacteristic) + } + } + + func findCharacteristicByID(characteristicID: CBUUID) -> CBCharacteristic? { + if let services = peripheral.services { + for service in services { + for characteristic in service.characteristics! { + if characteristic.UUID == characteristicID { + return characteristic + } + } + } + } + return nil + } + + func beginUnlockingBeacon(passKey: String, + lockStateCallback: (lockState: LockState) -> Void) { + didAttemptUnlocking = false + checkLockState(passKey, lockStateCallback: lockStateCallback) + + } + + func getUnlockChallenge() { + if let characteristic = findCharacteristicByID(CharacteristicID.unlock.UUID) { + peripheral.readValueForCharacteristic(characteristic) + } + } + + func unlockBeacon() { + if let + passKey = userPasskey, + characteristic = findCharacteristicByID(CharacteristicID.unlock.UUID), + unlockChallenge = characteristic.value { + let token: NSData? = AESEncrypt(unlockChallenge, key: passKey) + // erase old password + userPasskey = nil + didAttemptUnlocking = true + if let unlockToken = token { + peripheral.writeValue(unlockToken, + forCharacteristic: characteristic, + type: CBCharacteristicWriteType.WithResponse) + } + } + } + + func AESEncrypt(data: NSData, key: String?) -> NSData? { + if let passKey = key { + let keyBytes = StringUtils.transformStringToByteArray(passKey) + let cryptData = NSMutableData(length: Int(data.length) + kCCBlockSizeAES128)! + let operation: CCOperation = UInt32(kCCEncrypt) + let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128) + let options: CCOptions = UInt32(kCCOptionECBMode) + var numBytesEncrypted :size_t = 0 + let cryptStatus = CCCrypt(operation, + algoritm, + options, + keyBytes, + keyBytes.count, + nil, + data.bytes, + data.length, + cryptData.mutableBytes, + cryptData.length, + &numBytesEncrypted) + + if UInt32(cryptStatus) == UInt32(kCCSuccess) { + cryptData.length = Int(numBytesEncrypted) + return cryptData as NSData + } else { + NSLog("Error: \(cryptStatus)") + } + } + return nil + } + + func writeNewLockCode(encryptedKey: NSData) { + let value = NSMutableData(bytes: [0x00 as UInt8], length: 1) + value.appendData(encryptedKey) + if let characteristic = findCharacteristicByID(CharacteristicID.lockState.UUID) { + peripheral.writeValue(value, forCharacteristic: characteristic, type: .WithResponse) + } + } + + func changeLockCode(oldCode: String, newCode: String, callback: (lockState: LockState) -> Void) { + peripheral.delegate = self + updateLockStateCallback = callback + + let newCodeBytes = StringUtils.transformStringToByteArray(newCode) + let newCodeData = NSData(bytes: newCodeBytes, length: newCodeBytes.count) + let encryptedKey = AESEncrypt(newCodeData, key: oldCode) + userPasskey = newCode + if let key = encryptedKey { + writeNewLockCode(key) + } + } + + func factoryReset(callback: () -> Void) { + factoryResetCallback = callback + peripheral.delegate = self + if let characteristic = findCharacteristicByID(CharacteristicID.factoryReset.UUID) { + let value = NSData(bytes: [0x0B as UInt8], length: 1) + peripheral.writeValue(value, forCharacteristic: characteristic, type: .WithResponse) + } + } + + func changeRemainConnectableState(on: Bool, callback: () -> Void) { + remainConnectableCallback = callback + peripheral.delegate = self + if let characteristic = findCharacteristicByID(CharacteristicID.remainConnectable.UUID) { + var value: UInt8 = 0 + if on { + value = 1 + } + let data = NSData(bytes: [value], length: 1) + peripheral.writeValue(data, forCharacteristic: characteristic, type: .WithResponse) + } + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/HTTPRequest.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/HTTPRequest.swift new file mode 100644 index 0000000..ad63992 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/HTTPRequest.swift @@ -0,0 +1,57 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +import UIKit + +/// +/// Having a class that makes HTTP requests and sends results using callbacks seemes like a clean +/// implementation, since there are several classes that need to make HTTP requests. +/// +class HTTPRequest { + class func makeHTTPRequest(url: NSURL, + method: String, + postBody: NSData?, + requestHeaders: NSDictionary, + completionHandler: (httpResponseCode: Int, + response: NSData?, + error: NSError?) -> Void) { + let request = NSMutableURLRequest(URL: url) + for (key, value) in requestHeaders { + request.addValue(value as! String, forHTTPHeaderField: key as! String) + } + request.HTTPMethod = method + if let body = postBody { + request.HTTPBody = body + } + let config = NSURLSessionConfiguration.defaultSessionConfiguration() + config.timeoutIntervalForRequest = kRequestTimeout + let session = NSURLSession(configuration: config) + let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in + let content = NSString(data: data!, encoding: NSUTF8StringEncoding) + NSLog("CONTENT: \(content!)") + NSLog("RESPONSE: \(response!)") + NSLog("ERROR: \(error)") + + if let urlHTTPResponse = response as? NSHTTPURLResponse { + let statusCode = urlHTTPResponse.statusCode + completionHandler(httpResponseCode: statusCode, response: data, error: error) + } else { + completionHandler(httpResponseCode: -1, response: nil, error: error) + } + }); + task.resume() + } + +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/HorizontalScrollButtonList.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/HorizontalScrollButtonList.swift new file mode 100644 index 0000000..52ccd54 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/HorizontalScrollButtonList.swift @@ -0,0 +1,185 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +let globalButtonIndex = 0 + +import UIKit + +/// +/// Displays a custom made horizontal scroll button list, which appears on top of the view. +/// There can be only one selected button at a time and the class deselects the previously +/// selected button. The first button to be pressed is the Global one, since the Global view is +/// the default view to be displayed. +/// +class HorizontalScrollButtonList: UIView { + + /// Keeps track of the previous slelected button in order to be able to deselect it + var previousButtonPressed: UIButton? + + /// Displays a line under the selected button + var previousUnderlineView: UIView? + var linesArray: [UIView] = [] + var buttonsArray: [UIButton] = [] + + /// + /// Callback to the main class in order for it to handle displaying a different view + /// for each one of the buttons + /// + var buttonPressedCallback: ((buttonNumber: Int) -> Void)? + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init(buttonSize:CGSize, buttonNames: NSMutableArray, callback: (buttonNumber: Int) -> Void) { + buttonPressedCallback = callback + super.init(frame: CGRectMake(0, 0, 0, 0)) + let buttonCount = buttonNames.count + + self.frame.origin = CGPointMake(0,0) + self.frame.size.width = buttonSize.width * CGFloat(buttonCount) + self.frame.size.height = buttonSize.height + self.backgroundColor = UIColor.whiteColor() + + configureLine(buttonSize.width * CGFloat(buttonCount)) + + var buttonPosition = CGPointMake(0, 0) + let padding: CGFloat = 1 + let buttonIncrement = buttonSize.width + padding + + for i in 0.. UIButton { + let button = UIButton(type: .Custom) + button.frame.size = buttonSize + button.frame.origin = buttonPosition + button.setTitle(title, forState: UIControlState.Normal) + button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Normal) + button.setTitleColor(UIColor.grayColor(), forState: UIControlState.Selected) + button.titleLabel?.font = UIFont(name: "Arial-BoldMT", size: kTextFontSize) + button.addTarget(self, + action: #selector(HorizontalScrollButtonList.slotButtonPressed(_:)), + forControlEvents: .TouchUpInside) + button.backgroundColor = UIColor.whiteColor() + + buttonsArray.append(button) + self.addSubview(button) + + return button + } + + func configureButtonUnderlineView(buttonSize: CGSize, buttonPosition: CGPoint) -> UIView { + let view = UIView() + let lineHeight: CGFloat = 3 + view.frame.size = CGSizeMake(buttonSize.width, lineHeight) + view.frame.origin = CGPointMake(buttonPosition.x, buttonPosition.y + buttonSize.height) + view.backgroundColor = kGreenColor + view.hidden = true + linesArray.append(view) + + return view + } + + func configureLine(width: CGFloat) -> UIView { + let line = UIView() + line.backgroundColor = UIColor.whiteColor() + line.frame.size.height = 2 + line.frame.size.width = width + line.frame.origin = CGPointMake(0, self.frame.height) + CustomViews.addShadow(line) + self.addSubview(line) + + return line + } + + /// + /// Handle the swipe motions between the views, changing the selected button with + /// the one that coresponds to the view the user is currently seeing. + /// + func swipeLeft() { + if previousButtonPressed != buttonsArray[buttonsArray.count - 1] { + for i in 0 ..< buttonsArray.count { + if previousButtonPressed == buttonsArray[i] { + slotButtonPressed(buttonsArray[i + 1]) + break + } + } + } + } + + func swipeRight() { + if previousButtonPressed != buttonsArray[globalButtonIndex] { + for i in 0 ..< buttonsArray.count { + if previousButtonPressed == buttonsArray[i] { + slotButtonPressed(buttonsArray[i - 1]) + break + } + } + } + } + + func slotButtonPressed(sender: UIButton) { + if previousButtonPressed != nil { + previousButtonPressed!.selected = false + previousUnderlineView!.hidden = true + } + sender.selected = true + if let + character = sender.titleLabel?.text?.characters.last, + buttonNumber = Int(String(character)), + callback = buttonPressedCallback { + linesArray[buttonNumber].hidden = false + previousUnderlineView = linesArray[buttonNumber] + callback(buttonNumber: buttonNumber) + } else if let callback = buttonPressedCallback { + linesArray[globalButtonIndex].hidden = false + previousUnderlineView = linesArray[globalButtonIndex] + callback(buttonNumber: globalButtonIndex) + } + previousButtonPressed = sender + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/Info.plist b/tools/gatt-config/ios/Beaconfig/Beaconfig/Info.plist new file mode 100644 index 0000000..b393ba8 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + denisansadu-google.com.beaconfig.application + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Beaconfig iOS + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + + + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/ScannedBeaconsTableViewController.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/ScannedBeaconsTableViewController.swift new file mode 100644 index 0000000..5e910ca --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/ScannedBeaconsTableViewController.swift @@ -0,0 +1,192 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit + +let kNavBarTintColourHue: CGFloat = 0.2111 +let kNavBarTintSaturation: CGFloat = 1 +let kNavBarTintBrightness: CGFloat = 0.71 +let kNavBarTintAlpha: CGFloat = 1.0 +let kTableViewEstimatedRowHeight: CGFloat = 140 +let kSettingsFontSize: CGFloat = 22 +let kSettingsButtonSize: CGFloat = 30 + +/// +/// Displays a table view with the results of the scanning. +/// +class ScannedBeaconsTableViewController: UITableViewController { + var timer: NSTimer? + var beaconItems: [BeaconItem] = [] + var beaconScanner: BeaconScanner? + var scanButton: UIButton! + var refreshController = UIRefreshControl() + let settingsViewController = UserLoginViewController() + var userInfo = UserInformation() + + override func viewDidLoad() { + super.viewDidLoad() + navigationController?.interactivePopGestureRecognizer?.enabled = false + self.refreshController.addTarget(self, + action: #selector(startScanning), + forControlEvents: UIControlEvents.ValueChanged) + tableView.addSubview(refreshController) + self.view.backgroundColor = kLightGrayColor + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension + self.tableView.estimatedRowHeight = kTableViewEstimatedRowHeight + navigationController!.navigationBar.barTintColor = UIColor(hue: kNavBarTintColourHue, + saturation: kNavBarTintSaturation, + brightness: kNavBarTintBrightness, + alpha: kNavBarTintAlpha) + navigationController!.navigationBar.tintColor = UIColor.whiteColor() + UIApplication.sharedApplication().statusBarStyle = .LightContent + /// The left bar button opens the Login view. + let settingsButton = UIButton() + settingsButton.setImage(UIImage(named: "settings"), forState: .Normal) + settingsButton.frame = CGRectMake(0, 0, kSettingsButtonSize, kSettingsButtonSize) + settingsButton.addTarget(self, + action: + #selector(ScannedBeaconsTableViewController.settingsButtonPressed), + forControlEvents: .TouchUpInside) + let settingsBarButton = UIBarButtonItem(customView: settingsButton) + self.navigationItem.leftBarButtonItem = settingsBarButton + refreshController.beginRefreshing() + startScanning(nil) + } + + func settingsButtonPressed() { + performSegueWithIdentifier("userInformationSegue", sender: self) + } + + func setupScan() { + self.beaconScanner = BeaconScanner() + self.tableView.reloadData() + } + + /// Displays throbber to block the UI while scanning. + func displayThrobber() { + let alert = UIAlertController(title: nil, message: "Scanning...", preferredStyle: .Alert) + + alert.view.tintColor = UIColor.blackColor() + /// Need to give UIActivityIndicator nonzero values at init. + let loadingIndicator: UIActivityIndicatorView = + UIActivityIndicatorView(frame: CGRectMake(10, 5, 50, 50)) as UIActivityIndicatorView + loadingIndicator.hidesWhenStopped = true + loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray + loadingIndicator.startAnimating() + alert.view.addSubview(loadingIndicator) + self.presentViewController(alert, animated: true, completion: nil) + } + + + func stopScanning() { + NSLog("Stop scanning") + dispatch_async(dispatch_get_main_queue()) { + self.refreshController.endRefreshing() + self.dismissViewControllerAnimated(false, completion: nil) + /// We finished scanning, now we can put together the results and display them! + if let scanner = self.beaconScanner { + self.beaconItems = scanner.populateBeaconItems() + self.tableView.reloadData() + } + } + } + + func startScanning(sender: UIButton?) { + NSLog("Start scanning") + self.setupScan() + /// We're starting the scan and we send the function to be called when the scanning is over. + if let scanner = beaconScanner { + scanner.startScanning(stopScanning) + } + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return beaconItems.count + } + + override func tableView(tableView: UITableView, + cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let identifier = "BeaconTableViewCell" + let createdCell = self.tableView.dequeueReusableCellWithIdentifier(identifier, + forIndexPath: indexPath) + as? BeaconTableViewCell + + if let cell = createdCell { + for subview in cell.framesView.subviews { + subview.removeFromSuperview() + } + cell.beacon = beaconItems[indexPath.row].peripheral + cell.nameLabel.text = cell.beacon.name ?? "Unnamed Beacon" + cell.framesView.addSubview(beaconItems[indexPath.row].framesView) + CustomViews.setConstraints(beaconItems[indexPath.row].framesView, + holderView: cell.framesView, + topView: cell.framesView, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Top, + setBottomConstraints: true, + marginConstraint: kTableViewCellMargin) + cell.operations = beaconItems[indexPath.row].operations + cell.connectableDot.layer.cornerRadius = cell.connectableDot.frame.width / 2.0 + cell.connectableDot.backgroundColor = UIColor.redColor() + if beaconItems[indexPath.row].frames.EddystoneGATTServiceFrameSupported { + cell.connectableDot.backgroundColor = UIColor.greenColor() + } else if let + EID = beaconItems[indexPath.row].frames.EIDData, + scanner = beaconScanner { + if let myBeacon: Bool = scanner.myEIDBeacons[EID] as? Bool { + if myBeacon { + cell.connectableDot.backgroundColor = UIColor.greenColor() + } else { + cell.connectableDot.backgroundColor = UIColor.redColor() + } + } + } else { + cell.connectableDot.backgroundColor = UIColor.redColor() + } + return cell + } else { + return BeaconTableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:identifier) + } + } + + @IBAction func scanButton(sender: UIButton) { + displayThrobber() + self.startScanning(sender) + } + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if segue.identifier == "connectToBeacon" { + if let + cell = sender as? BeaconTableViewCell { + if let beaconDetailsViewController = segue.destinationViewController as? + BeaconDetailsViewController, + scanner = beaconScanner { + beaconDetailsViewController.prepareForUseWithBeacon(scanner, + beacon: cell.beacon, + operations: cell.operations!, + beaconName: cell.nameLabel.text, + userInfo: userInfo) + } + } + } else if segue.identifier == "userInformationSegue" { + if let userInfoViewController = segue.destinationViewController as? UserLoginViewController { + userInfoViewController.prepareForUse(userInfo) + } + } + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/SlotDataContentView.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/SlotDataContentView.swift new file mode 100644 index 0000000..8b58bb7 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/SlotDataContentView.swift @@ -0,0 +1,1409 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit +import Foundation + +let kLeadingConstraint: CGFloat = 8 +let kSlotDataMarginConstraint: CGFloat = 8 +let kLabelWidth: CGFloat = 250 +let kLabelHeight: CGFloat = 20 +let kPickerViewHeight: CGFloat = 100 +let kTextViewHeight: CGFloat = 25 +let kTextFieldHeight: CGFloat = 30 +let kSliderHeight: CGFloat = 25 +let kLightGrayColor = UIColor(red:0.96, green:0.96, blue:0.96, alpha:1.0) +let kGreenColor = UIColor(hue: kNavBarTintColourHue, + saturation: kNavBarTintSaturation, + brightness: kNavBarTintBrightness, + alpha: kNavBarTintAlpha) +let kHolderViewBorderWidth: CGFloat = 0.3 +let kURLTextViewWidth: CGFloat = 55 +let kUIDNamespaceTextViewWidth: CGFloat = 125 +let kUIDInstanceTextViewWidth: CGFloat = 62 +let kUIDInstanceLength = 12 +let kUIDNamespaceLength = 20 +let kPassCodeLength = 32 + +class SlotDataContentView: UIViewController, UIPickerViewDelegate, + UIPickerViewDataSource, UITextFieldDelegate, GIDSignInUIDelegate { + var didChangeSlotData = false + var frameTypePickerView: UIPickerView = UIPickerView() + let slotContentScrollView = UIScrollView() + let slotContentView = UIView() + var txPowerSlider: UISlider? + var txPowerTextView: UITextView? + var advIntervalSlider: UISlider? + var advIntervalTextView: UITextView? + var slotDataURL: UITextField? + var namespaceTextView: UITextField? + var instanceTextView: UITextField? + var slotData: Dictionary = [:] + var broadcastCapabilities: NSDictionary = [:] + var currentSlotUpdateData: Dictionary = [:] + var lockCodeBottomConstraints: NSLayoutConstraint? + var lockButtonBottomConstraints: NSLayoutConstraint? + var changeLockCodeButton: UIButton? + var factoryResetButton: UIButton? + var changeLockCodeView: UIView? + var factoryResetView: UIView? + var globalHolder: UIView? + var oldLockCode: UITextField? + var newLockCode: UITextField? + var changeLockCodeCallback: ((oldCode: String, newCode: String) -> Void)? + var factoryResetCallback: (() -> Void)? + var remainConnectableCallback: ((on: Bool) -> Void)? + var remainConnectableSwitch: UISwitch? + var instanceText: UITextView! + var namespaceText: UITextView! + var oldCodeCharactersCounter: UITextView! + var newCodeCharactersCounter: UITextView! + var frameTypeChange: FrameTypeChange = .NotSet + var signInHolder: UIView! + var selectHolder: UIView! + var signInWithGoogleCallback: ((viewToDisable: UIView, selectViewHolder: UIView) -> Void)? + var showAlert: ((title: String, description: String, buttonText: String) -> Void)? + let frameTypes: NSMutableArray = [BeaconInfo.EddystoneFrameType.UIDFrameType.description, + BeaconInfo.EddystoneFrameType.URLFrameType.description, + BeaconInfo.EddystoneFrameType.TelemetryFrameType.description, + BeaconInfo.EddystoneFrameType.EIDFrameType.description, + BeaconInfo.EddystoneFrameType.NotSetFrameType.description] + + enum FrameTypeChange: NSNumber { + case UID = 0 + case URL = 1 + case TLM = 2 + case EID = 3 + case NotSet = 4 + } + + func textField(textField: UITextField, + shouldChangeCharactersInRange range: NSRange, + replacementString string: String) -> Bool { + if string.characters.count == 0 { + return true + } + let currentText = textField.text ?? "" + let text = (currentText as NSString).stringByReplacingCharactersInRange(range, + withString: string) + + let currentCharacterCount = textField.text?.characters.count ?? 0 + if (range.length + range.location > currentCharacterCount){ + return false + } + let newLength = currentCharacterCount + string.characters.count - range.length + var hasRightLength: Bool = false + if textField == instanceTextView { + if newLength <= kUIDInstanceLength { + hasRightLength = true + } + } else if textField == namespaceTextView { + if newLength <= kUIDNamespaceLength { + hasRightLength = true + } + } else if textField == oldLockCode || textField == newLockCode { + if newLength <= kPassCodeLength { + hasRightLength = true + } + } + return StringUtils.inHexadecimalString(text) && hasRightLength + } + + func textFieldDidChange(textField : UITextField){ + if let length = textField.text?.characters.count { + if textField == instanceTextView { + instanceText.text = "Instance (\(length)/\(kUIDInstanceLength)):" + } else if textField == namespaceTextView { + namespaceText.text = "Namespace (\(length)/\(kUIDNamespaceLength)):" + } else if textField == oldLockCode { + oldCodeCharactersCounter.text = "\(length)/\(kPassCodeLength)" + } else if textField == newLockCode { + newCodeCharactersCounter.text = "\(length)/\(kPassCodeLength)" + } + } + } + + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return false + } + + func setUICallbacks(changeLockCodeCallback: (oldCode: String, newCode: String) -> Void, + factoryResetCallback: () -> Void, + remainConnectableCallback: (on: Bool) -> Void, + showAlert: (title: String, description: String, buttonText: String) -> Void, + signIn: (viewToDisable: UIView, selectViewHolder: UIView) -> Void) { + self.changeLockCodeCallback = changeLockCodeCallback + self.factoryResetCallback = factoryResetCallback + self.remainConnectableCallback = remainConnectableCallback + self.showAlert = showAlert + self.signInWithGoogleCallback = signIn + } + + + override func viewDidLoad() { + super.viewDidLoad() + frameTypePickerView.dataSource = self + frameTypePickerView.delegate = self + } + + func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { + return 1 + } + + func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + return frameTypes.count + } + + func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + for subview in slotContentView.subviews { + subview.removeFromSuperview() + } + switch row { + case FrameTypeChange.UID.rawValue: + frameTypeChange = .UID; + setAsUIDTypeContentView(slotData, + capabilities: broadcastCapabilities) + case FrameTypeChange.URL.rawValue: + frameTypeChange = .URL; + setAsURLTypeContentView(slotData, + capabilities: broadcastCapabilities) + case FrameTypeChange.TLM.rawValue: + frameTypeChange = .TLM; + setAsTLMTypeContentView(slotData, + capabilities: broadcastCapabilities) + // Not sure what to do with the EID frame for now, so setting + // the EID would mean setting no frame + case FrameTypeChange.EID.rawValue: + frameTypeChange = .EID; + setAsEIDTypeContentView(slotData, capabilities: broadcastCapabilities) + case FrameTypeChange.NotSet.rawValue: + frameTypeChange = .NotSet; + setAsNoFrameTypeContentView(broadcastCapabilities) + default: + break + } + } + + func pickerView(pickerView: UIPickerView, + viewForRow row: Int, + forComponent component: Int, + reusingView view: UIView?) -> UIView { + let pickerLabel = UILabel() + pickerLabel.textColor = UIColor.blackColor() + pickerLabel.text = frameTypes[row] as? String + pickerLabel.font = UIFont(name: "Arial-BoldMT", size: 15) + pickerLabel.textAlignment = NSTextAlignment.Center + return pickerLabel + } + + func createContentView() { + slotContentScrollView.frame = view.bounds + slotContentView.backgroundColor = kLightGrayColor + slotContentView.frame.origin = CGPointMake(0,0) + /// TODO: set slotContentView height to fit the content inside it + slotContentView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + 100) + slotContentScrollView.addSubview(slotContentView) + slotContentScrollView.contentSize = slotContentView.bounds.size + } + + /// Creates a label with a specific text and sets its constraints + func createLabelWithText(text: String, view: UIView) -> UILabel { + let textLabel = UILabel() + textLabel.text = text + textLabel.textColor = kGreenColor + textLabel.font = UIFont.systemFontOfSize(19, weight: UIFontWeightSemibold) + view.addSubview(textLabel) + CustomViews.setConstraints(textLabel, + holderView: view, + topView: view, + leftView: nil, + rightView: nil, + height: kLabelHeight, + width: kLabelWidth, + pinTopAttribute: .Top, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + + return textLabel + } + + func createControlButton(text: String, + holderView: UIView, + topElement: UIView, + setBottomConstraints: Bool, + rightView: UIView?) -> UIButton { + let button = UIButton() + holderView.addSubview(button) + CustomViews.setConstraints(button, + holderView: holderView, + topView: topElement, + leftView: nil, + rightView: rightView, + height: 20, + width: 80, + pinTopAttribute: .Bottom, + setBottomConstraints: setBottomConstraints, + marginConstraint: kSlotDataMarginConstraint) + + button.setTitle(text, forState: UIControlState.Normal) + button.setTitleColor(kGreenColor, forState: UIControlState.Normal) + button.titleLabel!.font = UIFont.systemFontOfSize(14, weight: UIFontWeightSemibold) + button.titleLabel?.textAlignment = .Left + button.titleLabel!.font = UIFont(name: "Arial-BoldMT", size: 14) + button.titleLabel?.textAlignment = .Right + return button + } + + func createButtonWithText(text: String, + holderView: UIView, + topElement: UIView, + setBottomConstraints: Bool) -> UIButton { + let button = UIButton() + holderView.addSubview(button) + CustomViews.setConstraints(button, + holderView: holderView, + topView: topElement, + leftView: nil, + rightView: nil, + height: 25, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: setBottomConstraints, + marginConstraint: kSlotDataMarginConstraint) + + button.setTitle(text, forState: UIControlState.Normal) + button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Normal) + button.titleLabel!.font = UIFont.systemFontOfSize(15, weight: UIFontWeightRegular) + button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left + button.titleLabel?.font = UIFont(name: "Arial", size: kTextFontSize) + button.titleEdgeInsets = UIEdgeInsets(top: 0, left: 5, bottom: -5, right: 0) + return button + } + + func createTextField(placeholder: String, + holderView: UIView, + topView: UIView, + leftView: UIView?, + topAttribute: NSLayoutAttribute) -> UITextField { + let textField = UITextField() + holderView.addSubview(textField) + textField.attributedPlaceholder = NSAttributedString(string:placeholder, + attributes:[NSForegroundColorAttributeName: + UIColor.grayColor()]) + CustomViews.setConstraints(textField, + holderView: holderView, + topView: topView, + leftView: leftView, + rightView: nil, + height: kTextFieldHeight, + width: nil, + pinTopAttribute: topAttribute, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + + textField.layer.backgroundColor = UIColor.whiteColor().CGColor + textField.layer.borderColor = UIColor.grayColor().CGColor + textField.layer.borderWidth = 0.0 + textField.layer.masksToBounds = false + CustomViews.addShadow(textField) + textField.font = UIFont(name: "Menlo-Regular", size: kTextFieldFontSize) + textField.autocapitalizationType = .None + textField.layer.sublayerTransform = CATransform3DMakeTranslation(3, 0, 0) + return textField + } + + func createChangeLockCodeView() { + changeLockCodeView = UIView() + changeLockCodeView?.backgroundColor = kLightGrayColor + globalHolder?.addSubview(changeLockCodeView!) + CustomViews.setConstraints(changeLockCodeView!, + holderView: globalHolder!, + topView: changeLockCodeButton!, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + } + + func createFactoryResetView() { + factoryResetView = UIView() + factoryResetView?.backgroundColor = kLightGrayColor + globalHolder?.addSubview(factoryResetView!) + CustomViews.setConstraints(factoryResetView!, + holderView: globalHolder!, + topView: factoryResetButton!, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + } + + func showChangeLockCodeView() { + oldCodeCharactersCounter = createTextView("0/\(kPassCodeLength)", + holderView: changeLockCodeView!, + topView: changeLockCodeView!, + leftView: nil, + rightView: nil, + width: kFrameTitleWidth, + pinTopAttribute: .Top, + setBottomConstraint: false) + oldCodeCharactersCounter.backgroundColor = kLightGrayColor + + oldLockCode = createTextField("Insert old lock code", + holderView: changeLockCodeView!, + topView: changeLockCodeView!, + leftView: oldCodeCharactersCounter, + topAttribute: .Top) + oldLockCode?.delegate = self + oldLockCode?.addTarget(self, + action: #selector(textFieldDidChange), + forControlEvents: .EditingChanged) + newCodeCharactersCounter = createTextView("0/\(kPassCodeLength)", + holderView: changeLockCodeView!, + topView: oldCodeCharactersCounter!, + leftView: nil, + rightView: nil, + width: kFrameTitleWidth, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + newLockCode = createTextField("Insert new lock code", + holderView: changeLockCodeView!, + topView: oldLockCode!, + leftView: newCodeCharactersCounter, + topAttribute: .Bottom) + newLockCode?.delegate = self + newLockCode?.addTarget(self, + action: #selector(textFieldDidChange), + forControlEvents: .EditingChanged) + newCodeCharactersCounter.backgroundColor = kLightGrayColor + let saveButton = createControlButton("SAVE", + holderView: changeLockCodeView!, + topElement: newLockCode!, + setBottomConstraints: true, + rightView: changeLockCodeView) + let cancelButton = createControlButton("CANCEL", + holderView: changeLockCodeView!, + topElement: newLockCode!, + setBottomConstraints: true, + rightView: saveButton) + cancelButton.addTarget(self, + action: #selector(cancelButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + saveButton.addTarget(self, + action: #selector(saveLockCodeButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + } + + func showFactoryResetView() { + let warningTextView = createTextView("Are you sure you want to factory reset all the data?", + holderView: factoryResetView!, + topView: factoryResetView!, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Top, + setBottomConstraint: false) + warningTextView.backgroundColor = kLightGrayColor + + let resetButton = createControlButton("RESET", + holderView: factoryResetView!, + topElement: warningTextView, + setBottomConstraints: true, + rightView: factoryResetView) + + let cancelButton = createControlButton("CANCEL", + holderView: factoryResetView!, + topElement: warningTextView, + setBottomConstraints: true, + rightView: resetButton) + cancelButton.addTarget(self, + action: #selector(cancelFactoryResetButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + resetButton.addTarget(self, + action: #selector(performFactoryReset), + forControlEvents: UIControlEvents.TouchUpInside) + + } + + func saveLockCodeButtonPressed() { + if let + callback = changeLockCodeCallback, + oldCode = oldLockCode?.text, + newCode = newLockCode?.text { + if oldCode.characters.count != kPassCodeLength { + if let alert = showAlert { + alert(title: "Old Passkey", + description: "The old passkey does not have the right number of characters.", + buttonText: "Dismiss") + } + return + } + if newCode.characters.count != kPassCodeLength { + if let alert = showAlert { + alert(title: "New Passkey", + description: "The new passkey does not have the right number of characters.", + buttonText: "Dismiss") + } + return + } + callback(oldCode: oldCode, newCode: newCode) + } + } + + func lockCodeChanged() { + for subview in changeLockCodeView!.subviews { + subview.removeFromSuperview() + } + let textView = createTextView("Lock code has been successfully changed!", + holderView: changeLockCodeView!, + topView: changeLockCodeView!, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Top, + setBottomConstraint: true) + textView.backgroundColor = kLightGrayColor + } + + func performFactoryReset() { + if let callback = factoryResetCallback { + callback() + } + } + + func cancelFactoryResetButtonPressed() { + for subview in factoryResetView!.subviews { + subview.removeFromSuperview() + } + } + + func cancelButtonPressed() { + for subview in changeLockCodeView!.subviews { + subview.removeFromSuperview() + } + } + + func changeLockCodeButtonPressed() { + if changeLockCodeView!.subviews.count == 0 { + showChangeLockCodeView() + } else if changeLockCodeView!.subviews.count == 1 { + for subview in changeLockCodeView!.subviews { + subview.removeFromSuperview() + } + } else { + cancelButtonPressed() + } + } + + func factoryResetButtonPressed() { + if factoryResetView?.subviews.count == 0 { + showFactoryResetView() + } else { + cancelFactoryResetButtonPressed() + } + } + + func createTextView(text: String, + holderView: UIView, + topView: UIView, + leftView: UIView?, + rightView: UIView?, + width: CGFloat?, + pinTopAttribute: NSLayoutAttribute, + setBottomConstraint: Bool) -> UITextView { + let textView = UITextView() + holderView.addSubview(textView) + textView.textAlignment = NSTextAlignment.Left + textView.text = text + textView.editable = false + textView.dataDetectorTypes = UIDataDetectorTypes.All + textView.textContainer.maximumNumberOfLines = 3 + textView.scrollEnabled = false + CustomViews.setConstraints(textView, + holderView: holderView, + topView: topView, + leftView: leftView, + rightView: rightView, + height: nil, + width: width, + pinTopAttribute: pinTopAttribute, + setBottomConstraints: setBottomConstraint, + marginConstraint: kSlotDataMarginConstraint) + textView.textColor = UIColor.darkGrayColor() + + return textView + } + + func createHolder(topElement: UIView, + setBottomConstraints: Bool, + pinTopAttribute: NSLayoutAttribute) -> UIView { + let holder: UIView = UIView() + slotContentView.addSubview(holder) + CustomViews.setConstraints(holder, + holderView: slotContentView, + topView: topElement, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: pinTopAttribute, + setBottomConstraints: setBottomConstraints, + marginConstraint: kSlotDataMarginConstraint) + holder.backgroundColor = UIColor.whiteColor() + CustomViews.addShadow(holder) + return holder + } + + func createURLTextView(slotData: Dictionary , topElement: UIView) -> UIView { + let URLHolder = createHolder(topElement, setBottomConstraints: false, pinTopAttribute: .Bottom) + let broadcastedURLLabel = createLabelWithText("Broadcasted URL", view: URLHolder) + var text: String = "" + let container = UIView() + URLHolder.addSubview(container) + CustomViews.setConstraints(container, + holderView: URLHolder, + topView: broadcastedURLLabel, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + container.backgroundColor = kLightGrayColor + + if let + urlData = slotData[slotDataURLKey], + url = String(data: urlData, encoding: NSUTF8StringEncoding) { + text = "\(url)" + } else { + text = "URL not set" + } + let URLTextView = createTextView("URL: ", + holderView: container, + topView: container, + leftView: nil, + rightView: nil, + width: kURLTextViewWidth, + pinTopAttribute: .Top, + setBottomConstraint: true) + URLTextView.backgroundColor = kLightGrayColor + slotDataURL = createTextField(text, + holderView: container, + topView: container, + leftView: URLTextView, + topAttribute: .Top) + + return URLHolder + } + + func createSlider(value: Int, + holderView: UIView, + topView: UIView, + minVal: Float, + maxVal: Float) -> UISlider { + let slider = UISlider() + slider.minimumValue = minVal + slider.maximumValue = maxVal + slider.setValue(Float(value), animated: false) + slider.continuous = true + holderView.addSubview(slider) + CustomViews.setConstraints(slider, + holderView: holderView, + topView: topView, + leftView: nil, + rightView: nil, + height: kSliderHeight, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + + return slider + } + + func createFrameTypePicker(frameType: Int, topView: UIView, setPageBottomConstraints: Bool) + -> UIView { + let frameTypePickerHolder = createHolder(topView, + setBottomConstraints: false, + pinTopAttribute: .Top) + let frameTypeLabel = createLabelWithText("Frame Type", view: frameTypePickerHolder) + frameTypePickerHolder.addSubview(frameTypePickerView) + CustomViews.setConstraints(frameTypePickerView, + holderView: frameTypePickerHolder, + topView: frameTypeLabel, + leftView: nil, + rightView: nil, + height: kPickerViewHeight, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + frameTypePickerView.selectRow(frameType, inComponent: 0, animated: false) + + return frameTypePickerHolder + } + + + func createTxPowerHolder(slotData: Dictionary , + topElement: UIView, + topAttribute: NSLayoutAttribute, + setBottomConstraints: Bool) -> UIView { + let txPowerHolder = createHolder(topElement, + setBottomConstraints: setBottomConstraints, + pinTopAttribute: topAttribute) + let txPowerLabel = createLabelWithText("TX Power", view: txPowerHolder) + var txPower: Int8 = 0 + var txPowerText: String! + if let txPowerData = slotData[slotDataTxPowerKey] { + txPowerData.getBytes(&txPower, length: sizeof(Int8)) + txPowerText = "\(txPower)" + } else { + txPowerText = "Unknown" + } + txPowerTextView = createTextView("Radio TX Power: \(txPowerText) dBm", + holderView: txPowerHolder, + topView: txPowerLabel, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + txPowerSlider = createSlider(Int(txPower), + holderView: txPowerHolder, + topView: txPowerTextView!, + minVal: -40, + maxVal: 4) + txPowerSlider?.addTarget(self, + action: #selector(SlotDataContentView.txPowerChanged), + forControlEvents: UIControlEvents.AllEvents) + + return txPowerHolder + } + + func txPowerChanged() { + let stepSize = 4 + let value = Int(txPowerSlider!.value) + txPowerSlider!.value = Float(value - value % stepSize) + txPowerTextView!.text = "Radio TX Power: \(Int(txPowerSlider!.value)) dBm" + } + + func createAdvIntervalHolder(slotData: Dictionary , + topElement: UIView, + pinTop: NSLayoutAttribute, + setBottomConstraints: Bool) -> UIView { + let advIntervalHolder = createHolder(topElement, + setBottomConstraints: setBottomConstraints, + pinTopAttribute: pinTop) + let advIntervalLabel = createLabelWithText("Advertising Interval", view: advIntervalHolder) + var advInterval: UInt16 = 0 + var advIntervalText: String! + if let advIntervalData = slotData[slotDataAdvIntervalKey] { + advIntervalData.getBytes(&advInterval, length: sizeof(UInt16)) + advIntervalText = "\(advInterval)" + } else { + advIntervalText = "Unknown" + } + advIntervalTextView = createTextView("Advertising Interval: \(advIntervalText)", + holderView: advIntervalHolder, + topView: advIntervalLabel, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + advIntervalSlider = createSlider(Int(advInterval), + holderView: advIntervalHolder, + topView: advIntervalTextView!, + minVal: 0, + maxVal: 1000) + + advIntervalSlider?.addTarget(self, + action: #selector(SlotDataContentView.advIntervalChanged), + forControlEvents: UIControlEvents.AllEvents) + + return advIntervalHolder + } + + func advIntervalChanged() { + let stepSize = 50 + let value = Int(advIntervalSlider!.value) + advIntervalSlider!.value = Float(value - value % stepSize) + advIntervalTextView!.text = "Advertising Interval: \(Int(advIntervalSlider!.value))" + } + + func byteToString(byte: UInt8) -> String { + var value: String = String(byte, radix: 16) + if value.characters.count == 1 { + value += "0" + } + return value + } + + func createUIDTextView(slotData: Dictionary , topElement: UIView) -> UIView { + let UIDHolder = createHolder(topElement, setBottomConstraints: false, pinTopAttribute: .Bottom) + let UIDLabel = createLabelWithText("Beacon ID", view: UIDHolder) + var strNamespace: String = "" + var strInstance: String = "" + if let value = slotData[slotDataUIDKey] { + /// The UID has 10 bytes for Namespace and 6 bytes for Instance + var namespace: [UInt8] = [UInt8](count: 10, repeatedValue: 0) + var instance: [UInt8] = [UInt8](count: 6, repeatedValue: 0) + value.getBytes(&namespace, length: 10 * sizeof(UInt8)) + value.getBytes(&instance, range: NSMakeRange(10, 6 * sizeof(UInt8))) + for byte in namespace { + strNamespace += byteToString(byte) + } + + for byte in instance { + strInstance += byteToString(byte) + } + } else { + strNamespace = "nil" + strInstance = "nil" + } + + let container = UIView() + UIDHolder.addSubview(container) + container.backgroundColor = kLightGrayColor + CustomViews.setConstraints(container, + holderView: UIDHolder, + topView: UIDLabel, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + + namespaceText = createTextView("Namespace:", + holderView: container, + topView: container, + leftView: nil, + rightView: nil, + width: kUIDNamespaceTextViewWidth, + pinTopAttribute: .Top, + setBottomConstraint: false) + + let namespaceDescription = "\(strNamespace)" + let instanceDescription = "\(strInstance)" + namespaceTextView = createTextField(namespaceDescription, + holderView: container, + topView: container, + leftView: namespaceText, + topAttribute: .Top) + instanceText = createTextView("Instance:", + holderView: container, + topView: namespaceText, + leftView: nil, + rightView: nil, + width: kUIDNamespaceTextViewWidth, + pinTopAttribute: .Bottom, + setBottomConstraint: true) + instanceTextView = createTextField(instanceDescription, + holderView: container, + topView: namespaceTextView!, + leftView: instanceText, + topAttribute: .Bottom) + instanceText.dataDetectorTypes = .None + namespaceText.dataDetectorTypes = .None + namespaceText.backgroundColor = kLightGrayColor + instanceText.backgroundColor = kLightGrayColor + namespaceTextView!.delegate = self + instanceTextView!.delegate = self + if strNamespace != "nil" { + namespaceTextView?.text = strNamespace + } + if strInstance != "nil" { + instanceTextView?.text = strInstance + } + namespaceTextView?.addTarget(self, + action: #selector(textFieldDidChange), + forControlEvents: .EditingChanged) + instanceTextView?.addTarget(self, + action: #selector(textFieldDidChange), + forControlEvents: .EditingChanged) + + return UIDHolder + } + + func createTLMTextView(slotData: Dictionary , topElement: UIView) -> UIView { + let TLMHolder = createHolder(topElement, setBottomConstraints: false, pinTopAttribute: .Bottom) + let TLMLabel = createLabelWithText("Telemetry", view: TLMHolder) + let container = UIView() + TLMHolder.addSubview(container) + CustomViews.setConstraints(container, + holderView: TLMHolder, + topView: TLMLabel, + leftView: nil, + rightView: nil, + height: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + if let + value = slotData[slotDataTLMKey], + (battery, temperature, PDU, time) = BeaconInfo.parseTLMFromFrame(value) { + let (days, hours, minutes) = BeaconInfo.convertDeciseconds(time) + let batteryDescription = "Battery voltage:" + let batteryVoltageTextView = createTextView(batteryDescription, + holderView: container, + topView: TLMLabel, + leftView: nil, + rightView: nil, + width: kFrameDescriptionWidth, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + createTextView("\(battery) mV/bit", + holderView: container, + topView: TLMLabel, + leftView: nil, + rightView: container, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + let line1 = createLine(container, topView: batteryVoltageTextView) + let temperatureDescription = "Beacon temperature:" + let temperatureTextView = createTextView(temperatureDescription, + holderView: container, + topView: line1, + leftView: nil, + rightView: nil, + width: kFrameDescriptionWidth, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + createTextView("\(temperature)°C", + holderView: container, + topView: line1, + leftView: nil, + rightView: container, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + let line2 = createLine(container, topView: temperatureTextView) + let advPDUDescription = "Advertising PDU count:" + let advPDUTextView = createTextView(advPDUDescription, + holderView: container, + topView: line2, + leftView: nil, + rightView: nil, + width: kFrameDescriptionWidth, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + createTextView("\(PDU)", + holderView: container, + topView: line2, + leftView: nil, + rightView: container, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + let line3 = createLine(container, topView: advPDUTextView) + let timeSinceRebootDescription = "Time since power-on or reboot:" + createTextView(timeSinceRebootDescription, + holderView: container, + topView: line3, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + + let timeView = createTextView("\(days) days\n\(hours) hours\n\(minutes) mins", + holderView: container, + topView: line3, + leftView: nil, + rightView: container, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: true) + timeView.textAlignment = .Right + } else { + createTextView("No telemetry data", + holderView: TLMHolder, + topView: TLMLabel, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: true) + } + + return TLMHolder + } + + func createLine(holderView: UIView, topView: UIView) -> UIView { + let lineView = UIView() + holderView.addSubview(lineView) + CustomViews.setConstraints(lineView, + holderView: holderView, + topView: topView, + leftView: nil, + rightView: nil, + height: 1.0, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraints: false, + marginConstraint: kSlotDataMarginConstraint) + lineView.backgroundColor = UIColor.lightGrayColor() + return lineView + } + + func createGlobalView() -> UIView { + globalHolder = createHolder(slotContentView, + setBottomConstraints: false, + pinTopAttribute: .Top) + let globalLabel = createLabelWithText("Global Settings", view: globalHolder!) + changeLockCodeButton = createButtonWithText("Change lock code", + holderView: globalHolder!, + topElement: globalLabel, + setBottomConstraints: false) + changeLockCodeButton!.addTarget(self, + action: #selector(changeLockCodeButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + createChangeLockCodeView() + let lineView = createLine(globalHolder!, topView: changeLockCodeView!) + factoryResetButton = createButtonWithText("Factory reset", + holderView: globalHolder!, + topElement: lineView, + setBottomConstraints: false) + factoryResetButton!.addTarget(self, + action: #selector(factoryResetButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + createFactoryResetView() + + let secondLineView = createLine(globalHolder!, topView: factoryResetView!) + createButtonWithText("Remain Connectable", + holderView: globalHolder!, + topElement: secondLineView, + setBottomConstraints: false) + remainConnectableSwitch = UISwitch() + remainConnectableSwitch!.onTintColor = kGreenColor + remainConnectableSwitch!.addTarget(self, + action: #selector(switchValueChanged), + forControlEvents: UIControlEvents.ValueChanged) + globalHolder?.addSubview(remainConnectableSwitch!) + CustomViews.setConstraints(remainConnectableSwitch!, + holderView: globalHolder!, + topView: secondLineView, + leftView: nil, + rightView: globalHolder, + height: nil, + width: kFrameTitleWidth, + pinTopAttribute: .Bottom, + setBottomConstraints: true, + marginConstraint: kSlotDataMarginConstraint) + + return globalHolder! + } + + func displaySignInWarningView(topView: UIView) { + signInHolder = createHolder(topView, setBottomConstraints: false, pinTopAttribute: .Bottom) + let signInLabel = createLabelWithText("Sign In", view: signInHolder) + let signInWarningTextView = createTextView("In order to configure the EID, you must sign in " + + "with Google. Do you want to do that now?", + holderView: signInHolder, + topView: signInLabel, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + signInWarningTextView.backgroundColor = kLightGrayColor + let signInButton = createControlButton("SIGN IN", + holderView: signInHolder, + topElement: signInWarningTextView, + setBottomConstraints: true, + rightView: signInHolder) + + let cancelButton = createControlButton("CANCEL", + holderView: signInHolder, + topElement: signInWarningTextView, + setBottomConstraints: true, + rightView: signInButton) + cancelButton.addTarget(self, + action: #selector(cancelSignInButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + signInButton.addTarget(self, + action: #selector(signInButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + + } + + func displayProjectSelectionWarningView(topView: UIView) { + selectHolder = createHolder(topView, setBottomConstraints: false, pinTopAttribute: .Bottom) + let signInLabel = createLabelWithText("Select Project", view: selectHolder) + let selectProjectTextView = createTextView("In order to configure the EID, you must select a " + + "Google project associated with the user you are " + + "currently signed in with. " + + "Do you want to do that now?", + holderView: selectHolder, + topView: signInLabel, + leftView: nil, + rightView: nil, + width: nil, + pinTopAttribute: .Bottom, + setBottomConstraint: false) + selectProjectTextView.backgroundColor = kLightGrayColor + let selectButton = createControlButton("SELECT", + holderView: selectHolder, + topElement: selectProjectTextView, + setBottomConstraints: true, + rightView: selectHolder) + + let cancelButton = createControlButton("CANCEL", + holderView: selectHolder, + topElement: selectProjectTextView, + setBottomConstraints: true, + rightView: selectButton) + cancelButton.addTarget(self, + action: #selector(cancelSignInButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + selectButton.addTarget(self, + action: #selector(signInButtonPressed), + forControlEvents: UIControlEvents.TouchUpInside) + } + + func signInButtonPressed() { + signInWithGoogleCallback!(viewToDisable: signInHolder, selectViewHolder: selectHolder) + } + + func cancelSignInButtonPressed() { + frameTypePickerView.selectRow(Int(FrameTypeChange.NotSet.rawValue), + inComponent: 0, + animated: true) + signInHolder.removeFromSuperview() + selectHolder.removeFromSuperview() + } + + func switchValueChanged() { + if let callback = remainConnectableCallback { + callback(on: remainConnectableSwitch!.on) + } + } + + + func setAsURLTypeContentView(slotData: Dictionary , + capabilities: NSDictionary) { + frameTypeChange = .URL + self.slotData = slotData + self.broadcastCapabilities = capabilities + createContentView() + slotContentScrollView.addSubview(slotContentView) + let pickerView = createFrameTypePicker(frameTypes + .indexOfObject(BeaconInfo.EddystoneFrameType.URLFrameType.description), + topView: slotContentView, + setPageBottomConstraints: false) + let textView = createURLTextView(slotData, topElement: pickerView) + var txPowerView: UIView? + if let + perSlotTxPowerSupported = capabilities[perSlotTxPowerSupportedKey] as? Bool, + perSlotAdvIntervSupported = capabilities[perSlotAdvIntervalsSupportedKey] as? Bool { + if perSlotTxPowerSupported && !perSlotAdvIntervSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: textView, + topAttribute: .Bottom, + setBottomConstraints: false) + } else if perSlotTxPowerSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: textView, + topAttribute: .Bottom, + setBottomConstraints: false) + createAdvIntervalHolder(slotData, + topElement: txPowerView!, + pinTop: .Bottom, + setBottomConstraints: false) + } else if perSlotAdvIntervSupported { + createAdvIntervalHolder(slotData, + topElement: textView, + pinTop: .Bottom, + setBottomConstraints: false) + } + } + } + + func setAsUIDTypeContentView(slotData: Dictionary , + capabilities: NSDictionary) { + frameTypeChange = .UID + self.slotData = slotData + self.broadcastCapabilities = capabilities + createContentView() + + slotContentScrollView.addSubview(slotContentView) + let pickerView = createFrameTypePicker(frameTypes + .indexOfObject(BeaconInfo.EddystoneFrameType.UIDFrameType.description), + topView: slotContentView, + setPageBottomConstraints: false) + let textView = createUIDTextView(slotData, topElement: pickerView) + var txPowerView: UIView? + if let + perSlotTxPowerSupported = capabilities[perSlotTxPowerSupportedKey] as? Bool, + perSlotAdvIntervSupported = capabilities[perSlotAdvIntervalsSupportedKey] as? Bool { + if perSlotTxPowerSupported && !perSlotAdvIntervSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: textView, + topAttribute: .Bottom, + setBottomConstraints: false) + } else if perSlotTxPowerSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: textView, + topAttribute: .Bottom, + setBottomConstraints: false) + createAdvIntervalHolder(slotData, + topElement: txPowerView!, + pinTop: .Bottom, + setBottomConstraints: false) + } else if perSlotAdvIntervSupported { + createAdvIntervalHolder(slotData, + topElement: textView, + pinTop: .Bottom, + setBottomConstraints: false) + } + } + } + + func setAsTLMTypeContentView(slotData: Dictionary , + capabilities: NSDictionary) { + frameTypeChange = .TLM + self.slotData = slotData + self.broadcastCapabilities = capabilities + + createContentView() + slotContentScrollView.addSubview(slotContentView) + let pickerView = createFrameTypePicker(frameTypes + .indexOfObject(BeaconInfo.EddystoneFrameType.TelemetryFrameType.description), + topView: slotContentView, + setPageBottomConstraints: false) + let textView = createTLMTextView(slotData, topElement: pickerView) + var txPowerView: UIView? + if let + perSlotTxPowerSupported = capabilities[perSlotTxPowerSupportedKey] as? Bool, + perSlotAdvIntervSupported = capabilities[perSlotAdvIntervalsSupportedKey] as? Bool { + if perSlotTxPowerSupported && !perSlotAdvIntervSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: textView, + topAttribute: .Bottom, + setBottomConstraints: false) + } else if perSlotTxPowerSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: textView, + topAttribute: .Bottom, + setBottomConstraints: false) + createAdvIntervalHolder(slotData, + topElement: txPowerView!, + pinTop: .Bottom, + setBottomConstraints: false) + } else if perSlotAdvIntervSupported { + createAdvIntervalHolder(slotData, + topElement: textView, + pinTop: .Bottom, + setBottomConstraints: false) + } + } + } + + func setAsEIDTypeContentView(slotData: Dictionary , + capabilities: NSDictionary) { + frameTypeChange = .EID + self.slotData = slotData + self.broadcastCapabilities = capabilities + createContentView() + slotContentScrollView.addSubview(slotContentView) + + let pickerView = createFrameTypePicker(frameTypes + .indexOfObject(BeaconInfo.EddystoneFrameType.EIDFrameType.description), + topView: slotContentView, + setPageBottomConstraints: false) + displayProjectSelectionWarningView(pickerView) + selectHolder.hidden = true + if GIDSignIn.sharedInstance().currentUser == nil { + displaySignInWarningView(pickerView) + } else if EIDConfiguration.projectID == nil { + selectHolder.hidden = false + } + } + + func setAsNoFrameTypeContentView(capabilities: NSDictionary) { + self.broadcastCapabilities = capabilities + frameTypeChange = .NotSet + createContentView() + slotContentScrollView.addSubview(slotContentView) + createFrameTypePicker(frameTypes + .indexOfObject(BeaconInfo.EddystoneFrameType.NotSetFrameType.description), + topView: slotContentView, + setPageBottomConstraints: false) + } + + func setAsGlobalContentView(broadcastCapabilities: NSDictionary, + slotData: Dictionary ) { + var txPowerView: UIView? + createContentView() + self.slotData = slotData + self.broadcastCapabilities = broadcastCapabilities + slotContentScrollView.addSubview(slotContentView) + let globalView = createGlobalView() + slotContentView.addSubview(globalView) + if let + perSlotTxPowerSupported = broadcastCapabilities[perSlotTxPowerSupportedKey] as? Bool, + perSlotAdvIntervSupported = broadcastCapabilities[perSlotAdvIntervalsSupportedKey] as? Bool { + if !perSlotTxPowerSupported && perSlotAdvIntervSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: globalView, + topAttribute: .Bottom, + setBottomConstraints: false) + } else if !perSlotTxPowerSupported { + txPowerView = createTxPowerHolder(slotData, + topElement: globalView, + topAttribute: .Bottom, + setBottomConstraints: false) + createAdvIntervalHolder(slotData, + topElement: txPowerView!, + pinTop: .Bottom, + setBottomConstraints: false) + } else if !perSlotAdvIntervSupported { + createAdvIntervalHolder(slotData, + topElement: globalView, + pinTop: .Bottom, + setBottomConstraints: false) + } + } + } + + func parseURLTextToFrame(URLText: String) -> NSData { + var URL: String? = URLText + var byte: UInt8 = 0 + var URLBytes: [UInt8] = [] + var URLData: NSData + URLBytes.append(BeaconInfo.EddystoneURLFrameTypeID) + while URL?.characters.count != 0 { + (byte, URL) = BeaconInfo.byteFromEncodedString(URL!) + URLBytes.append(byte) + } + URLData = NSData(bytes: URLBytes, length: URLBytes.count * sizeof(UInt8)) + return URLData + } + + func parseDataToUIDFrame(namespace: String, instance: String) -> NSData { + var UIDData: NSData = NSData() + var UIDBytes: [UInt8] = [] + UIDBytes.append(BeaconInfo.EddystoneUIDFrameTypeID) + let namespaceBytes = StringUtils.transformStringToByteArray(namespace) + let instanceBytes = StringUtils.transformStringToByteArray(instance) + + UIDBytes.appendContentsOf(namespaceBytes) + UIDBytes.appendContentsOf(instanceBytes) + + UIDData = NSData(bytes: UIDBytes, length: UIDBytes.count * sizeof(UInt8)) + return UIDData + } + + + func getUpdateData() -> Dictionary ? { + currentSlotUpdateData.removeAll() + if let currentTxPowerSlider = txPowerSlider { + var txPower: Int8 = Int8(currentTxPowerSlider.value) + let value = NSData(bytes: &txPower, length: sizeof(Int8)) + if value != slotData[slotDataTxPowerKey] { + currentSlotUpdateData[slotDataTxPowerKey] = value + didChangeSlotData = true + } + } + + if let currentAdvIntervalSlider = advIntervalSlider { + var advInterval: UInt16 = UInt16(currentAdvIntervalSlider.value) + let value = NSData(bytes: &advInterval, length: sizeof(UInt16)) + if value != slotData[slotDataAdvIntervalKey] { + currentSlotUpdateData[slotDataAdvIntervalKey] = value + didChangeSlotData = true + } + } + + switch frameTypeChange { + case .URL: + if var slotDataURLtext = slotDataURL?.text { + if slotDataURLtext.characters.count == 0 { + slotDataURLtext = (slotDataURL?.placeholder)! + } + currentSlotUpdateData[slotDataURLKey] = parseURLTextToFrame(slotDataURLtext) + } + case .UID: + if var + instanceData = instanceTextView?.text, + namespaceData = namespaceTextView?.text { + if namespaceData.characters.count == 0 { + namespaceData = (namespaceTextView?.placeholder)! + } else if namespaceData.characters.count != kUIDNamespaceLength { + if let alert = showAlert { + alert(title: "Namespace", + description: "Namespace too short. It must have exactly 20 characters.", + buttonText: "OK") + } + return nil + } + if instanceData.characters.count == 0 { + instanceData = (instanceTextView?.placeholder)! + } else if instanceData.characters.count != kUIDInstanceLength { + if let alert = showAlert { + alert(title: "Instance", + description: "Instance too short. It must have exactly 12 characters.", + buttonText: "OK") + } + return nil + } + if namespaceData != "nil" && instanceData != "nil" { + currentSlotUpdateData[slotDataUIDKey] = parseDataToUIDFrame(namespaceData, + instance: instanceData) + } + } + case .TLM: + currentSlotUpdateData[slotDataTLMKey] = NSData(bytes: [BeaconInfo.EddystoneTLMFrameTypeID], + length: 1) + case .NotSet: + currentSlotUpdateData[slotDataNoFrameKey] = NSData(bytes: [], length: 0) + case .EID: + if GIDSignIn.sharedInstance().currentUser != nil { + if EIDConfiguration.projectID != nil { + currentSlotUpdateData[slotDataEIDKey] = + NSData(bytes: [BeaconInfo.EddystoneEIDFrameTypeID], length: 1) + } else { + if let alert = showAlert { + alert(title: "Project", + description: "You are unable to configure the beacon to broadcast EID " + + "without having a Google Project selected.", + buttonText: "OK") + } + return nil + } + } else { + if let alert = showAlert { + alert(title: "Sign In", + description: "You are unable to configure the beacon to broadcast EID " + + "without signing in with a Google account.", + buttonText: "OK") + } + return nil + } + } + return currentSlotUpdateData + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/StringUtils.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/StringUtils.swift new file mode 100644 index 0000000..af9856a --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/StringUtils.swift @@ -0,0 +1,52 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +import UIKit + +class StringUtils { + class func containsOnlyCharactersInString(text: String, matchCharacters: String) -> Bool { + let disallowedCharacterSet = NSCharacterSet(charactersInString: matchCharacters).invertedSet + return text.rangeOfCharacterFromSet(disallowedCharacterSet) == nil + } + + class func inHexadecimalString(text: String) -> Bool { + return containsOnlyCharactersInString(text, matchCharacters: "0123456789ABCDEFabcdef") + } + + /// + /// converts a hex string to actual hex value + /// e.g. "1a5fbb" -> [0x1a, 0x5f, 0xbb] + /// + class func transformStringToByteArray(string: String) -> [UInt8] { + let characters = Array(string.characters) + let bytes = 0.stride(to: characters.count, by: 2).map { + UInt8(String(characters[$0 ..< $0+2]), radix: 16) ?? 0xff + } + return bytes + } + + class func convertNSDataToBase64String(data: NSData) -> String { + return data.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) + } + + class func md5(string: String) -> NSData { + var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0) + if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { + CC_MD5(data.bytes, CC_LONG(data.length), &digest) + } + let data = NSData(bytes: digest, length: digest.count * sizeof(UInt8)) + return data + } +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/UserInformation.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/UserInformation.swift new file mode 100644 index 0000000..2427ca9 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/UserInformation.swift @@ -0,0 +1,115 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import Foundation +import UIKit + +let kGetProjectsServer = "https://cloudresourcemanager.googleapis.com/v1beta1/projects" + +enum GettingProjectsListState { + case UserHasNoProjects + case UnableToGetProjects + case GotUserProjects +} + +/// +/// Using Storyboard segues to load the UserLoginViewController was a safe choice, but segues +/// create a new instance of the view controller every time the segue is triggered. We needed +/// a class to hold the state of the view controller. +/// +class UserInformation { + var userImage: UIImage + var userName: String? + var userEmail: String? + var userProjects: NSMutableArray? + var statusInfo: String + var userCurrentlySignedIn: Bool + var projectsArray: NSMutableArray! + var gotProjectsListCallback: ((state: GettingProjectsListState) -> Void)? + var selectedProjectIndex: Int? + + init() { + userImage = UIImage(named: "Google")! + statusInfo = "Currently not signed in" + userCurrentlySignedIn = false + projectsArray = ["Not Selected"] + } + + /// We want to clear all the data we have when the user signs out. + func clearData() { + userImage = UIImage(named: "Google")! + statusInfo = "Currently not signed in" + userCurrentlySignedIn = false + projectsArray = ["Not Selected"] + selectedProjectIndex = nil + } + + func parseUserProjects(data: NSData) { + do { + let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) + if let projectsList = json["projects"] as? NSArray { + for project in projectsList { + if let + projectID = project["projectId"], + ID = projectID as? String { + projectsArray.addObject(ID) + } + } + if let callback = gotProjectsListCallback { + callback(state: GettingProjectsListState.GotUserProjects) + } + } else { + /// The user has no projects. + if let callback = gotProjectsListCallback { + callback(state: GettingProjectsListState.UserHasNoProjects) + } + } + } catch { + print("error serializing JSON: \(error)") + } + } + + func getprojectListHTTPRequest() { + if GIDSignIn.sharedInstance().currentUser != nil { + let bearer = GIDSignIn.sharedInstance().currentUser.authentication.accessToken + let bearerHeader = "Bearer \(bearer)" + let server = kGetProjectsServer + let url = NSURL(string: server) + let httpHeaders = ["Authorization" : bearerHeader, + "Accept" : "application/json"] + if let requestURL = url { + HTTPRequest.makeHTTPRequest(requestURL, + method: "GET", + postBody: nil, + requestHeaders: httpHeaders) { statusCode, data, error in + if statusCode == 200 { + self.parseUserProjects(data!) + } else { + if let callback = self.gotProjectsListCallback { + callback(state: + GettingProjectsListState.UnableToGetProjects) + } + } + + } + } + } + } + + func getProjectList(callback: (state: GettingProjectsListState) -> Void) { + gotProjectsListCallback = callback + getprojectListHTTPRequest() + } + +} diff --git a/tools/gatt-config/ios/Beaconfig/Beaconfig/UserLoginViewController.swift b/tools/gatt-config/ios/Beaconfig/Beaconfig/UserLoginViewController.swift new file mode 100644 index 0000000..768b1cf --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Beaconfig/UserLoginViewController.swift @@ -0,0 +1,228 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import UIKit + +/// +/// Manages the view where the user signs in with Google and chooses a project. +/// +class UserLoginViewController: UIViewController, GIDSignInUIDelegate, + UIPickerViewDelegate, UIPickerViewDataSource { + @IBOutlet weak var userInfoView: UIView! + @IBOutlet weak var signInButton: GIDSignInButton! + @IBOutlet weak var signOutButton: UIButton! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var emailTextView: UILabel! + @IBOutlet weak var projectIDPickerView: UIPickerView! + @IBOutlet weak var projectSelectionDescriptionView: UILabel! + var viewToDisable: UIView? + var selectHolder: UIView? + var projectsArray: NSMutableArray = ["Not Selected"] + var userInfo: UserInformation! + var additionalScopes = ["https://www.googleapis.com/auth/userlocation.beacon.registry", + "https://www.googleapis.com/auth/cloud-platform"] + + override func viewDidLoad() { + super.viewDidLoad() + GIDSignIn.sharedInstance().uiDelegate = self + projectIDPickerView.delegate = self + projectIDPickerView.dataSource = self + projectIDPickerView.showsSelectionIndicator = true + projectSelectionDescriptionView.text = "Configuration of Eddystone EID beacons requires you\n" + + "to select a Google Cloud project." + CustomViews.addShadow(userInfoView) + projectSelectionDescriptionView.backgroundColor = kLightGrayColor + CustomViews.addShadow(projectSelectionDescriptionView) + /// + /// We need to manually add scopes in order to do the beacon registrations and to use the + /// clout platform. We only do this if the user is not signed in. + /// + if !userInfo.userCurrentlySignedIn { + for scope in additionalScopes { + GIDSignIn.sharedInstance().scopes.append(scope) + } + } + reloadDataInUIElements() + NSNotificationCenter.defaultCenter() + .addObserver(self, + selector: #selector(UserLoginViewController.receiveToggleAuthUINotification(_:)), + name: "ToggleAuthUINotification", + object: nil) + + signOutButton.setTitle("Sign Out", forState: UIControlState.Normal) + signOutButton.setTitleColor(kGreenColor, forState: UIControlState.Normal) + signOutButton.addTarget(self, + action: #selector(UserLoginViewController.didTapSignOut), + forControlEvents: .TouchUpInside) + + } + + func prepareForUse(userInfo: UserInformation) { + self.userInfo = userInfo + } + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + + func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { + return 1 + } + + func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + return projectsArray.count + } + + /// + /// When the user selects a project, immediately save it to be used in EID configuration + /// and remove all the notifications that tell the user to select a project. + /// + func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + EIDConfiguration.projectID = (userInfo.projectsArray.objectAtIndex(row) as! String) + userInfo.selectedProjectIndex = row + if let selectView = self.selectHolder { + selectView.removeFromSuperview() + } + } + + func pickerView(pickerView: UIPickerView, + viewForRow row: Int, + forComponent component: Int, + reusingView view: UIView?) -> UIView { + let pickerLabel = UILabel() + pickerLabel.textColor = UIColor.blackColor() + pickerLabel.text = projectsArray[row] as? String + pickerLabel.font = UIFont(name: "Arial-BoldMT", size: 15) + pickerLabel.textAlignment = NSTextAlignment.Center + return pickerLabel + } + + func signIn(signIn: GIDSignIn!, + presentViewController viewController: UIViewController!) { + print("sign in button pressed") + self.presentViewController(viewController, animated: true, completion: nil) + } + + /// Dismiss the "Sign in with Google" view. + func signIn(signIn: GIDSignIn!, + dismissViewController viewController: UIViewController!) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + func didTapSignOut() { + GIDSignIn.sharedInstance().signOut() + NSNotificationCenter.defaultCenter().postNotificationName( + "ToggleAuthUINotification", object: nil, userInfo: nil) + } + + + override func preferredStatusBarStyle() -> UIStatusBarStyle { + return UIStatusBarStyle.LightContent + } + + deinit { + NSNotificationCenter.defaultCenter().removeObserver(self, + name: "ToggleAuthUINotification", + object: nil) + } + + func reloadDataInUIElements() { + profileImage.frame.size = CGSizeMake(100, 100) + profileImage.image = userInfo.userImage + profileImage.layer.cornerRadius = profileImage.frame.width/2 + profileImage.clipsToBounds = true + + if userInfo.userCurrentlySignedIn { + statusText.text = userInfo.userName! + emailTextView.hidden = false + emailTextView.text = userInfo.userEmail! + signInButton.hidden = true + signOutButton.hidden = false + projectIDPickerView.hidden = false + projectSelectionDescriptionView.hidden = false + projectsArray = userInfo.projectsArray + projectIDPickerView.reloadAllComponents() + if let row = userInfo.selectedProjectIndex { + projectIDPickerView.selectRow(row, inComponent: 0, animated: true) + } + } else { + statusText.text = userInfo.statusInfo + emailTextView.hidden = true + signInButton.hidden = false + signOutButton.hidden = true + projectsArray.removeAllObjects() + projectIDPickerView.reloadAllComponents() + projectIDPickerView.hidden = true + projectSelectionDescriptionView.hidden = true + EIDConfiguration.projectID = nil + } + } + + @objc func receiveToggleAuthUINotification(notification: NSNotification) { + if (notification.name == "ToggleAuthUINotification") { + if let data = notification.userInfo { + userInfo.userName = data["statusText"] as? String + let imageData = NSData(contentsOfURL: data["imageURL"] as! NSURL) + userInfo.userImage = UIImage(data: imageData!)! + userInfo.userEmail = data["email"] as? String + userInfo.userCurrentlySignedIn = true + + /// When the user signs in, we need to get a list of the projects using the Cloud platform. + userInfo.getProjectList() {state in + dispatch_async(dispatch_get_main_queue()) { + if state == GettingProjectsListState.GotUserProjects { + self.reloadDataInUIElements() + if let view = self.viewToDisable { + view.removeFromSuperview() + } + if let selectView = self.selectHolder { + if EIDConfiguration.projectID != nil { + selectView.removeFromSuperview() + } else { + selectView.hidden = false + } + } + } else if state == GettingProjectsListState.UnableToGetProjects { + self.didTapSignOut() + self.showAlert("Projects List", + description: "Unable to get projects list.", + buttonText: "Dismiss") + } else if state == GettingProjectsListState.UserHasNoProjects { + self.didTapSignOut() + self.showAlert("Projects List", + description: "The account you selected has no projects." + + "You will not be able to register an EID Beacon." + + "Create a Google project or change the account.", + buttonText: "Dismiss") + } + } + } + } else { + userInfo.clearData() + reloadDataInUIElements() + } + } + } + + func showAlert(title: String, description: String, buttonText:String) { + let alertController = UIAlertController(title: title, + message: description, + preferredStyle: UIAlertControllerStyle.Alert) + alertController.addAction(UIAlertAction(title: buttonText, + style: UIAlertActionStyle.Default, + handler: nil)) + + self.presentViewController(alertController, animated: true, completion: nil) + } +} diff --git a/tools/gatt-config/ios/Beaconfig/GoogleService-Info.plist.sample b/tools/gatt-config/ios/Beaconfig/GoogleService-Info.plist.sample new file mode 100644 index 0000000..acb70c7 --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/GoogleService-Info.plist.sample @@ -0,0 +1,34 @@ + + + + + APY_KEY + AIzaSyBU418D7RFBkJqfFBxNN93MqWzBPqYCSr0 + CLIENT_ID + 123456789012-clientidcharactersgohere.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.123456789012-clientidcharactersgohere + PLIST_VERSION + 1 + BUNDLE_ID + denisansadu-google.com.beaconfig.application + PROJECT_ID + beaconfig-ios-141912 + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:14149026053:ios:ccf172013e2d4075 + CFBundleIdentifier + denisansadu-google.com.beaconfig.application + + + + diff --git a/tools/gatt-config/ios/Beaconfig/Podfile b/tools/gatt-config/ios/Beaconfig/Podfile new file mode 100644 index 0000000..18123ea --- /dev/null +++ b/tools/gatt-config/ios/Beaconfig/Podfile @@ -0,0 +1,11 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +target 'Beaconfig' do + # Comment this line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + + # Pods for Beaconfig + +end +pod 'Google/SignIn' diff --git a/tools/gatt-config/ios/README.md b/tools/gatt-config/ios/README.md index 203163b..307c14a 100644 --- a/tools/gatt-config/ios/README.md +++ b/tools/gatt-config/ios/README.md @@ -1 +1,47 @@ -TODO: describe this app, how to build and run, etc. +## BeaConfig App (iOS) + +The BeaConfig application enables unconstrained configuration of BLE beacons that support the Eddystone configuration GATT service, as well as EID registration. + +### Building The App +In order to set up the application, you have to set up various Google APIs, their authentication keys, and OAuth stuff. The actual app is CocoaPod and is easy to get running. + +1. Make sure your computer has [CocoaPods](http://cocoapods.org) installed, as well as Xcode 7. +2. In order to get all the component pieces: +``` +open the terminal +go to the folder that has “Podfile” in it +pod install +open Beaconfig.xcworkspace/ +``` +The code will not compile just yet. We need to add a couple of _.plist_ files. Also, so not open the _.xcodeproj/_. From now you should only use the **.xcworkspace/** one! + +3. Go to [Google API Developer Console](https://console.developers.google.com/). You now have to create a new project (Project -> Create Project). Give that project a name, save and then wait a couple of seconds for the project to be created. + +4. Now we’re gonna enable some APIs. In the left menu, go to Library and then search and enable the following APIs: +- Google Beacon Proximity API +- Google Cloud Resource Manager API + +5. Using the menu on the left, go to _Credentials_. Click on the _Create credentials_ drop down menu and then choose _API key_. Once you get it, you’re going to want to restrict it. Click _Restrict_ and choose _iOS apps_. When required a bundle identifier, you can either add _com.google.ios.beaconfig_ or just leave it blank. + +6. Go to [Start Integrating Google Sign-In](https://developers.google.com/identity/sign-in/ios/start-integrating) from a browser logged in to the account that created the API project you just created. + +7. Go to the button _”Get a configuration file”_ and click that. + +8. For _”App Name”_, Enter / select the project name you just created in API console. + +9. For __iOS BundleID__, enter `com.google.ios.beaconfig`. + +10. “Continue to Choose and Configure Services”. + +11. Enable __Google Sign-In__ (that’s all). + +12. “Continue to Generate configuration files”. + +13. Download the configuration file, `GoogleService-Info.plist`. Put it in the same folder as your Info.plist. Make sure any other _GoogleService-Info.plist_ files are deleted. + +14. You now have to set your project’s reversed client ID in Xcode: +* Click on the blue project “_Beaconfig_” at the top of the Project Navigator. +* Click on “_Beaconfig_” under “_Targets_” in the main part of Xcode. +* Click on “_Info_” across the top. +* Look for the scheme under “_URL Types_” +* Replace that scheme with the value of the REVERSED_CLIENT_ID from the *GoogleService-Info.plist* file (i.e. `com.googleusercontent.apps.2384234-35892859asdfashdoaiusdasf`) From 197a3b68105b3602077405f3623c0bcc9adcfefc Mon Sep 17 00:00:00 2001 From: Thomas Beverley Date: Mon, 26 Sep 2016 15:31:32 +0100 Subject: [PATCH 28/36] Added the BBC micro:bit implementation of a physical web beacon --- eddystone-url/implementations/BBC-microbit/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 eddystone-url/implementations/BBC-microbit/README.md diff --git a/eddystone-url/implementations/BBC-microbit/README.md b/eddystone-url/implementations/BBC-microbit/README.md new file mode 100644 index 0000000..0224ad4 --- /dev/null +++ b/eddystone-url/implementations/BBC-microbit/README.md @@ -0,0 +1,3 @@ +# BBC micro:bit + +[microbit-physicalweb](https://github.com/showio/microbit-physicalweb) From a79c66be4a718e51594a1a2bf0890280c35505e3 Mon Sep 17 00:00:00 2001 From: Mikael Jergefelt Date: Wed, 28 Sep 2016 08:52:56 +0200 Subject: [PATCH 29/36] add BBC micro:bit link to implementations directory list --- eddystone-url/implementations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/eddystone-url/implementations/README.md b/eddystone-url/implementations/README.md index db6f641..14aa9bf 100644 --- a/eddystone-url/implementations/README.md +++ b/eddystone-url/implementations/README.md @@ -10,6 +10,7 @@ write you own Eddystone-URL beacon code. We encourage you to add additional exam To date, in this directory you will find the following implementations: * [Arduino (BLEPeripheral)](https://github.com/sandeepmistry/arduino-BLEPeripheral/blob/master/examples/Eddystone/EddystoneURL/EddystoneURL.ino), a list of compatible hardware can be found [here](https://github.com/sandeepmistry/arduino-BLEPeripheral#compatible-hardware). +* [BBC micro:bit](https://github.com/showio/microbit-physicalweb) * [BlueGiga BLED112](BlueGiga-BLED112) * [Cambridge Silicon Radio CSR1010 (Beacon Development Board)](CSR-1010) * [PyBeacon (Python Package)](PyBeacon), for latest builds, check [Nirmanakarta/PyBeacon](https://github.com/nirmankarta/PyBeacon) From b12ec91bf0b85baf273d1f49d43673f1d2b03831 Mon Sep 17 00:00:00 2001 From: bashtian Date: Mon, 2 Jan 2017 14:56:25 +0100 Subject: [PATCH 30/36] Convert all UUIDs to lower case Single upper case letters can be easily overlooked during copy/pasting and can cause errors. --- configuration-service/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configuration-service/README.md b/configuration-service/README.md index ae6510e..3de7687 100644 --- a/configuration-service/README.md +++ b/configuration-service/README.md @@ -470,7 +470,7 @@ Read Not Permitted: for any attempt to read while the beacon is locked. Characteristic UUID -a3c8750A-8ed3-4bdf-8a39-a01bebede295 +a3c8750a-8ed3-4bdf-8a39-a01bebede295 Properties @@ -532,7 +532,7 @@ Invalid Attribute Length: on any attempt to write with an illegal number of byte Characteristic UUID -a3c8750B-8ed3-4bdf-8a39-a01bebede295 +a3c8750b-8ed3-4bdf-8a39-a01bebede295 Properties @@ -568,7 +568,7 @@ In addition, any write shall be ignored if the lock state is not 0x01 Characteristic UUID -a3c8750C-8ed3-4bdf-8a39-a01bebede295 +a3c8750c-8ed3-4bdf-8a39-a01bebede295 Properties From bd52c3e8f5e7678af9f47ef66e3ba85eacddd9d9 Mon Sep 17 00:00:00 2001 From: Roy Want Date: Mon, 6 Feb 2017 15:18:09 -0800 Subject: [PATCH 31/36] Adding beacon implementations directory with mbed subdirectory --- implementations/README.md | 12 + implementations/mbed/LICENSE | 201 +++ implementations/mbed/README.md | 24 + implementations/mbed/config.json | 20 + implementations/mbed/img/app_start.png | Bin 0 -> 20133 bytes implementations/mbed/img/edit_url.png | Bin 0 -> 24231 bytes .../mbed/img/open_configuration.png | Bin 0 -> 35881 bytes implementations/mbed/img/result.png | Bin 0 -> 40850 bytes implementations/mbed/img/save_url.png | Bin 0 -> 26889 bytes implementations/mbed/mbed-os.lib | 1 + implementations/mbed/mbed_app.json | 12 + implementations/mbed/source/EIDFrame.cpp | 206 +++ implementations/mbed/source/EIDFrame.h | 224 +++ .../mbed/source/EddystoneService.cpp | 1331 +++++++++++++++++ .../mbed/source/EddystoneService.h | 1198 +++++++++++++++ implementations/mbed/source/EddystoneTypes.h | 239 +++ .../mbed/source/Eddystone_config.h | 199 +++ .../source/EntropySource/EntropySource.cpp | 33 + .../mbed/source/EntropySource/EntropySource.h | 11 + .../nRFEntropySource/nRFEntropySource.cpp | 67 + .../mbed/source/EventQueue/AlignedStorage.h | 207 +++ .../mbed/source/EventQueue/EventQueue.h | 127 ++ .../source/EventQueue/EventQueueClassic.h | 251 ++++ .../mbed/source/EventQueue/EventQueueMinar.h | 70 + .../mbed/source/EventQueue/MakeThunk.h | 107 ++ .../mbed/source/EventQueue/PriorityQueue.h | 418 ++++++ .../mbed/source/EventQueue/Thunk.h | 117 ++ .../EventQueue/detail/FunctionAdaptor.h | 99 ++ .../EventQueue/detail/MemberFunctionAdaptor.h | 161 ++ .../source/EventQueue/detail/Thunk.impl.h | 66 + .../source/EventQueue/detail/ThunkVTable.h | 59 + .../EventQueue/detail/ThunkVTableGenerator.h | 96 ++ .../mbed/source/EventQueue/detail/Thunks.h | 136 ++ .../EventQueue/util/CriticalSectionLock.h | 59 + .../ConfigParamsPersistence.cpp | 55 + .../ConfigParamsPersistence.h | 67 + .../nrfConfigParamsPersistence.cpp | 140 ++ implementations/mbed/source/TLMFrame.cpp | 196 +++ implementations/mbed/source/TLMFrame.h | 276 ++++ implementations/mbed/source/UIDFrame.cpp | 69 + implementations/mbed/source/UIDFrame.h | 156 ++ implementations/mbed/source/URLFrame.cpp | 155 ++ implementations/mbed/source/URLFrame.h | 185 +++ implementations/mbed/source/aes_eax.cpp | 121 ++ implementations/mbed/source/aes_eax.h | 47 + implementations/mbed/source/main.cpp | 289 ++++ implementations/mbed/source/mbedtls_config.h | 112 ++ 47 files changed, 7619 insertions(+) create mode 100644 implementations/README.md create mode 100644 implementations/mbed/LICENSE create mode 100644 implementations/mbed/README.md create mode 100644 implementations/mbed/config.json create mode 100644 implementations/mbed/img/app_start.png create mode 100644 implementations/mbed/img/edit_url.png create mode 100644 implementations/mbed/img/open_configuration.png create mode 100644 implementations/mbed/img/result.png create mode 100644 implementations/mbed/img/save_url.png create mode 100644 implementations/mbed/mbed-os.lib create mode 100644 implementations/mbed/mbed_app.json create mode 100644 implementations/mbed/source/EIDFrame.cpp create mode 100644 implementations/mbed/source/EIDFrame.h create mode 100644 implementations/mbed/source/EddystoneService.cpp create mode 100644 implementations/mbed/source/EddystoneService.h create mode 100644 implementations/mbed/source/EddystoneTypes.h create mode 100644 implementations/mbed/source/Eddystone_config.h create mode 100644 implementations/mbed/source/EntropySource/EntropySource.cpp create mode 100644 implementations/mbed/source/EntropySource/EntropySource.h create mode 100644 implementations/mbed/source/EntropySource/nRFEntropySource/nRFEntropySource.cpp create mode 100644 implementations/mbed/source/EventQueue/AlignedStorage.h create mode 100644 implementations/mbed/source/EventQueue/EventQueue.h create mode 100644 implementations/mbed/source/EventQueue/EventQueueClassic.h create mode 100644 implementations/mbed/source/EventQueue/EventQueueMinar.h create mode 100644 implementations/mbed/source/EventQueue/MakeThunk.h create mode 100644 implementations/mbed/source/EventQueue/PriorityQueue.h create mode 100644 implementations/mbed/source/EventQueue/Thunk.h create mode 100644 implementations/mbed/source/EventQueue/detail/FunctionAdaptor.h create mode 100644 implementations/mbed/source/EventQueue/detail/MemberFunctionAdaptor.h create mode 100644 implementations/mbed/source/EventQueue/detail/Thunk.impl.h create mode 100644 implementations/mbed/source/EventQueue/detail/ThunkVTable.h create mode 100644 implementations/mbed/source/EventQueue/detail/ThunkVTableGenerator.h create mode 100644 implementations/mbed/source/EventQueue/detail/Thunks.h create mode 100644 implementations/mbed/source/EventQueue/util/CriticalSectionLock.h create mode 100644 implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.cpp create mode 100644 implementations/mbed/source/PersistentStorageHelper/ConfigParamsPersistence.h create mode 100644 implementations/mbed/source/PersistentStorageHelper/nrfPersistentStorageHelper/nrfConfigParamsPersistence.cpp create mode 100644 implementations/mbed/source/TLMFrame.cpp create mode 100644 implementations/mbed/source/TLMFrame.h create mode 100644 implementations/mbed/source/UIDFrame.cpp create mode 100644 implementations/mbed/source/UIDFrame.h create mode 100644 implementations/mbed/source/URLFrame.cpp create mode 100644 implementations/mbed/source/URLFrame.h create mode 100644 implementations/mbed/source/aes_eax.cpp create mode 100644 implementations/mbed/source/aes_eax.h create mode 100644 implementations/mbed/source/main.cpp create mode 100644 implementations/mbed/source/mbedtls_config.h diff --git a/implementations/README.md b/implementations/README.md new file mode 100644 index 0000000..003ffa8 --- /dev/null +++ b/implementations/README.md @@ -0,0 +1,12 @@ +# Eddystone Implementations +There are two goals of this list: + +* Collect a list of Eddystone beacon open source implementations that fully support the [Eddystone protocol](https://github.com/google/eddystone/blob/master/protocol-specification.md) and the [GATT configuration service](https://github.com/google/eddystone/blob/master/configuration-service) +* Encourage embedding Eddystone functionality into other products (usually by adding additional GATT services to the beacon) + +Any forks of these projects that add functionality should also be listed here as long as they too are forkable + + +* [ARM mbed](mbed) +* [Nordic](https://github.com/NordicSemiconductor/nrf5-sdk-for-eddystone) + diff --git a/implementations/mbed/LICENSE b/implementations/mbed/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/implementations/mbed/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/implementations/mbed/README.md b/implementations/mbed/README.md new file mode 100644 index 0000000..958836e --- /dev/null +++ b/implementations/mbed/README.md @@ -0,0 +1,24 @@ +# Eddystone for mbed +Eddystone beacons broadcast a small amount of information, such as URLs, to nearby devices that scan for them. If you'd like to learn more, please see the [Physical Web](physical-web.org) page. + +This repo contains an fully functional Eddystone image that supports all 4 frame types (URL, UUID, TLM, and EID) as well as the complete Eddystone GATT configuration service. + +To compile this image you'll need the [mbed toolchain from ARM](mbed.org). mbed is one of the most widely used embedded OS platforms. Unfortunately, we can't offer support for mbed or ARM tools. + +### Goal 1 - Lots of beacons +The first goal of this repo is to encourage a wide distribution of Eddystone beacon hardware with an open source version that anyone can freely use. If you do port this to your platform, please consider a pull request so others can compile to your hardware. + +### Goal 2 - Lots of devices +The second goal is to encourage other devices beyond just beacons. These would be interative devices that use new GATT services characteristics. We hope to see forks for products such as vending machines or remote control toys. With Bluetooth Javascript support in modern web browsers, it's important we have an easy way for device makers to not only broadcast a URL but to connect and control it directly. + +### Porting the code +1. Edit Eddystone_config.h, most boards should work with changes only to this file. +2. There are #defines for each target board, just add your own #define to the list + +**Note:** We've only compiled this for the Nordic chipsets as of Jan 2017. If you are using anything else, there will almost certainly be other changes to make throughout the code (such as persistent storage). We are encouraging new chip vendors to make these changes so you don't have to. + +### Best Practices +* Be sure to test the advertised transmit power levels as each board's antenna is different. +* The URL for configuring the beacon, cf.physical-web.org is free for anyone to use. You don't need to change it. +* Offer a wide range of power levels so it's possible to broadcast only a short distance. +* Please don't default to high power. We don't want 'shouty' beacons diff --git a/implementations/mbed/config.json b/implementations/mbed/config.json new file mode 100644 index 0000000..814e0bf --- /dev/null +++ b/implementations/mbed/config.json @@ -0,0 +1,20 @@ +{ + "nordic": { + "softdevice": "S130" + }, + "nrf51822": { + "ram_size": "32K" + }, + "mbed": { + "max-filehandles": 4 + }, + "platform" : { + "reset_button" : "p17", + "config_led" : "p13", + "shutdown_led" : "p14", + "led_off" : 0 + }, + "mbedtls": { + "user-config-file": "\"source/mbedtls_config.h\"" + } +} diff --git a/implementations/mbed/img/app_start.png b/implementations/mbed/img/app_start.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb78b32bc6891e87e2c7759bd3b80beaf35a05e GIT binary patch literal 20133 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 literal 0 HcmV?d00001 diff --git a/implementations/mbed/img/edit_url.png b/implementations/mbed/img/edit_url.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a048d7373f37ac3e6eb55266f5c0f6f49ef111 GIT binary patch literal 24231 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 Gg8vC_B#=A+ literal 0 HcmV?d00001 diff --git a/implementations/mbed/img/open_configuration.png b/implementations/mbed/img/open_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..678a582de920780762be10025962b6e4b1133af7 GIT binary patch literal 35881 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 literal 0 HcmV?d00001 diff --git a/implementations/mbed/img/result.png b/implementations/mbed/img/result.png new file mode 100644 index 0000000000000000000000000000000000000000..68d3cc246c73f362925743e8a3d2fd95ca8f9aa7 GIT binary patch literal 40850 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