2012-03-30 62 views
1

&をMobile Broadband APIで実行しようとしています。私はC#から、hereという命令を使って使っています。モバイルブロードバンドAPI:ピンが必要ですが、ピンが設定されていますが、ピンが設定されています

モデムデバイスがロックされている(つまりPINが必要な)ときは、プログラムでピンを設定して接続を続けるが、後者は「ピンが必要」で失敗する"私はPINを正しく設定していますが、

モバイルブロードバンドAPIは、ピンを設定するIMbnPinインタフェースを提供していますが、これは非同期操作ですので、あなたは、操作が完了したことを知らせるOnEnterCompleteイベント(IMbnPinEventsインタフェースの一部)に登録する必要があります。私はこれで十分だと思ったが、明らかにそうではない。

以下のクラスは、この問題を示す最小限の自己完結型のサンプルです。あなたは、このようなコンソールアプリケーションでそれを使用することができます。

var testInstance = new MbnTest(); 
testInstance.Test("XXXX"); // replace with actual PIN code 

(また、あなたはhereを見つけることができ、それをコンパイルするために相互運用機能DLLが必要になります)

テストクラスが間に調整するManualResetEventフィールドが含まれていますEnterメソッドとOnEnterCompleteメソッド

私はIMbnPinEventsに登録し、IMbnPinをインスタンス化し、(非同期の)Enterメソッドを呼び出し、ManualResetEvent.WaitOneを呼び出して現在のスレッドをブロックします。 OnEnterCompleteでは、ピンが正しく設定されていることを確認し、ManualResetEventに信号を送り、Testメソッドが実行を継続するようにします。その直後にTryToGetConnectionState()呼び出しを続けると、例外E_MBN_PIN_REQUIRED(0x80548210)が発生します。 Console.ReadLine()を使用して「十分に長い」待機しても、すべて正常に動作します。だから私は別のイベントを待つ必要があるように見えますが、どちらが見つかるかわかりません。

アイデア?私は何が欠けていますか?

// warning: this is sample code, needs to be better structured for production use 
class MbnTest : IMbnPinEvents 
{ 
    private readonly ManualResetEvent _resetEventPin = new ManualResetEvent(false); 

    public void Test(string pinCode) 
    { 
     var interfacemanager = (IMbnInterfaceManager)new MbnInterfaceManager(); 

     SubscribeToPinEvents(interfacemanager); 

     var mbnPin = GetPin(interfacemanager); 

     uint requestId; 
     Trace.WriteLine("Setting PIN"); 
     mbnPin.Enter(pinCode, out requestId); 
     Trace.WriteLine("Waiting for OnEnterComplete"); 

     // wait for the OnEnterComplete event 
     _resetEventPin.WaitOne(); 

     Trace.WriteLine("press enter to retrieve connection state"); 
     Console.ReadLine(); 

     TryToGetConnectionState(); 
    } 

    void IMbnPinEvents.OnEnterComplete(IMbnPin pin, ref MBN_PIN_INFO pinInfo, uint requestID, int status) 
    { 
     // reports MBN_PIN_STATE_NONE which means no pin is required 
     Trace.WriteLine(string.Format("OnEnterComplete: pin state = {0}", pinInfo.pinState)); 
     // signal the ManualResetEvent to unblock the thread waiting for the Enter Pin operation to complete 
     _resetEventPin.Set(); 
    } 

    private void SubscribeToPinEvents(IMbnInterfaceManager interfacemanager) 
    { 
     Trace.WriteLine("Subscribing to IMbnPinEvents"); 
     var guidPinEvents = typeof (IMbnPinEvents).GUID; 
     var connectionPointContainer = (IConnectionPointContainer) interfacemanager; 
     IConnectionPoint connectionPoint; 
     connectionPointContainer.FindConnectionPoint(ref guidPinEvents, out connectionPoint); 
     uint cookie; 
     connectionPoint.Advise(this, out cookie); 
    } 

    private static IMbnPin GetPin(IMbnInterfaceManager interfacemanager) 
    { 
     IMbnInterface mbnInterface = interfacemanager.GetInterfaces().OfType<IMbnInterface>().First(); 
     Trace.WriteLine(string.Format("mbnInterface: {0}", mbnInterface.GetReadyState())); 

     var pinMgr = (IMbnPinManager)mbnInterface; 
     var mbnPin = pinMgr.GetPin(MBN_PIN_TYPE.MBN_PIN_TYPE_PIN1); 
     return mbnPin; 
    } 

    private static void TryToGetConnectionState() 
    { 
     Trace.WriteLine("Retrieving mbn connection"); 
     var connectionManager = (IMbnConnectionManager)new MbnConnectionManager(); 
     var mbnConnection = connectionManager.GetConnections().OfType<IMbnConnection>().First(); 
     Trace.WriteLine(string.Format("connection: {0}", mbnConnection.ConnectionID)); 
     MBN_ACTIVATION_STATE state; 
     string profilename; 
     mbnConnection.GetConnectionState(out state, out profilename); 
    } 


    void IMbnPinEvents.OnChangeComplete(IMbnPin pin, ref MBN_PIN_INFO pinInfo, uint requestID, int status) 
    { 
     throw new NotImplementedException(); 
    } 

    void IMbnPinEvents.OnEnableComplete(IMbnPin pin, ref MBN_PIN_INFO pinInfo, uint requestID, int status) 
    { 
     throw new NotImplementedException(); 
    } 

    void IMbnPinEvents.OnDisableComplete(IMbnPin pin, ref MBN_PIN_INFO pinInfo, uint requestID, int status) 
    { 
     throw new NotImplementedException(); 
    } 


    void IMbnPinEvents.OnUnblockComplete(IMbnPin pin, ref MBN_PIN_INFO pinInfo, uint requestID, int status) 
    { 
     throw new NotImplementedException(); 
    } 

} 

答えて

1

私は答えを見つけました:接続を行う前にネットワーク登録がアクティブになるのを待つ必要がありました。後天的なことは明らかです。 (すなわち、1つの 登録状態が「登録」されているかどうかを確認し、IMbnRegistrationEvents.OnRegisterStateChange方法でIMbnRegistrationEventsインターフェイスに

  • をサブスクライブ、

    • ピンを設定する前に:それを動作させるために、私は次の変更を行いました値MBN_REGISTER_STATE_HOME、 MBN_REGISTER_STATE_ROAMINGまたはMBN_REGISTER_STATE_PARTNER)。

    その後、IMbnConnection.Connectメソッドを使用してブロードバンド接続を作成できます。

    こんにちは、この文書を見つけるのは難しいです... msdnにはMobile Broadband Connection Manager Development Guideがありますが、そこに詳細は見つかりませんでした。また、この動作にプロバイダー固有またはデバイス固有のものがあるかどうかはわかりません。

  • +0

    私は同じ問題があり、その説明を見つけることができませんでした。しかし、この問題はWindows 7で一時的な接続プロファイル( 'MBN_CONNECTION_MODE.MBN_CONNECTION_MODE_TMP_PROFILE')が発生した場合にのみ発生します。一方、Windows 10では、一時的な接続プロファイルを使用しても問題はありませんでした。両方のマシンは同じタイプです。 – creg

    関連する問題