Pull to refresh

Способ связать разные компьютеры в одну сеть

Reading time 6 min
Views 5.2K
Задача

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

Возможные средства исполнения

Существует несколько способов связать компьютеры в одну сеть. Например, VPN. В указанном случае неудобно то, что придётся перелопатить прошивку промышленного компьютера, или вмешаться в логику работы АРМа. В первом случае — перепрошивать совсем не хочется, да и нет необходимых средств/навыков, затраты на изучение платформы нерационально велики. Вмешательство в логику работы АРМа(SCADA InTuch) — также приведёт к потери гарантии. Ко всему прочему, довольно важно обеспечивать работу АРМа в режиме реального времени, а это гарантия мгновенной реакции системы на управляющее воздействие. Ни много, ни мало, а кому-то это спасёт жизнь.

Что ещё у нас есть? Ну например, SSH. Не подходит по аналогичным причинам. Хотя уровень требуемой безопасности вполне соответствует, но сложность переделок загоняет в тупик.

Приемлемое решение задачи

Итак, во внутренности работающих систем не лезем. Система обеспечивает вполне доступные средства обмена информацией в простых формах простыми средствами. Как правило, это текст с временными метками, указанием на уровень предупреждающих сообщений, отчёт о исполнении команд.

Ничто не мешает брать эти данные с машины под управлением АРМа, и на отдельной машине дальше с ними работать. Так как машина для связи является отдельной — можно не опасаться за подвисания, сбои и падения в самый неудобный момент времени. Впрочем, такое поведение будет говорить о плохой постановке вопроса, и как следствие — плохом решении. Ко всему прочему, машина может не находиться физически на опасном промышленном объекте (ОПО, обязателен к регистрации в органах Ростехнадзора), зачастую на объекте не предусмотрено место под дополнительное оборудование, а если предусмотрено, то потребуется провести проектные мероприятия, лицензирование, перерегистрацию и т. д. В конечном итоге, это тоже дорого и долго. А каналы связи, как правило, закладываются заблаговременно, и являются штатными средствами.

Сам способ связи компьютеров, очевидно, не должен базироваться на DNS, TCP\IP, UDP непосредственно.

Выбор технологии

Вполне понятно, что создавать средства связи с чистого листа крайне накладно. Опираться на низкоуровневые средства также невыгодно из-за жёсткой привязки. Очевидно это будет высокоуровневый протокол, с опорой на уже существующие наработки.

Особенности любой SCADA-системы в том, что объём передаваемых данных совсем не велик, но в тоже время, должна быть оперативность. Понятно, что при попытки связать SCADA на PC и мобильный телефон (с Java), необходимо обеспечить оперативность доставки информации. Т. о. из указанных высокоуровневых протоколов исключаются эл. почта, сильно ограничен ftp и др. средства рассчитанные на длительные промежутки времени.

Наиболее подходящим типом связи будет являться протокол, основанный на передаче коротких сообщений. В качестве основы, теоретически, можно рассматривать какие угодно интернет-пейджеры: ICQ, mail.ru, MSN, jabber и ещё с десяток других. Практически, из всего разнообразия, остаётся всего пару штук. Так например, ICQ — закрытый протокол, и в любой момент может измениться. Ко всему прочему, если копирайтер вычислит, что его протокол используется «не по назначению», — возникнут проблемы более чем финансового характера. По тем же причинам отпадают все коммерческие или закрытые протоколы. Малораспространённые, протоколы либо не имеют нормальной поддержки, либо не обеспечивают приемлемое качество связи. В конечном итоге, благодаря открытости, наличию массы библиотек, транспортов и расширений, вот он наш победитель — jabber.

Эффект рычага

Технически, можно устроить чехарду с манипуляцией окнами — в одном месте данные прочитал из файла/сокета, послал окну сообщение всплыть на передний план, эмулировать нажатие клавиш, для вставки нужного сообщения, и далее эмулировать нажатие кнопки «отправить», со сворачиванием окна. Этот инверсно-ректальный метод вполне имеет право на существование. Именно так, уже более трёх лет функционирует АРМ диспетчера вагонного депо, из-за того, что какой-то умник решил, что принтер обязательно подключен к com-порту, и подсистема печати де-факто и де-юро в Windows отсутствует. (были перепробованы практически все способы решения проблемы, в т. ч. с виртуальными DOS-принтерами).

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

Jabber обладает как большой группой пользователей, так и развитыми средствами взаимодействия. Децентрализованная сеть, возможность на вполне законных основаниях поднять свой сервер, и связать с другими — приятно завершает перспективу. Впрочем, серверов в интернете более чем достаточно, и необходимость в собственном сервере возникает более чем редко. Ещё раз следует повторить: передавать большие объёмы данных возможно, но не следует злоупотреблять добротой тех, кто содержит сервера.

Средства производства

В качестве языка программирования выбран Python. Вполне легковесный, «батарейки идут в комплекте», не ограничен лицензированием, есть подо все платформы, переносим. Этого вполне достаточно для обоснования выбора.

В комплект к Python всё-таки придётся добавить одну «батарейку» — xmpppy. Это дополнительная библиотека, специально разработанная для работы по протоколу XMPP/jabber. Она не развивается официально, но сообщество чуть ли не ежедневно добавляет что-либо в неё (официальных релизов уже не было давно). На просторах рунета лежит несколько примеров её использования, они легко ищутся, ссылки будут приведены в случае необходимости).
Итак, код с комментариями, достаточный для обеспечения связи компьютер-компьютер/мобильник/смартфон/тачпад. Подразумевается, что информация приходит на jabber-клиент.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
пример создания jabber-связи
для передачи данных между несвязанными компьютерами
Author: -=[fantom]=-@jabber.ru
Data: 2011-09-03
License: GPL
'''
import xmpp
from time import sleep

def msgparser(instance, message):
    '''
    Функция - обработчик сообщения. Нужна для
    обратной связи. В противном случае клиент не сможет получать данные
    о состоянии системы.
    '''
    # вообще, использование глобальных переменных - плохая идея не только в Python
    global myclient
    s=message.getBody()
    if s<>None:
        print '------------------------'
        print 'новое сообщение!'
        print 'от: ', message.getFrom()
        print 'сбщ: ', s, len(s)
        myclient.send(xmpp.Message(message.getFrom(),'hello, '+s))

# задаёмся именем пользователя (в данном случае- JID-автора)
jid=xmpp.protocol.JID('-=[fantom]=-@jabber.org')

# создаём клиента
myclient=xmpp.Client(jid.getDomain(),debug=[None])

# подключаем клиента
print 'Метод шифрования\t=', myclient.connect()  #‘tls’
print 'Метод авторизации\t=', myclient.auth(jid.getNode(),'xxxxxxxxxxx') # ‘sasl’, вместо много 'xxxx' - пароль

# делаем статус
print myclient.sendInitPresence()

# устанавливаем статус. Без него часто работать вообще нельзя
presence = xmpp.Presence(status = 'ООО "АРВИ НПК" г. Черняховск', show = 'chat', priority = '1')
print myclient.send(presence)

# регистрируем обработчик сообщений
myclient.RegisterHandler('message', msgparser)


# составляем сообщение для отправки (кому отправляем)
mymsg=xmpp.protocol.Message('-=[fantom]=-@jabber.ru','Проверка отправленного сообщения!', 'chat')

# отправляем сообщение
print myclient.send(mymsg)


# запускаем обработчик процесса
# и делаем это в цикле
myclient.online=1
while myclient.online==1:
    # инструкция sleep - как правило не требуется, дополнительная задержка лишь приведёт к сбоям
    #sleep(2)
    myclient.Process(1)

# корректно завершаем сессию
myclient.disconnect()

Приведённый код достаточно прокомментирован, чтобы решить в дальнейшем 99,5% задач.
В промышленных целях крайней не рекомендуется использовать операционные системы семейства Windows. Это не очередной виток холивар, это печальный опыт применения в промышленности. ко всему прочему, возможность связки внешнего оборудования и программной начинки PC — сильно ограничено, по сравнению с конкурентами. При сильном желании и избыточном количестве денег и эта проблема может быть решена, но если «брюки выглядят одинаково, зачем платить больше»?

Краткий итог

В приведённом примере не раскрыт механизм связи АРМ и клиента от начала и до конца. Решена лишь та часть, которая обеспечивает связь сколь угодно большого числа компьютеров со сколь угодно странно, в сетевом отношении, расположенными машинами. Дальнейшее наращивание обработчиков (или логики одного обработчика) позволит решить неограниченный круг задач по созданию информационной инфраструктуры. Встроенные средства обеспечения безопасности позволяют закрыть изначально массу брешей. Использование протокола высокого уровня позволяет поверх него создать дополнительные надстройки в интересах пользователей. Обеспечение устойчивой связи сократит время и средства на диагностику и устранение неисправностей. Инженерам АСУП указанная методика сохранит не один час свободного времени и нервов. Подключенные к PC внешний устройства (датчики, сигнализация охранная/пожарная, средства измерения) можно контролировать и программировать дистанционно.
Tags:
Hubs:
-2
Comments 64
Comments Comments 64

Articles