I need to store an ipaddress in the eeprom. how can i save the ip address as char array or similar. i want to get the ipaddress from udp.remoteipaddres() then save it in the eeprom
Here's a function to do it:
// convert IPAddress to char array and put it in the passed buffer
void IPtoa(const IPAddress & IP, char IPcharBuffer[]) {
#if defined(__ARDUINO_X86__)
sprintf (IPcharBuffer, "%u", IP[0]);
#else //defined(__ARDUINO_X86__)
utoa(IP[0], IPcharBuffer, 10); //convert the first octet
#endif //defined(__ARDUINO_X86__)
for (byte octetCount = 1; octetCount < 4; octetCount++) { //convert the other 3 octets
strcat(IPcharBuffer, ".");
char octetChar[3 + 1]; //3 digit byte + null terminator
#if defined(__ARDUINO_X86__)
sprintf (octetChar, "%u", IP[octetCount]);
#else //defined(__ARDUINO_X86__)
utoa(IP[octetCount], octetChar, 10); //convert the octet
#endif //defined(__ARDUINO_X86__)
strcat(IPcharBuffer, octetChar);
}
}
pert:
Here's a function to do it:// convert IPAddress to char array and put it in the passed buffer
void IPtoa(const IPAddress & IP, char IPcharBuffer[]) {
#if defined(ARDUINO_X86)
sprintf (IPcharBuffer, "%u", IP[0]);
#else //defined(ARDUINO_X86)
utoa(IP[0], IPcharBuffer, 10); //convert the first octet
#endif //defined(ARDUINO_X86)
for (byte octetCount = 1; octetCount < 4; octetCount++) { //convert the other 3 octets
strcat(IPcharBuffer, ".");
char octetChar[3 + 1]; //3 digit byte + null terminator
#if defined(ARDUINO_X86)
sprintf (octetChar, "%u", IP[octetCount]);
#else //defined(ARDUINO_X86)
utoa(IP[octetCount], octetChar, 10); //convert the octet
#endif //defined(ARDUINO_X86)
strcat(IPcharBuffer, octetChar);
}
}
i dont even know how to begin to comprehend that. i see sprintf writing into ipcahrbuffer. but how do i use this function
You need to create a buffer of the appropriate size, then pass the IPAddress and the buffer to the function:
byte IPAddressLengthMax = 3 + 1 + 3 + 1 + 3 + 1 + 3; //4 x octet + 3 x dot
char IPstringBuffer[IPAddressLengthMax + 1]; // Make sure to leave room in the buffer for the terminator
...
IPtoa(someIPAddress, IPstringBuffer);
After the IPtoa() function returns, IPstringBuffer will contain the string representation of someIPAddress.
pert:
You need to create a buffer of the appropriate size, then pass the IPAddress and the buffer to the function:byte IPAddressLengthMax = 3 + 1 + 3 + 1 + 3 + 1 + 3; //4 x octet + 3 x dot
char IPstringBuffer[IPAddressLengthMax + 1]; // Make sure to leave room in the buffer for the terminator
...
IPtoa(someIPAddress, IPstringBuffer);
After the IPtoa() function returns, IPstringBuffer will contain the string representation of someIPAddress.
Hi thanks. im trying to understand this. my compiler complains about declaring void function.
void IPtoa(someIPAddress, IPstringBuffer) {
byte IPAddressLengthMax = 3 + 1 + 3 + 1 + 3 + 1 + 3; //4 x octet + 3 x dot
char IPstringBuffer[IPAddressLengthMax + 1]; // Make sure to leave room in the buffer for the terminator
return
}
my compiler complains about declaring void function
You misunderstand. @pert has shown you how to use the function he provided in his previous reply.
You don't declare a new function, you just call IPtoa() as he has shown.
notsolowki:
Hi thanks. im trying to understand this. my compiler complains about declaring void function.void IPtoa(someIPAddress, IPstringBuffer) {
byte IPAddressLengthMax = 3 + 1 + 3 + 1 + 3 + 1 + 3; //4 x octet + 3 x dot
char IPstringBuffer[IPAddressLengthMax + 1]; // Make sure to leave room in the buffer for the terminator
return
}
return without a semi-colon.
cattledog:
You misunderstand. @pert has shown you how to use the function he provided in his previous reply.You don't declare a new function, you just call IPtoa() as he has shown.
I have missunderstood.
when i try to compile this i get error
array bound is not an integer constant before ']' token
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
void IPtoa(const IPAddress & IP, char IPcharBuffer[]) {
#if defined(__ARDUINO_X86__)
sprintf (IPcharBuffer, "%u", IP[0]);
#else //defined(__ARDUINO_X86__)
utoa(IP[0], IPcharBuffer, 10); //convert the first octet
#endif //defined(__ARDUINO_X86__)
for (byte octetCount = 1; octetCount < 4; octetCount++) { //convert the other 3 octets
strcat(IPcharBuffer, ".");
char octetChar[3 + 1]; //3 digit byte + null terminator
#if defined(__ARDUINO_X86__)
sprintf (octetChar, "%u", IP[octetCount]);
#else //defined(__ARDUINO_X86__)
utoa(IP[octetCount], octetChar, 10); //convert the octet
#endif //defined(__ARDUINO_X86__)
strcat(IPcharBuffer, octetChar);
}
}
byte IPAddressLengthMax = 3 + 1 + 3 + 1 + 3 + 1 + 3; //4 x octet + 3 x dot
char IPstringBuffer[IPAddressLengthMax + 1]; // Make sure to leave room in the buffer for the terminator
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
IPtoa(someIPAddress, IPstringBuffer);
}
Nope im still getting ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ from the serial.println of _EEPROM.UV_IP after IPtoa(WiFi.localIP(), _EEPROM.UV_IP);
will someone explain the behaviour. why when i print _EEPROM.IV_IP after reboot it prints all question marks.
even though its printing all question marks i can still use it as an ipaddress with udp.beginPacket.
wow it was so easy to do,
String str = Udp.remoteIP().toString();
str.toCharArray(_EEPROM.UV_IP, 15);
how come no one said this
Because you don't give people the time to react ![]()
And you can't store Strings in EEPROM. It will store the pointer to the actual data but not the actual data itself. After a reboot of your board, the data where that pointer points to might have been moved (e.g. when you change your sketch) or the data might have been wiped.