34
René Stein Senior Software Architect http://renestein.net http://blog.renestein.net

Slasti Strasti Propasti Windows Mobile

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Slasti Strasti Propasti Windows Mobile

René SteinSenior Software Architecthttp://renestein.nethttp://blog.renestein.net

Page 2: Slasti Strasti Propasti Windows Mobile

MobilMobilní zařízeníní zařízení

StandardStandard

Windows Windows MobileMobile

Tablet PCTablet PC – jiný – jiný světsvět

ProfessionalProfessionalClassicClassic

• GadgetyGadgety

Page 3: Slasti Strasti Propasti Windows Mobile

GPS Intermediate DriverPřístup k GPS pouze z jedné aplikace přímo přes

sériový port před Windows Mobile 5.0Znáte Franson GPS Gate

GPS Intermediate driverParsování NMEA zpráv z GPS

($GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A )

Doručení do více aplikacíGPSOpenDevice()GPSCloseDevice()GPSGetPosition()GPSGetDeviceState()

Page 4: Slasti Strasti Propasti Windows Mobile

HANDLE g_hGPSDevice;g_hGPSDevice =

GPSOpenDevice(NULL,NULL,NULL,0);

GPS_DEVICE gpsDevice;ZeroMemory(&gpsDevice,sizeof(GPS_DEVICE))

; gpsDevice.dwVersion=GPS_VERSION_1; gpsDevice.dwSize=sizeof(GPS_DEVICE); DWORD result=GPSGetDeviceState(&gpsDevice);

Je možné se nechat notifikovat o příchozích datech/stavu GPS (CreateEvent).

Page 5: Slasti Strasti Propasti Windows Mobile

Získání poziceGPS_POSITION gpsPosition;

ZeroMemory(&gpsPosition,sizeof(GPS_POSITION)); gpsPosition.dwVersion=GPS_VERSION_1; gpsPosition.dwSize=sizeof(GPS_POSITION); DWORD result=GPSGetPosition(g_hGPSDevice,&gpsPosition,10000,0);

gpsPositionValid.dblLatitudegpsPositionValid.dblLongitude

Page 6: Slasti Strasti Propasti Windows Mobile

Managed kód přes P/Invokepublic const int LMEM_ZEROINIT = 0x40;

[System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint = "#33", SetLastError = true)“]public static extern IntPtr LocalAlloc(int flags, int byteCount);

[System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint = "#36", SetLastError = true)“]public static extern IntPtr LocalFree(IntPtr hMem);

[DllImport("gpsapi.dll")“]static extern IntPtr GPSOpenDevice(IntPtr hNewLocationData, IntPtr hDeviceStateChange, string szDeviceName, int dwFlags);

[DllImport("gpsapi.dll")“]static extern int GPSCloseDevice(IntPtr hGPSDevice);

[DllImport("gpsapi.dll")“]static extern int GPSGetPosition(IntPtr hGPSDevice, IntPtr pGPSPosition, int dwMaximumAge, int dwFlags);

[DllImport("gpsapi.dll")“]static extern int GPSGetDeviceState(IntPtr pGPSDevice);

KOMPLETNí PŘÍKLAD je v SDK (C#, zkompilovaný na XDA-Developers)

Page 7: Slasti Strasti Propasti Windows Mobile

A teď strasti...GPS ID API je hezké API. Alespoň na první pohled...Ale:

Na některých zařízeních s WM6 GPSGetPosition vrací chybu 87 (ERROR_INVALID_PARAMETER).Důvod: OEM partneři a Microsoft počítají s jinou

velikostí struktury GPS_POSITION.Obezlička:BYTE gpsPositionRaw[376];

    GPS_POSITION *pGpsLocation = (GPS_POSITION*)gpsPositionRaw;        pGpsLocation->dwVersion = GPS_VERSION_1;    pGpsLocation->dwSize    = sizeof(gpsPositionRaw);

Page 8: Slasti Strasti Propasti Windows Mobile

Další strasti.Na HTC Artemis (MDA Vario III) je nekompletní

signalizace EV_RXCHAR na sériovém portu. To znamená, že nikdy nedostanete informaci o

poloze, což je u GPS API podstatná chyba :-)Obezličky:

Návrat ke komunikaci přes sériový port Použití API ReadFile a v pravidelných intervalech

se pokusit číst z portu.Zkuste si na HTC Kaiser připojit externí GPS

nebo si jen pohrát s nastavením driveru.

Page 9: Slasti Strasti Propasti Windows Mobile

Komunikace přes bluetoothVětšina zařízení používá MS BT Stack

Widcomm StackLid „obecný internetový“ má za obětního beránka

Microsoft Málo podporovaných BT protokolůChybné implementace BT profilůVyřazení některých protokolů z OS – BT DUNNejsou podporovány všechny specialitky BT profilů (BT

Handsfree)Propojení BT s nastavením IrDANesmyslná omezení u BT Handsfree (autorádio Pioneer

očekává BT class Smartphone)Špatně vyladěné drivery od dodavatele HW – HTC Kaiser.

Widcomm a IpaqWM_HIBERNATE a poté „odstřelení“ ovládací konzole, které

způsobilo i nefunkčnost driveru!!!!!

Page 10: Slasti Strasti Propasti Windows Mobile

                                   

Contents

                                   

Contents

Page 11: Slasti Strasti Propasti Windows Mobile

Podpora Bluetooth přes winsockBTHGetStateBTHSetStateZnáte problémy s nastavením bluetooth do

režimu „Discoverable“ – Viditelný?

Enumerace zařízení a služeb WSALookupServiceBegin WSALookupServiceBegin

Nijak zvlášť přívětivý kód. Ukázka.

Page 12: Slasti Strasti Propasti Windows Mobile

Vlastní protokolyBthnscreate.exe pro snadné vytvoření struktury SDP

záznamu (recordu) – bohužel pouze součást Platform Builderu.

#define SDP_HF_RECORD_SIZE 0x00000048BYTE rgbSdpRecordHeadsetHF[] = { 0x35, 0x46, 0x09, 0x00, 0x01, 0x35, 0x06, 0x19, 0x11, 0x1f, 0x19, 0x12, 0x03, 0x09, 0x00, 0x04, 0x35, 0x0c, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08, 0x0a, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x1e, 0x09, 0x01, 0x01, 0x09, 0x01, 0x00, 0x25, 0x0d, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x09, 0x03, 0x01, 0x08, 0x01, 0x09, 0x03, 0x11, 0x09, 0x00, 0x00};

Page 13: Slasti Strasti Propasti Windows Mobile

Vlastní Audio Gateway - HF profiletypedef DWORD (*PFN_SendATCommand) (LPSTR szCommand,

DWORD cbCommand);

BOOL BthAGATHandler(LPSTR szCommand, DWORD cbCommand);

void BthAGATSetCallback(PFN_SendATCommand pfn);

typedef DWORD (*PFN_SendATCommand) (LPSTR szCommand, DWORD cbCommand);

DWORD BthAGOnVoiceTag(BOOL fOn);

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Bluetooth\\AudioGateway\\BTAGExtModule

Neúplná dokumentace na MSDn

Page 14: Slasti Strasti Propasti Windows Mobile

Komunikace přes WiFiVětšina vývojářů předpokládá, že Microsoft

poskytne nějaké API pro správu WiFi. Žádné závazné API neexistuje.

Pouze OEM partneři jsou odpovědní za WiFi modul a jeho možnosti.

OEM API není veřejné.Volitelná podpora WZC, NDIS...

Page 15: Slasti Strasti Propasti Windows Mobile

ProblémyPři změně IP adresy, DHCP, masce sítě musíte většinou

resetovat PDA.Wifi Profily aplikují profil ihned – bez resetu.U některých zařízení (MDA Vario) problémy s nahráním

ovladače WiFi.

Změna

Page 16: Slasti Strasti Propasti Windows Mobile

Reinicializace adaptéru přes NDIS/IO

HANDLE hDevice = CreateFile(DD_NDIS_DEVICE_NAME, GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,

0, NULL); if (hDevice == INVALID_HANDLE_VALUE) {

return false; }

int adapterNamefullLength = adapterName.GetLength() + 2; WCHAR* pAdapterName = new WCHAR[adapterNamefullLength]; if (!pAdapterName) { return false; }

wcscpy(pAdapterName , adapterName); pAdapterName[adapterNamefullLength - 2] = L'\0'; pAdapterName[adapterNamefullLength - 1] = L'\0';

bool result = true; if (!DeviceIoControl(hDevice, IOCTL_NDIS_REBIND_ADAPTER, pAdapterName, adapterNamefullLength * sizeof(WCHAR), NULL, NULL, NULL, NULL)) { result = false; }

CloseHandle(hDevice);

Page 17: Slasti Strasti Propasti Windows Mobile

Spouštění Wifi od Windows Mobile 5 - nedokumentováno!!

g_DllWrlspwr = LoadLibrary(TEXT("ossvcs.dll"));if (g_DllWrlspwr == NULL)

return FALSE;pGetWirelessDevices = (_GetWirelessDevices)GetProcAddress(g_DllWrlspwr,MAKEINTRESOURCE(GetWirelessDevice_ORDINAL));if (pGetWirelessDevices == NULL)

return FALSE;

pChangeRadioState = (_ChangeRadioState)GetProcAddress(g_DllWrlspwr,MAKEINTRESOURCE(ChangeRadioState_ORDINAL));if (pChangeRadioState == NULL)

return FALSE;

pFreeDeviceList = (_FreeDeviceList)GetProcAddress(g_DllWrlspwr,MAKEINTRESOURCE(FreeDeviceList_ORDINAL));if (pFreeDeviceList == NULL)

return FALSE;return TRUE;

Page 18: Slasti Strasti Propasti Windows Mobile

Proč hack funguje? Odpovědí je pravděpodobně SNAPI.

Page 19: Slasti Strasti Propasti Windows Mobile

SNAPI v Compact .Net FrameworkuSystemState state = new

SystemState(SystemProperty. DisplayRotation);

state.Changed += new ChangeEventHandler(state_Changed);

Page 20: Slasti Strasti Propasti Windows Mobile

Informace z telefonní části – GSM moduluMicrosoft podporuje pro vývojáře aplikací

pouze TAPI.Přes TAPI uskutečníte hovor, zjistíte

informace o lince, ale určitě se nedostanete k údajům jako jsou Cell Id, LAC apod.

Pomocí cell id lze například zjistit, kde se přibližně nacházíme. (Google Maps Mobile).

Ale jak se k těmto údajům dostat?

Page 21: Slasti Strasti Propasti Windows Mobile

RILRIL - Radio Interface layerRIL proxy přenáší informace z OEM RIL

driveru do vyšších (aplikačních) vrstev.Dle informací z Microsoftu se neplánuje

zveřejnění RILu pro aplikační vývojářeNyní částečně dokumentován na MSDN

Page 22: Slasti Strasti Propasti Windows Mobile

Net Monitor AlfaDerivát komerčního projektuPřes RIL čte údaje z GSM částiIntegrace s BTS DB na GSM webu

(www.gsmweb.cz)

 

Page 23: Slasti Strasti Propasti Windows Mobile

A jak část .Net monitor pracuje?Today plugin je observer třídy, která

zapouzdřuje přístup k RILu.Dalším observerem je nyní instance třídy

zapisující do souboru.

UKÁZKA RIL jádra

Page 24: Slasti Strasti Propasti Windows Mobile

.NET Compact Framework„Ořezaný“ .NET Framework

Snaha omezit jmenné prostory pouz pro compact edici

Vývoj ve Visual studiu (2008)Pro mobilní zařízení neexistuje „Express“ ediceRychlý vývoj „business“ aplikací

Přechod na Compact .Net Framework z velkého .Net Frameworku se zdá být snadný.

Většinou Compact .Net Framework pouze obalují nativní kód.

Zlé jazyky říkají, že i pro verzi 3.5 platí: „Tenký obal nad výjimkou NotSupportedException“. A my jsme už už dnes viděli, že to často platí.

Page 25: Slasti Strasti Propasti Windows Mobile

Standard

Windows Mobile

Page 26: Slasti Strasti Propasti Windows Mobile

Podpora různých rozlišení a orientace displejeZměna prvků za běhu aplikace Využití vlastnosti Anchor„Znásilnění“ lokalizace (localizable) ke změně

vzhledu formuláře

Page 27: Slasti Strasti Propasti Windows Mobile

Chcete konfigurovat PDA? Nebo získat aktuální nastavení PDA? public static XmlDocument

ProcessConfiguration( XmlDocument configDoc, bool metadata );

<?xml version="1.0" encoding="utf-16"?> <wap-provisioningdoc> <characteristic type="Registry"><characteristic type="HKCU\Software\Microsoft\Windows\

CurrentVersion\Internet Settings\Connections"> <parm-query name="DefaultConnectionSettings" />

</characteristic> </characteristic> </wap-provisioningdoc>

Page 28: Slasti Strasti Propasti Windows Mobile

CSP -jedna z nejlepších věcí ve Windows MobileS CSP můžete:

Nastavit GPRS připojeníNastavit maximální velikost stahovaných přílohOdstranit všechny proxy. Nastavit proxy.Nastavit čas a datum.Nastavit/!!!!zjistit!!!! emailové účty v Pocket Outlooku.Změnit/Přidat hodnoty v registrech

http://msdn.microsoft.com/cs-cz/bb737536(en-us).aspx

Wrapper nad nativní funkcí DMProcessConfigXml

Page 29: Slasti Strasti Propasti Windows Mobile

Problém s CSP Jak nastavit a smazat právě jednu proxy ve Work

Settings?Žádná CSP nebyla vhodná.

U jednoho nastavení smazány všechny proxy.Nebo proxy byla nastavena, ale nebyla aktivní.

Návrat ke starým praktikám HKEY_LOCAL_MACHINE\Comm\ConnMgr\Providers\

{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E}\HTTP-{BC2CEC33-AEF1-412e-ABAC-3D695B7BE57D}:DestId

Klíče DestId, Proxy a Enable.Rozumíte konfiguraci sítí na PDA? Pokud ano, gratuluji,

jste jeden z mála lidí na světě. Víte, co to je ConnMgr?

Page 30: Slasti Strasti Propasti Windows Mobile

Webové službyPodpora asmx i WCFPragramují se zcela stejně jako velkém .Net

FrameworkuVhodné např. pro vlastní oboustrannou

synchronizaci dat mezi aplikací na PDA a serverovým modulem aplikace.

m_service = new medea9wsService(); m_service.Connect_medea9ws(null, null, null);

Page 31: Slasti Strasti Propasti Windows Mobile

Problémy při volání přes SSL System.Net.WebException: Unable to read data from the transport connection. ---> System.Net.Sockets.SocketException: Unknown

error (0x0).    at System.Net.HttpWebRequest.fillBuffer(HttpWebRequest request, Connection connection, CoreResponseData data)    at System.Net.HttpWebRequest.getLine(HttpWebRequest request, Connection connection, CoreResponseData data)    at System.Net.HttpWebRequest.parseResponse(HttpWebRequest request, Connection connection, Boolean defaultKeepAlive)    at System.Net.HttpWebRequest.startReceiving(Connection connection)    at System.Net.Connection.startReceiving(Object ignored)    at System.Threading.ThreadPool.WorkItem.doWork(Object o)    at System.Threading.Timer.ring()

   at System.Net.HttpWebRequest.finishGetResponse()    at System.Net.HttpWebRequest.GetResponse()    // ...

Důvod? CNF obdržel prázdný kryptovaný paket – velikost 0 bajtů po dekryptování. Server takový paket poslat může..

Odstranění chyby (návody přímo z MS)

Nepoužívejte SSL.Překonfigurujte webový server.Vytvořit (nejlépe v nativním kódu) vlastní proxy pro

navazání SSPI.Vyčkat na nějakou další verzi CNF.

Page 32: Slasti Strasti Propasti Windows Mobile

Zpracování WM_Hibernate v Compact .Net FrameworkuVerze 1.x . Compact Net Frameworku nepodporovala

přímé zpracování zprávy WM_HibernateDůsledek=>Systém často aplikaci „odstřelil“

Od verze 2.0 je dostupná událost Hibernate  MobileDevice.Hibernate += MobileDevice_Hibernate;

void MobileDevice_Hibernate(object sender, EventArgs e)  {    if (m_myObject != null)    {    m_myObject.Dispose();     m_myObject = null;    }  }

Page 33: Slasti Strasti Propasti Windows Mobile

Zajímavé části řízeného vývojeWindowsMobile.PocketOutlookWindowsMobile.StatusWindowsMobile.Telephony

Samostatnou kapitolou je (dnes už úžasný) Smart Device Framework, který zajistí, že programování v Compact .Net Frameworku není synonymem pro zkoušku z P/Invoke.

Page 34: Slasti Strasti Propasti Windows Mobile

a možná odpovědi?

René SteinSenior Software Architecthttp://renestein.nethttp://blog.renestein.net