среда, 23 сентября 2009 г.

Передача секретной информации

Интересно, о чём подумали читатели, увидев заголовок статьи? Наверно, кто-то решил, что речь пойдёт о передаче как минимум государственных тайн за пределы государства...
Шутка, разумеется, но ещё один способ незаметной передачи информации для тех, у кого есть компьютер, возможно, на что-нибудь сгодится. Заодно и познакомитесь с новыми компонентами.

Речь здесь пойдёт не о передаче файлов или другой компьютерной информации, а о передаче коротеньких (или длинных - у кого какое терпение :) сообщений между, например, коллегами по работе. Но главное условие - передача должна быть достаточно незаметной. Никаких сообщений на экране (типа ICQ)!

Сегодня мы будем передавать информацию с помощью азбуки Морзе. Однако звуки легко услышать, а потому воспользуемся не звуками, а светодиодами клавиатуры. Вы должны хорошо знать азбуку Морзе. Это нетрудно, достаточно потренироваться на досуге.

А со светодиодами умеет работать компонент со вкладки "Система" LedKey. Множество важных методов спрятано у него на вкладке "Точки" в панели параметров. Вот первоначальный пример работы с компонентом.



Здесь есть таймер, который автоматически включается после запсука программы (потому что параметр Enable у него = True). Затём идёт счётчик. Он замкнуто перебирает 3 числа: 0, 1 и 2, потому что это задано в его параметрах Min и Max. А при выдаче числа IndexToChanel генерирует одно из своих событий. Разумеется, все они идут по порядку, ведь счётчик считает по порядку, а событие IndexToChanel, понятно, зависит от значения счётчика.

Перейдём к более сложным вещам. Сделаем наконец передачу информации через светодиоды клавиатуры. Пусть NumLock будет у нас за точку, CapsLock за тире, а ScrollLock - разделитель между символами. Конечно, это не совсем правильно, ведь в идеале один светодиод должен уметь передавать всё, причём за точку он должен мигать быстро, а за тире - подольше гореть. Но для удобства сделаем так.



Эта сложная на первый взгляд схема очень просто расшифровывается, если начать с начала, а именно - с нажатия кнопки. При этом сначала через разветвители идёт сигнал на выключение всех светодиодов, чтобы при наблюдении за ними не запутаться. Затем используется компонент CharArray. В него загружается строка из поля ввода, и каждый символ сразу становится элементом массиа. Дальше работа идёт уже с массивом символов.

Событие onLoad компонента CharArray, происходящее после загрузки строки в массив компонента, вызывает целый ряд событий (через разветвитель). Во-первых устанавливается максимальное значение счётчика, оно должно быть равно количеству символов строки (или элеменов массива символов, что одно и то же). Затем счётчик получает начальное значение -1. Массивы нумеруются с 0, поэтому при движении счётчика вперёд первым будет как раз 0.

Затем устанавливается максимальное количество срабатываний таймера. Оно тоже равно числу символов. Ну а потом таймер запускается и через каждые 600 миллисекунд (это установлено в его параметр Interval) передвигает счётчик на 1 вперёд. При этом из массива символов извлекается новый символ, и элемент Case его проверяет. Если это точка - загорается (и через 300 мсек гаснет) NumLock, если тире - CapsLock, ну а если слеш, то ScrollLock, и это означет конец символа.

Объясню, зачем нужен таймер. Дело в том, что поставить компонент ArrayEnum, который просто перебирает массив, нельзя, потому что этот компонент выдаёт значения сразу одно за другим, а нам нужна некоторая задержка, чтобы можно было увидеть изменение светодиода. Ну а другие три таймера гасят светодиод, чтобы было удобней. У них, кстати, автостоп установлен в параметрах и равен 1, т.е. таймеры эти будут срабатывать только 1 раз (ведь нам же 1 раз нужно погасить светодиод).


Осталось лишь рассказать, как наладить связь между двумя компьютерами для передачи данных. Это можно сделать разными способами, я выбрал UDP. Этот компонент находится на вкладке "Интернет". Вот схема с его использованием.



Здесь вам нужно немного разобраться с компонентом UDP. Этот компонент создаётся сокет на вашем компьютере, через который возможно общение с другими компьютерами. LocalPort и RemotePort - это порты для привязки сокета и отправки данных. Они для всех программ должны быть одинаковыми, такими, как уже установлено.

LocalIP - это IP-адрес вашего компьютера в сети. Конечно, 127.0.0.1 нужно изменить на ваш IP, ведь именно на него будут присылать данные.
RemoteIP - это IP-адрес компьютера, куда вы будете отправлять данные. Если вы хотите связываться с несколькими компьютерами, то ничего в этом параметре указывать не нужно, а нужно RemoteIP указать в одноимённой верхней точке (при этом AutoConnect компонента UDP должно быть в False). Как показано в примере, вы должны вписывать IP-адрес компьютера, на который хотите отправить своё послание, в верхнее поле ввода.

Метод doSendTo отправляет данные на указанный IP, в указанный порт. Не спутайте её с точкой doSend, эта точка нужна для отправки данных на фиксированный IP-адрес, который указывается в параметре RemoteIP, но там ничего не указано, потому что IP-адрес у вас не фиксированный, вы сами его вводите.

Ну а если вам кто-то отправит послание (адресант должен отправлять на тот IP-адрес, который вы указали в параметре LocalIP), то сработает событие onReceive, данные останутся в памяти (Memory), и прозвучит звуковой сигнал (компонент для звукового сигнала находится на вкладке "Мультимедиа"), после чего запустится двухсекундный таймер (с автостопом = 1), и только потом начнут мигать светодиоды. Это сделано, чтобы вы реагировали на приход данных и успевали их прочитать.

11 комментариев:

  1. Этот проект - для юных радистов, осваивающих азбуку Морзе.
    Между тем идея хороша для светового оформления действий пользователя с программой. Она открывает новый, прежде никогда не использовавшийся канал воздействия - только не азбукой Морзе, а иллюминацией.

    ОтветитьУдалить
  2. а можно передавать текст?
    я хочу создать чат напишите мне pnv99game@gmail.com или создайте видео урок заранее спасибо

    ОтветитьУдалить
  3. лучше сделайте урок а то я не разобрался
    и нечего не получилось моя почта pnv99game@gmail.com

    ОтветитьУдалить
  4. Урок будет практически таким же, что уже есть (см. в конце этой статьи), поэтому делать его смысла нет. Разница лишь в том, что с точки onReceive компонента UDP будет выходить текст, который можно передать в поле ввода (просто подключить UDP к компоненту Edit). А в поле, где были знаки Морзе, надо вводить текст, который нужно отправить. В остальном практически всё то же самое.

    ОтветитьУдалить
  5. а можете мне перикинуть по почте готовый sha файл чата pnv99game@gmail.com

    ОтветитьУдалить
  6. пожалуйста пришлите мне готовый sha чат pnv99game@gmail.com

    ОтветитьУдалить
  7. http://hi-asm.narod.ru/sha/bh280.sha - это сервер чата
    http://hi-asm.narod.ru/sha/bh281.sha - клиент. Сначала запускается сервер. В клиенте (схеме) надо сначала прописать IP-адрес, где находится сервер. А потом скомпилировать клиент и установить подключение. Схемы несложные. Другие примеры, кстати, есть в папке Elements\Delphi\Example\Internet\TCP_Chat

    ОтветитьУдалить
  8. а там есть fast chat как его использовать
    а то с сервером не разобрался

    ОтветитьУдалить
  9. Elements\Delphi\Example\Internet\chat.sha
    кароче upd chat как его исп

    ОтветитьУдалить