InTheHand Bluetooth - Weird stream problems - Windows Mobile Development and Hacking General

I am currently working on my "SciLor's WiMoBlue". The new protocol is ready. Everything works fine, until I send much data at the same time.
For example if I try to send an image in that way:
Code:
Public Sub SendImage(ByVal Image As Bitmap, ByVal Position As Point, ByVal Format As ImageFormat)
Dim PosX, PosY, Width, Height As Byte()
Dim ImageStream As New IO.MemoryStream
Dim ImageLength As Integer
Dim ImageLengthBytes As Byte()
Dim ImageBuffer(MaxChunkSize - HeaderSize - 1) As Byte
PosX = BitConverter.GetBytes(Position.X)
PosY = BitConverter.GetBytes(Position.Y)
Width = BitConverter.GetBytes(Image.Width)
Height = BitConverter.GetBytes(Image.Height)
Image.Save(ImageStream, ImageFormat2ImagingFormat(Format))
ImageStream.Seek(0, SeekOrigin.Begin)
ImageLength = ImageStream.Length
ImageLengthBytes = BitConverter.GetBytes(ImageLength)
SendData(BuildCommand(BaseProtocol.Image, ImageProtocol.Initiate, CombineBytes(PosX, PosY, Width, Height, ImageLengthBytes)))
Thread.Sleep(2000)
Dim DataPos As Integer
For DataPos = 0 To ImageStream.Length - MaxChunkSize - HeaderSize - 1 Step MaxChunkSize - HeaderSize
ImageStream.Read(ImageBuffer, 0, MaxChunkSize - HeaderSize)
SendData(BuildCommand(BaseProtocol.Image, ImageProtocol.Data, ImageBuffer))
'WaitForNextChunk = True
'Do While WaitForNextChunk = True
'Loop
'Thread.Sleep(2000)
Next
ImageBuffer = New Byte(ImageLength - DataPos - 1) {}
ImageStream.Read(ImageBuffer, 0, ImageBuffer.Length)
SendData(BuildCommand(BaseProtocol.Image, ImageProtocol.End, ImageBuffer))
End Sub
SendData:
Code:
If Data.Length > MaxChunkSize Then
MsgBox("Data to long... " & vbNewLine & "SendSize:" & Data.Length & vbNewLine & "MaxSize:" & MaxChunkSize)
Else
If btClient.Connected = True And isRecieving = True Then
btStream.Write(Data, 0, Data.Length)
btStream.Flush()
End If
End If
Recieving Part:
Code:
While isRecieving = True
If btStream IsNot Nothing And btStream.DataAvailable = True Then
Try
Recieved = btStream.Read(myHeader, 0, myHeader.Length)
If myHeader(0) = HeaderIdentifier And myHeader(1) = OtherModeHeader Then
btStream.Read(myDataSize, 0, 2)
DataLength = BitConverter.ToInt16(myDataSize, 0)
myBuffer = New Byte(DataLength - 1) {}
Recieved = 0
Do Until Recieved = DataLength
If btStream.DataAvailable = True Then
Recieved += btStream.Read(myBuffer, Recieved, DataLength - Recieved)
End If
Loop
ExecuteCommand(myHeader(2), myHeader(3), myBuffer)
Else
Debug.WriteLine("WrongData")
Exit While
End If
Catch ex As Exception
Debug.WriteLine(ex.Message)
If Recieved = 0 Then
Exit While
End If
End Try
End If
End While
If I send the image, without Thread.Sleeps (huighe ones). The recieving stream gets weird. The gets btStream.DataAvailable = False forever. If I remove that ckeck, it hangs at the btStream.Read.
I also tried to fix that with waiting for the answer of the server, but the problem doesn't get solved.
Do you have any idea how to fix that problem?. In that speed the image sending is worthless
SciLor

Related

TAPI data calls.

1) Hi, we works with Pocket PC 2003 (Embedded Visual C++ 4.0). Our target is perform a data call over integrated cellular line. We read that the right mean is TAPI (XDA-Developers forum) because COM2 seem to be owned by RIL layer. We wrote a test program which handles a data call answer. We get the serial port handle returned by "lineGetID()" function for current data call, but when we try to use it through standard communication APIs ("WriteFile()" and "ReadFile()") it doesn't work (no data is read or write from port handle, but there aren't errors returned by APIs). Same code seems to work fine on a HP IPAQ 2210 with a Compact Flash GSM/GPRS card. How can we transfer data so?
2) We noticed a phone answering process is alive (CPROG.EXE) that takes calls' control. We kill this process when we make our tests, but it backs to life after some minutes. How can we take real calls' control?
3) Is the integrated cellular modem Hayes compatible? Is there a way to directly send AT commands to integrated cellular modem?
4) DCB structure "PortDCB" we pass to "SetCommState()" is the following:
PortDCB.DCBlength = sizeof (DCB);
PortDCB.BaudRate = 9600;
PortDCB.fBinary = TRUE;
PortDCB.fParity = TRUE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
PortDCB.fDsrSensitivity = FALSE;
PortDCB.fTXContinueOnXoff = TRUE;
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull = FALSE;
PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
PortDCB.fAbortOnError = FALSE;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
Is it correct?
Can anybody help me?
Matthew
This DCB params seem do right job....
Code:
PortDCB.BaudRate = 115200;
PortDCB.fBinary = TRUE;
PortDCB.fParity = FALSE;
//PortDCB.fParity = TRUE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
PortDCB.fDsrSensitivity = FALSE;
//PortDCB.fDsrSensitivity = TRUE;
PortDCB.fTXContinueOnXoff = TRUE;
//PortDCB.fTXContinueOnXoff = FALSE;
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull = FALSE;
PortDCB.fRtsControl = RTS_CONTROL_DISABLE;
PortDCB.fAbortOnError = FALSE;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
problem one shuold be solved ...Hi
Your DCB parameters worked fine.
Hi Matthew.
Your parameters worked fine with my application, i was teting an IMate and you helped me a lot with my next product version.
Thank you.
Cesar Bremer Pinheiro
Bremer Serv. Emp. Ltda.
Raseac Division.
http://www.raseac.com.br
Dear Matthew,
Hi,
I created a similar application to make a call from one PPC to another using data link. The problem is my program couldn't detect incoming calls. Would you please help me solve this issue?
Do you have any source code that I can learn from it? Also which method did you use? TAPI? COM port? RIL?
I'm very confused. Please help....
Best regards,
A. Riazi
Why is your baudrate 115200 when a CSD connection through TAPI is only at 9600 ?
cause it's TAPI
you can't select bearer capabilities
if you wana select rate use RIL or direct access to COM-ports
mathews help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
hi,
i am facing a similar problem cant send data through writefile api on cellular line
these r code snippets form my cod e
if(dwReturn =lineOpen (
g_hLineApp, // Usage handle for TAPI
g_dwCurrentLineID, // Cannot use the LINEMAPPER value
&g_CurrentLineInfo.hLine, // Line handle
g_CurrentLineInfo.dwAPIVersion,
// API version number
0, // Must set to zero for Windows CE
0, // No data passed back
LINECALLPRIVILEGE_NONE, // Can only make an outgoing call
0, // Media mode
NULL))
g_MakeCallRequestID = lineMakeCall (g_CurrentLineInfo.hLine,
&g_hCall,
szDialablePhoneNum,
0,
NULL);
dwRet =lineGetID(g_CurrentLineInfo.hLine, 0, 0, LINECALLSELECT_LINE, lpVarString,TEXT("comm/datamodem"));
till this its ok it returns a valid comm handle
after that it sends th data over the connected call but doesnt receive anythinga t the other end ...
the problem might be to give a call handle and LINECALLSELECT_CALL in linegteid func tion i tried it but when i use it fails saying cannot obtain the handle .......now i don understand whether its the problem of not obtaining a handle or whether linehandle will work but problem is in communication ...
plz help and add some code snippets for the communication
firstly have you set up the following...
LPLINECALLPARAMS CallParams;
CallParams=(LPLINECALLPARAMS)malloc(sizeof(LINECALLPARAMS)+1024);
memset(CallParams,0,sizeof(LINECALLPARAMS)+1024);
CallParams->dwTotalSize = sizeof(LINECALLPARAMS)+1024;
// This is where we configure the line for DATAMODEM usage.
//its important to note that if you attempt to make a call
//using LINEMEDIAMODE_DATAMODEM, the line must be opened in
//that way to begin with or nothing will happen. ie open lines
//corresponding to what you plan to makecall with.
CallParams->dwBearerMode = LINEBEARERMODE_VOICE;//over voice call
CallParams->dwMediaMode = LINEMEDIAMODE_DATAMODEM;//data transmition
//LINEMEDIAMODE_INTERACTIVEVOICE;//for voice
//specify that we only want to use a call that is not alreay in use.
//Otherwise it can take over calls that are in progress
CallParams->dwCallParamFlags = LINECALLPARAMFLAGS_IDLE;
//specify to use the first address
CallParams->dwAddressMode = LINEADDRESSMODE_ADDRESSID;
CallParams->dwAddressID = 0;
next check the line you want to use and make sure...
if(lpDevCaps->dwBearerModes & callModeData)//datamode
{
if(lpDevCaps->dwBearerModes & callModeVoice)
{
//then check the media mode
if(lpDevCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM)
{
if(lpDevCaps->dwMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE)
{
//use it
}
}
}
}
next when you get an incoming call etc get the handle......
HANDLE myTapiManager::getHandle()
{
HANDLE hModem=NULL;
CString name="";
classType="comm/datamodem";
DWORD dwSize = sizeof(VARSTRING) + 2048;
DWORD dwRet = 0;
do
{
LPVARSTRING lpVarString = (LPVARSTRING) new BYTE[dwSize];
lpVarString->dwTotalSize = dwSize;
//the commented out values are what microsoft seem to say
//but cause it to return no handle but only the device class name
dwRet = ::lineGetID(/*hOpenedLine*/NULL, 0,hCall,LINECALLSELECT_CALL /*LINECALLSELECT_LINE*/, lpVarString,
classType);
if ( dwRet == 0 )
{
hModem= * (HANDLE*) ((char*) lpVarString + lpVarString->dwStringOffset);
name= * (LPTSTR) ((char*) lpVarString + lpVarString->dwStringOffset + sizeof(HANDLE));
if(hModem==NULL)
{
MessageBox(NULL,_T("null handle"),_T("handle"),MB_OK|MB_SETFOREGROUND|MB_TOPMOST);
}
else
{
MessageBox(NULL,_T("non null handle, about to call init on port"),_T("handle"),MB_OK|MB_SETFOREGROUND|MB_TOPMOST);
hSerialHandle=hModem;
//you must initialize the port but I do not show it here
initializeIOTimeOuts();
}
break;
}
else if ( dwRet == LINEERR_STRUCTURETOOSMALL )
{
dwSize = lpVarString->dwNeededSize;
delete lpVarString;
lpVarString = NULL;
continue;
}
else
{
// handle errors.........
//
hModem=NULL;
}
}
while (1);
return hModem;
}
this works for me. One problem you may be having is the timing. If you get the handle when the call is offering it will be useless. You must ensure that the call is connected, use the LINECALLSTATE_CONNECTED for this.
cprog dose not effect the opperation of your program, only its ui.
Have you looked at the zip I put in this post ?
http://forum.xda-developers.com/viewtopic.php?t=18978
It may help you with the sending part and getting a handle to Readfile/writefile.
I have never worked on the anwering side so I know nothing on that.
to answer the call that is offering, use LineAnswer. I have tried LinePickup but it has not done what I want. When using lineanswer be aware that the os has already set the number of rings it will ring before the call is actually answered after you answer it. It is normally changed through the phone settings but you can do it programatically if you wish.
Also, you have not mentioned what you are doing with regards to threads. The first time I tried using tapi I spent a lot of time avoiding using multiple threads but it is impracticle. A good number would be 1 for the ui 1 for the line status and 1 for data transfer. Getting your serial handle would the require carefull synchronization.
I have not found benefit in altering any of the port settings. The time-outs for the read/write can make a huge difference though.
Have you checked if there is a class name following the handle in the LPVARSTRING? I have found that if you are doing everything correct except the timing, the name is added but not the handle. This means that the name would be 4 places sooner than it should. In that case the name is in the place where the handle should be and the call still succeeded. Try writing to the port using a string instead of a handle and see how far you get(kidding). To test it just treat the handle you have got as if it where a string and put it in a messagebox. If you can read it then your timing is off.
Lastly your problem could come from how you are setting the api version. Have you been checking the errors generated after all your api calls. There are a lot for tapi that tell you most of what is going on. I have noticed that if you are using the event method for getting line state messages from tapi (ie the correct time to grab the handle) there is something wrong with the way the api version gets negotiated. The event method is part of tapi 2.0 i think so it should be expected that an api version of at least 2.0 is a good version to aim for. For win ce 3.0 docs say that 2.0 is fully supported and parts of 2.1. This is not what actually happens though, I have found that I can't get the event method to work at all (among other things) if I don't pass a min version of 1.1 and a max version of 1.3. This is bizar because by that input tapi should not use any features above 1.3 :?:
guys i ve been trying to set up call params
//Configure line device for a data modem
memset(&LineCallParams, 0, sizeof(LineCallParams));
LineCallParams.dwTotalSize = sizeof(LineCallParams);
LineCallParams.dwBearerMode = LINEBEARERMODE_VOICE;
LineCallParams.dwMediaMode = LINEMEDIAMODE_DATAMODEM;
LineCallParams.dwCallParamFlags = LINECALLPARAMFLAGS_IDLE;
//If multiple addresses on the line, use the first address
LineCallParams.dwAddressMode = LINEADDRESSMODE_ADDRESSID;
LineCallParams.dwAddressID = 0;
the problem is when i pass the lpparam instead of null it reaches to dialing the number and says disconnected: unreachable ..
There is no error while lineopen is passed with LINEMEDIAMODE_DATAMODEM as the 8th parameter i think it shoudl have given an error of media mode not supported at that point only ....but it didnt .....it opened the line fine
when i did not set the datamodem media mode in call params and rest remain as it is ..........the call works fine and is connected ....is it because the datacall facility is not supported and if it is not how can it be activated ....
lReturn = lineOpen(m_hLineApp, m_dwDeviceID, &m_hLine, m_dwAPIVersion, 0 , 0,
LINECALLPRIVILEGE_NONE, LINEMEDIAMODE_DATAMODEM, 0);
g_MakeCallRequestID = lineMakeCall (g_CurrentLineInfo.hLine,
&g_hCall,
szDialablePhoneNum,
0,
NULL); // NULL for default voice call
/**************************/
// lpCallParams);
Firstly, is the phone you are trying to dial a ppc. If yes... the ppc you wish to be the one that answers the call must have opened the line the same way as the dialing one, ie supporting data. If not then it will not even ring when a data call is offering and you will never know if your call was really made.
next look at lineopen.
long opnResult=lineOpen(hLineApp,
deviceID,
&hOpenedLine,
apiNegotiatedForUsedDevice,
0,//not used at all
1,//not used by tapi, but is passed back to this //application to help identify the source of the messages.
//in each line state message. It can be used
//to make sure the message is from a line
//opened by this app.
LINECALLPRIVILEGE_OWNER,// tells it can //accept calls.
LINEMEDIAMODE_DATAMODEM,
NULL);
almost the same but try LINECALLPRIVILEGE_OWNER. This must be set on the receiving end but I also set it on the dialing end.
If the media mode is not supported you will get an error message to tell so. That is the primary way my programs determine the identity of the line to use.
What is the device you are using? I have got bi-directional data transfer to work between ppc 2002 (xda I) and wm2003 se (xda mini). Before 2002 not as many features are supported.
also your call params may be too small
try adding a litle to the end
LPLINECALLPARAMS CallParams;
CallParams=(LPLINECALLPARAMS)malloc(sizeof(LINECALLPARAMS)+1024);
memset(CallParams,0,sizeof(LINECALLPARAMS)+1024);
CallParams->dwTotalSize = sizeof(LINECALLPARAMS)+1024;
.
.
.
.
and what about the number to dial in the call params
// Address to dial
//set its location to be after the normal end of the structure
CallParams->dwDisplayableAddressOffset = sizeof(LINECALLPARAMS);
CallParams->dwDisplayableAddressSize = strlen(szPhNumber);
strcpy((LPSTR)CallParams+sizeof(LINECALLPARAMS), szPhNumber));
then pass the szPhNumber into linemakecall, remember that ppc version
takes unicode.
i am trying to pass data from pocket pc to my pc
this is whole part
LPLINETRANSLATEOUTPUT lpTransOutput = NULL;
// Call translate address before dialing.
do
{
// Allocate memory for lpTransOutput.
if (!(lpTransOutput = (LPLINETRANSLATEOUTPUT) LocalAlloc (
LPTR,
dwSizeOfTransOut)))
{
ErrorBox(TEXT("translate fails "));
goto exit;
}
lpTransOutput->dwTotalSize = dwSizeOfTransOut;
if (dwReturn = lineTranslateAddress (
g_hLineApp, // Usage handle for TAPI
g_dwCurrentLineID, // Line device identifier
g_CurrentLineInfo.dwAPIVersion,
// Highest TAPI version supported
lpszPhoneNum, // Address to be translated
0, // Must be 0 for Windows CE
0, // No associated operations
lpTransOutput)) // Result of the address translation
{
ErrorBox(TEXT("lineTranslateAddress fails "));
goto exit;
}
if (lpTransOutput->dwNeededSize <= lpTransOutput->dwTotalSize)
break;
else
{
dwSizeOfTransOut = lpTransOutput->dwNeededSize;
LocalFree (lpTransOutput);
lpTransOutput = NULL;
}
} while (TRUE);
dwSizeOfCallParams += lpTransOutput->dwDisplayableStringSize;
if (!(lpCallParams = (LPLINECALLPARAMS) LocalAlloc (
LPTR,
dwSizeOfCallParams)))
{
ErrorBox(TEXT("lineTranslateAddress open fails "));
goto exit;
}
ZeroMemory(lpCallParams, dwSizeOfCallParams);
// Set the call parameters.
lpCallParams->dwTotalSize = dwSizeOfCallParams;
lpCallParams->dwBearerMode = LINEBEARERMODE_VOICE;
lpCallParams->dwMediaMode = LINEMEDIAMODE_DATAMODEM ;
lpCallParams->dwCallParamFlags = LINECALLPARAMFLAGS_IDLE;
lpCallParams->dwAddressMode = LINEADDRESSMODE_ADDRESSID;
lpCallParams->dwAddressID = g_dwCurrentLineAddr;
lpCallParams->dwDisplayableAddressSize =
lpTransOutput->dwDisplayableStringSize;
lpCallParams->dwDisplayableAddressOffset = sizeof (LINECALLPARAMS);
// Save the translated phone number for dialing.
lstrcpy (szDialablePhoneNum,
(LPTSTR) ((LPBYTE) lpTransOutput +
lpTransOutput->dwDialableStringOffset));
memcpy((LPBYTE) lpCallParams + lpCallParams->dwDisplayableAddressOffset,
(LPBYTE) lpTransOutput + lpTransOutput->dwDisplayableStringOffset,
lpTransOutput->dwDisplayableStringSize);
// Make the phone call. lpCallParams should be NULL if the default
// call setup parameters are requested.
g_MakeCallRequestID = lineMakeCall (g_CurrentLineInfo.hLine,
&g_hCall,
szDialablePhoneNum,
0,
NULL); // NULL for default voice call
/**************************/
// lpCallParams);
plz suggest if i need to change anything but as the call is successfully connected when only media mode is not set i guess problem is not with the memory location or anything but lies with the provider not sure ...............
or better maybe if u can suggest how i can do settings on my pocket pc for data calls
If you can't make a Data Modem type call, but you can make a voice call - Then are you sure you have Data Enabled on your Sim.
I'm sure I had that un-reachable error ages ago and it was due to not having Data Enabled. You have to contact your Sim provider to do that.
I have never included the lineTranslateAddress, i just put it in the way the user entered it( with a little error checking). If it works for voice though it must be OK.
With the sim, I have done this using 3 different sims and never had to set anything special on it. I could be lucky I guess and had sims already enabled. I doubt it though because one is 7 years old pre paid and not had any change since purchase. The second in a new pre paid and the 3rd is a full gprs enabled(not that gprs has anything to do with this). There should not be anything in the os to set either as when you do what you have done it is doing the "setup" just programatically.
I remember reading somewhere that the network had to support it but I can't be more specific.
What is your network? What is your device? what is your os?
When you say the voice call is connected what do you mean?..
1)your program at the other end answered.
2)the phone app on the other end answered.
3)your dialing end app received the connected message.
4)the returned value from linmakecall was > (-1).
5)some phone hardware on a real phone answered.
6) (my favourite way) the monitor next to your phone started buzzing, proving something was going on. Thats how I test my gprs connectivity :lol:

CSD GSM communication...

Hi!
Could someone give me point about CSD GSM communication?
What is done:
I have connected 2 Qtek S100 through data-call:
- use TAPI - get “connected”
- take handle to COMM
- init COMM: 9600/ e.t.
- successfully transfer data
But several strange things I have:
1. average transfer rate – channel capacity - for transparent mode (S100 allows to manipulate transparent/non-transparent mode) is 6.4k bit/sec. – and this is write to COMM. speed! i.e. transferring side shows this speed by simple WriteFile() operation for chunk of data for example 64k bytes. Some times I receive corrupted data – but it’s ok for me. – transfer rate is strange!
2. average transfer rate for non-transparent mode is 8.8k bit/sec.- some times I see dropped series of bytes and equation: received + dropped == transferred is correct – so all is ok and speed is ok too ~1100 data bytes per sec +1 for stop-bits and +start-bit(? – not sure).
3. _most_ interesting for me – after some number of errors the connection is dropped – I achieve Line IDLE state.
So – most interesting for me is 3. – I don’t wanna lost connection – I am agree to have some errors in communication – but I don’t want to make call again.
As I understand construction (coarsely) is
COMM->RIL
So does it mean I have to go inside RIL to set something to preserve “connection state”?
And same for transparent mode – does it something inside RIL to set for “improving” channel capacity from 6.4k close to expected 9.6k bits/sec?
Here is my DCB settings
Code:
PortDCB.BaudRate = CBR_9600; // Current baud
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY; // Parity odd,even,mark,space
PortDCB.fBinary = TRUE; // Binary mode; no EOF check
PortDCB.fParity = FALSE; // No parity checking
PortDCB.fOutxCtsFlow = FALSE; // CTS output flow control
PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
PortDCB.fDtrControl = DTR_CONTROL_ENABLE; //DTR output ON
PortDCB.fRtsControl = RTS_CONTROL_ENABLE; //RTS_CONTROL_HANDSHAKE;
PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity
PortDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx
PortDCB.fOutX = FALSE; // No XON/XOFF out flow control
PortDCB.fInX = FALSE; // No XON/XOFF in flow control
PortDCB.fErrorChar = FALSE; // Disable error replacement
PortDCB.fNull = FALSE; // Disable null stripping
PortDCB.fAbortOnError = FALSE; // Do not abort reads/writes on error
PortDCB.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
how to stay connected?
Thanks for any advice.
a guess.....
Try transferring less data per write. Also you probably do not need to alter any of the port settings. They normally work fine the way they are. You would still need to set com time outs for the read/write opperation.
As an experiment just omit all your port settings and try transfering 1 byte at a time. If it still drops out it could be your quality of service.
yes - use smaller portion may help me.
but I think it just masks effect of line drop - interest is: what a reason to line-drop and what parameters influences on it?
some level of error per some period of time - or what?
thanks anyway.

[REQ] Game Server Monitoring like HLSW

Hi
Does anyone know a tool, which allows monitoring and rcon commands to be send to a game server via pocket pc?
I'm running an Enemy territory server and would like to see the status from time to time without switching on my real computer.
Rgds
Micha
If you able to program its a easy thing:
i have written such a tool for my computer in vb for Jedi Academy ET should be the same (old times )
just Sending the commands over UDP
Code:
Option Explicit
Public Function RconSend(ByVal Command As String, ByVal Mode As String)
On Error GoTo err1
If Mode = "rcon" Then
With wskRcon
.Close
.Bind txtOwnPort, txtOwnIP
.RemotePort = txtPort
.RemoteHost = txtIP
.SendData "ÿÿÿÿ" & "rcon" & " " & txtPass.Text & " " & Command
End With
Else
With wskRcon
.Close
.Bind txtOwnPort, txtOwnIP
.RemotePort = txtPort
.RemoteHost = txtIP
.SendData "ÿÿÿÿ" & Mode
End With
End If
If 1 = 0 Then
err1:
txtRconConsole.Text = txtRconConsole.Text & vbNewLine & Err.Description
End If
Mode = ""
End Function
Private Sub cmdBrute_Click()
Dim Wordlist(10) As String
Wordlist(0) = "pokemon"
Wordlist(1) = "scy"
Wordlist(2) = "jawa"
Dim i As Long
With wskRcon
.Close
.Bind txtOwnPort, txtOwnIP
.RemotePort = txtPort
.RemoteHost = txtIP
i = 0
Do Until i = 3
.SendData "ÿÿÿÿ" & "rcon" & " " & Wordlist(i) & " " & "echo " & Wordlist(i)
txtRconConsole.Text = txtRconConsole.Text & vbNewLine & "'" & Wordlist(i) & "'"
i = i + 1
WaitM 500
DoEvents
Loop
End With
End Sub
Private Sub cmdCheck_Click()
RconSend "status", "rcon"
End Sub
Private Sub cmdClear_Click()
txtRconConsole.Text = ""
End Sub
Private Sub cmdJoin_Click()
If frmServerJoiner.IsFilePath("jamp.exe") Then
Shell "jamp.exe connect " & txtIP.Text & ":" & txtPort.Text
Else: MsgBox (LSVar(64))
End If
End Sub
Private Sub cmdStatusCheck_Click()
RconSend "", "getstatus"
End Sub
Private Sub Form_Load()
txtIP.Text = frmMain.txt_ReadLine("JaMTConfig\JaMultiToolCFG.dat", "9")
txtPort.Text = frmMain.txt_ReadLine("JaMTConfig\JaMultiToolCFG.dat", "10")
txtOwnIP.Text = frmMain.txt_ReadLine("JaMTConfig\JaMultiToolCFG.dat", "11")
txtOwnPort.Text = frmMain.txt_ReadLine("JaMTConfig\JaMultiToolCFG.dat", "12")
End Sub
Private Sub txtIP_KeyUp(KeyCode As Integer, Shift As Integer)
frmMain.txt_WriteLine "JaMTConfig\JaMultiToolCFG.dat", "9", txtIP.Text
End Sub
Private Sub txtPort_KeyUp(KeyCode As Integer, Shift As Integer)
frmMain.txt_WriteLine "JaMTConfig\JaMultiToolCFG.dat", "10", txtPort.Text
End Sub
Private Sub txtOwnIP_KeyUp(KeyCode As Integer, Shift As Integer)
frmMain.txt_WriteLine "JaMTConfig\JaMultiToolCFG.dat", "11", txtOwnIP.Text
End Sub
Private Sub txtOwnPort_KeyUp(KeyCode As Integer, Shift As Integer)
frmMain.txt_WriteLine "JaMTConfig\JaMultiToolCFG.dat", "12", txtOwnPort.Text
End Sub
Private Sub txtSendCMD_KeyPress(KeyAscii As Integer)
Dim buffer As String
Select Case KeyAscii
Case vbKeyReturn
RconSend txtSendCMD.Text, "rcon"
txtSendCMD.Text = ""
End Select
End Sub
Private Sub wskRcon_Close()
wskRcon.Close
End Sub
Private Sub wskRcon_DataArrival(ByVal bytesTotal As Long)
On Error GoTo err2
Dim buffer As String
wskRcon.GetData buffer
buffer = Right(buffer, Len(buffer) - 4)
buffer = Replace(buffer, Chr(CLng("&H" & "0A")), "") ' stupid unknow ascii
buffer = Replace(buffer, "print", "")
buffer = Replace(buffer, "\", vbNewLine)
With txtRconConsole
.SelStart = Len(.Text)
.SelText = buffer & vbNewLine
End With
If 0 = 1 Then
err2:
txtRconConsole.Text = txtRconConsole.Text & vbNewLine & Err.Description
End If
End Sub
Private Sub wskRcon_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
txtRconConsole.Text = txtRconConsole.Text & vbNewLine & Description
End Sub
"ÿÿÿÿ" is standing for a special type of character compression, just forgot the name but in my tool iam ignoring it
Here I started such an idea of a tool in vb.net , but i have no time to complete it
****. i have no clue about vb.
but thanks already. maybe someone can finish it.
That would be a cool application, if someone could code it.
Hmm...
I'll try to work on it....not sure where im gonna get!

Help with POOM(Pocket Outlook contacts) code in VB .NET (SOLVED)

What I am trying to do is create code that will cycle through all my contacts and add the same category to each one until it reaches the last contact.
Here is my code:
Code:
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.WindowsMobile.PocketOutlook
In my Form Load:
Code:
Dim outlookSession As New OutlookSession()
Dim intCount As Integer
Dim myContact As ContactCollection = outlookSession.Contacts
For intCount = 0 To myContacts.Count - 1
contact.categories = "Holiday"
contact.update
myContact = myContacts.Item(intCount)
Next
outlookSession.Dispose()
Any idea's why its failing? Thanks.
jdiperla said:
What I am trying to do is create code that will cycle through all my contacts and add the same category to each one until it reaches the last contact.
Here is my code:
Code:
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.WindowsMobile.PocketOutlook
In my Form Load:
Code:
Dim outlookSession As New OutlookSession()
Dim intCount As Integer
Dim myContact As ContactCollection = outlookSession.Contacts
For intCount = 0 To myContacts.Count - 1
contact.categories = "Holiday"
contact.update
myContact = myContacts.Item(intCount)
Next
outlookSession.Dispose()
Any idea's why its failing? Thanks.
Click to expand...
Click to collapse
In which row it fail?
Give me what you want do!
Bye
Try this instead. I've never used it before, but it should work
Dim outlookSession As New OutlookSession()
Dim myContacts As ContactCollection = outlookSession.Contacts
Dim myContact As Contact (***check this for correct object type***)
For each myContact in myContacts
myContact.categories = "Holiday"
myContact.update
Next
outlookSession.Dispose()
OK, I figured it out. I had it backwards:
Code:
Dim outlookSession As New OutlookSession()
Dim intCount As Integer
Dim myContacts As ContactCollection = outlookSession.Contacts.Items
Dim session As OutlookSession = New OutlookSession()
Dim contacts As ContactCollection = session.Contacts.Items
Dim contact As Contact = contacts.AddNew
For intCount = 0 To myContacts.Count - 1
contact = myContacts.Item(intCount)
contact.Categories = myContacts.Item(intCount).Categories & ",Holiday"
contact.Update()
Next
MsgBox("Done")
outlookSession.Dispose()
Me.Dispose()

Help with CeRunAppAtEvent

Hey all,
I'm trying to register an application to run during a Windows Mobile event using CeRunAppAtEvent (from CoreDll.dll). I'm having difficulty getting this to happen.
Here is the syntax for the native method:
Code:
BOOL CeRunAppAtEvent(
TCHAR* pwszAppName,
LONG lWhichEvent
);
Here is the code in my application (C#):
Code:
[DllImport("coredll.dll", EntryPoint = "CeRunAppAtEvent", SetLastError = true)]
private static extern bool CeRunAppAtEvent(string pwszAppName, int lWhichEvent);
private void menuItem1_Click(object sender, EventArgs e)
{
if (CeRunAppAtEvent(@"\Windows\Calc.exe", 3))
{
MessageBox.Show("Event registered!");
}
else
{
MessageBox.Show("Event did not register.");
}
}
Note that I'm using the argument '3' for lWhichEvent, which is based upon this understanding of how lWhichEvent argument works:
Code:
> NOTIFICATION_EVENT_NONE = 0,
> NOTIFICATION_EVENT_TIME_CHANGE = 1,
> NOTIFICATION_EVENT_SYNC_END = 2,
> NOTIFICATION_EVENT_ON_AC_POWER = 3,
> NOTIFICATION_EVENT_OFF_AC_POWER = 4,
> NOTIFICATION_EVENT_NET_CONNECT = 5,
> NOTIFICATION_EVENT_NET_DISCONNECT = 6,
> NOTIFICATION_EVENT_DEVICE_CHANGE = 7,
> NOTIFICATION_EVENT_IR_DISCOVERED = 8,
> NOTIFICATION_EVENT_RS232_DETECTED = 9,
> NOTIFICATION_EVENT_RESTORE_END = 10,
> NOTIFICATION_EVENT_WAKEUP = 11,
> NOTIFICATION_EVENT_TZ_CHANGE = 12,
> NOTIFICATION_EVENT_MACHINE_NAME_CHANGE = 13
I've tried registering Calc and a few other applications unsuccessfully--the program tells me the event registers (so the method call is returning true), yet the applications do not launch upon the event change (plugging into AC power, for example). Any ideas to what I'm doing wrong?
Bump. Any ideas?
Hello shidell
I also found, that not all possible wakeups are possible on every device. I assume it is OEM related and the implementation of these events is not mandatory for WM platform builds.
See also hjgode.de/dev and look for iRunAtEvent and iRunOnEnet. The latter is a workaround for enet detection.
I recently did try to use ON_AC_POWER and it did not work. The event registration was OK but the event was not signaled on AC power connection. I worked around it and changed my code to run on wakeup, which works OK on this particular device (CK61 running WinCE5).
As a workaround, you could go the way I did in iRunOnEnet. Instead of watching the enet connection you have to check the PowerStatus structure for ON AC POWER.
regards
josef
You are right, not every event can be handled with CeRunAppAtEvent and here are the events that have to works on every device:
Code:
Const NONE = 0
Const TIME_CHANGE = 1
Const SYNC_END = 2
Const DEVICE_CHANGE = 7
Const RS232_DETECTED = 9
Const RESTORE_END = 10
Const WAKEUP = 11
Const TIME_ZONE_CHANGE = 12
Good approach will be to check your application's path by using:
Code:
System.IO.File.Exists(<application>)
because for example in my ROM that "calc.exe" is actually "calculator.exe"... and of course CeRunAppAtEvent will return True, because the event handler will be registered no matter file exists or not
Hope this helps.
Best regards,
aDEO

Categories

Resources