Imports System.IO
Imports System.Threading
Imports System.Runtime.InteropServices
Module Module_GPRSConnection
Public Function GPRSConnectionSetup() As Boolean
Dim t As String = System.IO.Path.AltDirectorySeparatorChar.ToString() + System.IO.Path.DirectorySeparatorChar.ToString()
Dim url As String = "www.msn.com"
GPRSConnectionSetup = GPRSConnection.Setup(Uri.UriSchemeHttp + Uri.SchemeDelimiter + url + Path.AltDirectorySeparatorChar)
End Function
Public Sub GPRSConnectionRelease()
GPRSConnection.ReleaseAll()
End Sub
Public Class GPRSConnection
Const S_OK As Integer = 0
Const CONNMGR_PARAM_GUIDDESTNET As Integer = &H1
Const CONNMGR_FLAG_PROXY_HTTP As Integer = &H1
Const CONNMGR_PRIORITY_USERINTERACTIVE As Integer = &H8000
Const INFINITE As UInteger = &HFFFFFFFFUI
Const CONNMGR_STATUS_CONNECTED As Integer = &H10
Shared ht As New Hashtable()
Shared Sub New()
Dim mre As New ManualResetEvent(False)
mre.Handle = ConnMgrApiReadyEvent()
mre.WaitOne()
CloseHandle(mre.Handle)
End Sub
Protected Overrides Sub Finalize()
Try
ReleaseAll()
Finally
MyBase.Finalize()
End Try
End Sub
Public Shared Function Setup(ByVal url As Uri) As Boolean
Return Setup(url.ToString())
End Function
Public Shared Function Setup(ByVal urlStr As String) As Boolean
Dim ci As New ConnectionInfo()
Dim phConnection As IntPtr = IntPtr.Zero
Dim status As Integer = 0
If ht(urlStr) IsNot Nothing Then
Return True
End If
If ConnMgrMapURL(urlStr, ci.guidDestNet, IntPtr.Zero) <> S_OK Then
Return False
End If
ci.cbSize = CUInt(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(ci, phConnection, INFINITE, status) <> S_OK AndAlso status <> CONNMGR_STATUS_CONNECTED Then
Return False
End If
ht(urlStr) = phConnection
Return True
End Function
Public Shared Function Release(ByVal url As Uri) As Boolean
Return Release(url.ToString())
End Function
Public Shared Function Release(ByVal urlStr As String) As Boolean
Return Release(urlStr, True)
End Function
Private Shared Function Release(ByVal urlStr As String, ByVal removeNode As Boolean) As Boolean
Dim res As Boolean = True
Dim ph As IntPtr = IntPtr.Zero
If ht(urlStr) Is Nothing Then
Return True
End If
ph = DirectCast(ht(urlStr), IntPtr)
If ConnMgrReleaseConnection(ph, 0) <> S_OK Then
res = False
End If
CloseHandle(ph)
If removeNode Then
ht.Remove(urlStr)
End If
Return res
End Function
Public Shared Sub ReleaseAll()
For Each de As DictionaryEntry In ht
Release(DirectCast(de.Key, String), False)
Next
ht.Clear()
End Sub
<StructLayout(LayoutKind.Sequential)> _
Public Structure ConnectionInfo
Public cbSize As Integer
Public dwParams As Integer
Public dwFlags As Integer
Public dwPriority As Integer
Public bExclusive As Integer
Public bDisabled As Integer
Public guidDestNet As Guid
Public hWnd As IntPtr
Public uMsg As Integer
Public lParam As Integer
Public ulMaxCost As Integer
Public ulMinRcvBw As Integer
Public ulMaxConnLatency As Integer
End Structure
<DllImport("cellcore.dll")> _
Private Shared Function ConnMgrMapURL(ByVal pwszURL As String, ByRef pguid As Guid, ByVal pdwIndex As IntPtr) As Integer
End Function
<DllImport("cellcore.dll")> _
Private Shared Function ConnMgrEstablishConnectionSync(ByRef ci As ConnectionInfo, ByRef phConnection As IntPtr, ByVal dwTimeout As UInteger, ByRef pdwStatus As Integer) As Integer
End Function
<DllImport("cellcore.dll")> _
Private Shared Function ConnMgrApiReadyEvent() As IntPtr
End Function
<DllImport("cellcore.dll")> _
Private Shared Function ConnMgrReleaseConnection(ByVal hConnection As IntPtr, ByVal bCache As Integer) As Integer
End Function
<DllImport("coredll.dll")> _
Private Shared Function CloseHandle(ByVal hObject As IntPtr) As Integer
End Function
End Class
End Module
Проблема с ConnMgrReleaseConnection WM6+Samsung
Есть проблема, не могу нормально разорвать соединение ЖПРС на телефоне при связке КПК WM6 и телефона модели Samsung
Подключаюсь к Интернет через телефон (bluetooth) со своего приложения при помощи ConnMgrEstablishConnectionSync
Происходит коннект, отправка данных и дисконект. ЖПРС на телефоне и передача данных на КПК после команды ConnMgrReleaseConnection отключается. Тестировал на аппаратах
ipaq 2410 (WM 2003 SE)
ipaq 2490 (WM5)
в связке со многими моделями телефонов (в том числе и с samsung). И все было ОК.
Когда попытался проделать это с КПК
ipaq 114 (WM6) и телефон samsung (c5212 и e250) то первый коннект проходит. Потом после команды ConnMgrEstablishConnectionSync на телефоне пропадает значок соединения с GPRS, а на КПК не пропадает соединение. При попытке еще раз соединится, и отправить данные, долго висит и вываливается с ошибками. Тестировал с разными моделями Nokia и Motorola - все работает. Буду благодарен помощи в решении этой проблемы.
Net CF 2
VS 2008
VBNet
Код:
Один поменял телефон с сонерика на самсунг 3310 (вроде, цифирь не запоминал, много их) + iPAQ 114.
У второго КПК 2190 увели, пришлось выдавать новый - 114-й. У него самсунг 2110 ( ну помню что на 2)
И сразу стал наблюдаться описаный тобой глюк. Развлекуха шла около двух часов, опытным путем выяснили, что второй раз зайти в интернет с КПК после отключения можно только перегрузив самсунги (телефоны). В конторе около 30 разнопородных КПК на wm5 и wm6, глюк идет только в связке Самсунг - iPAQ 114, но это сочетание только 2 раза и встретилось. С другими телефонами КПК работают нормально, самсунги нормально работают с 2190 c wm5
Я повисшее соединение отключаю либо путем перезапуска блютуса, или через отключить активные соединения в манагере блютус.
После этого программа снова может коннектица.