C#读取Windows Mobile Broadband连接属性
本文关键字:连接 属性 Broadband Mobile 读取 Windows | 更新日期: 2023-09-27 18:29:59
首先,这里是背景:
我们有一个Windows窗体应用程序(用C#编写,.NET Framework 3.5),目前正在完整的Windows 7平板电脑上运行,该平板电脑内置了用于数据连接的3G模块。数据连接在Windows中配置为正常的移动宽带连接(因此Windows自己管理连接),连接显示在"控制面板">"网络和Internet">"Network Connections"中,工作正常-应用程序能够通过Internet与我们的web服务进行通信。在未来的某个时候,我们将转向另一种设备(可能是一款完整的基于Windows 8的平板电脑)。
现在,我需要做的是读取这个移动宽带连接的连接状态;即获得信号强度和运营商名称(例如Vodafone UK)。我已经找到了一种使用Windows 7 SDK中的移动宽带API部分来实现这一点的方法(请参阅此处和此处),但这似乎是特定于操作系统的,因为它在Windows 8上不起作用,或者至少不与我这里的设备一起使用。
有没有一种通用的方法可以使用.NET框架读取移动宽带连接属性?
或者,有人知道一个Windows 8 SDK,它包含一个移动宽带API,就像我目前使用的Windows 7一样?
提前谢谢。
更新-我现在已经在一系列不同的Win7/Win8设备上完成了这项工作。即使联想设备也工作正常。我会张贴主要位的示例代码(读取连接状态、配置连接、检查SIM卡状态)作为答案;令人恼火的是,代码有点太长了,不适合讨论这个问题。
以编程方式配置连接(您需要APN详细信息):
try
{
MbnInterfaceManager mbnInfMgr = new MbnInterfaceManager();
IMbnInterfaceManager mbnInfMgrInterface = mbnInfMgr as IMbnInterfaceManager;
if (mbnInfMgrInterface != null)
{
IMbnInterface[] mobileInterfaces = mbnInfMgrInterface.GetInterfaces() as IMbnInterface[];
if (mobileInterfaces != null && mobileInterfaces.Length > 0)
{
// Just use the first interface
IMbnSubscriberInformation subInfo = mobileInterfaces[0].GetSubscriberInformation();
if (subInfo != null)
{
SIMNumber = subInfo.SimIccID;
// Get the connection profile
MbnConnectionProfileManager mbnConnProfileMgr = new MbnConnectionProfileManager();
IMbnConnectionProfileManager mbnConnProfileMgrInterface = mbnConnProfileMgr as IMbnConnectionProfileManager;
if (mbnConnProfileMgrInterface != null)
{
bool connProfileFound = false;
string profileName = String.Empty;
try
{
IMbnConnectionProfile[] mbnConnProfileInterfaces = mbnConnProfileMgrInterface.GetConnectionProfiles(mobileInterfaces[0]) as IMbnConnectionProfile[];
foreach (IMbnConnectionProfile profile in mbnConnProfileInterfaces)
{
string xmlData = profile.GetProfileXmlData();
if (xmlData.Contains("<SimIccID>" + SIMNumber + "</SimIccID>"))
{
connProfileFound = true;
bool updateRequired = false;
// Check if the profile is set to auto connect
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlData);
profileName = xdoc["MBNProfile"]["Name"].InnerText;
if (xdoc["MBNProfile"]["ConnectionMode"].InnerText != "auto")
{
xdoc["MBNProfile"]["ConnectionMode"].InnerText = "auto";
updateRequired = true;
}
// Check the APN settings
if (xdoc["MBNProfile"]["Context"] == null)
{
XmlElement context = (XmlElement)xdoc["MBNProfile"].AppendChild(xdoc.CreateElement("Context", xdoc["MBNProfile"].NamespaceURI));
context.AppendChild(xdoc.CreateElement("AccessString", xdoc["MBNProfile"].NamespaceURI));
context.AppendChild(xdoc.CreateElement("Compression", xdoc["MBNProfile"].NamespaceURI));
context.AppendChild(xdoc.CreateElement("AuthProtocol", xdoc["MBNProfile"].NamespaceURI));
updateRequired = true;
}
if (xdoc["MBNProfile"]["Context"]["AccessString"].InnerText != APNAccessString)
{
xdoc["MBNProfile"]["Context"]["AccessString"].InnerText = APNAccessString;
updateRequired = true;
}
if (xdoc["MBNProfile"]["Context"]["Compression"].InnerText != APNCompression)
{
xdoc["MBNProfile"]["Context"]["Compression"].InnerText = APNCompression;
updateRequired = true;
}
if (xdoc["MBNProfile"]["Context"]["AuthProtocol"].InnerText != APNAuthProtocol)
{
xdoc["MBNProfile"]["Context"]["AuthProtocol"].InnerText = APNAuthProtocol;
updateRequired = true;
}
if (xdoc["MBNProfile"]["Context"]["UserLogonCred"] == null && !String.IsNullOrEmpty(APNUsername))
{
XmlElement userLogonCred = (XmlElement)xdoc["MBNProfile"]["Context"].InsertAfter(xdoc.CreateElement("UserLogonCred", xdoc["MBNProfile"].NamespaceURI), xdoc["MBNProfile"]["Context"]["AccessString"]);
userLogonCred.AppendChild(xdoc.CreateElement("UserName", xdoc["MBNProfile"].NamespaceURI));
userLogonCred.AppendChild(xdoc.CreateElement("Password", xdoc["MBNProfile"].NamespaceURI));
updateRequired = true;
}
if (xdoc["MBNProfile"]["Context"]["UserLogonCred"] != null && xdoc["MBNProfile"]["Context"]["UserLogonCred"]["UserName"].InnerText != APNUsername)
{
xdoc["MBNProfile"]["Context"]["UserLogonCred"]["UserName"].InnerText = APNUsername;
updateRequired = true;
}
if (xdoc["MBNProfile"]["Context"]["UserLogonCred"] != null && xdoc["MBNProfile"]["Context"]["UserLogonCred"]["Password"] == null && !String.IsNullOrEmpty(APNUsername))
{
xdoc["MBNProfile"]["Context"]["UserLogonCred"].AppendChild(xdoc.CreateElement("Password", xdoc["MBNProfile"].NamespaceURI));
}
if (xdoc["MBNProfile"]["Context"]["UserLogonCred"] != null && xdoc["MBNProfile"]["Context"]["UserLogonCred"]["Password"].InnerText != APNPassword)
{
xdoc["MBNProfile"]["Context"]["UserLogonCred"]["Password"].InnerText = APNPassword;
updateRequired = true;
}
if (updateRequired)
{
// Update the connection profile
profile.UpdateProfile(xdoc.OuterXml);
}
}
}
}
catch (Exception ex)
{
if (!ex.Message.Contains("Element not found"))
{
throw ex;
}
}
if (!connProfileFound)
{
// Create the connection profile
XmlDocument xdoc = new XmlDocument();
xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "utf-8", "yes"));
XmlElement mbnProfile = (XmlElement)xdoc.AppendChild(xdoc.CreateElement("MBNProfile", "http://www.microsoft.com/networking/WWAN/profile/v1"));
mbnProfile.AppendChild(xdoc.CreateElement("Name", xdoc["MBNProfile"].NamespaceURI)).InnerText = SIMNumber;
mbnProfile.AppendChild(xdoc.CreateElement("IsDefault", xdoc["MBNProfile"].NamespaceURI)).InnerText = "true";
mbnProfile.AppendChild(xdoc.CreateElement("ProfileCreationType", xdoc["MBNProfile"].NamespaceURI)).InnerText = "DeviceProvisioned";
mbnProfile.AppendChild(xdoc.CreateElement("SubscriberID", xdoc["MBNProfile"].NamespaceURI)).InnerText = subInfo.SubscriberID;
mbnProfile.AppendChild(xdoc.CreateElement("SimIccID", xdoc["MBNProfile"].NamespaceURI)).InnerText = SIMNumber;
mbnProfile.AppendChild(xdoc.CreateElement("HomeProviderName", xdoc["MBNProfile"].NamespaceURI)).InnerText = SIMNumber;
mbnProfile.AppendChild(xdoc.CreateElement("AutoConnectOnInternet", xdoc["MBNProfile"].NamespaceURI)).InnerText = "true";
mbnProfile.AppendChild(xdoc.CreateElement("ConnectionMode", xdoc["MBNProfile"].NamespaceURI)).InnerText = "auto";
XmlElement context = (XmlElement)xdoc["MBNProfile"].AppendChild(xdoc.CreateElement("Context", xdoc["MBNProfile"].NamespaceURI));
context.AppendChild(xdoc.CreateElement("AccessString", xdoc["MBNProfile"].NamespaceURI));
XmlElement userLogonCred = (XmlElement)context.AppendChild(xdoc.CreateElement("UserLogonCred", xdoc["MBNProfile"].NamespaceURI));
userLogonCred.AppendChild(xdoc.CreateElement("UserName", xdoc["MBNProfile"].NamespaceURI));
userLogonCred.AppendChild(xdoc.CreateElement("Password", xdoc["MBNProfile"].NamespaceURI));
context.AppendChild(xdoc.CreateElement("Compression", xdoc["MBNProfile"].NamespaceURI));
context.AppendChild(xdoc.CreateElement("AuthProtocol", xdoc["MBNProfile"].NamespaceURI));
xdoc["MBNProfile"]["Context"]["AccessString"].InnerText = APNAccessString;
xdoc["MBNProfile"]["Context"]["UserLogonCred"]["UserName"].InnerText = APNUsername;
xdoc["MBNProfile"]["Context"]["UserLogonCred"]["Password"].InnerText = APNPassword;
xdoc["MBNProfile"]["Context"]["Compression"].InnerText = APNCompression;
xdoc["MBNProfile"]["Context"]["AuthProtocol"].InnerText = APNAuthProtocol;
profileName = xdoc["MBNProfile"]["Name"].InnerText;
mbnConnProfileMgrInterface.CreateConnectionProfile(xdoc.OuterXml);
}
// Register the connection events
MbnConnectionManager connMgr = new MbnConnectionManager();
IConnectionPointContainer connPointContainer = connMgr as IConnectionPointContainer;
Guid IID_IMbnConnectionEvents = typeof(IMbnConnectionEvents).GUID;
IConnectionPoint connPoint;
connPointContainer.FindConnectionPoint(ref IID_IMbnConnectionEvents, out connPoint);
ConnectionEventsSink connEventsSink = new ConnectionEventsSink();
connPoint.Advise(connEventsSink, out cookie); if (showProgress) { MessageBox.Show("After registering events"); }
// Connect
IMbnConnection connection = mobileInterfaces[0].GetConnection();
if (connection != null)
{
MBN_ACTIVATION_STATE state;
string connectionProfileName = String.Empty;
connection.GetConnectionState(out state, out connectionProfileName);
if (state != MBN_ACTIVATION_STATE.MBN_ACTIVATION_STATE_ACTIVATED && state != MBN_ACTIVATION_STATE.MBN_ACTIVATION_STATE_ACTIVATING)
{
if (String.IsNullOrEmpty(connectionProfileName))
{
connectionProfileName = profileName;
}
uint requestID;
connection.Connect(MBN_CONNECTION_MODE.MBN_CONNECTION_MODE_PROFILE, connectionProfileName, out requestID);
}
else
{
// Do nothing, already connected
}
}
else
{
MessageBox.Show("Connection not found.");
}
}
else
{
MessageBox.Show("mbnConnProfileMgrInterface is null.");
}
}
else
{
MessageBox.Show("No subscriber info found.");
}
}
else
{
MessageBox.Show("No mobile interfaces found.");
}
}
else
{
MessageBox.Show("mbnInfMgrInterface is null.");
}
}
catch (Exception ex)
{
if (ex.Message.Contains("SIM is not inserted."))
{
SIMNumber = "No SIM inserted.";
}
MessageBox.Show("LoginForm.DataConnection ConfigureWindowsDataConnection Error " + ex.Message);
}
读取连接状态:
try
{
MbnInterfaceManager mbnInfMgr = new MbnInterfaceManager();
IMbnInterfaceManager mbnInfMgrInterface = mbnInfMgr as IMbnInterfaceManager;
if (mbnInfMgrInterface != null)
{
IMbnInterface[] mobileInterfaces = mbnInfMgrInterface.GetInterfaces() as IMbnInterface[];
if (mobileInterfaces != null && mobileInterfaces.Length > 0)
{
// Use the first interface, as there should only be one mobile data adapter
IMbnSignal signalDetails = mobileInterfaces[0] as IMbnSignal;
Int32.TryParse(signalDetails.GetSignalStrength().ToString(), out PhoneSignal);
PhoneSignal = Convert.ToInt32(((float)PhoneSignal / 16) * 100);
MBN_PROVIDER provider = mobileInterfaces[0].GetHomeProvider();
PhoneNetwork = provider.providerName.ToString();
if (String.IsNullOrEmpty(SIMNumber))
{
try
{
IMbnSubscriberInformation subInfo = mobileInterfaces[0].GetSubscriberInformation();
if (subInfo != null)
{
SIMNumber = subInfo.SimIccID;
}
else
{
SIMNumber = "Unable to read SIM info";
}
}
catch (Exception)
{
SIMNumber = "Unable to read SIM info";
}
}
// Check whether the connection is active
IMbnConnection connection = mobileInterfaces[0].GetConnection();
if (connection != null)
{
MBN_ACTIVATION_STATE state;
string profileName = String.Empty;
connection.GetConnectionState(out state, out profileName);
Connected = (state == MBN_ACTIVATION_STATE.MBN_ACTIVATION_STATE_ACTIVATED);
}
else
{
MessageBox.Show("Connection not found.");
}
}
else
{
MessageBox.Show("No mobile interfaces found.");
}
}
else
{
MessageBox.Show("mbnInfMgrInterface is null.");
}
}
catch (Exception ex)
{
if (ex.Message.Contains("SIM is not inserted."))
{
SIMNumber = "No SIM inserted.";
}
else
{
MessageBox.Show("LoginForm.DataConnection GetWindowsMobileDataStatus " + ex.Message);
}
PhoneSignal = 0;
PhoneNetwork = "Unknown";
}
移动宽带API也可在Windows 8桌面中使用。
如果您使用的是Windows 8 Metro/RT/任何名称,您都需要这些WindowsRT API(Windows.Connectivity.NetworkInformation等)。
检查SIM是否插入并工作/激活:
try
{
MbnInterfaceManager mbnInfMgr = new MbnInterfaceManager();
IMbnInterfaceManager mbnInfMgrInterface = mbnInfMgr as IMbnInterfaceManager;
if (mbnInfMgrInterface != null)
{
IMbnInterface[] mobileInterfaces = mbnInfMgrInterface.GetInterfaces() as IMbnInterface[];
if (mobileInterfaces != null && mobileInterfaces.Length > 0)
{
try
{
MBN_READY_STATE readyState = mobileInterfaces[0].GetReadyState();
switch (readyState)
{
case MBN_READY_STATE.MBN_READY_STATE_BAD_SIM:
MessageBox.Show("The SIM is invalid (PIN Unblock Key retrials have exceeded the limit).");
break;
case MBN_READY_STATE.MBN_READY_STATE_DEVICE_BLOCKED:
MessageBox.Show("The device is blocked by a PIN or password which is preventing the device from initializing and registering onto the network.");
break;
case MBN_READY_STATE.MBN_READY_STATE_DEVICE_LOCKED:
MessageBox.Show("The device is locked by a PIN or password which is preventing the device from initializing and registering onto the network.");
break;
case MBN_READY_STATE.MBN_READY_STATE_FAILURE:
MessageBox.Show("General device failure.");
break;
case MBN_READY_STATE.MBN_READY_STATE_INITIALIZED:
try
{
IMbnSubscriberInformation subInfo = mobileInterfaces[0].GetSubscriberInformation();
if (subInfo != null)
{
SIMNumber = subInfo.SimIccID;
}
else
{
SIMNumber = "Unable to read SIM info";
}
}
catch (Exception)
{
SIMNumber = "Unable to read SIM info";
}
IMbnRegistration registration = mobileInterfaces[0] as IMbnRegistration;
if (registration != null)
{
try
{
MBN_REGISTER_STATE regState = registration.GetRegisterState();
switch (regState)
{
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_DENIED:
// SIM Inactive
simInactive = true;
MessageBox.Show("The device was denied registration. The most likely cause of this error is an Inactive SIM.");
break;
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_DEREGISTERED:
// Do nothing - this is returned before the device has tried to register
break;
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_HOME:
// Do nothing
break;
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_NONE:
MessageBox.Show("The device registration state is unknown. This state may be set upon failure of registration mode change requests.");
break;
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_PARTNER:
// Do nothing
break;
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_ROAMING:
// Do nothing
break;
case MBN_REGISTER_STATE.MBN_REGISTER_STATE_SEARCHING:
// Do nothing
break;
default:
MessageBox.Show("GetRegisterState returned an unexpected state: " + regState.ToString());
break;
}
}
catch (Exception ex)
{
MessageBox.Show("GetRegisterState Error: " + ex.Message);
}
}
break;
case MBN_READY_STATE.MBN_READY_STATE_NOT_ACTIVATED:
MessageBox.Show("The subscription is not activated.");
break;
case MBN_READY_STATE.MBN_READY_STATE_OFF:
MessageBox.Show("The mobile broadband device stack is off.");
break;
case MBN_READY_STATE.MBN_READY_STATE_SIM_NOT_INSERTED:
MessageBox.Show("The SIM is not inserted.");
break;
default:
MessageBox.Show("GetReadyState returned an unexpected state: " + readyState.ToString());
break;
}
}
catch (Exception ex)
{
MessageBox.Show("GetReadyState Error: " + ex.Message);
}
}
else
{
MessageBox.Show("No mobileInterfaces found.");
}
}
else
{
MessageBox.Show("mbnInfMgrInterface is null.");
}
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
响应连接事件(事件在上例中注册):
public class ConnectionEventsSink : IMbnConnectionEvents
{
public ConnectionEventsSink() { }
public void OnConnectComplete(IMbnConnection connection, uint requestID, int status)
{
// Un-register the connect event - you might not want to do this, depends on your own requirements. Do do this you need the cookie uint from when the events were registered.
MbnConnectionManager connMgr = new MbnConnectionManager();
IConnectionPointContainer connPointContainer = connMgr as IConnectionPointContainer;
Guid IID_IMbnConnectionEvents = typeof(IMbnConnectionEvents).GUID;
IConnectionPoint connPoint;
connPointContainer.FindConnectionPoint(ref IID_IMbnConnectionEvents, out connPoint);
connPoint.Unadvise(cookie);
switch (status)
{
case 0:
MobileBroadbandTest.Connected = true;
MessageBox.Show("Connected");
break;
case -2141945334:
MessageBox.Show("There is no SIM in the device.");
break;
case -2141945328:
MessageBox.Show("A PIN is required for the operation to complete.");
break;
case -2141945335:
MessageBox.Show("The network service subscription has expired.");
break;
case -2141945337:
MessageBox.Show("The provider is not visible. This applies only to manual registration mode.");
break;
case -2141945340:
MessageBox.Show("The connection access string is not correct.");
break;
case -2141945333:
MessageBox.Show("An active voice call is in progress.");
break;
case -2141945339:
MessageBox.Show("There is already an Mobile Broadband context active. The Mobile Broadband service does not currently support multiple active contexts.");
break;
case -2141945336:
MessageBox.Show("The device radio is off.");
break;
case -2141945338:
MessageBox.Show("No active attached packet service is available.");
break;
case -2141945326:
MessageBox.Show("Generic Failure.");
break;
case -2141945320:
MessageBox.Show("Profile is invalid.");
break;
case -2141945319:
MessageBox.Show("Default profile exist.");
break;
case -2141945327:
MessageBox.Show("PIN is disabled.");
break;
case -2141945329:
MessageBox.Show("Pin is not supported.");
break;
case -2141945330:
MessageBox.Show("Providers not found.");
break;
case -2141945331:
MessageBox.Show("Device is not registered.");
break;
case -2141945332:
MessageBox.Show("Visible provider cache is invalid.");
break;
case -2141945341:
MessageBox.Show("Requested data class is not available.");
break;
case -2141945342:
MessageBox.Show("Bad SIM is inserted.");
break;
case -2141945343:
MessageBox.Show("Context is not activated.");
break;
default:
MessageBox.Show("Unexpected status: " + status.ToString());
break;
}
}
public void OnVoiceCallStateChange(IMbnConnection connection)
{
// Do nothing
}
public void OnConnectStateChange(IMbnConnection connection)
{
// Do nothing
}
public void OnDisconnectComplete(IMbnConnection connection, uint requestID, int status)
{
// Do nothing
}
}