WINCE下的GPRS拨号连接(一)

来源:互联网 发布:恢复iphone软件 编辑:程序博客网 时间:2024/05/21 09:25

  WINCE下的GPRS拨号连接,

   一、拨号函数:RasDial(IntPtr dialExtensions, IntPtr phoneBookPath,IntPtr rasDialParam,uint NotifierType,IntPtr notifier,ref IntPtr pRasConn ) ,函数返回值类型为uint,成功返回0。

     二、断开连接的函数:RasHangUp(IntPtr pRasConn),函数返回值类型为uint,成功返回0.

     三、列举当前已经建立的活动的连接的函数:RasEnumConnections([In, Out] _RASCONN[] lprasconn, ref UInt32 lpcb, ref UInt32 lpcConnections),函数返回值类似为uint32,参数的结构体类型下文再说。

在wince5.0系统上调试成功,注意

1、 r = RasDial(IntPtr.Zero, IntPtr.Zero, (IntPtr)pAddr, 0, IntPtr.Zero, ref RasConn);函数返回0值,代表成功联网,但是必须拿掉USB才可以正常显示网页。也就是说,上午时不可以用USB与PC同步。
2、同样,如果先USB与PC同步后RasDial,发送数据到服务器也收不到。

using System;

using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Wince_CLR_RAS
{
    public class CLR_RAS
    {
        #region 引用coredll
        [DllImport("coredll.dll")]
        private static extern uint RasDial
        (
           IntPtr dialExtensions,
           IntPtr phoneBookPath,
           IntPtr rasDialParam,
           uint NotifierType,
           IntPtr notifier,
           ref IntPtr pRasConn
           );


        [DllImport("coredll.dll")]
        private static extern uint RasHangUp(IntPtr pRasConn);


        [DllImport("coredll.dll", CharSet = CharSet.Unicode)]
        internal static extern UInt32 RasEnumConnections([In, Out] _RASCONN[] lprasconn, ref UInt32 lpcb, ref UInt32 lpcConnections);


        const int RAS_MaxEntryName = 20;
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        internal struct _RASCONN
        {
            private UInt32 m_size;
            private IntPtr m_hrasconn;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = RAS_MaxEntryName + 1)]
            public char[] m_entryName;


            public IntPtr ConnectionHandle { get { return m_hrasconn; } }
            public string EntryName { get { return new string(m_entryName).TrimEnd(new char[] { '\0' }); } }


            public static _RASCONN CreateStruct()
            {
                _RASCONN obj = new _RASCONN();
                obj.m_size = System.Convert.ToUInt32(Marshal.SizeOf(typeof(_RASCONN)));
                obj.m_hrasconn = IntPtr.Zero;
                obj.m_entryName = new char[RAS_MaxEntryName + 1];
                return obj;
            }
        }

        #endregion


        #region 列举已建立的活动连接
        /// <summary>
        /// 列举已建立的活动连接
        /// </summary>
        /// <returns></returns>
        private static _RASCONN[] EnumerateConnections()
        {
            _RASCONN[] rasconn;
            UInt32 size = 0, noelements = 0;
            size = System.Convert.ToUInt32(Marshal.SizeOf((rasconn = new _RASCONN[1])[0] = _RASCONN.CreateStruct()));
            if (RasEnumConnections(rasconn, ref size, ref noelements) != 0x00)
            {
               // size = System.Convert.ToUInt32(Marshal.SizeOf((rasconn = new _RASCONN[size / Marshal.SizeOf(typeof(_RASCONN))])[0] = _RASCONN.CreateStruct()) * rasconn.Length);
                
                rasconn = new _RASCONN[size / Marshal.SizeOf(typeof(_RASCONN))];
                rasconn[0] = _RASCONN.CreateStruct();
                size = System.Convert.ToUInt32(Marshal.SizeOf(rasconn[0]) * rasconn.Length);
               
                if (RasEnumConnections(rasconn, ref size, ref noelements) != 0x00) { rasconn = null; }
            }
            return rasconn;
        }
        #endregion


        /// <summary>
        /// GPRS拨号连接
        /// </summary>
        /// <param name="EntryName">拨号连接的名称</param>
        /// <param name="UserName">用户名</param>
        /// <param name="Password">密码</param>
        /// <param name="RasConn">返回的句柄</param>
        /// <returns></returns>
        unsafe private static uint myRasDial(string EntryName, string UserName, string Password, out IntPtr RasConn)
        {
            /*
            EntryName ,UserName,Password - same as in RASDIALPARAMS structure (see
            MSDN)
            */
            uint r = 0;
            RasConn = IntPtr.Zero;
            byte[] bRASDIALPARAMS = new byte[1464];
            fixed (byte* pAddr = bRASDIALPARAMS)
            {


                byte* pCurrent = pAddr;
                Marshal.WriteInt32((IntPtr)pCurrent, bRASDIALPARAMS.Length);
                pCurrent += 4;
                foreach (byte b in Encoding.Unicode.GetBytes(EntryName))
                {
                    Marshal.WriteByte((IntPtr)pCurrent, b);
                    pCurrent++;
                }
                pCurrent = pAddr + 0x192;//0x192 - offset for RASDIALPARAMS.UserName
                foreach (byte b in Encoding.Unicode.GetBytes(UserName))
                {
                    Marshal.WriteByte((IntPtr)pCurrent, b);
                    pCurrent++;
                }
                pCurrent = pAddr + 0x394;//0x394 - offset for RASDIALPARAMS.Password
                foreach (byte b in Encoding.Unicode.GetBytes(Password))
                {
                    Marshal.WriteByte((IntPtr)pCurrent, b);
                    pCurrent++;
                }


                r = RasDial(IntPtr.Zero, IntPtr.Zero, (IntPtr)pAddr, 0, IntPtr.Zero, ref RasConn);
            }
            return r;
        }


        /// <summary>
        /// 断开所有活动的连接
        /// </summary>
        public static void DicConnectAll()
        {
            _RASCONN[] ran = EnumerateConnections();
            for (int i = 0; i < ran.Length; i++)
            {
                if (ran[i].EntryName =="GPRS")
                {
                   RasHangUp(ran[i].ConnectionHandle);
                }
            }


        }


        /// <summary>
        /// 所有活动的连接
        /// </summary>
        public static string ListConnectAll()
        {
            string strCon = "";
            _RASCONN[] ran = EnumerateConnections();
            for (int i = 0; i < ran.Length; i++)
            {
                strCon +=ran[i].EntryName+",";                
            }
            return strCon;


        }


        /// <summary>
        /// 断开已建立的连接
        /// </summary>
        /// <param name="mEntryName">已建立的活动连接的名称</param>
        /// <returns></returns>
        public static bool disConnect(string mEntryName)
        {
            _RASCONN[] ran = EnumerateConnections();
            for (int i = 0; i < ran.Length; i++)
            {
                if (ran[i].EntryName == mEntryName)
                {
                    if (RasHangUp(ran[i].ConnectionHandle) == 0)
                        return true;
                    else
                        return false;
                }
            }
            return false;   //表示没有此连接
        }


        /// <summary>
        /// 判断是否已经建立连接
        /// </summary>
        /// <param name="mEntryName">要查询状态的拨号连接的名称</param>
        /// <returns></returns>
        public static bool GPRSIsCon(string mEntryName)
        {
            _RASCONN[] ran = EnumerateConnections();
            for (int i = 0; i < ran.Length; i++)
            {
                if (ran[i].EntryName == mEntryName)
                    return true;
            }
            return false;   //表示没有此连接
        }


        public static bool GPRSConnectNet(string mEntryName)
        {
            IntPtr hRaon;
            uint res = myRasDial(mEntryName, "", "", out hRaon);
            if (res == 0)
                return true;
            else
                return false;
            
        }
    }
}


原创粉丝点击