Salve ragazzi, un saluto a tutti voi. Scusate la mia lunga assenza, ma fidatevi che l'anno passato è stato molto più del covid per me, ma questa è un'altra storia. Dico solo che non tocco breadboard e codici da quando ho scritto il mio ultimo reply... mi sono arrugginito un po
Veniamo al mio problema...
Ricevo un MAC address in string.
Creo una substring dal mac address ricevuto ottenendo gli ultimi due caratteri
Come tutti sappiamo il mac address è qualcosa della serie AA:BB:CC:DD:EE:FF
A quel FF (che ovviamente è in HEX) devo sottrarre 0x01 e sostituire FF con la differenza di 0xFF-0x01 e salvare tutto il MAC address (il salvataggio al momento non mi preoccupa, sono abituato a risolvere un problema alla volta).
Esempio pratico:
A4:23:B2:C7:11:D4 (formato string)
D4 (lo tiro fuori con substring)
D4 è una stringa e gli devo far capire che invece è 212, farlo diventare 211, ovvero D3 e accodarlo al primo pezzo di MAC.
Solo per completezza, ma è molto importante per la soluzione al mio problema, dopo aver ricostruito il MAC address modificato lo dovrò usare in formato unit8_t...
Quindi non so se conviene trasformare già tutto all'inizio in questo formato di dati.
Grazie in anticipo.. gpb01 solo per il fatto che c'è string di mezzo già so che mi bacchetterai
purtroppo il MAC address viene recuperato da una funzione della libreria in formato string...non è colpa mia
miky_police:
... purtroppo il MAC address viene recuperato da una funzione della libreria in formato string...non è colpa mia
... peccato che, se avessi studiato ... sapersti che OGNI string ha la possibilità di darti se stessa in formato stringa classica del 'C' senza dover fare nulla ... basta scrivere tuaStringa.c_str() ed invece di una String hai una char array. E' nel reference, QUI.
Ah ... il tipo uint8_t è esattamente l'equivalente di un tipo byte che è equivalente ad unsigned char quindi ... uno qualsiasi di questi va bene.
Quindi alla fine della fiera vorresti arrivare con un array di 6 byte, dove i primi 5 sono uguali al mac di partenza mentre l'ultimo lo ricavi sottraendo 1?
Ho capito bene?
Di possibili soluzioni ce ne sono molte, la prima che mi viene in mente è usare sscanf (come ad esempio viene già fatto per recuperare il MAC address nel core Espressif).
Intanto Auguri a tutti, #fratt hai capito alla perfezione. #cotestatnt è proprio un mac di un wroom32 che gira in AP, ma il suo MAC in STA dovrebbe essere allo stesso in AP mode, tranne che per l'ultimo HEX che è uguale a HEX-1
Attenzione, l'estrazione del MAC dell'AP lo sto facendo lato STA. Diversamente lo avrei richiamato con 1 riga di codice...
Provo il prima possibile il tuo suggerimento e vi faccio sapere. #gpb01 ...me lo aspettavo
chi ha altre idee nel frattempo sarebbe bello spulciare i vari metodi... Grazie, vi aggiorno.
Prima che ti banni definitivamente (e non sto scherzando) ... spiegami perché hai DUE account (miky_police e m_police), cosa che è proibita da REGOLAMENTO, punto 16.12 e che, appunto, è causa di BAN definitivo. Grazie.
gpb01:
Prima che ti banni definitivamente (e non sto scherzando) ... spiegami perché hai DUE account (miky_police e m_police), cosa che è proibita da REGOLAMENTO, punto 16.12 e che, appunto, è causa di BAN definitivo. Grazie.
Guglielmo
m_police era il primo account che feci e non lo utilizzai per un po... non riuscii a recuperare la pw e così ne feci uno ex novo... pensavo fosse già cancellato definitivamente.
m_police:
chi ha altre idee nel frattempo sarebbe bello spulciare i vari metodi
Non so se c'è qualcosa di più compatto di uno scanf.
C'è strtol che permette di scegliere la base da cui convertire.
Ma tocca comunque scorrere la stringa convertendo i valori dei gruppi di digit esa, scorrimento che scanf effettua automaticamente leggendo la stringa di formato.
Altrimenti la conversione a manina di ogni singolo digit:
byte fromESA(byte a)
{
a -= '0';
if (a < 10) return a;
return (byte)toupper(a) - 7;
}
Claudio_FF:
C'è strtol che permette di scegliere la base da cui convertire.
Ma tocca comunque scorrere la stringa
Si potrebbe usare in combinazione con il classico strtok() per "tokenizzare" la stringa usando come delimitatore il ":", ma sarebbe comunque più complesso e meno intuitivo (anche se molto probabilmente più efficiente).
cotestatnt:
Di possibili soluzioni ce ne sono molte, la prima che mi viene in mente è usare sscanf (come ad esempio viene già fatto per recuperare il MAC address nel core Espressif).
Buona la prima. Non riuscivo a mostrarlo in seriale, ma poi con printf ho risolto.
uint8_t macA[6];
sscanf(BSSIDstr.c_str(), "%hhX:%hhX:%hhX:%hhX:%hhX:%hhX", &macA[0], &macA[1], &macA[2], &macA[3], &macA[4], &macA[5]);
for (int i = 0; i<=5; i++) {
if (i == 5) {
macA[5]--;
}
Serial.printf("%X", macA[i], 16);
if(i<5) {
Serial.print(":");
}
if (i==5) {
Serial.println();
}
Output della seriale:
A4:E5:7C:C5:FB:29
A4:E5:7C:C5:FB:28
Il primo MAC è il BSSID il secondo è il MAC ricalcolato sottraendo 1. Se notate orrori nel codice sono qui per crocifiggermi Ultima paranoia che mi è salita per la sottrazione: meglio macA[5]-- oppure macA[5]-=0x01 ? So che è perfettamente la stessa cosa, cambia solo la sintassi, ma non il risultato (provati entrambi). Qual'è la sintassi più appropriata (secondo il vostro illustre parere)?
miky_police: Se notate orrori nel codice sono qui per crocifiggermi
Il 16 è inutile nel printf e potevi scrivere tutto in modo molto più compatto.
uint8_t macA[6];
sscanf(BSSIDstr.c_str(), "%hhX:%hhX:%hhX:%hhX:%hhX:%hhX", &macA[0], &macA[1], &macA[2], &macA[3], &macA[4], &macA[5]);
mac[5]--; // Da quel che ne so dovrebbe essere più efficiente questo metodo (a meno di ottimizzazioni del compilatore).
// Stampa del nuovo MAC address
Serial.printf("%hhX:%hhX:%hhX:%hhX:%hhX:%hhX", macA[0], macA[1], macA[2], macA[3], macA[4], macA[5]);
// Oppure metodo alternativo per stampare il MAC
for (uint8_t i=0; i<6; i++) {
Serial.print(macA[i], HEX);
if (i<5) Serial.print(":");
}
Serial.println();