none
如何判斷目前應使用何種連線方式 RRS feed

  • 問題

  •  

    請教大家一個問題

    我寫一個手機程式需要進行網路連線,

    當直接使用手機時就透過3G連線上網,

    但是當連接到電腦時則不透過3g上網,

     

    但是我的程式應該如何判定

    目前應該選擇3G或是透過PC上網呢?

    2008年1月29日 上午 09:03

解答

  • 不知道你有沒有 Windows Mobile 的 Adaption Kit?

    If so, public\cellcore\SDK\SAMPLES\CONNMGR\CMUTIL\ 這邊有一個好的 example regard to how to use Connection Manager APIs...

    沒有的話 看能不能找廠 商 or 啥的拿拿看, download 大概就沒辦法了 畢竟這是 OEM product...

    有幾個重點要注意的吧

     

    ConnMgrQueryDetailedStatus 可能會傳回比 sizeof(CONNMGR_CONNECTION_DETAILED_STATUS) 大因為可能有好幾個 sizeof(CONNMGR_CONNECTION_DETAILED_STATUS), 因為你的 system 裡頭可能存在不只一個 Active Conneciton, 因此一般而言都會 invoke 兩次 ConnMgrQueryDetailedStatus, 第一次是去 test 需要多少 buffer size, 這時後會得到一個 ERROR_INSUFFICIENT_BUFFER 的 WIN32 Error Code (via GetLastError API), 之後再去 allocate 這個大小的 buffer 然後再 invoke 一次

     

    取得的 data 因為可能不只一個 這時後下一個 detail 就是用 pNext 是 obtain next item, 假如是最後一個 這個 node 就是 NULL.

     

    2008年2月1日 上午 12:12

所有回覆

  • Ttry ConnMgrQueryDetailedStatus API for detials you may refer the following URL

    http://msdn2.microsoft.com/en-us/library/bb416284.aspx

     

    And other Conenction Manager relative APIs might come to your goal.

    2008年1月29日 下午 11:21
  •  

    抱歉可能我沒有說清楚

     

    就是目前我的程式都會進行3G連線的動作

    但是當PDA接到電腦時,我希望可以判斷目前已經接到電腦,

    不需要進行3G連線的動作,

     

    所以我的主要問題點在於我如何判斷現在是否連接到電腦

    謝謝大家

    2008年1月30日 上午 06:28
  • 因為你是 Windows Mobile based device, 利用 Connection Manager 來判斷應該是最方便簡單的.

    一但你跟 PC 連上了, 那 connection manager 應該可以 query 到 PC connection 是通的

    所以一樣是用 ConnMgrQueryDetailedStatus 然後 query 看看 PC connection 存不存在

    2008年1月30日 下午 07:00
  •  

    非常感謝   過一番研究  確實如您所說的 需要使用 ConnMgrQueryDetailedStatus 這個API

     

    我是利用C# 寫程式的 下面是我的程式碼

     

    執行後發覺  所得到內容值可能不正確

     

    是我的程式有錯嗎?   因為在網路上也發掘其他人跟我有相同的問題

     

    typedef struct _CONNMGR_CONNECTION_DETAILED_STATUS{
      struct _CONNMGR_CONNECTION_DETAILED_STATUS* pNext;
      DWORD dwVer; === 1
      DWORD dwParams;  === 823
      DWORD dwType; === 1
      DWORD dwSubtype; === 7
      DWORD dwFlags;  === 5
      DWORD dwSecure; === 0
      GUID guidDestNet; === GUID 值
      GUID guidSourceNet; === GUID 值
      TCHAR* szDescription; === 0
      TCHAR* szAdapterName; === 0
      DWORD dwConnectionStatus;  === 32
      SYSTEMTIME LastConnectTime;
      DWORD dwSignalQuality;  === 0 
      CONNMGR_CONNECTION_IPADDR* pIPAddr; === 0
    } CONNMGR_CONNECTION_DETAILED_STATUS;

    Code Snippet

       [StructLayout(LayoutKind.Sequential)]
        public struct ConnMgrConnectionDetailedStatus
        {
            public IntPtr pNext;

            public uint dwVer;

            public uint dwParams;

            public uint dwType;

            public uint dwSubType;

            public uint dwFlags;

            public uint dwSecure;

            public Guid guidDestNet;

            public Guid guidSourceNet;

            public IntPtr szDescription;

            public IntPtr szAdaptername;

            public uint dwConnectionStatus;

            public SYSTEMTIME LastConnectTime;

            public uint dwSignalQuality;

            public IntPtr pIPAddr;      
        }

     

     

     

     

    Code Snippet
    [DllImport("CellCore.dll")]
            public static extern int ConnMgrQueryDetailedStatus(out ConnMgrConnectionDetailedStatus pStatusBuffer, out uint pcbBufferSize);

     

     


    Code Snippet

            public string QueryConnectionStatus()
            {
                ConnMgrConnectionDetailedStatus pStatusBuffer;
                uint pcbBufferSize = (uint)Marshal.SizeOf(typeof(ConnMgrConnectionDetailedStatus));
                int Result = ConnMgrQueryDetailedStatus(out pStatusBuffer, out pcbBufferSize);

                string szDescription = string.Empty;
            

                if (pStatusBuffer.szDescription != IntPtr.Zero)
                {

                    szDescription = Marshal.PtrToStringUni(pStatusBuffer.szDescription);

                    return szDescription;
                }

                return String.Empty;

            }

     

     

    2008年1月31日 上午 10:05
  • 不知道你有沒有 Windows Mobile 的 Adaption Kit?

    If so, public\cellcore\SDK\SAMPLES\CONNMGR\CMUTIL\ 這邊有一個好的 example regard to how to use Connection Manager APIs...

    沒有的話 看能不能找廠 商 or 啥的拿拿看, download 大概就沒辦法了 畢竟這是 OEM product...

    有幾個重點要注意的吧

     

    ConnMgrQueryDetailedStatus 可能會傳回比 sizeof(CONNMGR_CONNECTION_DETAILED_STATUS) 大因為可能有好幾個 sizeof(CONNMGR_CONNECTION_DETAILED_STATUS), 因為你的 system 裡頭可能存在不只一個 Active Conneciton, 因此一般而言都會 invoke 兩次 ConnMgrQueryDetailedStatus, 第一次是去 test 需要多少 buffer size, 這時後會得到一個 ERROR_INSUFFICIENT_BUFFER 的 WIN32 Error Code (via GetLastError API), 之後再去 allocate 這個大小的 buffer 然後再 invoke 一次

     

    取得的 data 因為可能不只一個 這時後下一個 detail 就是用 pNext 是 obtain next item, 假如是最後一個 這個 node 就是 NULL.

     

    2008年2月1日 上午 12:12
  • 請教大家一個問題

    我要寫一個windows程式需要進行網路連線,

    我需要判斷目前我是用有線連線上網

    或者我目前是透過3G上網

    請問有辦法判斷出我目前用的是3G無線網路連線上網,或者利用公司網路上網

     

    然後如果當我現在連接公司網路時,又透過3G上網時我有辦法停用3G網路

    目的類似當直接使用手機時就透過3G連線上網,

    但是當連接到電腦時則不透過3g上網,

     

    但是我的程式應該如何判定

    目前應該選擇3G或是透過PC上網呢?

     

    2008年6月12日 上午 09:02