C++ – Directly accessing the modem in Windows Mobile

cmodemtapiwindows-mobile

For some reasons I need to be able to access the internal modem of a Windows Mobile smartphone (a HTC s740 with WM version 6.1). What I want is to be able to access it like it was a serial port in order to give AT-commands.

I have code that uses the TAPI Line interface and lineGetID() to get a "handle" on which I shuld be able to do ReadFile()/WriteFile(). Sadly I have not gotten it to work.

What I do currently is:

  1. Initialize TAPI with lineInitializeEx()

  2. Open the Line with lineOpen()

  3. Iterate through each available device and get info. Currently I am selecting the "UNIMODEM"/"Hayes compatible on COM1" device. But maybe I should choose the "TAPI cellular service"/"Cellular Line" instead? I have tried the "Cellular Line" device with the same result.

  4. Use lineGetID() on the selected device to get a handle.

  5. Do WriteFile("AT\r") and then directly do a ReadFile(), which should give me a "OK" back if it really was the modem I accessed.

  6. Realize that it doesn't work and get annoyed…

But this has so far been a no-go.

Does anyone have any idea on how to do it?

I am doing this in Native WIN32 C++ on Windows Mobile 6 SDK.

UPDATE:
I have so far managed to get a data connection between two phones using RIL, which gives me a serial port handle to write and read from. BUT, I still would like to be able to interact directly with the modem to send AT-commands. So, the bounty I am starting only concerns getting direct access to the modem in order to give AT-commands. My investigations so far indicates that this was possible in previous versions of Windows Mobile (by opening COM2 and/or COM9 and slaying RIL, or something like that) but I have not yet seen code which works on WM6.

Best Answer

You probably can't do this. The interface to the radio isn't necessarily a COM port - the AT commands are often emulated. Even if you could get a handle to the COM port, how would you synchronize with the activity that the built in connection manager is performing.