@@ -76,33 +76,14 @@ std::string BLEEddystoneURL::getData() {
76
76
77
77
String BLEEddystoneURL::getFrame () {
78
78
BLEHeadder[7 ] = lengthURL + 5 ; // Fill in real: Type + 2B UUID + Frame Type + Tx power + URL (note: the Byte holding the length does not count itself)
79
- // Serial.printf("BLEHeadder[7](%d) = sizeof(BLEHeadder)(%d) + lengthURL(%d)\n", BLEHeadder[7], sizeof(BLEHeadder), lengthURL);
80
-
81
79
String frame (BLEHeadder, sizeof (BLEHeadder));
82
- /*
83
- Serial.printf("BLEHeadder:\n");
84
- for(int i = 0; i < frame.length(); ++i){
85
- Serial.printf("[%d] 0x%02X=%d='%c'\n",i , frame.c_str()[i],frame.c_str()[i],frame.c_str()[i]);
86
- }
87
- Serial.printf("m_eddystoneData.advertisedTxPower = 0x%02X=%d:\nm_eddystoneData.url:\n", m_eddystoneData.advertisedTxPower, m_eddystoneData.advertisedTxPower);
88
- for(int i = 0; i < lengthURL; ++i){
89
- Serial.printf("[%d] 0x%02X=%d='%c'\n",i , m_eddystoneData.url[i],m_eddystoneData.url[i],m_eddystoneData.url[i]);
90
- }
91
- */
92
-
93
80
frame += String ((char *) &m_eddystoneData, lengthURL+1 ); // + 1 for TX power
94
- /*
95
- Serial.println("Returning frame:");
96
- for(int i = 0; i < frame.length(); ++i){
97
- Serial.printf("[%d] 0x%02X=%d='%c'\n",i , frame.c_str()[i],frame.c_str()[i],frame.c_str()[i]);
98
- }
99
- */
81
+
100
82
return frame;
101
83
} // getFrame
102
84
103
- // TODO test his change !!!
104
85
BLEUUID BLEEddystoneURL::getUUID () {
105
- uint16_t uuid = (((uint16_t )BLEHeadder[10 ]) << 8 ) & BLEHeadder[9 ];
86
+ uint16_t uuid = (((uint16_t )BLEHeadder[10 ]) << 8 ) | BLEHeadder[9 ];
106
87
return BLEUUID (uuid);
107
88
} // getUUID
108
89
@@ -123,7 +104,6 @@ String BLEEddystoneURL::getPrefix(){
123
104
}
124
105
125
106
String BLEEddystoneURL::getSuffix (){
126
- log_d (" suffix = m_eddystoneData.url[%d] 0x%02X" , lengthURL-1 , m_eddystoneData.url [lengthURL-1 ]);
127
107
if (m_eddystoneData.url [lengthURL-1 ] <= 0x0D ){
128
108
return EDDYSTONE_URL_SUFFIX[m_eddystoneData.url [lengthURL-1 ]];
129
109
}else {
@@ -133,9 +113,6 @@ String BLEEddystoneURL::getSuffix(){
133
113
134
114
std::string BLEEddystoneURL::getDecodedURL () {
135
115
std::string decodedURL = " " ;
136
- log_d (" prefix = m_eddystoneData.url[0] 0x%02X" ,m_eddystoneData.url [0 ]);
137
- log_e (" prefix type m_eddystoneData.url[0]=%d" , m_eddystoneData.url [0 ]); // this is actually debug
138
-
139
116
decodedURL += std::string (getPrefix ().c_str ());
140
117
if (decodedURL.length () == 0 ){ // No prefix extracted - interpret byte [0] as character
141
118
decodedURL += m_eddystoneData.url [0 ];
@@ -165,7 +142,6 @@ void BLEEddystoneURL::setData(std::string data) {
165
142
lengthURL = data.length () - (sizeof (m_eddystoneData) - sizeof (m_eddystoneData.url ));
166
143
} // setData
167
144
168
- // TODO test his change !!!
169
145
void BLEEddystoneURL::setUUID (BLEUUID l_uuid) {
170
146
uint16_t beaconUUID = l_uuid.getNative ()->uuid .uuid16 ;
171
147
BLEHeadder[10 ] = beaconUUID >> 8 ;
@@ -221,11 +197,21 @@ void BLEEddystoneURL::setURL(std::string url) {
221
197
} // setURL
222
198
223
199
int BLEEddystoneURL::setSmartURL (String url) {
200
+ if (url.length () == 0 ){
201
+ log_e (" URL String has 0 length" );
202
+ return 0 ; // ERROR
203
+ }
204
+ for (auto character : url){
205
+ if (!isPrintable (character)){
206
+ log_e (" URL contains unprintable character(s)" );
207
+ return 0 ; // ERROR
208
+ }
209
+ }
224
210
bool hasPrefix = false ;
225
211
bool hasSuffix = false ;
226
212
m_eddystoneData.url [0 ] = 0x00 ; // Init with default prefix "http://www."
227
213
uint8_t suffix = 0x0E ; // Init with empty string
228
- log_d (" encode url \" %s\" with length %d" , url.c_str (), url.length ());
214
+ log_d (" Encode url \" %s\" with length %d" , url.c_str (), url.length ());
229
215
for (uint8_t i = 0 ; i < 4 ; ++i){
230
216
// log_d("check if substr \"%s\" == prefix \"%s\" ", url.substring(0, EDDYSTONE_URL_PREFIX[i].length()), EDDYSTONE_URL_PREFIX[i]);
231
217
if (url.substring (0 , EDDYSTONE_URL_PREFIX[i].length ()) == EDDYSTONE_URL_PREFIX[i]){
@@ -246,7 +232,6 @@ int BLEEddystoneURL::setSmartURL(String url) {
246
232
size_t found_pos = std_url.find (std_suffix);
247
233
// log_d("check if in url \"%s\" can find suffix \"%s\": found_pos = %d", std_url.c_str(), std_suffix.c_str(), found_pos);
248
234
if (found_pos != std::string::npos){
249
- log_d (" Found suffix 0x%02X = \" %s\" at position %d" , i, EDDYSTONE_URL_SUFFIX[i], found_pos);
250
235
hasSuffix = true ;
251
236
suffix = i;
252
237
break ;
@@ -255,30 +240,17 @@ int BLEEddystoneURL::setSmartURL(String url) {
255
240
256
241
size_t baseUrlLen = url.length () - (hasPrefix ? EDDYSTONE_URL_PREFIX[m_eddystoneData.url [0 ]].length () : 0 ) - EDDYSTONE_URL_SUFFIX[suffix].length ();
257
242
lengthURL = baseUrlLen + 1 + (hasSuffix ? 1 : 0 );
258
- Serial.printf (" Original URL has length %dB - prefix 1 Byte - suffix len (%d)B = base url len %dB\n => complete url len with prefix and suffix =%d\n " , url.length (), EDDYSTONE_URL_SUFFIX[suffix].length (), baseUrlLen, lengthURL); // debug
259
243
if (lengthURL > 18 ){
260
244
log_e (" Encoded URL is too long %d B - max 18 B" , lengthURL);
261
245
return 0 ; // ERROR
262
246
}
263
247
String baseUrl = url.substring ((hasPrefix ? EDDYSTONE_URL_PREFIX[m_eddystoneData.url [0 ]].length () : 0 ), baseUrlLen+(hasPrefix ? EDDYSTONE_URL_PREFIX[m_eddystoneData.url [0 ]].length () : 0 ));
264
- Serial.printf (" Prefix #%02X = \" %s\" , length =%d\n " , m_eddystoneData.url [0 ], EDDYSTONE_URL_PREFIX[m_eddystoneData.url [0 ]].c_str (), EDDYSTONE_URL_PREFIX[m_eddystoneData.url [0 ]].length ()); // debug
265
- Serial.printf (" Base URL and length %d = : \" %s\"\n " , baseUrlLen, baseUrl.c_str ()); // debug
266
248
memcpy ((void *)(m_eddystoneData.url +1 ), (void *)baseUrl.c_str (), baseUrl.length ()); // substr for Arduino String
267
249
268
250
if (hasSuffix){
269
- Serial.printf (" Put suffix on position m_eddystoneData.url[%d] value %d = : \" %s\"\n " , 1 +baseUrlLen, suffix, EDDYSTONE_URL_SUFFIX[suffix].c_str ()); // debug
270
251
m_eddystoneData.url [1 +baseUrlLen] = suffix;
271
252
}
272
253
273
- Serial.printf (" [0] 0x%02X = \" %s\" prefix\n " , m_eddystoneData.url [0 ], EDDYSTONE_URL_PREFIX[m_eddystoneData.url [0 ]].c_str ());
274
- for (int i = 1 ; i < baseUrlLen+1 ; ++i){
275
- Serial.printf (" [%d] 0x%02X = \' %c\'\n " ,i , m_eddystoneData.url [i], m_eddystoneData.url [i]);
276
- }
277
- if (hasSuffix){
278
- Serial.printf (" [%d] 0x%02X = \" %s\" suffix\n " , lengthURL-1 , m_eddystoneData.url [lengthURL-1 ], EDDYSTONE_URL_SUFFIX[m_eddystoneData.url [lengthURL-1 ]].c_str ());
279
- }
280
-
281
-
282
254
return 1 ; // OK
283
255
} // setSmartURL
284
256
0 commit comments