
Как научить модем понимать сигнал "занято".
Руководство к действию в трех частях.
Часть 1. Что такое "Занято" и как его
ловить? Часть 2. Волшебная команда. Часть 3. Мы не ищем легких
путей.
Часть 1. Что такое
"Занято" и как его ловить.
Порой пользователи не понимают вообще, о чем идет речь. Объясню сразу. Все
модемы должны уметь при появлении коротких гудков класть трубку и гордо сообщать
слово "BUSY". Проблема в том, что модемы, которые мы покупаем, предназначены
для других стран, в которых стандарт на сигнал "занято" может отличаться
от нашего. А может почти не отличаться. Например, в Финляндии очень похожие
стандарты, поэтому модемы для Финляндии определяют сигнал занято неплохо. Модемы
для США напротив не определяют ничего. Ну и, наконец, модемы для России (бывают
и такие) ведут себя чуть лучше, чем для США, но не всегда и не везде, а, в общем,
так себе.
Наметим три метода для исправления ситуации. 1)
Мобилизация возможностей модема. 2) Раскрытие внутренних
резервов. 3) Грубое вмешательство во
внутреннее устройство. Рассмотрим первый метод. К сожалению, в
большинстве модемов, сделанных на чипах Rockwell нет настроек для
корректировки определения сигналов АТС. Есть только несколько
режимов выдачи сообщений, которые устанавливаются командой ATXn.
Особенностью режимов X0,X1,X2 является то, что слово
"BUSY" не выдается, а по прошествии некоторого времени
после набора номера (это время, кстати, задается регистром S7)
выдается сообщение "NO CARRIER". Поэтому для определения
сигнала "Занято" необходимо, чтобы в конфигурации модема
было либо X3, либо X4. Проверьте конфигурацию модема командой
"AT&V" и убедитесь, что подобных значений нет в строке
инициализации. Все это очевидные вещи и чаще всего хоть и включен
соответствующий режим но "BUSY" модем не определяет. Для
большинства владельцев модемов эта глава окончена. Дочитывать ее до конца имеет
смысл, если у Вас модем Diamond или IDC. Для
последнего существует
ряд специальных регистров S100...S111. Как ими пользоваться
читайте в описании модема. У модемов Diamond Supra есть так называемые SC регистры (их полное описание есть здесь
). Вот кусочек из
документации:
SCn=n Telephone Signal Cadence Settings (Defaults change with
country code)
Each register "pair" holds the value for each
setting. To set a value, divide the setting by 256. The
integer value goes in the second (high byte) register, while
the remainder (low byte) goes in the first. (A setting of 516
for the Phase 1 Minimum BUSY ON Time period would convert to
2 with a of remainder 4, and could be set by sending AT SC0=4
SC1=2 to the modem.) Settings are in 1/100ths of a second.
Entries are listed as follows Minimum ON Time (2 bytes),
Maximum ON Time (2 bytes), Min. OFF Time (2 bytes), Max. OFF
Time (2 bytes), Number of valid singal cycles to occur before
the signal is accepted as valid (1 byte). Some countries
codes specify a two PHASE cadence pattern (On-Off in one
pattern followed by a different On-Off pattern) for some
singals, and in such cases, the "PHASE 2" entries
would have NON-ZERO values (the US country code setting only
supports single PHASE cadence patterns or patterns that just
repeat the same On-Off pattern over and over.)
(Listed default values are for the United States values)
SC(0-8) PHASE 1 BUSY
Minimum ON Time = 42 ( SC0=42 SC1=0 )
Maximum ON Time = 58 ( SC2=58 SC3=0 )
Minimum OFF Time = 42 ( SC4=42 SC5=0 )
Maximum OFF Time = 58 ( SC6=58 SC7=0 )
Number of Cycles = 4 ( SC8=4 )
Notes: USA (1) - SC0=22 & SC4=22 allows CONGESTION
("FAST" BUSY signals to be detected as a BUSY.)
Lithuania (370) - SC0=50 SC2=100 SC4=15 SC6=60 SC8=2 for BUSY
Если Вы не сильны в английском, поясню, что в регистры 0, 2, 4, 6 нужно заносить соответственно минимальное/максимальное время включения/выключения импульса сигнала "занято". В 8 регистр заносится минимальное число циклов, "достаточное" для
определения сигнала. Мы, конечно, хотим, чтобы сигнал "ловился" со второго гудка. Поэтому в регистр
SC8 нужно занести 2. Что касается остальных регистров, следует напомнить, что для наших АТС сигнал занято, передается импульсами длительностью 0,3...0,4 сек с такими же промежутками. Но для надежности следует установить более широкие границы захвата 0,2...0,8 сек. Делается это так.
ATSC0=20 SC1=0 SC2=80 SC3=0 SC4=20 SC5=0 SC6=80 SC7=0 SC8=2
Эти регистры не сохраняются в NVRAM и их надо добавлять в строку инициализации. Если после этого модем начнет определять сигнал, то можно сузить границы. Если же
это не имеет удовлетворительного эффекта, то дело, скорее всего, кроется в слишком сильном уровне сигнала или даже
в его частоте.
Часть 2. Волшебная команда.
Некоторые модели модемов ориентированы на продажу в нескольких странах и у них есть
несколько вариантов конфигураций. Поэтому можно попытаться сменить страну. Но сначала
выясните текущую страну. Код страны показывается по команде ATI5 (в модемах Diamond
Supra ATI6). Посмотрите по списку стран, что
это за страна. Чаще всего встречается 22 - Америка. В этом случае стоит внимательно
взглянуть на ответ модема на команду ATI3. Если она имеет примерно такой вид: >>>ATI3
>>>V1.120 022-001-K56_DLP
>>>OK
то нет смысла искать другие страны в этой прошивке, т.к. она имеет только одну страну
- США. Пропустите следующие пункты и переходите сразу к замене прошивки. Если же
надежда еще есть, то попробуйте дать модему следующие команды.
1) ATI100. Иногда в ответ он может выдать примерно следующее.
>>>ATI100
>>>UK-16,AT-01,BG-02,DM-03,FN-04,FR-05,GM-06,IT-08
>>>NL-10,NW-11,SP-13,SD-14,SW-15,AU-40,SA-99
>>>OK
Цифры, это и есть коды стран, которые нужно попытаться использовать. Подставляйте их
вместо xx в команду AT*NCxx. (Иногда пользователи не очень внимательны к командам и
вместо AT*NC16 дают команду AT*NC=16. Это не одно и то же! Правилен только первый
вариант.)
2) AT*NC? может дать примерно такой ответ.
>>>AT*NC?
>>>022 US 011
>>>001 AUS 00
>>>002 BLG 00
>>>003 DEN 009
>>>004 FIN 990
>>>005 FR 19
>>>006 GER 00
>>>007 IRE 353
>>>008 IT 00
>>>010 NL 09
>>>011 NOR 095
>>>OK
В
таком случае для смены страны используйте первые цифры в строчках.
3) Если на 1 и 2 модем ответит ERROR, то этих команд нет и у Вас есть шанс найти
возможные страны только методом перебора кодов стран от 1 до 40. Если также кроме
ERROR Вы ничего не увидите, то смысла перебирать дальше нет.
Часть 3.
Мы не ищем легких путей.
И
вот все варианты испробованы, а результат нулевой. Многие останавливались перед такими
трудностями, но мы не из них. Проведем некоторый экскурс в историю. Уже давно было
замечено, что есть прошивки позволяющие менять страны, а есть только с одной страной.
Некоторые хорошо распознают сигнал "занято", некоторые не распознают совсем.
Внимательные люди долго разглядывали эти прошивки и поняли в чем дело. Были найдены
параметры, по которым идентифицируются сигналы АТС, потом методом проб и ошибок
удалось найти подходящие параметры. Поэтому долгое время как единственный выход из
положения была замена прошивки. Путь не простой, но кардинально решающий проблему. Подробнее
об этом методе читайте в разделе "Прошивки". Но и с этим методом все
шло не так гладко. И вот как-то раз Konstantin Vasilyev заметил, что с помощью команды
AT! (уже известной ранее как способ получения содержимого ОЗУ) можно поменять те
же самые параметры определения сигналов, что и в прошивке. Прежде чем рассматривать
этот метод необходимо убедиться, что эта команда есть в Вашем модеме (если ее нет, то
остается только замена прошивки). Проверить ее наличие легко - в терминалке дайте
модему команду AT!0000, если в ответ Вы увидите
AT!0000
0000: DE FF FF 6D FF 40 FF 8B
или что-то похожее, то Вам повезло (для выхода из этого режима нажмите пробел).
Содержимое ОЗУ можно посмотреть или изменить командой
AT! <адрес> [<команда>]
Адрес задается четырехзначным числом в шестнадцатеричной системе. В режиме индикации
содержимого ОЗУ команда не задается. Для изменения ОЗУ используется команда M. Для
выхода из этих режимов нужно нажать пробел. Примеры команд:
AT!0000 начать вывод
содержимого ОЗУ с адреса 0000h;
AT!02E3M начать
редактирование содержимого ОЗУ с адреса 02E3h.
Как же использовать эти команды для решения проблемы Busy? Очень просто! Дело в том,
что часть прошивки модема копируется в ОЗУ и в ней как раз содержится информация по
константам определения сигнала "Занято". Воспользуйтесь
программой rock_ram для считывания ОЗУ модема в файл.
В этом файле надо найти примерно следующий кусок.
02BA: 02 C2 08 7C EE C2 08 74 C7 FE 74 C2 08 84 11 C2
02CA: 08 4F CD 95 64 00 FF 00 05 0D 16 C3 1B C1 15 63
02DA: 1B 0A 42 00 0E 00 13 03 01 2A 00 3A 00 2A 00 3A
02EA: 00 04 5A 00 2C 01 22 01 CC 01 01 16 00 1C 00 16
Характерным местом, в котором его можно найти является уже указанный адрес 02b7 или
около того. В принципе такой кусок входит в прошивку несколько раз, а эффект
достигается при изменении только по одному адресу. Если Вы все еще не нашли его, то
загляните в раздел "Адаптация", там это расписано подробнее.
Теперь о том, что надо на что поменять. Для приведенного выше куска это:
02BA: 02 09
и еще в одном месте, рядом с первым.
02E3: 2A 0A
02E4: 00 00
02E5: 3A 5A
02E6: 00 00
02E7: 2A 0A
02E8: 00 00
02E9: 3A 5A
02EA: 00 00
02EB: 04 02
Такой вариант вполне хорошо определяет сигнал занято. Если после этого ничего
не изменилось, то попробуйте вместо первого изменения подставить:
0A или 0C
Все это, к сожалению, не дает полной гарантии в определении сигнала занято. И если частота сигнала меньше ~350Гц или больше ~700Гц, то данным способом проблему решить
нельзя. Читайте раздел "Адаптация".
Внимание, важное замечание: после изменения ОЗУ модем нельзя
инициализировать командой ATZ, т.к. по ней содержимое ОЗУ восстанавливается из прошивки модема, и
все труды пойдут насмарку. Инициализировать нужно командой AT&F, дополняя ее по
необходимости. Таким образом, про NVRAM и сохранение в ней конфигурации модема лучше
забыть.
Для того чтобы автоматизировать эти изменения можно использовать следующие
программы:

|