Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5ый семестр / 1. Производственная практика / стащил с работы / 64 урок - TCP сервер и клиент на Ардуино

.pdf
Скачиваний:
3
Добавлен:
18.07.2023
Размер:
5.39 Mб
Скачать

}

включаем ожидание входящих соединений

// ожидаем объект клиент

клиента

== false) {

подключении

connected");

ready"); // ответ клиенту true;

> 0) {

read(); // чтение символа // передача клиенту

(http://mypractic.ru

}

/goto/ArduinoSys.php)

Проверяем с помощью моей программы.

скетча локальному контроллеру присвоился адрес 192.168.1.6.

(http://mypractic.ru

/goto/fn1.php)

(//freekassa.ru/)

(http://mypractic.ru/wp-content/uploads/2018/03/Lesson_64_15.png)

Запускаем программу TCP_Client_1. Задаем адрес 192.168.1.6. Проверяем.

(http://mypractic.ru

/goto/ArduinoSys.php)

ru/wp-content/uploads/2018/03/Lesson_64_14.png)

(http://mypractic.ru

TCP клиент.

/goto/fn1.php)

 

В предыдущем(//freekassaразделе.ru/) мы управляли сервером на Ардуино с помощью клиента на компьютере. Попробуем противоположный вариант: клиент реализован на Ардуино, сервер

– на компьютере.

Если все получиться, то в будущем сможем разрабатывать системы, в которых и серверы и клиенты выполнены на базе плат Ардуино.

Создадим из платы Ардуино TCP клиента. После соединения с сервером он будет:

передавать на компьютер-сервер все данные, которые мы будем набирать в мониторе последовательного порта;

в окно монитора последовательного порта выводить данные, поступающие с сервера.

Скетч TCP клиента:

Зарегистрируйтесь (http://mypractic.ru/?action-rcl=register) и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!

//TCP клиент, передает данные из UART серверу, от сервера в UART #include <SPI.h>

#include <UIPEthernet.h>

//определяем конфигурацию сети

byte mac[] = {0xAE, 0xB2, 0x26, 0xE4, 0x4A, 0x5C}; // MAC-адрес byte ip[] = {192, 168, 1, 10}; // IP-адрес клиента

byte ipServ[] = {192, 168, 1, 2}; // IP-адрес сервера

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

void setup() {

Ethernet.begin(mac, ip); // инициализация контроллера

Serial.begin(9600);

...");

соединение с сервером

2000)) {

// успешно

failed"); // ошибка

с сервера, печатаем в UART

{

read();

из UART, передаем серверу

> 0) {

.read();

(http://mypractic.ru

if (client.connected()) {

/goto/ArduinoSys.php)

client.print(inChr);

}

отключился, останавливаем клиент

{

.");

останавливается

(http://mypracticУстанавливает.ru соединение с сервером.

/goto/fn1.php)

Все поступающие от сервера данные выводит в UART.

(//freekassa.ru/)

Все данные из UART передает серверу.

Если соединение с сервером разорвано, зависает.

Проверяем с помощью TCP/IP Builder.

Запускаем TCP/IP Builder.

Устанавливаем в строке Local IP порт 2000.

Нажимаем Create Socket.

Затем Connect.

Запускаем программу Ардуино. В случае успешного соединения, на сервере и клиенте должны появиться сообщения connected.

Теперь можем обмениваться данными.

(http://mypractic.ru

/goto/ArduinoSys.php)

ru/wp-content/uploads/2018/03/Lesson_64_10.png)

(http://mypractic.ru

/goto/fn1.php)

(//freekassa.ru/)

(http://mypractic.ru/wp-content/uploads/2018/03/Lesson_64_11.png)

Можно проверить работу с сервером, созданном на моем телефоне.

Запускаем на телефоне Simple TCP Socket Tester.

Выбираем режим сервер.

Устанавливаем порт 2000.

Нажимаем START SERVER.

В программе Ардуино меняем адрес сервера (ipServ[]). Адрес выводится в приложении Simple TCP Socket Tester зеленой строкой. У меня 192.168.1.4.

Загружаем программу в плату Ардуино.

Проверяем соединение и обмен данными.

(http://mypractic.ru

/goto/ArduinoSys.php)

(http://mypractic.ru/wp-content/uploads

_12.png)

вариант программы сервера на компьютере. Загрузить можно по ссылке:

(http://mypractic.ru/?action-rcl=register) и оплатите. Всего 60 руб. в месяц ресурсам сайта!

(http://mypractic.ru

/goto/fn1.php)

(//freekassa.ru/)

(http://mypractic.ru/wp-content/uploads/2018/03/Lesson_64_16.png)

Надеюсь, вы убедились, как просто можно организовать обмен данными в сети Ethernet с помощью стандартной библиотеки.

В следующем уроке будем обмениваться данными, используя протоколы UDP и HTTP.

урок (http://mypractic.ru/urok-63-lokalnaya-set-ethernet-modul-enc28j60-ego- -k-plate-arduino.html) Список уроков (http://mypractic.ru/uroki-

-arduino-navigaciya-po-urokam) Следующий урок (http://mypractic.ru/urok- -cifrovye-preobrazovaniya-arduino-v-fonovom-rezhime-biblioteka-

backgroundadc.html)

.ru/finansovaya-podderzhka-sajta)

проект (http://mypractic.ru/finansovaya-podderzhka-sajta)

0

Эдуард (http://mypractic.ru/account?user=1)

не в сети 1 неделя

Комментарии: 1790

Публикации: 183

Регистрация: 13-12-2015

(http://mypractic.ru

/goto/ArduinoSys.php)

Рубрика: Уроки Ардуино (http://mypractic.ru/category/uroki-programmirovaniya-arduino). Вы можете добавить постоянную ссылку (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-uipethernet.html) в закладки.

HTTP://MYPRACTIC.RU/GLAVA-2-STRUKTURA-SISTEMY-UMNYJ-DOM- KONVERTERA-USB-RS-485.HTML)

HTTP://MYPRACTIC.RU/GLAVA-3-RAZRABOTKA-OBSHHIX-DLYA-VSEX- KONTROLLEROV-APPARATNOJ-I-PROGRAMMNOJ-CHASTEJ.HTML)

на «Урок 64. TCP сервер и клиент на Ардуино. Библиотека

Александр

(http://mypractic.ru

29.03.2018 в 04:31 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- /goto/fn1.php)uipethernet.html#comment-12305)

Здравствуйте, всё очень познавательно спасибо!

(//freekassa.ru/)

MODBUS TCP в планах у Вас для публикации?

0

() ОТВЕТИТЬ

Эдуард ()

29.03.2018 в 10:32 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-12310)

Здравствуйте! Спасибо, за отзыв.

Про MODBUS TCP не думал. TCP протокол и так защищает данные, гарантированно доставляет их.

0

() ОТВЕТИТЬ

Андрей киповец

03.04.2018 в 15:29 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-12403)

Спасибо вам за проделанную работу. У вас очень хорошие уроки. Поддерживаю вопрос про Modbus TCP. В данный момент сам пытаюсь прикрутить Arduino UNO R3 (китайский клон) + Ethernet Shield Wiznet W5500 (производство Amperka) к панели оператора WEINTEK MT8071IE. При помощи ваших уроков получилось прикрутить ардуину через RS485, по протоколу Modbus RTU к панели WEINTEK. По Modbus TCP пока не получается, не хватает знаний. Ардуина видна в сети, пингуется, но модбус не работает.

0

() ОТВЕТИТЬ

Эдуард ()

03.04.2018 в 15:31 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-12404)

Спасибо за приятные слова. На счет ModBus TCP подумаю.

1

() ОТВЕТИТЬ

Александр

20.12.2020 в 22:20 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-38398)

Спасибо за такое прекрасное объяснение всех тем в уроках. Андрей, удалось ли вам «прикрутить» Ардуину к WEINTEKу?

0

() ОТВЕТИТЬ

киповец

2018 в 22:40 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-

.html#comment-12413)

интернете скачал библиотеку, называется Mudbus 1.0 пишут что это Modbus TCP попробую (http://mypracticприкрутить.ru , если что то получится напишу.

/goto/ArduinoSys.php) 0

() ОТВЕТИТЬ

Лысенко

2018 в 22:44 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-

.html#comment-12482)

за за уроки, за ними стоит колоссальный труд — респект вам!

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

0

() ОТВЕТИТЬ

(http://mypractic.ru Эдуард ()

/goto/fn1.php) 06.04.2018 в 22:51 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-12483)

(//freekassa.ru/)

Ничего страшного. Спасибо за приятные слова.

0

() ОТВЕТИТЬ

Михаил

22.05.2018 в 14:08 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino- biblioteka-uipethernet.html#comment-13365)

Спасибо за уроки! Подскажите, пожалуйста, у меня TCP/IP Builder не видит IP моего компа.

0

() ОТВЕТИТЬ

Эдуард ()

22.05.2018 в 22:40 (http://mypractic.ru/urok-64-tcp-server-i-klient-na- arduino-biblioteka-uipethernet.html#comment-13370)

Здравствуйте!

А другие способы показывают IP? В моей программе из урока есть такая функция.

0

() ОТВЕТИТЬ

Михаил

23.05.2018 в 12:34 (http://mypractic.ru/urok-64-tcp-server- i-klient-na-arduino-biblioteka-uipethernet.html#comment- 13387)

Не догадался сразу проверить, результат ввода команды ipconfig/all в cmd — среда передачи не доступна

0

2018 в 12:38 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-

.html#comment-13388)

программе TCP/IP Builder автоматически выставляется 127.0.0.1

0

() ОТВЕТИТЬ

(http://mypractic.ru

/goto/ArduinoSys.php)

Михаил

24.05.2018 в 14:19 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-13411)

Вообщем с вашей программой все работает, а TCP/IP builder не желает. Я хочу написать на с# подобие вашей программы, не подскажите с чего начать, постороение клиентсерверных приложений?

0

() ОТВЕТИТЬ

(http://mypractic.ru

/goto/fn1.php)

(//freekassa.ru/)

Эдуард ()

24.05.2018 в 21:59 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino- biblioteka-uipethernet.html#comment-13421)

Здравствуйте!

У меня TCP/IP builder работает. С чего начать разработку? Разбираться в конкретных функциях, классах для работы с TCP.

0

() ОТВЕТИТЬ

Владимир

19.05.2021 в 08:32 (http://mypractic.ru/urok-64-tcp-server-i-klient-na- arduino-biblioteka-uipethernet.html#comment-45359)

Здравствуйте!

После скачивания и установки TCP/IP builder 1.9 выдаёт сообщение об ошибке: Unable to get ip information from the operating system. Прошу помочь.

0

() ОТВЕТИТЬ

Павел

03.07.2018 в 09:50 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-14097)

Здравствуйте!

Благодарю за отличную статью и рабочую программу! Единственный вопрос: после отключения сервера клиент прекращает работу, у меня не получилось сделать так, чтобы после повторного включения сервера клиент подсоединился к нему и начал обмен сообщениями. Не подскажете куда копнуть, чтобы решить проблему?

0

() ОТВЕТИТЬ

2018 в 11:44 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-

.html#comment-14875)

сделано, описано, выложено !!! Спасибо !!!

0

() ОТВЕТИТЬ

Эдуард ()

29.08.2018 в 20:16 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-14880)

Спасибо.

0

() ОТВЕТИТЬ

11.09.2018 в 00:09 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- (http://mypractiuic.rupethernet.html#comment-15072)

/goto/ArduinoSys.php)

интересная тема. На есп8266 еще удобнее было бы. только питание 3.3 в.

0

() ОТВЕТИТЬ

2018 в 00:45 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-

.html#comment-15263)

, Эдуард!

уроки, спасибо еще раз огромное!

такой, как клиентом с ардуины кинуть get-запрос на web-сервер развернутый в локальной чтобы обработать php скриптом этот запрос?

0

() ОТВЕТИТЬ

(http://mypractic.ru

/goto/fn1.php)

(//freekassa.ru/)Эдуард ()

25.09.2018 в 09:04 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-15267)

Здравствуйте!

Надеясь, скоро продолжу тему обмена информацией по сетям.

0

() ОТВЕТИТЬ

Валерий

26.10.2018 в 08:56 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-15770)

Добрый день!

Не получается соединение в режиме клиента (сервер ПК). А очень нужно. Остальное работает.

Связка Arduino nano m328+модуль enc28.

Что может быть? Остальные режимы работают. Автору — благодарность и пожелания успехов!

0

() ОТВЕТИТЬ

gheki.chan@mail.ru ()

21.11.2018 в 16:20 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka- uipethernet.html#comment-16250)

Здравствуйте, меня тоже очень интересует уроки — ModBus TCP , за которые готов поддержать проекты четырёхзначной суммой , так как валяются у меня два года эти конвекторы RS485 без дела. На просторах интернета более внятно растолкованного материала нигде нет.

0

() ОТВЕТИТЬ

()

2018 в 06:49 (http://mypractic.ru/urok-64-tcp-server-i-klient-na-arduino-biblioteka-

.html#comment-16264)

.

заморачивался с modbus TCP на W5500 и под него код у меня есть. с библиотекой что описана здесь все работает.

modbus tcp ниже:

regnum 30

modbusSlaveDataTable_4[regnum];// Изменить при изменении кол-ва регистров modbusSlaveAddresTable_4[regnum] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // Изменить при изменении кол-

регистров

12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29}; 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49 52, 53, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 72, 73, 74, 75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87, 88, 89, 92, 93, 94, 95, 96, 97, 98, 99};

modbusSlaveBufferSize = 0; modbusSlaveBuffer[64];

unsigned char _modbusSlave_fctsupported[] = {3, 6, 16}; _modbusSlaveTCPServer(502);

EthernetClient _modbusSlaveTCPClient; (http://mypracticbyte.ru_modbusSlaveMBAPBuffer[6];

// Настройки сетевой карты

/goto/ArduinoSys.php)

byte ethernet_mac [] = {0x78, 0xAC, 0xC0, 0x4D, 0x2D, 0x9E}; IPAddress ethernet_ip(192, 168, 2, 220);

byte ethernet_dns [] = {192, 168, 2, 1}; ethernet_gateway [] = {192, 168, 2, 1}; ethernet_subnet [] = {255, 255, 255, 0};

ethClient;

setup()

.begin(ethernet_mac, ethernet_ip, ethernet_dns, ethernet_gateway, ethernet_subnet);

modbusSlaveTCPServer.begin();

i=0;i= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime -startTime+period));}

modbusSlavePoll()

modbusSlaveTCPClient.connected()) {_modbusSlaveTCPClient =

_modbusSlaveTCPServer.available();}

(http://mypractic.ru

if (_modbusSlaveTCPClient) { _modbusGetSlaveRxBuffer();} else{return 0;} /goto/fn1.php)if(_modbusSlaveBufferSize ==0) {return 0;}

if ((_modbusSlaveBuffer[0] != 1) && (_modbusSlaveBuffer[0] != 0)) return 0;

byte exception = _modbusValidateRequest();

(//freekassaif (exception.ru/) > 0) {

if (exception != 255) { _modbusSlaveBuildException( exception ); _modbusSlaveSendTxBuffer();

}

return exception;

}

switch ( _modbusSlaveBuffer[1] ) { case 3 :

return process_modbus_FC3(4); break;

case 6 :

return process_modbus_FC6(); break;

case 16 :

return process_modbus_FC16(); break;

default:

break;

}

return 25;

}

byte _modbusValidateRequest() { boolean isSupported = false;

for (uint8_t i = 0; i < sizeof( _modbusSlave_fctsupported ); i++) { if (_modbusSlave_fctsupported[i] == _modbusSlaveBuffer[1]) { isSupported = 1;

break;

}

}

if (!isSupported) { return 1;} int intRegs = 0;

byte byteRegs;

switch ( _modbusSlaveBuffer[1] ) { case 6 :

if(!(checkModbusAddres(( word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3]) ),4))){return 2;} break;

case 3 : case 16 :

if(!(checkModbusRange((word( _modbusSlaveBuffer[2], _modbusSlaveBuffer[3])), (word( _modbusSlaveBuffer[4], _modbusSlaveBuffer[5])),4))){return 2;}

break;

}

return 0; // OK, no exception code thrown

}

bool checkModbusAddres(int addr, byte table)

{

return (!(( modbusSlaveIndexForAddres(addr,table)) == -1));

}

int modbusSlaveIndexForAddres(int addr, byte table)