Пишем NetMonitor для компа самиДругие темы, косвенно связанные с тематикой сайта и форума Netmonitor.Ru, не вошедшие в другие разделы

Ответить
Аватара пользователя
SovA
Нетмониторщик
Сообщения: 39
Зарегистрирован: Пт, 10-02-2006, 07:55
Откуда: Ижевск
Нетмонитор: siemens c60

Пишем NetMonitor для компа сами

Сообщение SovA »

маленькое вступление:

многие наверно знают что с помощью кабеля из телефона можно вытащить гораздо больше информации чем используя стандартные netmonitorы телефона.
И многие начинают пробовать использовать терминальные программы для получения информации из телефона. Но использование терминала неудобно и часть людей знакомых с программированием хотят сами написать программу выдирающую данные из телефона и пишущую лог.
основным способом соединения компьютера и телефона так и остаеться старый добрый интерфейс RS-232 в просторечии COM port.

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

поэтому перебрав множество компонентов и даже написав обработку данных через WinApi думаю что для начинающих больше всего подойдет компонент TBComPort (версию которую я нашел 2.10 выпуска 2005 года) (хочу также сказать большое спасибо Брусникину И.В. majar@nm.ru за разработку данного компонента)
находил я его на сайте http://kladovka.net.ru/ прямой линк для скачивания http://kladovka.net.ru/download.cgi?id=295

Установку компонента и работу с ним я расписывамь не буду - в архиве есть документация и примеры

но на паре моментов я остановлюсь:
для начинающих актуальными командами для работы с портом (кроме настроек :) ) будут

function WriteStr(const Str: string): Integer;
function ReadStr(var Str: string; Count: Integer): Integer;

небольшое замечание по function ReadStr

есть команды (например AT+COPN) выдающие достаточно большой по размеру ответ. И возникает вопрос как его читать полностью

привожу пример процедуры читающей весь ответ

Код: Выделить всё

Function Tf_ComRw.ReadFromComm(SizeByte:Integer):String;
   var ActualSizeToRead:Integer;
       Readed:Integer;
       ReadedData,TempStr:String;
   Begin
    if BComPort.Connected then
     begin
       ActualSizeToRead:=MaxReadBytes;
       if &#40;SizeByte>0&#41; and &#40;SizeByte<MaxReadBytes&#41;
           then ActualSizeToRead&#58;=SizeByte;

      Readed&#58;=BComPort.ReadStr&#40;ReadedData,ActualSizeToRead&#41;;
      TempStr&#58;=ReadedData;
//если прочитали весь буфер значит возможно есть еще данные  - продолжаем чтение
      While Readed=ActualSizeToRead do
       Begin
 // for not freeze application
         Application.ProcessMessages;
// end not freeze
         Readed&#58;=BComPort.ReadStr&#40;ReadedData,ActualSizeToRead&#41;;
         TempStr&#58;=TempStr+ReadedData;
       End;
     Result&#58;=TempStr;
     end;
   End;
(для тех кто в танке :) по умолчанию delphi использует в качесиве string - ansistring который ограничен размером в 2 GB так что для наших нужд его должно хватит )


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

Думаю данный пост поможет начинающим программистам при разработке нового улучшенного софта для мониторинга сетей ОпСоСов
Аватара пользователя
SovA
Нетмониторщик
Сообщения: 39
Зарегистрирован: Пт, 10-02-2006, 07:55
Откуда: Ижевск
Нетмонитор: siemens c60

Сообщение SovA »

нашел еще одну статейку
http://www.xakep.ru/post/18094/default.asp
Ответить