| ClipArtMag Science Blog |

Free Cliparts

E - K e r m i t

Перевод статьи - E - K e r m i t

Источник оригинальной статьи:

http://www.kermitproject.org/ek.html

Компактный, быстрый, надежный, переносимый протокол передачи файлов Kermit для встраивания

Версия: 1.7

Дата: 6 июня 2011 г.

Эта страница обновлена: Чт янв 21 11:14:37 2016

Объявление с открытым исходным кодом: 30 марта 2011 года с версией 1.6 E-Kermit выпускается «as-is» в соответствии с пересмотренной лицензией BSD 3-Clause.

Cодержание

  1. ПРОГРАММА КОНТРОЛЯ
  2. ПЕРЕДАЧА ФАЙЛА
  3. ИСХОДНЫЙ КОД
  4. ВЕРСИЯ UNIX
  5. ПАРТИРОВКА К НОВОЙ ПЛАТФОРМЕ
  6. ОТЛАДКА
  7. ИСТОРИЯ РЕЛИЗЫ
  8. СКАЧАТЬ

EK (Embedded Kermit, E-Kermit) представляет собой реализацию протокола передачи файлов Kermit, написанного на ANSI C и предназначенного для встраивания в устройства или прошивку, использования в приложениях реального времени или для создания DLL и библиотек. EKSW - это новая версия E-Kermit, которая включает в себя настоящую раздвижную пакетную передачу. EK и EKSW следует сверять обратно в единую базу кода, но пока этого не произошло.

Что E-Kermit делает

EK выполняет только две функции: отправка файлов и получение файлов. Он компактный, портативный и полностью повторно используемый. На SPARC (RISC), kermit.o составляет около 25K. На Intel (CISC) это около 15K. Уменьшая размеры буфера и устраняя дополнительные или нежелательные функции, можно добиться меньших размеров.

Что E-Kermit НЕ ДЕЛАЕТ

EK не включает функции клиент / сервер; язык программирования команд или скриптов; преобразование символов; транспортное шифрование; или любой формы связи или ввода / вывода файлов. Он не набирает модемы, не делает соединений, у него нет встроенного стека TCP / IP или интерфейса для внешнего. Если вам нужны эти функции, вам следует использовать полную программу Kermit, такую ??как C-Kermit или Kermit 95.

EK не является самим приложением, это подпрограмма, вызываемая из вашего основного приложения. Он полезен только разработчикам, которые должны предоставить основное приложение или вызывающую среду, а также подпрограммы ввода / вывода файлов и сообщений. Окружающая среда запроса должна, в свою очередь, сделать и формировать коммуникационную связь, если оно требуется и не открыто. Для Unix предоставляется примерная среда вызова и поддержка ввода / вывода.

Клиенты адаптировали EK к различным средам и платформам, включая Palm Pilot, различные виды оборудования для техников (например, для диагностики и обслуживания башен сотовых телефонов), и иногда они вносят свои адаптации или процедуры ввода / вывода, и мы можем сделать их доступными на строго-основе. Мы не можем поддерживать или поддерживать код, предоставляемый клиентом; таким образом (например), если выпущена новая версия EK, модули, добавленные пользователем, необязательно обновляются. Клиентский код включает:

EK включает следующие функции Kermit Protocol:

Следующие функции Kermit Protocol не реализованы:

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

Начиная с версии 1.5, E-Kermit включает в себя конструкции препроцессора, позволяющие исключать различные функции, такие как длинные пакеты, скользящие окна и проверки блоков более высокого порядка для достижения наименьшего возможного объема памяти, а также могут быть созданы в конфигурации только для приема.

ПРОГРАММА КОНТРОЛЯ

EK предназначен для работы в совместной многозадачной среде, но не требует такой среды. Программа управления заботится о планировании. Вот что должна делать программа управления (и/или может):

(Когда E-Kermit должен получать файлы, он ждет пассивно для первого пакета от отправителя файла, поэтому он просто входит в цикл пакета.) В цикле пакетов E-Kermit:

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

Когда это будет сделано, программа управления:

Кодами функций, которые программа управления может вызывать kermit(), являются:

Коды возврата функции kermit():

(Фактически статус перенастраивается при каждом вызове.) Коды состояния протокола:

ПЕРЕДАЧА ФАЙЛА

Поскольку EK предназначен в первую очередь для встраивания, он не использует потоковые или (за исключением EKSW) истинные скользящие окна (хотя большая часть кода раздвижных окон есть). Это происходит по следующим причинам:

Отсутствие истинных скользящих окон в EK компенсируется тем, что EK притворяется, что поддерживает их, не делая этого. Это позволяет его отправляющему партнеру «передавать» пакеты, а не ждать ACK после каждого из них, если нет ошибки. Если есть ошибка, стратегия восстановления «вернется к n» (или, возможно, в некоторых случаях «ошибка»), а не «выборочное повторение». EKSW, отдельная программа, которая не была интегрирована с EK (но должна быть), поддерживает настоящие раздвижные окна с выборочным повторением; то есть ретранслируются только те пакеты, которые на самом деле должны быть.

В любом случае, поскольку EK предназначен прежде всего для встраивания, ожидается, что задержки в оба конца не будут большим фактором; соединения, как правило, локальные, короткие, относительно быстрые, и если соединение эффективно контролируется потоком, то это без ошибок. Когда эффективного управления потоком не хватает, скорость и / или длина пакета и / или размер окна могут быть установлены в комбинацию значений, которые максимизируют пропускную способность и минимизируют потерю данных.

ИСХОДНЫЙ КОД

Исходными файлами являются:

platform.h

Заголовочный файл для любых необходимых для платформы #includes или definitions. Требуется, даже если он пустой, потому что kermit.c включает его.

kermit.h

Заголовочный файл для всех модулей. Определение структур k_data и k_response.

kermit.c

Это механизм протокола Kermit. Он полностью зависит от данных вызова. Вся информация состояния сохраняется в структуре данных kermit, которая передается по ссылке из основного модуля и среди всех функций модуля kermit и обратно в основной модуль; таким образом, один и тот же модуль должен одновременно передавать несколько файлов на разные соединения. Кроме того, в модуле kermit нет ссылок на библиотеки, ни один вообще, даже stdio (кроме случаев, когда включена отладка), а также нет файлов заголовков /usr/include/*. Правила для kermit.c:

Единственной точкой входа для модуля kermit.c является функция kermit():

int kermit(struct k_data * k, struct k_response * r)

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

main.c

Программа контроля образца. В тестовом стенде Unix это просто традиционная функция main(), которая считывает аргументы командной строки, инициализирует протокол и затем вызывает модуль протокола в цикле, управляемом положением, до тех пор, пока не будет выполнена его работа, а затем очистится. Во встроенной среде эти функции будут интегрированы в программу управления.

unixio.c

Функции ввода-вывода в Unix. Замените свой собственный модуль, который реализует эти функции в целевой среде и изменить процедуру сборки, чтобы связать с ним. Точки входа и соглашения о вызовах, описанные ниже.

ВЕРСИЯ UNIX

Разработка EK происходит на обычной платформе Unix, такой как Solaris, HP-UX или Linux, в которой EK построен как программа передачи файлов Kermit с дистанционным режимом, подобная G-Kermit, и протестирована против настольного Kermit таким образом как K95 или C-Kermit. ПРИМЕЧАНИЕ. Версия Unix работает над stdin/stdout; «линия» обусловлена ??самым суровым образом (система («stty ...»)). Это дает переменные результаты; например загрузки с EK на Solaris могут работать на скорости 17Kcps, тогда как загрузка из Linux в одной сети на тот же компьютере может работать на скорости 1700Kcps. Об этом не стоит беспокоиться, поскольку EK не предназначен для использования в Unix, который уже имеет G-Kermit и C-Kermit для производства.

Unix makefile имеет следующие цели (его легко добавить больше):

makefile создает исполняемый файл Unix под названием «ek» (встроенный kermit). Процедура sample main() предоставляет простой интерфейс командной строки:

$ ./ek -h

Usage: ./ek options

Options:

-r Receive files

-s files Send files

-p [neoms] Parity: none, even, odd, mark, space

-b [123] Block check type: 1, 2, or 3 (default = 3)

-k Keep incompletely received files

-B Force binary mode

-T Force text mode

-R Remote mode (vs local)

-L Local mode (vs remote)

-E number Simulated error rate (0-100)

-d Create debug.log

-h Help (this message)

$

При отправке файлов, если вы не укажете Text или Binary, EK сканирует каждый файл и выбирает текстовый или двоичный режим на основе его содержимого.

Remote vs Local режим используется только для включения теста на прерывание передачи файлов.

ПАРТИРОВКА К НОВОЙ ПЛАТФОРМЕ

Версия 1.0 EK была перенесена в VxWorks компанией Airvana, Inc, Chelmsford MA. Полный пакет VxWorks EK 1.1 включен в качестве примера производственной системы с разрешения Airvana (обратите внимание, что с тех пор EK API немного изменился, поэтому, прежде чем использовать код VxWorks, он должен быть обновлен). Чтобы подключиться к новой платформе:

#define NODEBUG для создания без кода отладки.

#define HAVE_UCHAR, если UCHAR уже определен или typedef'd для не определенного типа char.

#define HAVE_ULONG, если ULONG уже определен или typedef'd для не определенного типа long.

#define IBUFLEN - желаемый размер для входного буфера файла.

#define OBUFLEN - желаемый размер для выходного буфера.

#define FN_MAX как максимальная длина для имени файла.

#define P_PKTLEN, чтобы переопределить максимальную длину пакета по умолчанию.

#define P_WSLOTS, чтобы переопределить максимальные интервалы окон по умолчанию.

Вот несколько советов по созданию модуля ввода / вывода:

Ожидается, что процедуры ввода/вывода устройства будут обрабатывать сами параметры связи, включая скорость линии связи, контроль четности и управление потоком. В частности, Кермит не справляется с паритетом, но все равно нужно сказать об этом. Это делается в настройке main(). При необходимости ваши программы readpkt() и tx_data() должны разделять и добавлять паритет, если это необходимо. При последовательных подключениях, возможно, UART можно запрограммировать для этого.

API Изменение между EK 1.1 и 1.2: соглашения о вызовах (списки аргументов функций и возвращаемые значения) были изменены между версиями 1.1 и 1.2, главным образом, чтобы обеспечить доступ к каждой структуре k последовательно, а также обеспечить лучшую обратную связь с вызывающим абонентом. В каждом случае, когда было сделано изменение, как старый, так и новый формат.

Функции ввода/вывода устройства:

int

devopen(char * device)

Открывает данное устройство связи. Также может быть сетевым хостом. Возвращает 0 при сбое, 1 при успешном выполнении.

int

devsettings(char * settings)

Это одно выполняет все необходимые установки для прибора, как скорость и регулирование потока для серийного прибора. Поскольку нет никакого способа узнать, что соответствующие параметры, эта процедура просто принимает строку, которая может быть в любом формате, например "9600;8N1" or "speed=57600;flow=rts/cts"; процедура devsettings должна будет проанализировать строку. Возвращает 0 при сбое, 1 при успешном выполнении.

int

devrestore(void)

Если необходимо, верните устройство обратно, как обнаружил его devsettings(). как раз перед закрытием.

int

devclose(void)

Закрывает коммуникационное устройство.

int

readpkt(UCHAR * buffer, struct k_data * k) (1.1)

readpkt(struct k_data * k, UCHAR * buffer, int length) (1.2)

Эта процедура должна выполнять именно то, что делает образец: поиск начала пакета, а затем копирование всех символов до (но не включая) конца пакета в пакетный буфер, адрес которого указан. Вы захотите скомпилировать это как можно более эффективно, используя любые трюки, доступные для вас: неблокированные буферизованные чтения и т. д. Если вы хотите, чтобы ваша программа Kermit испытывал таймаут, здесь вы должны поместить код. ПРИМЕЧАНИЕ. Тайм-ауты не нужны, так как вероятность того, что ek Kermit-партнер не может выйти из игры, составляет около 0. Формат EK 1.2 помещает k в качестве первого аргумента для согласованности с другими подпрограммами и добавляет аргумент длины буфера.

Обратите внимание на функцию F_CTRLC. Это включено по умолчанию. Это позволяет EK выходить из пакетного режима, отправив ему три последовательных Ctrl-C в поток данных. Обычно вам не нужно отключать это, так как, даже если отправитель является «препрофилированием» Ctrl-C, три из них в строке обычно будут свернуты в последовательность повторения.

int

tx_data(UCHAR * data, int length, short parity) (1.1)

tx_data(struct k_data * k, UCHAR * data, int length) (1.2)

Здесь снова нужно придерживаться равенства (если оно не выполняется автоматически устройством связи или драйвером). Эта процедура должна быть эффективной и надежной. Он должен передавать всю строку данных, иначе сбой. См. Образец unixio.c, что я подразумеваю под «надежным». В EK 1.2 и позже, паритетное урегулирование поднято с k структуры.

Функции ввода/вывода файла следующие: конечно, они могут использоваться для чтения или записи чего угодно - не только файлов: памяти, ленты, карт, лазерных лучей, контролеров приборов, что угодно. Не имеет значения, что вы называете этими процедурами, но список аргументов и тип возвращаемого значения должны быть такими, как показано; также, если вы дадите им разные имена, вам нужно будет изменить прототипы в kermit.h:

int

openfile(UCHAR * filename, int mode, struct k_date * k) (1.1)

openfile(struct k_date * k, UCHAR * filename, int mode) (1.2)

Открывает именованный файл в заданном режиме (1 = чтение, 2 = запись, 3 = добавление). Возвращает X_OK на успех, X_ERROR при сбое.

ULONG

fileinfo(UCHAR * filename, UCHAR * buf, int buflen, short * type, short mode) (1.1)

fileinfo(struct k_data * k,UCHAR * filename,UCHAR * buf,int buflen,short * type,short mode) (1.2)

Получает информацию о указанном существующем локальном файле: размер, дата и, если mode == 0, тип файла (текстовый или двоичный). buf и buflen применяются к строке даты/времени файла. Возвращает X_OK или X_ERROR.

int

readfile (struct k_data *)

Читает буфер из входного файла, и если передача в текстовом режиме, конвертирует формат записи в стандартный CRLF Cermit Stream. Возвращает X_OK или X_ERROR.

int

writefile(struct k_data *, CHAR * buffer, int length)

Записывает буфер в выходной файл, и если передача в текстовом режиме также преобразует стандартный формат записи CRLF потока Kermit в то, что требуется локально. Возвращает X_OK или X_ERROR.

int

closefile(struct k_data *, UCHAR code, int mode)

Закрывает файл. Для выходных файлов, конечно, это сбрасывает любые ожидающие буферы в файл перед его закрытием; то он проверяет, отменяет ли передача Kermit передачу файла до его завершения (код == 'D'), и в этом случае он отбрасывает частичный файл, а не сохраняет его. Режим указывает, является ли это входным или выходным файлом, поэтому при необходимости могут быть удалены не полностью полученные файлы. Возвращает X_OK или X_ERROR.

Точные соглашения о вызовах показаны в файле unixio.c.

ОТЛАДКА

Если EK был создан без определения NODEBUG, то, если вы включите в командной строке параметр -d, примерная версия EK на основе Unix создает файл debug.log в текущем каталоге. В производственной версии вы должны добавить -DNODEBUG к компилятору C CFLAGS, чтобы исключить код отладки. Размеры, показанные выше, включают отладку. Вы можете реализовать функцию отладки любым способом, который вы хотите в своем модуле ввода-вывода для платформы.

ИСТОРИЯ РЕЛИЗЫ

Версия Дата Описание
1.1 2002/10/07    Первоначальный выпуск. Версия VxWorks все еще находится на этом уровне.
1.2 2003/01/28 Улучшенный API, порт Java (который все еще находится на этом уровне).
1.3 2004/03/04 Исправьте передачу файлов с помощью HyperTerminal.
1.4 2004/03/20 Исправление приема пустых файлов.
1.5 2004/04/10 Исправить проблему с A-пакетами, разрешить сверхмалые и / или настройки только для приема.
1.51 2004/09/23 Адаптация к Philips XAG30 (Джон Данлэп)
EKSW 0.94 2010/06/24 Настоящие раздвижные окна с выборочной повторной передачей (Джон Данлэп)
1.6 2011/03/30 Издано и выпущено под лицензией 3-Clause Revised BSD.
1.7 2011/06/06 Протокол FORCE-3 2011/06/06 работает совместно с C-Kermit 9.0 (поясняется здесь)

СКАЧАТЬ

Для загрузки доступны несколько различных реализаций E-Kermit. Сам E-Kermit, версия 1.7, является основным. Другие - адаптация к различным платформам или языкам, которые были сделаны во время предыдущих выпусков E-Kermit, как указано в предыдущем разделе; другими словами, исправления, найденные в E-Kermit 1.3, 1.4 и 1.5, не находятся в версиях VxWorks или Java, а версия VxWorks использует API E-Kermit 1.1 вместо улучшенной версии 1.2. EKSW имеет некоторые изменения в API и другие несоответствия, которые следует отменить, прежде чем он может быть интегрирован с EK 1.6, но совершенно полезен сам по себе. Фактически, это версия, работающая в новом поколении Apex-EM ocean floats, и была протестирована более тщательно в более неблагоприятных условиях, чем, возможно, любая другая реализация протокола Kermit. Возвращаясь к версии 1.7, которая реализует новый протокол проверки пакетов Force-3. (EKSW получит это тоже в какой-то момент.)

    HTTP FTP
Имя Описание Tar* Zip Исходные файлы
E-Kermit 1.7 Портативный на всех платформах, с Unix демо. Скачать Скачать Скачать
EKSW 0.94 E-Kermit с истинными скользящими окнами, адаптированными к Linux. Скачать Скачать Скачать
EKVX 1.1 E-Kermit 1.1 адаптирован к VxWorks. Скачать Скачать Скачать
Java E-Kermit 1.2 конвертировано в Java Скачать Скачать Скачать
Simirid Тестер стресса протокола [Описание] Скачать Скачать Скачать
* Не сжаты, нет необходимости, они очень малы.

Нажмите здесь, чтобы получить доступ к FTP всем файлам E-Kermit.