The eddystone config service allows you to configure the eddystone frame data over BLE for a set period of time and then starts an eddystone beacon. This example defaults to 30 seconds of config time.

Dependencies:   BLE_API mbed nRF51822 X_NUCLEO_IDB0XA1

Fork of BLE_EddystoneBeaconConfigServiceRelease by Austin Blackstone

This is the eddystone config service. This code starts up and for a user configured time period (default 30 seconds) will advertise the configuration service.

The configuration service allows for modifying various frames of the eddystone specification.

For more details on the Configuration Service please see : https://github.com/google/eddystone/blob/master/eddystone-url/docs/config-service-spec.md

Committer:
Vincent Coubard
Date:
Tue Sep 20 14:21:04 2016 +0100
Revision:
8:f53d48e5d64f
Parent:
6:321047f0190a
Update libraries and add support of ST shield.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andresag 6:321047f0190a 1 /* mbed Microcontroller Library
andresag 6:321047f0190a 2 * Copyright (c) 2006-2015 ARM Limited
andresag 6:321047f0190a 3 *
andresag 6:321047f0190a 4 * Licensed under the Apache License, Version 2.0 (the "License");
andresag 6:321047f0190a 5 * you may not use this file except in compliance with the License.
andresag 6:321047f0190a 6 * You may obtain a copy of the License at
andresag 6:321047f0190a 7 *
andresag 6:321047f0190a 8 * http://www.apache.org/licenses/LICENSE-2.0
andresag 6:321047f0190a 9 *
andresag 6:321047f0190a 10 * Unless required by applicable law or agreed to in writing, software
andresag 6:321047f0190a 11 * distributed under the License is distributed on an "AS IS" BASIS,
andresag 6:321047f0190a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
andresag 6:321047f0190a 13 * See the License for the specific language governing permissions and
andresag 6:321047f0190a 14 * limitations under the License.
andresag 6:321047f0190a 15 */
andresag 6:321047f0190a 16
andresag 6:321047f0190a 17 #include "URLFrame.h"
andresag 6:321047f0190a 18
andresag 6:321047f0190a 19 URLFrame::URLFrame(void)
andresag 6:321047f0190a 20 {
andresag 6:321047f0190a 21 urlDataLength = 0;
andresag 6:321047f0190a 22 memset(urlData, 0, sizeof(UrlData_t));
andresag 6:321047f0190a 23 }
andresag 6:321047f0190a 24
andresag 6:321047f0190a 25 URLFrame::URLFrame(const char *urlDataIn)
andresag 6:321047f0190a 26 {
andresag 6:321047f0190a 27 encodeURL(urlDataIn);
andresag 6:321047f0190a 28 }
andresag 6:321047f0190a 29
andresag 6:321047f0190a 30 URLFrame::URLFrame(UrlData_t urlDataIn, uint8_t urlDataLength)
andresag 6:321047f0190a 31 {
andresag 6:321047f0190a 32 if (urlDataLength > URL_DATA_MAX) {
andresag 6:321047f0190a 33 memcpy(urlData, urlDataIn, URL_DATA_MAX);
andresag 6:321047f0190a 34 } else {
andresag 6:321047f0190a 35 memcpy(urlData, urlDataIn, urlDataLength);
andresag 6:321047f0190a 36 }
andresag 6:321047f0190a 37 }
andresag 6:321047f0190a 38
andresag 6:321047f0190a 39 void URLFrame::constructURLFrame(uint8_t* rawFrame, int8_t advPowerLevel)
andresag 6:321047f0190a 40 {
andresag 6:321047f0190a 41 size_t index = 0;
andresag 6:321047f0190a 42 rawFrame[index++] = EDDYSTONE_UUID[0]; // 16-bit Eddystone UUID
andresag 6:321047f0190a 43 rawFrame[index++] = EDDYSTONE_UUID[1];
andresag 6:321047f0190a 44 rawFrame[index++] = FRAME_TYPE_URL; // 1B Type
andresag 6:321047f0190a 45 rawFrame[index++] = advPowerLevel; // 1B Power @ 0meter
andresag 6:321047f0190a 46 memcpy(rawFrame + index, urlData, urlDataLength); // Encoded URL
andresag 6:321047f0190a 47 }
andresag 6:321047f0190a 48
andresag 6:321047f0190a 49 size_t URLFrame::getRawFrameSize(void) const
andresag 6:321047f0190a 50 {
andresag 6:321047f0190a 51 return urlDataLength + FRAME_MIN_SIZE_URL + EDDYSTONE_UUID_SIZE;
andresag 6:321047f0190a 52 }
andresag 6:321047f0190a 53
andresag 6:321047f0190a 54 uint8_t* URLFrame::getEncodedURLData(void)
andresag 6:321047f0190a 55 {
andresag 6:321047f0190a 56 return urlData;
andresag 6:321047f0190a 57 }
andresag 6:321047f0190a 58
andresag 6:321047f0190a 59 uint8_t URLFrame::getEncodedURLDataLength(void) const
andresag 6:321047f0190a 60 {
andresag 6:321047f0190a 61 return urlDataLength;
andresag 6:321047f0190a 62 }
andresag 6:321047f0190a 63
andresag 6:321047f0190a 64 void URLFrame::setURLData(const char *urlDataIn)
andresag 6:321047f0190a 65 {
andresag 6:321047f0190a 66 encodeURL(urlDataIn);
andresag 6:321047f0190a 67 }
andresag 6:321047f0190a 68
andresag 6:321047f0190a 69 void URLFrame::setEncodedURLData(const uint8_t* urlEncodedDataIn, const uint8_t urlEncodedDataLengthIn)
andresag 6:321047f0190a 70 {
andresag 6:321047f0190a 71 urlDataLength = urlEncodedDataLengthIn;
andresag 6:321047f0190a 72 memcpy(urlData, urlEncodedDataIn, urlEncodedDataLengthIn);
andresag 6:321047f0190a 73 }
andresag 6:321047f0190a 74
andresag 6:321047f0190a 75 void URLFrame::encodeURL(const char *urlDataIn)
andresag 6:321047f0190a 76 {
andresag 6:321047f0190a 77 const char *prefixes[] = {
andresag 6:321047f0190a 78 "http://www.",
andresag 6:321047f0190a 79 "https://www.",
andresag 6:321047f0190a 80 "http://",
andresag 6:321047f0190a 81 "https://",
andresag 6:321047f0190a 82 };
andresag 6:321047f0190a 83 const size_t NUM_PREFIXES = sizeof(prefixes) / sizeof(char *);
andresag 6:321047f0190a 84 const char *suffixes[] = {
andresag 6:321047f0190a 85 ".com/",
andresag 6:321047f0190a 86 ".org/",
andresag 6:321047f0190a 87 ".edu/",
andresag 6:321047f0190a 88 ".net/",
andresag 6:321047f0190a 89 ".info/",
andresag 6:321047f0190a 90 ".biz/",
andresag 6:321047f0190a 91 ".gov/",
andresag 6:321047f0190a 92 ".com",
andresag 6:321047f0190a 93 ".org",
andresag 6:321047f0190a 94 ".edu",
andresag 6:321047f0190a 95 ".net",
andresag 6:321047f0190a 96 ".info",
andresag 6:321047f0190a 97 ".biz",
andresag 6:321047f0190a 98 ".gov"
andresag 6:321047f0190a 99 };
andresag 6:321047f0190a 100 const size_t NUM_SUFFIXES = sizeof(suffixes) / sizeof(char *);
andresag 6:321047f0190a 101
andresag 6:321047f0190a 102 urlDataLength = 0;
andresag 6:321047f0190a 103 memset(urlData, 0, sizeof(UrlData_t));
andresag 6:321047f0190a 104
andresag 6:321047f0190a 105 if ((urlDataIn == NULL) || (strlen(urlDataIn) == 0)) {
andresag 6:321047f0190a 106 return;
andresag 6:321047f0190a 107 }
andresag 6:321047f0190a 108
andresag 6:321047f0190a 109 /*
andresag 6:321047f0190a 110 * handle prefix
andresag 6:321047f0190a 111 */
andresag 6:321047f0190a 112 for (size_t i = 0; i < NUM_PREFIXES; i++) {
andresag 6:321047f0190a 113 size_t prefixLen = strlen(prefixes[i]);
andresag 6:321047f0190a 114 if (strncmp(urlDataIn, prefixes[i], prefixLen) == 0) {
andresag 6:321047f0190a 115 urlData[urlDataLength++] = i;
andresag 6:321047f0190a 116 urlDataIn += prefixLen;
andresag 6:321047f0190a 117 break;
andresag 6:321047f0190a 118 }
andresag 6:321047f0190a 119 }
andresag 6:321047f0190a 120
andresag 6:321047f0190a 121 /*
andresag 6:321047f0190a 122 * handle suffixes
andresag 6:321047f0190a 123 */
andresag 6:321047f0190a 124 while (*urlDataIn && (urlDataLength < URL_DATA_MAX)) {
andresag 6:321047f0190a 125 /* check for suffix match */
andresag 6:321047f0190a 126 size_t i;
andresag 6:321047f0190a 127 for (i = 0; i < NUM_SUFFIXES; i++) {
andresag 6:321047f0190a 128 size_t suffixLen = strlen(suffixes[i]);
andresag 6:321047f0190a 129 if (strncmp(urlDataIn, suffixes[i], suffixLen) == 0) {
andresag 6:321047f0190a 130 urlData[urlDataLength++] = i;
andresag 6:321047f0190a 131 urlDataIn += suffixLen;
andresag 6:321047f0190a 132 break; /* from the for loop for checking against suffixes */
andresag 6:321047f0190a 133 }
andresag 6:321047f0190a 134 }
andresag 6:321047f0190a 135 /* This is the default case where we've got an ordinary character which doesn't match a suffix. */
andresag 6:321047f0190a 136 if (i == NUM_SUFFIXES) {
andresag 6:321047f0190a 137 urlData[urlDataLength++] = *urlDataIn;
andresag 6:321047f0190a 138 ++urlDataIn;
andresag 6:321047f0190a 139 }
andresag 6:321047f0190a 140 }
andresag 6:321047f0190a 141 }