Your SlideShare is downloading. ×
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Slasti Strasti Propasti Windows Mobile
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Slasti Strasti Propasti Windows Mobile

1,959

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,959
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Transcript

    • 1. René Stein Senior Software Architect http://renestein.net http://blog.renestein.net
    • 2. Mobil ní zařízení Standard Windows Mobile Tablet PC – jiný svět Professional Classic
      • Gadgety
    • 3. GPS Intermediate Driver
      • Přístup k GPS pouze z jedné aplikace přímo přes sériový port před Windows Mobile 5.0
        • Znáte Franson GPS Gate
      • GPS Intermediate driver
        • Parsov á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()
    • 4.
      • 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).
    • 5. Získání pozice
      • GPS_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.dblLatitude
      • gpsPositionValid.dblLongitude
    • 6. Managed kód přes P /Invoke
      • public 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)
    • 7. 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);
    • 8. 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 :-)
      • Obe zlič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.
    • 9. Komunikace přes bluetooth
      • Většina zařízení používá MS BT Stack
        • Widcomm Stack
      • Lid „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 DUN
        • Nejsou podporovány všechny specialitky BT profilů (BT Handsfree)
        • Propojení BT s nastavením IrDA
        • Nesmyslná omezení u BT Handsfree (autorádio Pioneer očekává BT class Smartphone)
        • Špatně vyladěné drivery od dodavatele HW – HTC Kaiser.
      • Widcomm a Ipaq
        • WM_HIBERNATE a poté „odstřelení“ ovládací konzole, které způsobilo i nefunkčnost driveru !!!!!
    • 10.                                      Contents                                      Contents
    • 11. Podpora Bluetooth přes winsock
      • BTHGetState
      • BTHSetState
      • Zná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.
    • 12. Vlastní protokoly
      • Bthnscreate.exe pro snadné vytvoření struktury SDP záznamu (recordu) – bohužel pouze součást Platform Builderu.
      • #define SDP_HF_RECORD_SIZE 0x00000048
      • BYTE 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
      • };
    • 13. Vlastní Audio Gateway - HF profile
      • typedef 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_MACHINEOFTWAREicrosoftluetoothudioGatewayTAGExtModule
      • Neúplná dokumentace na MSDn 
    • 14. Komunikace přes WiFi
      • Většina vývojářů předpokládá, že Microsoft poskytne nějaké API pro správu WiFi. Žádné závazné API neexistuje.
      • Pouze OEM partn e ři jsou odpovědní za WiFi modul a jeho možnosti.
      • OEM API nen í veřejné.
      • Volitelná podpora WZC, NDIS...
    • 15. Probl émy
      • Př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
    • 16. Reinicializace adaptéru přes NDIS /IO
      • HANDLE hDevice = CreateFile(DD_NDIS_DEVICE_NAME, GENERIC_READ |GENERIC_WRITE, F ILE_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'';
      • pAdapterName[adapterNamefullLength - 1] = L'';
      • bool result = true;
      • if (!DeviceIoControl(hDevice, IOCTL_NDIS_REBIND_ADAPTER, pAdapterName, adapt erNamefullLength * sizeof(WCHAR),
      • NULL,
      • NULL,
      • NULL,
      • NULL))
      • {
      • result = false;
      • }
      • CloseHandle(hDevice);
    • 17. 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;
    • 18. Proč hack funguje? Odpovědí je pravděpodobně SNAPI.
    • 19. SNAPI v Compact .Net Frameworku
      • SystemS tate state = new SystemState(SystemProperty. DisplayRotation );
      • state.Changed += new ChangeEventHandler(state_Changed);
    • 20. Informace z telefonní části – GSM modulu
      • Microsoft 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?
    • 21. RIL
      • RIL - Radio Interface layer
      • RIL 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áře
      • Nyní částečně dokumentován na MSDN
    • 22. Net Monitor Alfa
      • Derivát komerčního projektu
      • Přes RIL čte údaje z GSM části
      • Integrace s BTS DB na GSM webu ( www.gsmweb.cz )
      •  
    • 23. 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
    • 24. .NET C ompact 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“ edice
        • Rychlý 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í. 
    • 25.
      • Standard
      Windows Mobile
    • 26. Podpora různých rozlišení a orientace displeje
      • Změna prvků za běhu aplikace 
      • Využití vlastnosti Anchor
      • „ Znásilnění“ lokalizace (localizable) ke změně vzhledu formuláře
    • 27. Chcete konfigurovat PDA? Nebo získat aktuální nastavení PDA?
      • public static XmlDocument ProcessConfiguration( XmlDocument configDoc, bool metadata );
      • <?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?>
      • <wap-provisioningdoc>
      • <characteristic type=&quot;Registry&quot;>
      • <characteristic type=&quot;HKCUSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections&quot;> <parm-query name=&quot;DefaultConnectionSettings&quot; />
      • </characteristic> </characteristic> </wap-provisioningdoc>
    • 28. CSP -jedna z nejlepších věcí ve Windows Mobile
      • S CSP můžete:
        • Nastavit GPRS připojení
        • Nastavit maximální velikost stahovaných příloh
        • Odstranit všechny proxy. Nastavit proxy.
        • Nastavit čas a datum.
        • Nastavit /!!!!zjistit!!!! e mailov é úč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
    • 29. 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_MACHINECommConnMgrProviders{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?
    • 30. Webové služby
      • Podpora asmx i WCF
      • Pragramují se zcela stejně jako velkém .Net Frameworku
      • Vhodné 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);
    • 31. 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. 
    • 32. Zpracování WM_Hibernate v Compact .Net Frameworku
      • Verze 1.x . Compact Net Frameworku nepodporovala přímé zpracování zprávy WM_Hibernate
      • Dů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;     }   }
    • 33. Zajímavé části řízeného vývoje
        • WindowsMobile.PocketOutlook
        • WindowsMobile.Status
        • WindowsMobile.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.
    • 34. a možná odpovědi?  René Stein Senior Software Architect http://renestein.net http://blog.renestein.net

    ×