Обнаружение CallerID: не работает с некоторыми телефонами

Я использую следующий метод для определения идентификатора вызывающего абонента, когда кто-то звонит.

При загрузке формы я устанавливаю следующий код:

this.serialPort1.PortName = "COM3"; 
this.serialPort1.BaudRate = 9600;
this.serialPort1.DataBits = 8;
this.serialPort1.RtsEnable = true;
this.serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
this.serialPort1.Open();
this.serialPort1.WriteLine("AT#cid=1" + System.Environment.NewLine);

void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            richTextBox1.Text += this.serialPort1.ReadLine();
            //richTextBox1.Text += this.serialPort1.ReadExisting();
            //richTextBox1.Text += this.serialPort1.ReadByte().ToString();

        }

Команда

this.serialPort1.WriteLine("AT#cid=1" + System.Environment.NewLine);

дал мне вывод

OK

Что гарантирует, что Caller Id поддерживается модемом и работает.

Я пробовал с некоторыми частными телефонными линиями в нашей стране (Индия), это дает ожидаемый результат, как показано ниже.

RING               //On 1st Ring
DATE = xxxxx       //On 2nd Ring
TIME = xxxx
NMBR = xxxxxxxxx

RING               //On 3rd Ring    
RING               //On 4th Ring

Но когда я пытаюсь использовать правительственные телефоны (компания BSNL в Индии), мне не удается передать часть DATE, TIME и NMBR. Это дает следующий вывод.

RING               //On 1st Ring    
RING               //On 3rd Ring        
RING               //On 4th Ring

Обратите внимание, что во время второго звонка ничего не отображается.

Важное примечание:

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

- Любая идея, почему я не получаю номера с телефонов BSNL, несмотря на то, что они отображаются на экране идентификатора вызывающего абонента?

Редактировать: я передаю модему следующие команды инициализации, чтобы настроить его на режим приема DTMF.

AT#CID=1  //Enable Caller ID (Verbose)
AT#VLS=0  //Voice Source--Telephone Line (Go on hook)
AT#VTD=3F,3F,3F  //Enable DTMF Transmit, Receive and Voice Online 
AT#CLS=8  //Sets Modem to Voice Mode

Заранее спасибо.


person Marshal    schedule 05.05.2011    source источник
comment
Это звонки из BSNL или им? Это через обычный старый модем POTS или сотовый?   -  person Alex K.    schedule 14.05.2011
comment
@Alex: Это звонки, поступающие на телефоны BSNL. Он использует модем для телефона и факса (модель: голосовой модем Smart Link 56K)   -  person Marshal    schedule 16.05.2011


Ответы (1)


Если вы используете универсальный модем, к сожалению, нет гарантии, что он будет работать во всех ситуациях во всех странах; например, в США используется сигнализация FSK для передачи CID по проводу, тогда как в Индии, похоже, используется сигнализация DTMF.

Вполне может быть, что BSNL использует тип сигнализации, который модем не поддерживает (если бы это был случай, когда CID просто не передавался, вы все равно ожидали бы увидеть пустой NMBR=)

Я бы проверил с модемом, который, как вы знаете, поддерживает сигнализацию DTMF.

Кроме того, если правительство звонит в офис за АТС, это может повлиять на то, как отправляется CID.

person Alex K.    schedule 16.05.2011
comment
Привет, спасибо за материалы. Да, вы правы в том, что BSNL отправляет тональные сигналы DTMF в качестве идентификатора вызывающего абонента. Во-вторых, ссылаясь на AT Command Sheet модемов Smart Link, говорится, что они поддерживают передачу и прием тонов DTMF; и для этого нам просто нужно передать модему соответствующие AT-команды. Я отредактировал свой ответ, чтобы показать, какие команды я передаю - person Marshal; 16.05.2011
comment
Я подозреваю, что это только для DTMF во время разговора; т.е. что происходит при нажатии клавиши не для сигнализации CID - person Alex K.; 16.05.2011