|
23 | 23 | #include <Arduino_JSON.h>
|
24 | 24 | #include <WiFiNINA.h>
|
25 | 25 |
|
26 |
| -// from section 10.3.3 of the SAMD datasheet |
27 |
| -#define SERIAL_NUMBER_WORD_0 *(volatile uint32_t*)(0x0080A00C) |
28 |
| -#define SERIAL_NUMBER_WORD_1 *(volatile uint32_t*)(0x0080A040) |
29 |
| -#define SERIAL_NUMBER_WORD_2 *(volatile uint32_t*)(0x0080A044) |
30 |
| -#define SERIAL_NUMBER_WORD_3 *(volatile uint32_t*)(0x0080A048) |
31 |
| - |
32 | 26 | const bool DEBUG = true;
|
33 | 27 |
|
34 | 28 | char ssid[] = SECRET_SSID;
|
@@ -116,31 +110,12 @@ void setup() {
|
116 | 110 |
|
117 | 111 | //Random number for device name
|
118 | 112 | board_name += String(secureElement.random(65535));
|
119 |
| - |
120 |
| - uint32_t BoardUniqueID[4]; |
121 |
| - BoardUniqueID[0] = SERIAL_NUMBER_WORD_0; |
122 |
| - BoardUniqueID[1] = SERIAL_NUMBER_WORD_1; |
123 |
| - BoardUniqueID[2] = SERIAL_NUMBER_WORD_2; |
124 |
| - BoardUniqueID[3] = SERIAL_NUMBER_WORD_3; |
125 |
| - uint8_t bid[32]; |
126 |
| - for (int i = 0; i < 4; i++) |
127 |
| - { |
128 |
| - bid[i*4+0] = (uint8_t)(BoardUniqueID[i] >> 24); |
129 |
| - bid[i*4+1] = (uint8_t)(BoardUniqueID[i] >> 16); |
130 |
| - bid[i*4+2] = (uint8_t)(BoardUniqueID[i] >> 8); |
131 |
| - bid[i*4+3] = (uint8_t)(BoardUniqueID[i] >> 0); |
132 |
| - } |
133 |
| - |
134 |
| - for (size_t i = 0; i < 16; i++) { |
135 |
| - if (bid[i] < 16) { |
136 |
| - ArduinoID += String(0, HEX); |
137 |
| - } |
138 |
| - ArduinoID += String(bid[i], HEX); |
139 |
| - } |
140 |
| - ArduinoID.toUpperCase(); |
141 |
| - |
142 | 113 | Serial.print("Device Name: ");
|
143 | 114 | Serial.println(board_name);
|
| 115 | + //Board Serial Number |
| 116 | + ArduinoID = ArduinoSerialNumber(); |
| 117 | + Serial.print("SN: "); |
| 118 | + Serial.println(ArduinoID); |
144 | 119 | // Create Arduino Token
|
145 | 120 | ArduinoToken(client_id, secret_id);
|
146 | 121 | Serial.print("Bearer Token: ");
|
@@ -314,6 +289,44 @@ void hexStringToBytes(String& in, byte out[], int length) {
|
314 | 289 | }
|
315 | 290 | }
|
316 | 291 |
|
| 292 | +#ifdef ARDUINO_ARCH_SAMD |
| 293 | + |
| 294 | +static void utox8(uint32_t val, uint8_t* s) { |
| 295 | + for (int i = 0; i < 16; i=i+2) { |
| 296 | + int d = val & 0XF; |
| 297 | + val = (val >> 4); |
| 298 | + |
| 299 | + s[15 - i -1] = d > 9 ? 'A' + d - 10 : '0' + d; |
| 300 | + s[15 - i] = '\0'; |
| 301 | + } |
| 302 | +} |
| 303 | + |
| 304 | +uint8_t getUniqueSerialNumber(uint8_t* name) { |
| 305 | + utox8(*(volatile uint32_t*)(0x0080A00C), &name[0]); |
| 306 | + utox8(*(volatile uint32_t*)(0x0080A040), &name[16]); |
| 307 | + utox8(*(volatile uint32_t*)(0x0080A044), &name[32]); |
| 308 | + utox8(*(volatile uint32_t*)(0x0080A048), &name[48]); |
| 309 | + return 64; |
| 310 | +} |
| 311 | + |
| 312 | +#endif |
| 313 | + |
| 314 | +String ArduinoSerialNumber() { |
| 315 | + |
| 316 | + uint8_t uniqueSerialNumber[64 + 1] = {0}; |
| 317 | + char BoardUniqueID[32 + 1] = {0}; |
| 318 | + |
| 319 | + int uniqueSerialNumberLength = getUniqueSerialNumber(uniqueSerialNumber); |
| 320 | + for(int i = 0, k = 0; i < uniqueSerialNumberLength; i = i+2, k++) { |
| 321 | + BoardUniqueID[k] = uniqueSerialNumber[i]; |
| 322 | + } |
| 323 | + |
| 324 | + String serialNumber = String(BoardUniqueID); |
| 325 | + serialNumber.toUpperCase(); |
| 326 | + return serialNumber; |
| 327 | + |
| 328 | +} |
| 329 | + |
317 | 330 | void ArduinoToken(String client_id, String client_secret) {
|
318 | 331 | Serial.println("Creating Bearer Token...");
|
319 | 332 | String PostData = "grant_type=client_credentials&client_id=";
|
|
0 commit comments