Slasti Strasti Propasti Windows Mobile

Post on 14-Nov-2014

2,201 views 3 download

description

 

transcript

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

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

StandardStandard

Windows Windows MobileMobile

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

ProfessionalProfessionalClassicClassic

• GadgetyGadgety

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()

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).

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

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)

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);

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.

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!!!!!

                                   

Contents

                                   

Contents

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.

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};

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

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...

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

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);

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;

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

SNAPI v Compact .Net FrameworkuSystemState state = new

SystemState(SystemProperty. DisplayRotation);

state.Changed += new ChangeEventHandler(state_Changed);

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?

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

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

(www.gsmweb.cz)

 

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

.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í.

Standard

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

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>

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

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?

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);

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.

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;    }  }

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.

a možná odpovědi?

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