📄 ril.cs
字号:
case RIL_NOTIFY_SIGNALQUALITY:
RILSIGNALQUALITY _signalQuality = (RILSIGNALQUALITY)Marshal.PtrToStructure(lpData, typeof(RILSIGNALQUALITY));
EVENTS.RiseSignalQualityChanged(new SIGNALQUALITY(((_signalQuality.dwParams & RIL_PARAM_SQ_SIGNALSTRENGTH) == 0) ? RIL_PARAM_NOT_AVAILABLE : _signalQuality.nSignalStrength.ToString(),
((_signalQuality.dwParams & RIL_PARAM_SQ_MINSIGNALSTRENGTH) == 0) ? RIL_PARAM_NOT_AVAILABLE : _signalQuality.nMinSignalStrength.ToString(),
((_signalQuality.dwParams & RIL_PARAM_SQ_MAXSIGNALSTRENGTH) == 0) ? RIL_PARAM_NOT_AVAILABLE : _signalQuality.nMaxSignalStrength.ToString(),
((_signalQuality.dwParams & RIL_PARAM_SQ_BITERRORRATE) == 0) ? RIL_PARAM_NOT_AVAILABLE : _signalQuality.dwBitErrorRate.ToString(),
((_signalQuality.dwParams & RIL_PARAM_SQ_LOWSIGNALSTRENGTH) == 0) ? RIL_PARAM_NOT_AVAILABLE : _signalQuality.nLowSignalStrength.ToString(),
((_signalQuality.dwParams & RIL_PARAM_SQ_HIGHSIGNALSTRENGTH) == 0) ? RIL_PARAM_NOT_AVAILABLE : _signalQuality.nHighSignalStrength.ToString()));
break;
}
}
private static void _ResultCallback(IntPtr dwCode, IntPtr hrCmdID, System.IntPtr lpData, IntPtr cbData, IntPtr dwParam)
{
if ((rilCmd.CmdType != RIL_CMD_TYPE.NONE)&&(rilCmd.CmdId==(Int32)hrCmdID))
{
if ((Int32)dwCode == (Int32)RIL_RESULT.OK)
{
switch (rilCmd.CmdType)
{
case RIL_CMD_TYPE.OPERATOR:
_vOperatore = (RILOPERATORNAMES)Marshal.PtrToStructure(lpData, typeof(RILOPERATORNAMES));
break;
case RIL_CMD_TYPE.CELLTOWERINFO:
_cellTowerInfo = (RILCELLTOWERINFO)Marshal.PtrToStructure(lpData, typeof(RILCELLTOWERINFO));
break;
case RIL_CMD_TYPE.SIGNALQUALITY:
_signalQuality = (RILSIGNALQUALITY)Marshal.PtrToStructure(lpData, typeof(RILSIGNALQUALITY));
break;
}
}
ril_result = (RIL_RESULT)((Int32)dwCode);
rilCmd.CmdType = RIL_CMD_TYPE.NONE;
}
}
#region Invoke/RIL
[DllImport("ril.dll")]
private static extern IntPtr RIL_Initialize(IntPtr dwIndex, System.IntPtr pfnResult, System.IntPtr pfnNotify, IntPtr dwNotificationClasses, IntPtr dwParam, out IntPtr lphRil);
[DllImport("ril.dll")]
private static extern IntPtr RIL_Deinitialize(IntPtr lphRil);
[DllImport("ril.dll")]
private static extern IntPtr RIL_GetCurrentOperator(IntPtr hRil, IntPtr dwFormat);
[DllImport("ril.dll")]
private static extern IntPtr RIL_GetCellTowerInfo(IntPtr hRil);
[DllImport("ril.dll")]
private static extern IntPtr RIL_GetSignalQuality(IntPtr hRil);
#endregion
private struct RIL_CMD
{
Int32 _cmdId;
RIL_CMD_TYPE _cmdType;
public Int32 CmdId
{
get { return _cmdId; }
set { _cmdId = value; }
}
public RIL_CMD_TYPE CmdType
{
get { return _cmdType; }
set { _cmdType = value; }
}
public RIL_CMD(Int32 cmdId, RIL_CMD_TYPE cmdType)
{
_cmdId = cmdId;
_cmdType = cmdType;
}
}
private enum RIL_CMD_TYPE
{
NONE = 0,
OPERATOR = 1,
CELLTOWERINFO=2,
SIGNALQUALITY=3
}
private enum RIL_RESULT
{
OK = 1,
NOCARRIER = 2,
ERROR = 3,
NODIALTONE = 4,
BUSY = 5,
NOANSWER = 6,
CALLABORTED = 7
}
#region OPERATORNAMES struct
public enum RIL_OPFORMAT
{
LONG = 0x00000001,
SHORT = 0x00000002,
NUM = 0x00000003
}
[StructLayout(LayoutKind.Sequential)]
private struct RILOPERATORNAMES
{
public Int32 cbSize;
public Int32 dwParams;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RIL.MAXLENGTH_OPERATOR_LONG)]
public byte[] szLongName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RIL.MAXLENGTH_OPERATOR_SHORT)]
public byte[] szShortName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RIL.MAXLENGTH_OPERATOR_NUMERIC)]
public byte[] szNumName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RIL.MAXLENGTH_OPERATOR_COUNTRY_CODE)]
public byte[] szCountryCode;
}
public class OPERATORNAMES
{
public string LongName;
public string ShortName;
public string NumName;
public string CountryCode;
public OPERATORNAMES(string LongName, string ShortName, string NumName, string CountryCode)
{
this.LongName = LongName;
this.ShortName = ShortName;
this.NumName = NumName;
this.CountryCode = CountryCode;
}
}
#endregion
#region CELLINFO struct
public class CELLINFO
{
public string MobileCountryCode;
public string MobileNetworkCode;
public string LocationAreaCode;
public string CellID;
public string RxLevel;
public string RxQuality;
public CELLINFO(string MobileCountryCode, string MobileNetworkCode, string LocationAreaCode, string CellID, string RxLevel, string RxQuality)
{
this.MobileCountryCode = MobileCountryCode;
this.MobileNetworkCode = MobileNetworkCode;
this.LocationAreaCode = LocationAreaCode;
this.CellID = CellID;
this.RxLevel = RxLevel;
this.RxQuality = RxQuality;
}
}
[StructLayout(LayoutKind.Sequential)]
private struct RILCELLTOWERINFO
{
public UInt32 cbSize; // @field structure size in bytes
public UInt32 dwParams; // @field indicates valid parameters
public UInt32 dwMobileCountryCode; // @field TBD
public UInt32 dwMobileNetworkCode; // @field TBD
public UInt32 dwLocationAreaCode; // @field TBD
public UInt32 dwCellID; // @field TBD
public UInt32 dwBaseStationID; // @field TBD
public UInt32 dwBroadcastControlChannel; // @field TBD
public UInt32 dwRxLevel; // @field Value from 0-63 (see GSM 05.08, 8.1.4)
public UInt32 dwRxLevelFull; // @field Value from 0-63 (see GSM 05.08, 8.1.4)
public UInt32 dwRxLevelSub; // @field Value from 0-63 (see GSM 05.08, 8.1.4)
public UInt32 dwRxQuality; // @field Value from 0-7 (see GSM 05.08, 8.2.4)
public UInt32 dwRxQualityFull; // @field Value from 0-7 (see GSM 05.08, 8.2.4)
public UInt32 dwRxQualitySub; // @field Value from 0-7 (see GSM 05.08, 8.2.4)
public UInt32 dwIdleTimeSlot; // @field TBD
public UInt32 dwTimingAdvance; // @field TBD
public UInt32 dwGPRSCellID; // @field TBD
public UInt32 dwGPRSBaseStationID; // @field TBD
public UInt32 dwNumBCCH; // @field TBD
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RIL.MAXLENGTH_BCCH)]
public byte[] rgbBCCH;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RIL.MAXLENGTH_NMR)]
public byte[] rgbNMR;
}
#endregion
#region SIGNALQUALITY struct
[StructLayout(LayoutKind.Sequential)]
private struct RILSIGNALQUALITY
{
public UInt32 cbSize; // @field structure size in bytes
public UInt32 dwParams; // @field indicates valid parameters
public Int32 nSignalStrength; // @field TBD
public Int32 nMinSignalStrength; // @field TBD
public Int32 nMaxSignalStrength; // @field TBD
public UInt32 dwBitErrorRate; // @field bit error rate in 1/100 of a percent
public Int32 nLowSignalStrength; // @field TBD
public Int32 nHighSignalStrength; // @field TBD
}
#endregion
}
public class SIGNALQUALITY
{
public string SignalStrength; // @field TBD
public string MinSignalStrength; // @field TBD
public string MaxSignalStrength; // @field TBD
public string BitErrorRate; // @field bit error rate in 1/100 of a percent
public string LowSignalStrength; // @field TBD
public string HighSignalStrength; // @field TBD
public SIGNALQUALITY(string SignalStrength, string MinSignalStrength, string MaxSignalStrength, string BitErrorRate, string LowSignalStrength, string HighSignalStrength)
{
this.SignalStrength = SignalStrength;
this.MinSignalStrength = MinSignalStrength;
this.MaxSignalStrength = MaxSignalStrength;
this.BitErrorRate = BitErrorRate;
this.LowSignalStrength = LowSignalStrength;
this.HighSignalStrength = HighSignalStrength;
}
}
public class RIL_EVENTS
{
public RIL_EVENTS()
{
}
#region Events
public delegate void SignalQualityChangedSelectedHandler(SIGNALQUALITY signal);
public event SignalQualityChangedSelectedHandler SignalQualityChanged;
#endregion
public void RiseSignalQualityChanged(SIGNALQUALITY signal)
{
if (SignalQualityChanged != null)
{
SignalQualityChanged(signal);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -