Преобразование строки в IP-адрес

Как преобразовать строку в IP-адрес на ардуино / esp ?

например, "192.168.1.2" -> IP-адрес(192, 168, 1, 2)

Попробовал это

void setup() {

  Serial.begin(115200);

  IPAddress apip;

  const char *apipch;
  apipch = "192.168.4.1";

Serial.println(apip.fromString(apipch));

}

void loop() {

}

Но я просто получаю вывод "1".

, 👍5

Обсуждение

В ссылке есть две возможности, какую из них вы использовали? Если это не сработало, значит, вы сделали что-то не так, но я не могу догадаться, что вы сделали. Опубликуйте свой код, желательно самый короткий возможный бит - он не должен быть функциональным, только тот бит, где вы получаете свою строку (это строка или char []?), Как вы реализуете код преобразования и где вы вызываете функцию ip ()., @Msquare

пожалуйста, не говорите не сработало ... вместо этого скажите: "вот что случилось ....` .... "не сработало" - это почти подло, @jsotola

ip.fromString(s. c_str());, @Juraj

@Msquare добавил пример, попробовал оба кода, но они дали мне результат 1, @strange_esp

@jsotola ваше право извините, я добавил код и мой результат, @strange_esp

@Juraj это просто дало мне результат 1, @strange_esp

потому что вы печатаете возвращаемое значение fromString, а не IP - адрес. `Serial.println(apip);', @Juraj


4 ответа


6

Класс IPAddress имеет функцию-член bool fromString(const char *address).

const char *apipch = "192.168.4.1"
IPAddress apip;

if (apip.fromString(apipch)) { // попробуйте разобрать IP-адрес
  Serial.println(apip); // вывести проанализированный IP-адрес 
} else {
  Serial.println("unparsable IP");
}
,

Это просто дает мне результат 1 к сожалению, @strange_esp

это происходит потому, что вы не используете его, например, не ожидаете, что возвращаемое значение будет содержать нужный ip-адрес, метод работает с ранее определенным объектом IPAddress., @Sim Son


-1

Пожалуйста, проверьте функцию в IPAddress.cpp файл строки 70 :

bool IPAddress::fromString(const char *address) { 
// TODO: (IPv4) добавить поддержку форматов "a", "a.b", "a.b.c"
.... 
}

Я думаю, что вам нужно отбросить скобки из IPAdress ip() в вашем коде, код должен быть следующим :

Void yourMethod (const char *addr, String ipStr){

IPAdreess ip;
bool i;

i = ip.fromString(ipStr);
    if (i) {
        for (int a = 0; a < 4; a++) {
            addr[a] = ip[a];
          ....
        }
    }
}

Надеюсь, это поможет.

,

1

Вы могли бы сделать это:

String myip="192.168.1.2"
IPAddress local_IP;
bool x= local_IP.fromString(myip);
,

Это не добавляет ничего нового к уже приведенным ответам и комментариям., @the busybee

парень выше показал функцию, но не то, как ее использовать :), @TuLiO

Если вы имеете в виду ответ абу-амеда аль-катири, то нет. Этот ответ даже показывает больше контекста, чем ваш., @the busybee


0
IPAddress str2IP(String str) {

    IPAddress ret( getIpBlock(0,str),getIpBlock(1,str),getIpBlock(2,str),getIpBlock(3,str) );
    return ret;

}

int getIpBlock(int index, String str) {
    char separator = '.';
    int found = 0;
    int strIndex[] = {0, -1};
    int maxIndex = str.length()-1;
  
    for(int i=0; i<=maxIndex && found<=index; i++){
      if(str.charAt(i)==separator || i==maxIndex){
          found++;
          strIndex[0] = strIndex[1]+1;
          strIndex[1] = (i == maxIndex) ? i+1 : i;
      }
    }
    
    return found>index ? str.substring(strIndex[0], strIndex[1]).toInt() : 0;
}
,