<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html class="client-nojs" dir="ltr" lang="en">
<head>
<meta charset="UTF-8" />
<title>Модулі/Sockets - OpenSCADAWiki</title>
<meta content="MediaWiki 1.26.4" name="generator" />
<link href="https://www.gnu.org/copyleft/fdl.html" rel="copyright" />
<link href="../../en/files/doc.css" rel="stylesheet" /></head>
<body><div class="floatright"><a href="../index.html"><img alt="OpenSCADA" src="../../en/files/index.png" /></a></div><div id="mw_header">
			<div class="mw-indicators">
</div>
			<h1 id="firstHeading" lang="uk">Модулі/Sockets</h1>
		</div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="uk"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&amp;group=page-Modules%2FSockets&amp;action=page&amp;filter=&amp;language=uk" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Modules/Sockets" title="Modules/Sockets">Modules/Sockets</a> and the translation is 100% complete.</div><hr /><div class="mw-pt-languages" dir="ltr" lang="en"><div class="mw-pt-languages-list autonym"><a class="mw-pt-languages-ui mw-pt-progress mw-pt-progress--complete" href="../../en/Modules/Sockets.html" title="Modules/Sockets (100% translated)">English</a>&nbsp;• ‎<a class="mw-pt-progress mw-pt-progress--med" href="../../ru/Modules/Sockets.html" title="Модули/Sockets (50% translated)">mRussian</a>&nbsp;• ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">Українська</span></div></div>
<table class="wikitable">

<tr>
<th> Модуль </th>
<th> Ім'я </th>
<th> Версія </th>
<th> Ліцензія </th>
<th> Джерело </th>
<th> Мови </th>
<th> Платформи </th>
<th> Тип </th>
<th> Автор </th>
<th> Опис
</th></tr>

<tr>
<td> <a href="../Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Sockets</a> </td>
<td> Сокети
</td>
<td> 5.0 </td>
<td> GPL2 </td>
<td> tr_Sockets.so </td>
<td> en,uk,ru,de </td>
<td> x86,x86_64,ARM
</td>
<td> Транспорт </td>
<td> Роман Савоченко<br />&nbsp;&nbsp;<font size="-2"><i>Максим Кочетков(2014)</i></font> </td>
<td> Надає транспорт заснований на сокетах. Підтримуються мережеві та UNIX сокети. Мережевий сокет підтримує TCP, UDP та RAWCAN протоколи.
<ul><li> <b><a href="../../en/To_do.html" title="Special:MyLanguage/Works/To do">Завдання (To Do)</a>:</b></li></ul>
<dl><dd>- додати підтримку AF_BLUETOOTH сокетів для прямого запиту BLE пристроїв.</dd></dl>
</td></tr></table>
<p>Модуль надає до програми підтримку транспортів, заснованих на сокетах. Підтримуються вхідні та вихідні транспорти, основані на мережевих сокетах TCP, UDP, UNIX та RAWCAN.
</p><p>Додати нові вхідні та вихідні сокети можна за посередництвом конфігурації <a href="../Program_manual.html#Transports" title="Special:MyLanguage/Documents/Program manual">транспортної підсистеми</a> у будь якому конфігураторі OpenSCADA.
</p>
<div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#.D0.92.D1.85.D1.96.D0.B4.D0.BD.D1.96_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D0.B8"><span class="tocnumber">1</span> <span class="toctext"><span>Вхідні транспорти</span></span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#.D0.92.D0.B8.D1.85.D1.96.D0.B4.D0.BD.D1.96_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D0.B8"><span class="tocnumber">2</span> <span class="toctext">Вихідні транспорти</span></a></li>
</ul>
</div>

<h2><span class="mw-headline" id=".D0.92.D1.85.D1.96.D0.B4.D0.BD.D1.96_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D0.B8"><span class="mw-headline-number">1</span> <span id="InTr" title="#InTr">Вхідні транспорти</span></span></h2>
<p>Сконфігурований та запущений вхідний транспорт відкриває серверний сокет для очікування підключення клієнтів, крім ініціативного підключення. У випадку з UNIX сокетом створюється файл UNIX сокету. Сокети TCP та UNIX є багатопотоковими, тобто при підключені клієнту до сокетів цих типів створюється клієнтський сокет та новий потік, у якому відбувається обслуговування клієнту. Серверний сокет, на цей час, переходить до очікування запитів від нового клієнту. Таким чином досягається паралельне обслуговування клієнтів. RAWCAN сокет здійснює прийом CAN кадрів з інтерфейсу згідно до налаштованому фільтру.
</p><p>Кожний вхідний транспорт пов'язується з одним або декількома з доступних транспортних протоколів, якому передаються вхідні повідомлення. Разом з транспортним протоколом підтримується механізм об'єднання шматків розрізнених при передачі запитів.
</p><p>Прочитати про механізм пасивного збору та ініціативні підключення ви можете у відповідній частині документу "<a href="../DAQ.html#PassiveAndInitiative" title="Special:MyLanguage/Documents/DAQ">Збір даних в OpenSCADA</a>".
</p>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:858px;"><a class="image" href="http://oscada.org/wiki/File:Sockets_in_uk.png"><img class="thumbimage" height="1210" src="../files/Sockets_in_uk.png" width="856" /></a>  <div class="thumbcaption">Рис.1. Загальні діалоги конфігурації вхідного сокету.</div></div></div></div>
<p>За допомогою основного діалогу можна встановити:
</p>
<ul><li> Стан транспорту, а саме: статус, "Підключення", ім'я сховища (яке містить конфігурацію) та інформація про поточні підключення.</li>
<li> Ідентифікатор, ім'я та опис транспорту.</li>
<li> Адреса транспорту. Формат адреси описано у таблиці нижче.</li>
<li> Обрання транспортних протоколів.</li></ul>
<dl><dd><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Порожнє значення обрання протоколу перемикає транспорт у режим створення асоційованого вихідного транспорту для кожного прочитаного ІД підключення на цей вхідний.</dd></dl>
<ul><li> Стан "Підключення", у який переводити транспорт при запуску.</li></ul>
<p>За допомогою додаткового діалогу можна встановити:
</p>
<ul><li> Пріоритет задач транспорту.</li>
<li> [TCP] Розмір системного вхідного буферу сокетів в кілобайтах. Встановити в 0 для зняття користувацького розміру. Актуальний розмір можете бачити у статусі.</li>
<li> [TCP] Максимальний розмір сегмента (MSS) в байтах для обмеження розміру пакетів що відсилаються (сегментів TCP) на поганих каналах зв'язку. Встановити в 0 для зняття користувацького обмеження розміру. Актуальний розмір можете бачити у статусі.</li>
<li> [TCP|UNIX|RAWCAN] Довжина черги сокетів.</li>
<li> [TCP|UNIX|RAWCAN,!INIT] Максимальна кількість клієнтів та Максимальна кількість клієнтів за хостами (для TCP).</li>
<li> [TCP|UNIX|RAWCAN,!INIT] Keep alive запитів — закриття підключення після визначеної кількості запитів. Нульове значення для вимкнення — не закривається ніколи.</li>
<li> [TCP|UNIX|RAWCAN] Keep alive час очікування, в секундах — закриття підключення після відсутності запитів протягом визначеного часу. Нульове значення для вимкнення — не закривається ніколи.</li></ul>
<dl><dd><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Вимикати цю функцію не рекомендується оскільки властивість мереж TCP/IP не гарантує повідомлення серверу про відключення з'єднання, скажемо у випадку зникнення живлення на клієнті. У результаті чого можуть <span style="color: red">назавжди</span> залишатися відкритими клієнтські підключення, а при досягненні ліміту сервер припинить приймати нові!</dd></dl>
<ul><li> [TCP,INIT|ASSOC] Таймаути, спроби ініціативного підключення і асоційованих вихідних транспортів, порожнє для типового і поділене '||'. Формат таймаутів і спроб відповідає вихідному транспорту.</li>
<li> Специфічні до протоколу користувацькі параметри.</li>
<li> Скинути усі додаткові параметри до типових значень та очистити специфічні до протоколу користувацькі параметри.</li></ul>
<p>Особливості формування адреси вхідних сокетів приведено у таблиці нижче:
</p>
<table class="wikitable">

<tr>
<th> Тип сокету </th>
<th> Адреса
</th></tr>
<tr>
<td> TCP </td>
<td>
<p><b>[TCP:]{addr}[:{port}[,{port2}[,{portN}]][:{mode}[:{IDmess}]]]</b><br />
де:
</p>
<ul><li> <i>addr</i> — адреса відкриття сокету, порожня або "*" адреса відкриває сокет на всіх інтерфейсах. Допускаються як символьне, так й IPv4 "<b>127.0.0.1</b>" або IPv6 "<b>[::1]</b>" представлення адреси.</li>
<li> <i>port</i>, <i>port2</i>, <i>portN</i> — мережеві порти на яких послідовно відкривається сокет (при зайнятості перших), можливе вказання символьної назви порту відповідно до <i>/etc/services</i>.</li>
<li> <i>mode</i> — режим роботи вхідного сокету:
<ul><li> <b>0</b> — примусово розривати з'єднання після сеансу прийом-відповідь.</li>
<li> <b>1</b>(типово) — не розривати з'єднання, тільки з урахуванням параметрів KeepAlive.</li>
<li> <b>2</b> — ініціативне підключення. Включає режим ініціативи підключення цього вхідного транспорту до віддаленого хосту (адреса замість локального) та перехід у режим очікування запитів від цього хосту. Значення "Keep alive час очікування" використовується як таймаут перепідключення даного транспорту за відсутності активності з метою відновлення можливо втраченого підключення.</li></ul></li>
<li> <i>IDmess</i> — ідентифікуюче повідомлення ініціативного підключення — режим 2.</li></ul>
<p>Приклад: "<b>TCP::10001:1</b>" — TCP-сокет доступний на всіх інтерфейсах, відкритий на порту 10001 та з'єднання не розриває.
</p>
</td></tr>
<tr>
<td> UDP </td>
<td>
<p><b>UDP:{addr}:{port}</b><br />
де:
</p>
<ul><li> <i>addr</i> — теж що й у TCP;</li>
<li> <i>port</i> — теж що й у TCP.</li></ul>
<p>Приклад: "<b>UDP:localhost:10001</b>" — UDP-сокет доступний тільки на інтерфейсі "localhost" та відкритий на порту 10001.
</p>
</td></tr>
<tr>
<td> RAWCAN </td>
<td>
<p><b>RAWCAN:{if}:{mask}:{id}</b><br />
де:
</p>
<ul><li> <i>if</i> — ім'я CAN інтерфейсу;</li>
<li> <i>mask, id</i> — маска та ідентифікатор фільтрації CAN кадрів.</li></ul>
<p>Приклад: "<b>RAWCAN:can0:0:0</b>" — приймати всі CAN кадри на інтерфейсі "can0".
</p>
</td></tr>
<tr>
<td> UNIX </td>
<td>
<p><b>UNIX:{name}:{mode}</b><br />
де:
</p>
<ul><li> <i>name</i> — ім'я файлу UNIX сокету;</li>
<li> <i>mode</i> — те саме, що у TCP.</li></ul>
<p>Приклад: "<b>UNIX:/tmp/oscada:1</b>" — UNIX-сокет доступний через файл "/tmp/oscada" та з'єднання не розриває.
</p>
</td></tr></table>
<p>RAWCAN має деякі особливості у формуванні посилки, а саме:
</p>
<ul><li> ідентифікатор отриманого CAN фрейму розташовується у відправнику (<i>sender</i>), а дані у полі запиту (<i>request</i>);</li>
<li> ознакою розширеного ідентифікатору-відправника є наявність старшого біту (0x80000000).</li></ul>
<h2><span class="mw-headline" id=".D0.92.D0.B8.D1.85.D1.96.D0.B4.D0.BD.D1.96_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D0.B8"><span class="mw-headline-number">2</span> Вихідні транспорти</span></h2>
<p>Сконфігурований та запущений вихідний транспорт відкриває з'єднання з вказаним сервером. При розриві з'єднання вихідний транспорт зупиняється. Для відновлення з'єднання транспорт треба знову запустити, що всі протоколи роблять автоматично.
</p><p>Транспорт підтримує пряме визначення декількох адрес серверу та опрацювання всіх IP-адрес у які резолвиться символьна адреса, що дозволяє будувати <a href="../DAQ.html#Redundancy" title="Special:MyLanguage/Documents/DAQ">вертикальне резервування</a> безпосередньо транспортом, який буде автоматично підключатися до першого доступного серверу.
</p>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:840px;"><a class="image" href="http://oscada.org/wiki/File:Sockets_out_uk.png"><img class="thumbimage" height="940" src="../files/Sockets_out_uk.png" width="838" /></a>  <div class="thumbcaption">Рис.2. Загальні діалоги конфігурації вихідного сокету.</div></div></div></div>
<p>За допомогою основного діалогу можна встановити:
</p>
<ul><li> Стан транспорту, а саме: статус, "Підключення" та ім'я сховища, яке містить конфігурацію.</li>
<li> Ідентифікатор, ім'я та опис транспорту.</li>
<li> Адреса транспорту. Формат адреси описано у таблиці нижче.</li></ul>
<p>За допомогою додаткового діалогу можна встановити:
</p>
<ul><li> Інтервали часу підключення у форматі "<b>{conn}:{next}[:{rep}]</b>", де:
<ul><li> <i>conn</i> — максимальний час очікування відповіді підключення, у секундах;</li>
<li> <i>next</i> — максимальний час очікування продовження відповіді, у секундах;</li>
<li> <i>rep</i>  — мінімальний час затримки наступного запиту, в секундах.</li></ul></li></ul>
<dl><dd> Може бути пріоритетно визначено другим глобальним аргументом поля адреси, на кшталт "<b>localhost:123||5:1</b>".</dd></dl>
<ul><li> Спроб запиту транспортом та протоколом, для повних запитів.</li></ul>
<dl><dd> Може бути пріоритетно визначено третім глобальним аргументом поля адреси, на кшталт "<b>localhost:123||5:1||3</b>".</dd></dl>
<ul><li> [TCP] Максимальний розмір сегмента (MSS) в байтах для обмеження розміру пакетів що відсилаються (сегментів TCP) на поганих каналах зв'язку. Встановити в 0 для зняття користувацького обмеження розміру. Актуальний розмір можете бачити у статусі.</li>
<li> Специфічні до протоколу користувацькі параметри.</li>
<li> Скинути усі додаткові параметри до типових значень та очистити специфічні до протоколу користувацькі параметри.</li></ul>
<p>Адреса вихідних сокетів різного типу формуються наступним чином:
</p>
<table class="wikitable">

<tr>
<th> Тип сокету </th>
<th> Адреса
</th></tr>
<tr>
<td> TCP/UDP </td>
<td>
<p><b>[TCP:]{addr}[,{addrN}]:{port}</b><br />
<b>UDP:{addr}[,{addrN}]:{port}</b><br />
де:
</p>
<ul><li> <i>addr</i> — адреса до якої здійснюється підключення. Допускається як символьне так й IPv4 "<b>127.0.0.1</b>" або IPv6 "<b>[::1]</b>" представлення адреси.</li>
<li> <i>port</i> — мережевий порт до якого здійснюється підключення. Можливе вказання символьного ім'я порту відповідно до <i>/etc/services</i>.</li></ul>
<p>Приклад: "<b>TCP:127.0.0.1:7634</b>" — підключення з портом 7634 на хості 127.0.0.1.
</p>
</td></tr>
<tr>
<td> RAWCAN </td>
<td>
<p><b>RAWCAN:{if}:{mask}:{id}</b><br />
де:
</p>
<ul><li> <i>if</i> — ім'я CAN інтерфейсу;</li>
<li> <i>mask, id</i> — маска та ідентифікатор CAN кадрів.</li></ul>
<p>Приклад: "<b>RAWCAN:can0:0:0</b>" — приймати всі CAN кадри на інтерфейсі "can0". 
</p>
</td></tr>
<tr>
<td> UNIX </td>
<td>
<p><b>UNIX:{name}</b><br />
де:
</p>
<ul><li> <i>name</i> — ім'я файлу UNIX сокета.</li></ul>
<p>Приклад: "<b>UNIX:/tmp/oscada</b>" — з'єднатися з UNIX-сокетом через файл "/tmp/oscada". 
</p>
</td></tr></table>
<p>RAWCAN має деякі особливості у формуванні посилки, а саме:
</p>
<ul><li> надсилання CAN фреймів (прозоро) до транспорту здійснюється у вигляді структури <i>struct can_frame</i>. Розмір структури 16 байт, де: 4 байти — ідентифікатор, 4 байти — довжина, 8 байтів — дані. Наприклад, посилка: <b>15 CD 5B 07 08 00 00 00 11 12 13 14 15 16 17 18</b>. Де:
<ul><li> ідентифікатор: 123456789 (0x75BCD15) =&gt; <b>15 CD 5B 07</b>, додати 0x80 у останньому байті якщо потрібен розширений;</li>
<li> довжина: <b>08 00 00 00</b> (вісім байтів);</li>
<li> дані: <b>11 12 13 14 15 16 17 18</b>.</li></ul></li></ul>






</div><table style="border-top: dotted 2px #999999; margin-top: 20pt; color: gray;" width="100%"><tr><td style="text-align: left;" width="40%"><a href="http://oscada.org/wiki/Modules/Sockets/uk">Modules/Sockets/uk</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">April 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3018</td></tr></table></body>
</html>