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