
5ый семестр / 1. Производственная практика / стащил с работы / 64 урок - TCP сервер и клиент на Ардуино
.pdf
}
включаем ожидание входящих соединений
// ожидаем объект клиент
клиента
== 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)