Ethernet Как передать IP через переменную

ratman
Offline
Зарегистрирован: 11.10.2015

IP устройства хранится на SD. Это строка. Чтобы присвоить адрес шидлу, её нужно разделить на четыре октета. То есть толко парсить вручную.

Я правильно понимаю?

ratman
Offline
Зарегистрирован: 11.10.2015

Хотя, с другой стороны всё равно весь конфиг построчно парсить, функцией меньше, функцией больше -- разницы нет.

fogary
Offline
Зарегистрирован: 05.03.2016

Вы управляете шилдом через библиотеку и напрямую? Если через библиотеку. точно нет метода/функции для передачи адреса как строки?

В каком виде Вы сохраняете конфиг на SD, можно посмотреть пример?

На вскидку, можно сохранять каждай октет - как отдельную переменную; либо хранить адрес как массив из четерех байт (char).

ratman
Offline
Зарегистрирован: 11.10.2015

Управление напрямую. И, прошу прощения, там не шилд будет, а модуль. Хотя без разницы.

Да пока ещё ни как не сохраняем. Точнее будет обычный текстовый конфиг, даже с комментариями и примерами. Для простоты, чтобы можно было быстро вручную исправить и перезапустить, а не шить по-новой.

Нужно передать (из конфига) адресные параметры - ип, хост, маска, mac. Ну и кроме них около полутора десятков параметров. SD нужна для хранения логов, по этому решили задействовать и для конфигурации.

Вообще, пока идёт разработка концепции устройства. Не прикидывали ещё даже, во что мы влазим.

fogary
Offline
Зарегистрирован: 05.03.2016

Понятно.
Можно еще посмотреть в строну функции strtok, что бы уж не совсем вручную парсить.

axill
Offline
Зарегистрирован: 05.09.2011
int ip[4];
char str[] = "192.168.1.10";

if(sscanf_P(str, PSTR("%d.%d.%d.%d"), &ip[0], &ip[1], &ip[2], &ip[3]) == 4) {
    // у нас есть адрес
} else {
    // ошибка получения адреса
}

 

ratman
Offline
Зарегистрирован: 11.10.2015

axill пишет:

int ip[4];
char str[] = "192.168.1.10";

if(sscanf_P(str, PSTR("%d.%d.%d.%d"), &ip[0], &ip[1], &ip[2], &ip[3]) == 4) {
    // у нас есть адрес
} else {
    // ошибка получения адреса
}

 

Понял, спасибо.

ratman
Offline
Зарегистрирован: 11.10.2015

Я, собственно, зачем заходил... Спросить, а может у нативной либы Ethernet какие методы есть... Извините...

axill
Offline
Зарегистрирован: 05.09.2011

По мне так ip адрес правильнее получать через dhcp

ratman
Offline
Зарегистрирован: 11.10.2015

axill пишет:

По мне так ip адрес правильнее получать через dhcp

Этого ни кто не отменял.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Нативная либа интерент принимает IP как 4 байтный массив. Так что придется парсить. Вроде ini файлы не сложно парсить - знак равенства отделяет имя переменной от значения. IP тоже не сложно парсить - точки отделяют байты друг от друга. Если поискать на гитхабе - то наверно уже есть что-то готовое.

axill
Offline
Зарегистрирован: 05.09.2011

NeiroN пишет:

Нативная либа интерент принимает IP как 4 байтный массив. Так что придется парсить. Вроде ini файлы не сложно парсить - знак равенства отделяет имя переменной от значения. IP тоже не сложно парсить - точки отделяют байты друг от друга. Если поискать на гитхабе - то наверно уже есть что-то готовое.

попробуйте найти что то более "готовое" чем sscanf ;)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

ratman пишет:

Я, собственно, зачем заходил... Спросить, а может у нативной либы Ethernet какие методы есть... Извините...

а) Кто мешает создать класс наследник нативной библиотеки и добавить там методы, понимающие IP адрес в виде строки?

б) Передовать строкой IP адрес мнее удобно, ибо её там придётся разбирать, проверять. Удобнее это делать в чтении конфига.

г) Вы даташит смотрели на 5110?

ratman
Offline
Зарегистрирован: 11.10.2015

Оказывается, всё придумано до нас, но хорошо забыто. https://github.com/stevemarple/IniFile А стоило только этот же форум с самого начала пролистать.