получить порт, к которому подключен GSM-модем, используя С#

Я планирую отправить смс с помощью модема на С# из приложения asp.net. Поскольку проект будет интегрирован в другой проект, у него не будет поля для ввода пользователем ввода COM-порта. Как я могу получить номер порта, где мой модем подключен из C#.

Спасибо, Сагар.


person Sagar    schedule 03.12.2012    source источник
comment
Как правило, эти устройства имеют команду типа HELO, которую вы можете отправить на него. Что я сделал для считывателя магтрипа, так это отправил конкретный HELO на каждый COM-порт и сохранил тот, который ответил, до конца сеанса. У вашего конкретного модема может быть специальная команда для этой цели, или они могут быть стандартизированы (не уверен ... раньше не делал этого с модемами GSM).   -  person Simon Whitehead    schedule 03.12.2012
comment
Почему бы просто не поместить имя порта в файл .config?   -  person Dennis    schedule 03.12.2012


Ответы (1)


Чтобы проверить, что модем подключен к определенному порту, вы можете отправить AT-команду на этот порт. Эта функция ниже возвращает true, если мы нашли модем на текущем COM-порту:

    private bool CheckExistingModemOnComPort(SerialPort serialPort)
    {
        if ((serialPort == null) || !serialPort.IsOpen)
            return false;

        // Commands for modem checking
        string[] modemCommands = new string[] { "AT",       // Check connected modem. After 'AT' command some modems autobaud their speed.
                                                "ATQ0" };   // Switch on confirmations
        serialPort.DtrEnable = true;    // Set Data Terminal Ready (DTR) signal 
        serialPort.RtsEnable = true;    // Set Request to Send (RTS) signal

        string answer = "";
        bool retOk = false;
        for (int rtsInd = 0; rtsInd < 2; rtsInd++)
        {
            foreach (string command in modemCommands)
            {
                serialPort.Write(command + serialPort.NewLine);
                retOk = false;
                answer = "";
                int timeout = (command == "AT") ? 10 : 20;

                // Waiting for response 1-2 sec
                for (int i = 0; i < timeout; i++)
                {
                    Thread.Sleep(100);
                    answer += serialPort.ReadExisting();
                    if (answer.IndexOf("OK") >= 0)
                    {
                        retOk = true;
                        break;
                    }
                }
            }
            // If got responses, we found a modem
            if (retOk)
                return true;

            // Trying to execute the commands without RTS
            serialPort.RtsEnable = false;
        }
        return false;
    }

На следующем этапе мы можем собрать некоторые данные с модема.

  • ATQ0 - включить подтверждения (получать OK на каждый запрос)
  • ATE0 - включить эхо
  • ATI – получить сведения о модеме
  • ATI3 — получить расширенную информацию о модеме (не все модемы поддерживают эту команду)
person sajanyamaha    schedule 03.12.2012