многие наверно знают что с помощью кабеля из телефона можно вытащить гораздо больше информации чем используя стандартные 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 (SizeByte>0) and (SizeByte<MaxReadBytes)
then ActualSizeToRead:=SizeByte;
Readed:=BComPort.ReadStr(ReadedData,ActualSizeToRead);
TempStr:=ReadedData;
//если прочитали весь буфер значит возможно есть еще данные - продолжаем чтение
While Readed=ActualSizeToRead do
Begin
// for not freeze application
Application.ProcessMessages;
// end not freeze
Readed:=BComPort.ReadStr(ReadedData,ActualSizeToRead);
TempStr:=TempStr+ReadedData;
End;
Result:=TempStr;
end;
End;
Теперь давайте разберемся с таймаутами
Часто (покрайней мере у меня) возникала ситуация что строка при чтении приходит не полностью и часть (окончание) ответа приходит после следующего чтения из порта.
Даю направление куда копать: ReadInterval и ReadTotalConstant
первое отвечает за максимальное время, в миллисекундах, допустимое между двумя последовательными символами, а второй задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции чтения.
Думаю данный пост поможет начинающим программистам при разработке нового улучшенного софта для мониторинга сетей ОпСоСов