Получение сообщений USSD, не работающих на устройствах HSDPA Windows Mobile 6.5 (Opennetcf.Telephony) - PullRequest
3 голосов
/ 20 октября 2011

Я использую OpenNetCF.Telephony (доступно здесь http://tapi.codeplex.com), с этой оболочкой, довольно просто использовать TAPI для отправки и получения USSD-сообщений; до сих пор я использовал ее со многими устройствами GSM, и она работала flawlessy !!!

Недавно я протестировал свою программу на Motorola MC65 и ES400, обоих устройствах HSDPA 3.5G, и смог без проблем отправить свой USSD-запрос, но ответ не был пойман функцией чтения сообщения; Странно то, что это тот же код, который отлично работал на всех других устройствах GSM, с которыми я работал, так как USSD отображает всплывающее окно при ответе, я знаю, что сервер Carrier отвечает довольно быстро, но мой вызов LineGetMessage срабатывает тайм-аут, не замечая, что ответ был получен ...

Вот фрагмент небольшого примера, который я сделал для проверки функциональности, его можно протестировать где угодно, поскольку платформа любого оператора связи ответит «НЕИЗВЕСТНОЕ ПРИЛОЖЕНИЕ» или аналогичным сообщением, если оно не ожидает отправленного сообщения, но даже этот ответ не пойман ...

        private void btnUSSDSend_Click(object sender, EventArgs e)
    {
        int ret = 0; 
        for (int i = 0; i < m_tapi.NumberOfDevices; i++)
        {

            DeviceCapabilities dc = new DeviceCapabilities(LINE_DEV_CAPS_INITIAL_SIZE); //LINEDEVCAPS
            dc.Store(); 
            int dwVersion = m_tapi.NegotiateVersion(i);
            ret = NativeMethods.lineGetDevCaps(m_tapi.hLineApp, i, dwVersion, 0, dc.Data); //NativeTapi.lineGetDevCaps
            if (ret < 0)
            {
                MessageBox.Show(((ErrorCode)ret).ToString()); //LINEERR
            }

            if ((ErrorCode)ret == ErrorCode.StructureTooSmall)  //LINEERR  STRUCTURETOOSMALL
            {
                dc.Data = new byte[dc.NeededSize]; //dc.dwNeededSize
                ret = NativeMethods.lineGetDevCaps(m_tapi.hLineApp, i, dwVersion, 0, dc.Data); //NativeTapi
            }

            dc.Load();

            DeviceCaps.Add( i, dc);

            AddressStatus ac = new AddressStatus(1024);
            ac.Store();
            ret = NativeMethods.lineGetAddressCaps(m_tapi.hLineApp, i, 0, dwVersion, 0, ac.Data); //NativeTapi
            ac.Load();
            ac = null;

        }


        bool found = false;
        foreach (KeyValuePair<int, DeviceCapabilities> entry in DeviceCaps) //LINEDEVCAPS
        {
            DeviceCapabilities dc = entry.Value;  //LINEDEVCAPS 
            found = true;
            if (dc != null && dc.ProviderName.StartsWith(NativeMethods.CELLTSP_PROVIDERINFO_STRING)) //CellTSP.CELLTSP_PROVIDERINFO_STRING
            {
                m_line = m_tapi.CreateLine(entry.Key,  MediaMode.DataModem  | MediaMode.InteractiveVoice, CallPrivilege.Monitor |CallPrivilege.Owner ); //LINEMEDIAMODE LINECALLPRIVILEGE

                byte[] dialArray; 
                LineMessage msg; //LINEMESSAGE
                int flags = 0;
                byte[] chResponse;
                string Mensaje="";
                string dial = "*888#";
                int continuetonext = 0;
            needtosendanother:
                dialArray= Encoding.Unicode.GetBytes(dial);
                int length = dialArray.Length;
                int result = NativeMethods.lineSendUSSD(m_line.hLine, dialArray, dialArray.Length, 0); 
                AddMessage(dial, 0);


                while ( NativeMethods.lineGetMessage(m_tapi.hLineApp, out msg,10000)==0 ) //NativeTapi
                { 
                    if (msg.MessageID == LineMessages.LINE_DEVSPECIFIC && (int)(msg.Param1) == (int)LineMessages.LINE_USSD) //msg.dwMessageID | LINEMESSAGES | LINEDEVSPECIFIC_CELLTSP
                    {
                        flags = 0;
                        chResponse = new byte[(int)(msg.Param3)]; //msg.dwParam3
                        result = NativeMethods.lineGetUSSD(m_line.hLine, (int)(msg.Param2), chResponse, chResponse.Length, out flags); 
                        Mensaje = Encoding.Unicode.GetString(chResponse, 0, chResponse.Length);
                        AddMessage(Mensaje, 1);
                        break;
                    }
                }
                //in case I have to respond to another message
                if (Mensaje.ToUpper().Contains("ENTER PIN:"))
                {
                    continuetonext = 1;
                    dial = "1234";
                }
                //some more conditions here...
                //
                if (Mensaje.ToUpper().Contains("TRANSFERED"))
                {
                    continuetonext = 0;
                    dial = "TRANSFERED";
                }
                if (Mensaje.ToUpper().Contains("FAILED") || Mensaje.ToUpper().Contains("ERROR"))
                {
                    continuetonext = 0;
                    dial = "ERROR";
                }
                if (continuetonext==1) goto needtosendanother;
            }

        }

        if (!found)
        {
            MessageBox.Show("Error - line not found");
            return;
        }
    }

Это код, который не получает ответ, он каждый раз срабатывает по таймауту :(

while (NativeMethods.lineGetMessage (m_tapi.hLineApp, out msg, 10000) == 0)

Я знаю, что инициализировал TAPI правильно, так как я отправил параметр для регистрации событий, фактически ему удается получить подтверждение Linemessage от отправки запроса USSD, который обрабатывается другим потоком, созданным в оболочке TAPI, но событие фактического ответа никогда не возникает в этих устройствах.

Нужно ли что-то изменить, чтобы заставить работать устройства 3 / 3.5G? Я сравнивал все, что делают устройства 2G (с кодом), кажется, что все работает точно так же, просто чтение ответа - проблема, у меня действительно нет никакого понятия, как заставить это работать ...

Заранее спасибо за любые другие идеи, которые можно попробовать или параметры изменить ...

...