Wi-Fi ホットスポット オフロードの廃止に関するメモ
Von Bedeutung
Windows 10 バージョン 1709 以降では、Wi-Fi ホットスポット オフロード機能は非推奨となり、使用しないでください。 代わりに、UWP アプリを記述し、Wi-Fi ホットスポット認証 API (Windows.Networking.NetworkOperators) を使用することをお勧めします。
コード サンプルと詳細については、Wi-Fi ホットスポット認証のサンプルを参照してください。
Wi-Fi オフロードを有効にするには、ホットスポット プラグインを作成してインストールします。 このトピックでは、ホットスポット プラグインを開発するときに考慮すべきいくつかの問題について説明します。 また、プラグイン パッケージの一部として実装するプラグイン API の一般的な説明も提供します。
プラグインの計画
プラグインの開発を開始する前に、次の問題に必ず対処してください。
サポートされている認証方法
プラグインがサポートするネットワークに必要な認証方法を特定します。 ホットスポット オフロード フレームワークでは、次の 3 つのクラスのネットワークがサポートされています。
WISPr 1.0 または一部のバリアントを使用して、HTTP 経由でユーザーやデバイスを認証するネットワーク。 これらのネットワークは、次の機能で表されます。
- HS_FLAG_CAPABILITY_NETWORK_AUTH_HTTP
EAP-SIM/AKA/AKA' を使用してデバイスを認証するネットワーク。 これらのネットワークは、次の機能で表されます。
- HS_FLAG_CAPABILITY_NETWORK_AUTH_EAP_SIM
- HS_FLAG_CAPABILITY_NETWORK_AUTH_EAP_AKA
- HS_フラグ_機能_ネットワーク認証_EAP_AKA_PRIME
EAP ベースのネットワークの場合、プラグインは 、HS_FLAG_CAPABILITY_NETWORK_CUSTOM_REALM 機能を使用してカスタム領域を指定することもできます。
認証を必要としないネットワーク、またはプラグインにデバイス資格情報を必要としない独立した認証メカニズムを持つネットワーク。 これらのネットワークは、次の機能で表されます。
- HS_FLAG_CAPABILITY_NETWORK_AUTH_NO_SIM (ネットワーク認証のためのSIM不要フラグ)
非表示のネットワーク
スキャン結果にネットワークが表示されないため、非表示のネットワークは初期化時に事前に指定する必要があります。 隠しネットワークのパワーとプライバシーへの影響により、フレームワークは最大 1 つの隠されたネットワークをグローバルにサポートします。 したがって、別のプラグインが隠しネットワークへの接続も要求した場合、2 番目のプラグインの要求は拒否されます。 プラグインで非表示のネットワークを構成する必要がある場合は、そのネットワークの HS_FLAG_CAPABILITY_NETWORK_TYPE_HIDDEN 機能を指定する必要があります。
他のすべてのネットワークでは、プラグインは HS_FLAG_CAPABILITY_NETWORK_TYPE_VISIBLE 機能を指定する必要があります。
ユーザー インターフェイスの表示文字列
プラグインがユーザーと通信するために使用するカスタム UI 表示文字列は、文字列テーブル (.rc ファイル内) に格納する必要があります。 プラグインは、適切な文字列を読み込むためのホット スポット オフロード サービスに文字列 ID を渡す必要があります。 現在、次の表示文字列がサポートされています。
- プロバイダー名 (最大 HS_CONST_MAX_PROVIDER_NAME_LENGTH 長)
- ネットワーク名 (最大 HS_CONST_MAX_NETWORK_DISPLAY_NAME_LENGTH 長)
- [上級] ページに表示されるメッセージ (最大 HS_CONST_MAX_ADVANCED_PAGE_STRING_LENGTH 文字長)
- HSHostSendUserMessage 関数を使用してユーザーに渡される追加の文字列 (最大 MAX_PATH 長)。 詳細については、「 HS_HOST_SEND_USER_MESSAGE」を参照してください。
手記: Wi-Fi ホットスポットオフロード機能と定数の詳細については、「 Wi-Fi ホットスポットオフロード定数」を参照してください。
プラグインの実装
プラグインは DLL として実装されます。 HSPluginGetVersion 関数と HSPluginInitPlugin 関数は、プラグイン DLL の .def ファイルで指定するか、関数実装で "__declspec(dllexport)" キーワードを追加して公開する必要があります。
初期化
プラグイン API は、初期化時に次の順序で呼び出されます。
HsPluginGetVersion
プラグインは、プラグインのバージョンがホスト デバイスのバージョンと一致することを確認するために、そのバージョン情報を返す必要があります。 現在のバージョンは定数 HS_CONST_HOST_CURRENT_API_VERSIONに格納されます。
HSPluginInitPlugin
これがメインの初期化関数です。 プラグインには次の情報が提供されます。
- ホットスポット プラグイン ホスト (HS_HOST_*\*) 関数を呼び出すたびにプラグインが使用するコンテキスト ハンドル
- ホストで現在使用されているバージョン番号 (dwVerNumUsed)
- デバイスに関する情報 (pDeviceIdentity)
- HS_FLAG_CAPABILITY_NETWORK_** 型 (dwHostCapabilities) として指定されたプラグインで使用できる OS 機能
- ホストにコールバックするためにプラグインによって使用される関数のハンドラー (pHotspotHostHandlers)
プラグインは、ホットスポット プラグイン ホストに次の情報を返します。
- プラグイン API (pHotspotPluginAPIs) の一覧を含む構造体へのポインター。 詳細については、「 HOTSPOT_PLUGIN_APIS」を参照してください。
- プラグイン プロファイル (pPluginProfile) を含む構造体へのポインター。 詳細については、「HS_PLUGIN_PROFILE」 を参照してください。
このプロファイルには、プラグインに必要なすべての機能が含まれています。 これは、ビットごとの OR 演算を使用して適用可能な機能フラグ値 (HS_FLAG_CAPABILITY_NETWORK_*) を組み合わせた結果の 1 つの値で表されます。 プラグインがHS_FLAG_CAPABILITY_NETWORK_AUTH_HTTP機能またはHS_FLAG_CAPABILITY_NETWORK_AUTH_EAP_* 機能を指定する場合、HS_PLUGIN_PROFILE構造体の dwSupportedSIMCount メンバーは、サポートされている SID の数に設定する必要があります。 プラグインは、そのHS_PLUGIN_PROFILE構造の dwNumNetworksSupported メンバーを設定することによって、サポートするネットワークの合計数も指定する必要があります。
HsPluginQueryHiddenNetwork [省略可能]
プラグインが HS_FLAG_CAPABILITY_NETWORK_TYPE_HIDDEN 機能を指定し、デバイスが隠しネットワークをサポートできる場合、この関数は、プラグインから隠されたネットワーク情報を取得するためにホットスポットプラグインホストによって呼び出されます。 詳細については、「HS_PLUGIN_QUERY_HIDDEN_NETWORK」 を参照してください。
HsPluginQuerySupportedSIMs [オプション]
プラグインが dwSupportedSIMCount に 0 以外の値を指定している場合、ホットスポット プラグイン ホストはこの関数を呼び出します。 呼び出された場合、 pNetworkIdentity 引数は NULL で、プラグインでサポートされているすべての SID の一覧を提供するためにプラグインが必要です。 この関数は、後で呼び出して、各ホットスポット ネットワークに関連付けられている SID を識別することもできます (その時点では、 pNetworkIdentity は NULL 以外になります)。 プラグインは、サポートされている SID の一覧を提供する必要があります。 詳細については、 HS_PLUGIN_QUERY_SUPPORTED_SIMSを参照してください。
実行時
ネットワークが表示されると、ホットスポット プラグイン ホストは、各ネットワークのプラグインに対してクエリを実行して、それがホットスポット ネットワークであるかどうかを判断します。
HSPluginIsHotspotNetwork
ホットスポット プラグイン ホストは、この関数を呼び出して、指定されたネットワークがホットスポット ネットワークであるかどうかを判断します。 ネットワークに関する識別情報 (SSID、認証の種類、暗号) を HS_NETWORK_IDENTITY 構造を介して渡します。 プラグインは、ネットワークの種類を示す eHS_NETWORK_STATE 列挙値を返す必要があります。 ホットスポット ネットワークの場合、ネットワークに関する情報は HS_NETWORK_PROFILE 構造を介して返されます。 詳細については、「 HS_PLUGIN_IS_HOTSPOT_NETWORK」を参照してください。
HsPluginQuerySupportedSIMs [任意]
ホットスポット プラグインホストは、プラグインがHS_PLUGIN_IS_HOTSPOT_NETWORKの呼び出しのHS_NETWORK_PROFILE引数にHS_FLAG_CAPABILITY_NETWORK_AUTH_HTTPまたはHS_FLAG_CAPABILITIES_NETWORK_AUTH_EAP機能を指定する場合に、この関数を呼び出します。 このインスタンスで呼び出される場合、pNetworkIdentity 引数は NULL 以外にする必要があり、プラグインは pNetworkIdentity でのみ指定されたネットワークでサポートされる SID の一覧を提供する必要があります。 詳細については、 HS_PLUGIN_QUERY_SUPPORTED_SIMSを参照してください。
HSPluginQueryCellularExceptionHosts 「省略可能」
ホットスポット プラグイン ホストは、プラグインによって返されるHS_NETWORK_PROFILE構造体の dwNumCellularExceptions フィールドが 0 以外の値に設定されている場合に、この関数を呼び出します。 プラグインは、呼び出されたときに携帯ネットワーク ベアラー ホストの一覧を返す必要があります。 詳細については、 HS_PLUGIN_QUERY_CELLULAR_EXCEPTION_HOSTSを参照してください。
接続時間
ネットワークが接続可能と見なされるか、ユーザーがネットワークを選択すると、次の一連の呼び出しが行われます。
HSPluginPreConnectInit
ホットスポット プラグイン ホストは、この関数を呼び出して、プラグインによって返される HS_NETWORK_IDENTITY 構造で指定されたホットスポット ネットワークへの接続が進行中であることをプラグインに通知します。 詳細については、「 HS_PLUGIN_PRE_CONNECT_INIT」を参照してください。
HSPluginStartPostConnectAuth
L2 接続が完了すると、ホットスポット プラグイン ホストはこの関数を呼び出して、認証を開始するようにプラグインに通知します。 プラグインには、HSPluginPreConnectInit の前回の呼び出しから pConnectContext、pNetworkIdentity、および pNetworkProfile が提供されますが、dwConnectionId と pSIMData も提供されます。 プラグインは接続 ID を格納し、ホストの HSHostPostConnectAuthCompletion ハンドラーを呼び戻して認証結果を OS に通知するときに使用する必要があります。また、メッセージをユーザーに伝える必要がある場合は HSHostSendUserMessage の呼び出しでも使用する必要があります。 pSIMData 構造体には、認証時にプラグインが必要とする可能性がある SIM 構成に関する追加情報が含まれています。 プラグインが Success を返す場合は、5 分以内に HSHostPostConnectAuthCompletion を 呼び出すか、接続が切断されている必要があります。
切断とリセット
ネットワークが切断されると(ユーザーまたはデバイスのアクションによって明示的に、または外部要因の結果として暗黙的に)、次の関数が呼び出されます。
HSPluginStopPostConnectAuth
ホットスポット プラグイン ホストは、デバイスがネットワークから切断されようとしているため、この関数を呼び出してネットワーク認証を終了します。 詳細については、「 HS_PLUGIN_STOP_POST_CONNECT_AUTH」を参照してください。
HSプラグインネットワークからの切断
ホットスポット プラグイン ホストは、この関数を呼び出して、デバイスがネットワークから切断されることをプラグインに通知します。 詳細については、「HS_PLUGIN_DISCONNECT_FROM_NETWORK」 を参照してください。
HSPluginReset
ホットスポット プラグイン ホストは、この関数を呼び出して、プラグインを初期状態 (読み込まれたばかり) 状態にリセットします。 詳細については、「 HS_PLUGIN_RESET」を参照してください。
定期的なコール
プラグインによって設定された特定のパラメーターに応じて、次の関数が定期的に呼び出されます。
HSPluginSendKeepAlive [オプションとして省略可能]
ホットスポット プラグイン ホストは、プラグインによって返されるHS_NETWORK_PROFILE構造体の dwKeepAliveTimeMins メンバーで指定された頻度でこの関数を呼び出します。 詳細については、 HS_PLUGIN_SEND_KEEP_ALIVEを参照してください。
HSPluginCheckForUpdates [省略可能]
ホットスポット プラグイン ホストは、HS_PLUGIN_PROFILE構造体の dwProfileUpdateTimeDays メンバーで指定された頻度でこの関数を呼び出します。
プラグインのアンロード
HSPluginDeinit
ホットスポット プラグイン ホストは、この関数を呼び出して、プラグインが未保存の情報をフラッシュし、開いているハンドルを閉じてからアンロードできるようにします。 このプラグインには、 UnloadReason 引数のアンロードの理由が指定されます。 詳細については、「HS_PLUGIN_DEINIT」 を参照してください。
プラグイン インストール パッケージ
プラグインのインストール パッケージには、次のものが含まれている必要があります。
プラグイン DLL ファイル
DLL ファイルは、署名して Programs\HotspotHost\<ProviderName> の下に配置する必要があります。ここで、 <ProviderName> は DLL プロバイダーの名前です。
DLL への署名の詳細については、「 バイナリとパッケージに署名する」を参照してください。
DLL ファイルに名前を付ける特別な規則はないため、レジストリでファイルへのパスが正しいことを確認する必要があります。 たとえば、レジストリ情報はパッケージで次のように指定できます。
<RegKeys>
<RegKey KeyName="$(hklm.software)\Microsoft\Windows Phone\HotspotOffload\Plugins\<ProviderName>">
<RegValue Name="PluginRank" Type="REG_DWORD" Value="00000005" />
<RegValue Name="PluginPath" Type="REG_SZ" Value="%SystemDrive%\Programs\HotspotHost\Orange\<ProviderName>\<HotspotPlugin.dll>" />
</RegKey>
</RegKeys>
レジストリ構成
必要なレジストリ設定は、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Phone\HotspotOffload\Plugins\ProviderName の下に作成された新しいエントリ に保存されます。
ProviderName は、プラグイン プロバイダーまたは携帯電話会社に固有である必要があります。
レジストリ キーの下に次の値を保存する必要があります。
| 名前 | タイプ | 説明 |
|---|---|---|
| PluginPath | [REG_SZ] | DLL ファイルの名前と完全パス。 |
| PluginRank | [REG_DWORD] | 1 から 250 を含む正の値 (0 は Microsoft 用に予約されています)。 値が小さいほど、優先順位が高くなります。 2 つのプラグインが同じランクを持つ場合、ホットスポット サービスは互いに任意の優先順位を付けます。 |
SSID の一覧、暗号化された資格情報など、接続に特化した情報を含むデータファイル [省略可能]
データ ファイルは次の下に保存する必要があります: Data\SharedData\HotspotHost\Plugins\<ProviderName>。