2009-04-03 25 views
6

Tôi có một chương trình .NET Compact Framework 3.5 được sử dụng làm ứng dụng doanh nghiệp (LOB) dòng 'Đôi khi kết nối'. Nếu nó có thể nhìn thấy một webservice trực tuyến, nó sẽ sử dụng nó để truy cập dữ liệu, nhưng nếu kết nối mạng bị mất, nó sẽ sử dụng một bộ nhớ cache cục bộ.Cách tốt nhất để quản lý trạng thái mạng trong Windows Mobile

Cách tốt nhất để xử lý tất cả các tùy chọn kết nối và thay đổi trạng thái là gì?

  • Lớp ConnectionManager của OpenNetCF?
  • Microsoft.WindowsBile.State.SystemState?
  • Cuộc gọi API?

Làm thế nào để bạn hiểu được sự khác biệt giữa WiFi, Cradle và GPRS và sử dụng phương pháp tốt nhất có sẵn?

Bất kỳ ai có bất kỳ hướng dẫn nào về điều này?

Trả lời

2

tôi chỉ tạo ra một lớp được chia sẻ đơn giản mà tôi có thể gọi như thế này:

If MyConnectionClass.IsConnected then 
    'Do connected stuff 
Else 
    'Do local save 
End If 

Sau đó, tất cả các lớp học kinh doanh thực tế của tôi/chức năng có thể sử dụng để ẩn nastiness này từ mã UI.

tài sản IsConnected Các MyConnectionClass' sẽ có một cái gì đó như thế này:

Public ReadOnly Property IsConnected As Boolean 
    Get 
    Try 

     Dim HostName As String = Dns.GetHostName() 
     Dim thisHost As IPHostEntry = Dns.GetHostByName(HostName) 
     Dim thisIpAddr As String = thisHost.AddressList(0).ToString 

     return (thisIpAddr <> Net.IPAddress.Parse("127.0.0.1").ToString()) 

    Catch ex As Exception 
     Return False 
    End Try 
    End Get 
End Property 

Nó cũng được khuyến cáo rằng bạn thăm dò ý kiến ​​cho tình trạng kết nối sử dụng một sợi nền và sau đó bắn một sự kiện trở lại thread ứng dụng chính khi nhà nước thay đổi. Đây là writeup chi tiết:

Testing for and responding to network connections in the .NET Compact Framework

EDIT:

Bây giờ, cho GPRS hỗ trợ:

Nếu bạn đang sử dụng yêu cầu Web hoặc dịch vụ Web, khuôn khổ sẽ xử lý kết nối cho bạn.Nếu bạn đang lặn sâu hơn vào TCPClient hoặc UDPClient, bạn cần phải xử lý nó với các API quản lý kết nối của mình như sau:

public class GPRSConnection 
{ 
    const int S_OK = 0; 
    const uint CONNMGR_PARAM_GUIDDESTNET = 0x1; 
    const uint CONNMGR_FLAG_PROXY_HTTP = 0x1; 
    const uint CONNMGR_PRIORITY_USERINTERACTIVE = 0x08000; 
    const uint INFINITE = 0xffffffff; 
    const uint CONNMGR_STATUS_CONNECTED = 0x10; 
    static Hashtable ht = new Hashtable(); 

    static GPRSConnection() 
    { 
     ManualResetEvent mre = new ManualResetEvent(false); 
     mre.Handle = ConnMgrApiReadyEvent(); 
     mre.WaitOne(); 
     CloseHandle(mre.Handle); 
    } 

    ~GPRSConnection() 
    { 
     ReleaseAll(); 
    } 

    public static bool Setup(Uri url) 
    { 
     return Setup(url.ToString()); 
    } 

    public static bool Setup(string urlStr) 
    { 
     ConnectionInfo ci = new ConnectionInfo(); 
     IntPtr phConnection = IntPtr.Zero; 
     uint status = 0; 

     if (ht[urlStr] != null) 
      return true; 

     if (ConnMgrMapURL(urlStr, ref ci.guidDestNet, IntPtr.Zero) != S_OK) 
      return false; 

     ci.cbSize = (uint) Marshal.SizeOf(ci); 
     ci.dwParams = CONNMGR_PARAM_GUIDDESTNET; 
     ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP; 
     ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE; 
     ci.bExclusive = 0; 
     ci.bDisabled = 0; 
     ci.hWnd = IntPtr.Zero; 
     ci.uMsg = 0; 
     ci.lParam = 0; 

     if (ConnMgrEstablishConnectionSync(ref ci, ref phConnection, INFINITE, ref status) != S_OK && 
      status != CONNMGR_STATUS_CONNECTED) 
      return false; 

     ht[urlStr] = phConnection; 
     return true; 
    } 

    public static bool Release(Uri url) 
    { 
     return Release(url.ToString()); 
    } 

    public static bool Release(string urlStr) 
    { 
     return Release(urlStr, true); 
    } 

    private static bool Release(string urlStr, bool removeNode) 
    { 
     bool res = true; 
     IntPtr ph = IntPtr.Zero; 
     if (ht[urlStr] == null) 
      return true; 
     ph = (IntPtr)ht[urlStr]; 
     if (ConnMgrReleaseConnection(ph, 1) != S_OK) 
      res = false; 
     CloseHandle(ph); 
     if (removeNode) 
      ht.Remove(urlStr); 
     return res; 
    } 

    public static void ReleaseAll() 
    { 
     foreach(DictionaryEntry de in ht) 
     { 
      Release((string)de.Key, false); 
     } 
     ht.Clear(); 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct ConnectionInfo 
    { 
     public uint cbSize; 
     public uint dwParams; 
     public uint dwFlags; 
     public uint dwPriority; 
     public int bExclusive; 
     public int bDisabled; 
     public Guid guidDestNet; 
     public IntPtr hWnd; 
     public uint uMsg; 
     public uint lParam; 
     public uint ulMaxCost; 
     public uint ulMinRcvBw; 
     public uint ulMaxConnLatency; 
    } 

    [DllImport("cellcore.dll")] 
    private static extern int ConnMgrMapURL(string pwszURL, ref Guid pguid, IntPtr pdwIndex); 

    [DllImport("cellcore.dll")] 
    private static extern int ConnMgrEstablishConnectionSync(ref ConnectionInfo ci, ref IntPtr phConnection, uint dwTimeout, ref uint pdwStatus); 

    [DllImport("cellcore.dll")] 
    private static extern IntPtr ConnMgrApiReadyEvent(); 

    [DllImport("cellcore.dll")] 
    private static extern int ConnMgrReleaseConnection(IntPtr hConnection, int bCache); 

    [DllImport("coredll.dll")] 
    private static extern int CloseHandle(IntPtr hObject); 
} 

Và để sử dụng nó, làm như sau:

public void DoTcpConnection() 
    { 
     string url = "www.msn.com"; 
     bool res = GPRSConnection.Setup("http://" + url + "/"); 
     if (res) 
     { 
      TcpClient tc = new TcpClient(url, 80); 
      NetworkStream ns = tc.GetStream(); 
      byte[] buf = new byte[100]; 
      ns.Write(buf, 0, 100); 
      tc.Client.Shutdown(SocketShutdown.Both); 
      ns.Close(); 
      tc.Close(); 
      MessageBox.Show("Wrote 100 bytes"); 
     } 
     else 
     { 
      MessageBox.Show("Connection establishment failed"); 
     } 
    } 

Đây là từ Anthony Wong của blog ở đây:

Anthony Wong

Và hãy nhớ, bạn chỉ cần điều này cho TCP cấp dưới hoặc những thứ UDP. HTTPRequests không cần điều này.

+0

Tôi làm cách nào để yêu cầu kết nối (ví dụ: bắt đầu GPRS nếu có)? Phương thức được đăng (và liên kết) dường như chỉ có địa chỉ giống như WiFi nơi kết nối là Bật hoặc Tắt. – JasonRShaver

1

Điều gì về việc sử dụng lớp SystemState tại không gian tên Microsoft.WindowsMobile.Status? Bạn có thể theo dõi trạng thái hiện tại của hệ thống và nhận thông báo, khi trạng thái thay đổi. Hãy xem số post này để biết một số mã.

SystemState chỉ là về trạng thái của kết nối. Bạn có thể sử dụng một kết nối cụ thể thông qua ConnectionManager. Tôi khuyên bạn nên đọc số này article. Nếu bạn đang sử dụng .NET Compact Framework 3.5, một API được quản lý được bao gồm. Bạn cũng có thể sử dụng OpenNetCF ConnectionManager.

+0

Làm cách nào để sử dụng SystemState để yêu cầu kết nối (ví dụ: bắt đầu GPRS nếu có)? – JasonRShaver

1

Tôi cố gắng viết ứng dụng dành cho thiết bị di động để họ thậm chí không biết có mạng liên quan. Tôi giữ dữ liệu xác thực đủ tốt cục bộ, và sau đó ghi các giao dịch vào một hàng đợi cục bộ trong khi kết nối; trình đọc hàng đợi bao gồm bộ hẹn giờ để thử lại khi không được kết nối. Các thông báo hàng đợi là hai chiều, do đó, làm mới cục bộ cũng có thể được cung cấp. Các mẫu Hàng đợi Tin nhắn Cơ bản.

Điều này cho phép tôi xử lý kết nối mạng theo cách đơn giản nhất, sử dụng logic cơ bản mở/đóng/đọc/ghi/ioctl logic có tính di động cao; và các kết nối của bạn không cần phải tồn tại trong bất kỳ thời gian quan trọng nào. (Tôi ghét phải tưởng tượng những gì sẽ được yêu cầu để ở đồng bộ với tất cả các biến thể kiến ​​trúc MS trong vài năm qua - mà vẫn chưa giải quyết được IMHO.)

+0

Tôi đồng ý rất nhiều với những gì bạn đã viết, tôi đã có một ứng dụng dành cho thiết bị di động khi WiFi không có ở đó sẽ chuyển sang sử dụng SMS làm giao thức. Điều đó rất dễ làm vì một hệ thống xfer 'Message Queue' dựa trên hệ thống mà tôi đã tích hợp vào CLSA cho CE. Tôi ước tôi vẫn có thể sử dụng nó nhưng dự án đó đã bỏ tùy chọn điện thoại = ( – JasonRShaver

1

Tôi đã tìm thấy Microsoft.WindowsMobile.State .SystemState báo cáo kết nối mạng không đáng tin cậy. Đây là 6.0 và sớm hơn. Tôi đã không làm thử nghiệm đầy đủ nhưng nó đã bị bỏ rơi khi nó sẽ nói rằng không có kết nối khi có.

Các vấn đề liên quan