Udp remoteip arduino

Udp remoteip arduino

Copy raw contents

Copy raw contents

The purpose of example application below is to demonstrate UDP communication between ESP8266 and an external client. The application (performing the role of a server) is checking inside the loop() for an UDP packet to arrive. When a valid packet is received, an acknowledge packet is sent back to the client to the same port it has been sent out.

Table of Contents

At the beginning of sketch we need to include two libraries:

The first library ESP8266WiFi.h is required by default if we are using ESP8266’s Wi-Fi. The second one WiFiUdp.h is needed specifically for programming of UDP routines.

Once we have libraries in place we need to create a WiFiUDP object. Then we should specify a port to listen to incoming packets. There are conventions on usage of port numbers, for information please refer to the List of TCP and UDP port numbers. Finally we need to set up a buffer for incoming packets and define a reply message.

At the beginning of setup() let’s implement typical code to connect to an access point. This has been discussed in Quick Start. Please refer to it if required.

Once connection is established, you can start listening to incoming packets.

That is all required preparation. We can move to the loop() that will be handling actual UDP communication.

An UDP Packet Arrived!

Waiting for incoming UDP packed is done by the following code:

Once a packet is received, the code will printing out the IP address and port of the sender as well as the length of received packet. If the packet is not empty, its contents will be printed out as well.

An Acknowledge Send Out

For each received packet we are sending back an acknowledge packet:

Please note we are sending reply to the IP and port of the sender by using Udp.remoteIP() and Udp.remotePort() .

The sketch performing all described functionality is presented below:

How to Check It?

Upload sketch to module and open serial monitor. You should see confirmation that ESP has connected to Wi-Fi and started listening to UDP packets:

Now we need another application to send some packets to IP and port shown by ESP above.

Instead of programming another ESP, let’s make it easier and use a purpose build application. I have selected the Packet Sender. It is available for popular operating systems. Download, install and execute it.

Once Packet Sender’s window show up enter the following information: * Name of the packet * ASCII text of the message to be send inside the packet * IP Address shown by our ESP * Port shown by the ESP * Select UDP

What I have entered is shown below:

Immediately after that you should see the following on ESP’s serial monitor:

The text 192.168.1.106, port 55056 identifies a PC where the packet is send from. You will likely see different values.

As ESP sends an acknowledge packet back, you should see it in the log in the bottom part of the Packet Sender’s window.

This simple example shows how to send and receive UDP packets between ESP and an external application. Once tested in this minimal set up, you should be able to program ESP to talk to any other UDP device. In case of issues to establish communication with a new device, use the Packet Sender or other similar program for troubleshooting

For review of functions provided to send and receive UDP packets, please refer to the UDP Class documentation.

Источник

Send and Receive UDP String

This sketch waits for a UDP packet on a local port. When a valid packet is received, an acknowledge packet is sent back to the client on a specified outgoing port.

Hardware Required

Arduino WiFi Shield

Shield-compatible Arduino board

Circuit

The WiFi shield uses pins 10, 11, 12, and 13 for the SPI connection to the HDG104 module. Digital pin 4 is used to control the slave select pin on the SD card.

You should have access to a 802.11b/g wireless network that connects to the internet for this example. You will need to change the network settings in the sketch to correspond to your particular networks SSID.

image developed using Fritzing. For more circuit examples, see the Fritzing project page

In the above image, the Arduino board would be stacked below the WiFi shield.

See Also:

WiFi library — Your reference for the WiFi Library.

WiFi Shield — Product details for the retired WiFi Shield.

Getting started — Getting started with the retired WiFi Shield.

Connect No Encryption — Demonstrates how to connect to an open network.

Connect With WEP — Demonstrates how to connect to a network that is encrypted with WEP.

Connect With WPA — Demonstrates how to connect to a network that is encrypted with WPA2 Personal.

Scan Networks — Displays all WiFi networks in range.

Simple Web Server WiFi — Turn on and off an LED accessing this simple Web Server.

UDP NTP Client — Query a Network Time Protocol (NTP) server using UDP.

WiFi Chat Server — Set up a simple chat server.

WiFi Web Client — Connect to a remote webserver.

WiFi Web Client Repeating — Repeatedly make HTTP calls to a server.

WiFi Web Server — Serve a webpage from the WiFi shield with Analog Input values.

Источник

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Ардуино-библиотека UIPEthernet.h (Ethernet.h).

Справочный материал к уроку 64.

Класс Ethernet инициализирует библиотеку и настройки для работы с сетью Ethernet.
begin() subnetMask() dnsServerIP()
localIP() gatewayIP() maintain()
Класс Ethernet инициализирует библиотеку и настройки для работы с сетью Ethernet.
IPAddress()
Класс Server – применяется для создания и работы с серверами.
Server available() print()
EthernetServer() write() println()
begin()
Класс Client – используется для создания и работы с клиентами.
Client write() read()
EthernetClient() print() peek()
if (EthernetClient) println() flush()
connected() available() stop()
connect()
Класс EthernetUDP – поддерживает UDP протокол.
begin() beginPacket() stop()
read() endPacket() remoteIP()
peek() parsePacket() remotePort()
write() vailable() flush()

Класс Ethernet инициализирует библиотеку и настройки для работы с сетью Ethernet.

begin()

int begin(const uint8_t* mac);
void begin(const uint8_t* mac, IPAddress ip);
void begin(const uint8_t* mac, IPAddress ip, IPAddress dns);
void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway);
void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet);

Инициализирует библиотеку UIPEthernet, задает основные настройки. Имеет форматы:

Ethernet.begin(mac);
Ethernet.begin(mac, ip);
Ethernet.begin(mac, ip, dns);
Ethernet.begin(mac, ip, dns, gateway);
Ethernet.begin(mac, ip, dns, gateway, subnet);

  • mac: MAC-адрес модуля (массив из 6 байт). Может быть указан на наклейке модуля или задан программно.
  • ip: IP-адрес сетевого устройства (массив из 4 байт).
  • dns: IP-адрес DNS-сервера (массив из 4 байт). Параметр необязательный. При отсутствии аргумента, в качестве адреса DNS-сервера будет установлен IP-адрес модуля, в котором последний октет равен 1.
  • gateway: IP-адрес сетевого шлюза (массив из 4 байт). Параметр необязательный. При отсутствии аргумента, в качестве адреса шлюза будет установлен IP-адрес модуля, в котором последний октет равен 1.
  • subnet: маска подсети (массив из 4 байт). Параметр необязательный. По умолчанию задается 255.255.255.0.

Подробная информация обо всех этих параметрах есть в уроке 62.

Если функция используется в формате с единственным аргументом Ethernet.begin(mac), назначение IP-адреса модуля происходит автоматически, по протоколу DHCP. В этом случае, при неудачном DHCP-соединении функция возвращает 0, при успешном – 1. Остальные форматы функции begin() не возвращают никаких значений.

if (Ethernet.begin(mac) == 0) <
// ошибка получения IP-адреса
>

Типичное использование функции выглядит так:

void setup() <
Ethernet.begin(mac, ip, myDns, gateway, subnet); // инициализация контроллера
server.begin(); // включаем ожидание входящих соединений
>

localIP()

Функция возвращает IP-адрес Ethernet-модуля. Используется для того, чтобы узнать IP-адрес модуля, назначенный автоматически по DHCP-протоколу.

IPAddress ip = Ethernet.localIP(); // чтение IP-адреса

subnetMask()

Функция возвращает маску подсети.

gatewayIP()

Функция возвращает IP-адрес шлюза.

dnsServerIP()

Функция возвращает IP-адрес DNS-сервера.

maintain()

Инициирует обновление IP-адреса по протоколу DHCP. В результате может быть получен, как новый, так и прежний адрес. Как решит DHCP-сервер.

Возвращает значение типа byte:

  • 0 – ничего не произошло;
  • 1 – обновить аренду адреса не удалось;
  • 2 – обновление аренды адреса прошло успешно;
  • 3 – IP-адрес обновить не удалось;
  • 4 – обновление IP-адреса прошло успешно.

Класс IPAddress – используется для работы с IP адресами.

IPAddress()

IPAddress();
IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
IPAddress(uint32_t address);
IPAddress(const uint8_t *address);

Функция задает IP-адрес.

  • address – IP-адрес (массив 4 байта).

IPAddress ip(192,168,1,15); // устанавливаем IP-адрес

Действие функции равнозначно:

Класс Server – применяется для создания серверов и работы с ними.

Server

Базовый класс, непосредственно не вызывается. Используется при вызове его функций.

EthernetServer()

void EthernetServer (uint16_t);

Создает сервер, ожидающий соединения через заданный порт.

EthernetServer server(1000); // создаем сервер, порт 1000

begin()

Инициирует сервер начать ожидание входящих соединений.

Аргументов и возвращаемых значений нет.

EthernetServer server(1000); // создаем сервер, порт 1000

void setup() <
Ethernet.begin(mac, ip); // инициализация контроллера
server.begin(); // включаем ожидание входящих соединений
>

available()

При наличии клиента, подключенного к серверу и имеющего непрочитанные данные, возвращает описывающий клиента объект Client.

Если отсутствуют клиенты с непрочитанными данными, то функция возвращает false.

client = server.available(); // ожидаем объект клиент
if (client) <
// есть данные от клиента
>

write()

size_t write(uint8_t);
size_t write(const uint8_t *buf, size_t size);

Отправляет данные всем клиентам, подключенным к серверу. Можно отправить один байт или последовательность байтов.

server.write(val);
server.write(buf, len);

  • val — байт, который необходимо передать;
  • buf — массив данных, который необходимо отправить;
  • len — длина массива.

Возвращает количество отправленных байтов.

server.write(0x23); // отправляем байт

print()

size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t print(const Printable&);

Отправляет данные всем клиентам, подключенным к серверу. Данные передаются в текстовом виде (ASCII символы). Формат функции аналогичен одноименной функции класса Serial.

server.print(data);
server.print(data, BASE);

  • data — данные, которые необходимо передать (char, byte, int, long или string);
  • BASE — система счисления, в которой необходимо выводить числа. Параметр не обязательный.
    • BIN – двоичная система исчисление;
    • DEC – десятичная:
    • OCT – восьмеричная;
    • HEX – шестнадцатеричная.

Функция возвращает количество отправленных байтов.

println()

size_t println(const __FlashStringHelper *);
size_t println(const String &s);
size_t println(const char[]);
size_t println(char);
size_t println(unsigned char, int = DEC);
size_t println(int, int = DEC);
size_t println(unsigned int, int = DEC);
size_t println(long, int = DEC);
size_t println(unsigned long, int = DEC);
size_t println(double, int = 2);
size_t println(const Printable&);
size_t println(void);

Аналогично функции print() отправляет данные всем подключенным клиентам в текстовом виде. В отличие от print() добавляет символы переноса строки (\r, код 13) и (\n, код 10).

server.println();
server.println(data);
server.print(data, BASE)

  • data — данные, которые необходимо передать (char, byte, int, long или string);
  • BASE — система счисления, в которой необходимо выводить числа. Параметр не обязательный.
    • BIN – двоичная система исчисление;
    • DEC – десятичная:
    • OCT – восьмеричная;
    • HEX – шестнадцатеричная.

Функция возвращает количество отправленных байтов.

Класс Client – используется для создания клиентов и работы с ними.

Client

Базовый класс, непосредственно не вызывается. Используется при вызове его функций.

EthernetClient()

Функция создает клиента. Параметров и возвращаемых значений нет.

EthernetClient client; // создаем клиента

if (EthernetClient)

bool operator==(const EthernetClient&);

Показывает готов ли указанный клиент к работе.

Если указанный клиент готов, возвращает true.

connected()

Функция показывает, подключен ли клиент к серверу. При наличии непрочитанных данных клиент считается подключенным к серверу, даже если соединение уже закрыто.

Если клиент подключен, функция возвращает true.

connect()

int connect(IPAddress ip, uint16_t port);
int connect(const char *host, uint16_t port);

Функция устанавливает соединение с сервером через заданный порт. В качестве аргумента может использоваться как IP-адрес, так и доменное имя.

client.connect(ip, port);
client.connect(URL, port);

  • ip — IP-адрес сервера, с которым необходимо установить соединение (массив из 4 байт);
  • URL — доменное имя сервера, с которым необходимо установить соединение (строка, например «google.com»);
  • port — порт, через который необходимо установить соединение.

При успешном подключении функция возвращает true.

write()

size_t write(uint8_t);
size_t write(const uint8_t *buf, size_t size);

Отправляет данные серверу, с которым было установлено соединение. Можно отправлять один байт или последовательность байтов.

  • val — байт, который необходимо отправить;
  • buf — массив данных, который необходимо отправить в виде последовательности байт;
  • len — длина буфера (массива).

Функция возвращает количество отправленных байтов.

print()

size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t print(const Printable&);

Отправляет данные от клиента серверу. Данные передаются в текстовом виде (ASCII символы). Формат функции аналогичен одноименной функции класса Serial.

client.print(data);
client.print(data, BASE);

  • data — данные, которые необходимо передать (char, byte, int, long или string);
  • BASE — система счисления, в которой необходимо выводить числа. Параметр не обязательный.
    • BIN – двоичная система исчисление;
    • DEC – десятичная:
    • OCT – восьмеричная;
    • HEX – шестнадцатеричная.

Функция возвращает количество отправленных байтов.

println()

size_t println(const __FlashStringHelper *);
size_t println(const String &s);
size_t println(const char[]);
size_t println(char);
size_t println(unsigned char, int = DEC);
size_t println(int, int = DEC);
size_t println(unsigned int, int = DEC);
size_t println(long, int = DEC);
size_t println(unsigned long, int = DEC);
size_t println(double, int = 2);
size_t println(const Printable&);
size_t println(void);

Аналогично функции print() отправляет данные серверу в текстовом виде. В отличии от print() добавляет символы переноса строки (\r, код 13) и (\n, код 10).

client.println();
client.println(data);
client.print(data, BASE);

  • data — данные, которые необходимо передать (char, byte, int, long или string);
  • BASE — система счисления, в которой необходимо выводить числа. Параметр не обязательный.
    • BIN – двоичная система исчисление;
    • DEC – десятичная:
    • OCT – восьмеричная;
    • HEX – шестнадцатеричная.

Функция возвращает количество отправленных байтов.

available()

Возвращает количество непрочитанных байтов, принятых клиентом от сервера.

Возвращает количество непрочитанных байтов.

// все, что приходит с сервера, печатаем в UART
if (client.available()) <
char chr = client.read();
Serial.print(chr);
>

read()

int read();
int read(uint8_t *buf, size_t size);

Считывает очередной байт из потока данных, принятых клиентом от сервера.

  • buf — массив данных, в который необходимо считать данные;
  • len — длина массива.

Возвращает значение очередного байта, либо -1, если буфер пуст.

char chr = client.read();

peek()

Возвращает очередной принятый от сервера байт, не удаляя его из буфера.

flush()

Удаляет из буфера все непрочитанные данные, полученные от сервера.

Параметров и возвращаемого значения нет.

stop()

Разрывает соединение с сервером.

Параметров и возвращаемого значения нет.

Класс EthernetUDP – поддерживает UDP протокол.

begin()

Инициализирует UDP библиотеку, запускает прослушивание на указанном порту.

  • port – номер порта для прослушивания.

Возвращает 1 при успешной операции.

read()

int read(void);
int read(unsigned char* buffer, size_t len);
int read(char* buffer, size_t len);

Считывает данные в заданный буфер. Если аргументы функции не заданы, то возвращает очередной принятый символ.

Функцию можно использовать только после вызова parsePacket().

UDP.read();
UDP.read(buf, size);

  • buf — массив для чтения;
  • size — длина данных.

Возвращает значение очередного байта, либо -1, если буфер пуст. В случае приема пакета, возвращает количество байтов, записанных в массив.

peek()

Возвращает очередной принятый от сервера байт, не удаляя его из буфера.

write()

size_t write(uint8_t);
size_t write(const uint8_t *buffer, size_t size);

Посылает данные по протоколу UDP. Метод должен вызываться между вызовами функций beginPacket() и endPacket().beginPacket() инициализирует пакет данных, но не отправляет его до вызова endPacket().

  • val — байт, который необходимо отправить;
  • buf — массив данных, который необходимо отправить в виде последовательности байтов;
  • len — длина буфера (массива).

Функция возвращает количество отправленных байтов.

beginPacket()

int beginPacket(IPAddress ip, uint16_t port);
int beginPacket(const char *host, uint16_t port);

Устанавливает соединение с устройством для отправки данных по протоколу UDP.

  • remoteIP — IP-адрес удаленного устройства (4 байта);
  • remotePort — номер порта на удаленном устройстве.

Возвращает 1, если операция прошла успешно, 0 — если возникли неразрешимые проблемы с адресом или портом.

endPacket()

Данный метод вызывается после подготовки UDP-данных для отправки.

Возвращает 1, если пакет был послан успешно, 0 — если произошла ошибка.

parsePacket()

Функция проверяет наличие принятого UDP-пакета и возвращает его размер. Должна вызываться перед считыванием буфера методом UDP.read().

Функция возвращает размер принятого UDP-пакета.

available()

Функция возвращает количество принятых байтов, доступных для считывания из буфера. Ее можно вызывать только после вызова UDP.parsePacket().

Возвращает количество байтов, доступных для считывания.

stop()

Разрывает соединение с сервером.

Параметров не имеет, значение не возвращает.

remoteIP()

Функция возвращает IP-адрес удаленного устройства. Можно вызывать только после вызова UDP.parsePacket().

Возвращает IP-адрес удаленного устройства (4 байта).

remotePort()

Функция возвращает номер порта удаленного устройства. Можно вызывать только после вызова UDP.parsePacket().

Функция возвращает номер порта UDP-соединения на удаленном устройстве

flush()

Удаляет из буфера все непрочитанные данные.

Источник

Adblock
detector