Slasti Strasti Propasti Windows Mobile

2,171 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
2,171
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Slasti Strasti Propasti Windows Mobile

    1. 1. René Stein Senior Software Architect http://renestein.net http://blog.renestein.net
    2. 2. Mobil ní zařízení Standard Windows Mobile Tablet PC – jiný svět Professional Classic <ul><li>Gadgety </li></ul>
    3. 3. GPS Intermediate Driver <ul><li>Přístup k GPS pouze z jedné aplikace přímo přes sériový port před Windows Mobile 5.0 </li></ul><ul><ul><li>Znáte Franson GPS Gate </li></ul></ul><ul><li>GPS Intermediate driver </li></ul><ul><ul><li>Parsov ání NMEA zpráv z GPS ($GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A ) </li></ul></ul><ul><ul><li>Doručení do více aplikací </li></ul></ul><ul><li>GPSOpenDevice() </li></ul><ul><li>GPSCloseDevice() </li></ul><ul><li>GPSGetPosition() </li></ul><ul><li>GPSGetDeviceState() </li></ul>
    4. 4. <ul><li>HANDLE g_hGPSDevice; </li></ul><ul><li>g_hGPSDevice = GPSOpenDevice(NULL,NULL,NULL,0); </li></ul><ul><li>GPS_DEVICE gpsDevice; </li></ul><ul><li>ZeroMemory(&gpsDevice,sizeof(GPS_DEVICE)); gpsDevice.dwVersion=GPS_VERSION_1; gpsDevice.dwSize=sizeof(GPS_DEVICE); DWORD result=GPSGetDeviceState(&gpsDevice); </li></ul><ul><li>Je možné se nechat notifikovat o příchozích datech /stavu GPS (CreateEvent). </li></ul>
    5. 5. Získání pozice <ul><li>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); </li></ul><ul><li>gpsPositionValid.dblLatitude </li></ul><ul><li>gpsPositionValid.dblLongitude </li></ul>
    6. 6. Managed kód přes P /Invoke <ul><li>public const int LMEM_ZEROINIT = 0x40; [System.Runtime.InteropServices.DllImport(&quot;coredll.dll&quot;, EntryPoint = &quot;#33&quot;, SetLastError = true)“ ] public static extern IntPtr LocalAlloc(int flags, int byteCount); [System.Runtime.InteropServices.DllImport(&quot;coredll.dll&quot;, EntryPoint = &quot;#36&quot;, SetLastError = true)“ ] public static extern IntPtr LocalFree(IntPtr hMem); [DllImport(&quot;gpsapi.dll&quot;)“ ] static extern IntPtr GPSOpenDevice(IntPtr hNewLocationData, IntPtr hDeviceStateChange, string szDeviceName, int dwFlags); [DllImport(&quot;gpsapi.dll&quot;)“ ] static extern int GPSCloseDevice(IntPtr hGPSDevice); [DllImport(&quot;gpsapi.dll&quot;)“ ] static extern int GPSGetPosition(IntPtr hGPSDevice, IntPtr pGPSPosition, int dwMaximumAge, int dwFlags); [DllImport(&quot;gpsapi.dll&quot;)“ ] static extern int GPSGetDeviceState(IntPtr pGPSDevice); </li></ul><ul><li>KOMPLETNí PŘÍKLAD je v SDK (C #, zkompilovan ý na XDA-Developers) </li></ul>
    7. 7. A te ď strasti... <ul><li>GPS ID API je hezké API. Alespoň na první pohled... </li></ul><ul><li>Ale: </li></ul><ul><li>Na některých zařízeních s WM6 GPSGetPosition vrací chybu 87 (ERROR_INVALID_PARAMETER). </li></ul><ul><ul><li>Důvod: OEM partneři a Microsoft počítají s jinou velikostí struktury GPS_POSITION. </li></ul></ul><ul><ul><li>Obezlička: </li></ul></ul><ul><ul><li>BYTE gpsPositionRaw[376];     GPS_POSITION *pGpsLocation = (GPS_POSITION*)gpsPositionRaw;         pGpsLocation->dwVersion = GPS_VERSION_1;     pGpsLocation->dwSize    = sizeof(gpsPositionRaw); </li></ul></ul>
    8. 8. Další strasti. <ul><li>Na HTC Artemis (MDA Vario III) je nekompletní signalizace EV_RXCHAR na sériovém portu. </li></ul><ul><li>To znamená, že nikdy nedostanete informaci o poloze, což je u GPS API podstatná chyba :-) </li></ul><ul><li>Obe zličky : </li></ul><ul><ul><li>Návrat ke komunikaci přes sériový port  </li></ul></ul><ul><ul><li>Použití API ReadFile a v pravidelných intervalech se pokusit číst z portu. </li></ul></ul><ul><li>Zkuste si na HTC Kaiser připojit externí GPS nebo si jen pohrát s nastavením driveru. </li></ul>
    9. 9. Komunikace přes bluetooth <ul><li>Většina zařízení používá MS BT Stack </li></ul><ul><ul><li>Widcomm Stack </li></ul></ul><ul><li>Lid „obecný internetový“ má za obětního beránka Microsoft  </li></ul><ul><ul><li>M álo podporovaných BT protokolů </li></ul></ul><ul><ul><li>Chybné implementace BT profilů </li></ul></ul><ul><ul><li>Vyřazení některých protokolů z OS – BT DUN </li></ul></ul><ul><ul><li>Nejsou podporovány všechny specialitky BT profilů (BT Handsfree) </li></ul></ul><ul><ul><li>Propojení BT s nastavením IrDA </li></ul></ul><ul><ul><li>Nesmyslná omezení u BT Handsfree (autorádio Pioneer očekává BT class Smartphone) </li></ul></ul><ul><ul><li>Špatně vyladěné drivery od dodavatele HW – HTC Kaiser. </li></ul></ul><ul><li>Widcomm a Ipaq </li></ul><ul><ul><li>WM_HIBERNATE a poté „odstřelení“ ovládací konzole, které způsobilo i nefunkčnost driveru !!!!! </li></ul></ul>
    10. 10.                                      Contents                                      Contents
    11. 11. Podpora Bluetooth přes winsock <ul><li>BTHGetState </li></ul><ul><li>BTHSetState </li></ul><ul><li>Znáte problémy s nastavením bluetooth do režimu „Discoverable“ – Viditelný? </li></ul><ul><li>Enumerace zařízení a služeb </li></ul><ul><ul><li>WSALookupServiceBegin </li></ul></ul><ul><ul><li>WSALookupServiceBegin </li></ul></ul><ul><li>Nijak zvlášť přívětivý kód. Ukázka. </li></ul>
    12. 12. Vlastní protokoly <ul><li>Bthnscreate.exe pro snadné vytvoření struktury SDP záznamu (recordu) – bohužel pouze součást Platform Builderu. </li></ul><ul><li>#define SDP_HF_RECORD_SIZE 0x00000048 </li></ul><ul><li>BYTE rgbSdpRecordHeadsetHF[] = { </li></ul><ul><li>0x35, 0x46, 0x09, 0x00, 0x01, 0x35, 0x06, 0x19, </li></ul><ul><li>0x11, 0x1f, 0x19, 0x12, 0x03, 0x09, 0x00, 0x04, </li></ul><ul><li>0x35, 0x0c, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, </li></ul><ul><li>0x05, 0x19, 0x00, 0x03, 0x08, 0x0a, 0x09, 0x00, </li></ul><ul><li>0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x1e, </li></ul><ul><li>0x09, 0x01, 0x01, 0x09, 0x01, 0x00, 0x25, 0x0d, </li></ul><ul><li>0x56, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x47, 0x61, </li></ul><ul><li>0x74, 0x65, 0x77, 0x61, 0x79, 0x09, 0x03, 0x01, </li></ul><ul><li>0x08, 0x01, 0x09, 0x03, 0x11, 0x09, 0x00, 0x00 </li></ul><ul><li>}; </li></ul>
    13. 13. Vlastní Audio Gateway - HF profile <ul><li>typedef DWORD (*PFN_SendATCommand) (LPSTR szCommand, DWORD cbCommand); </li></ul><ul><li>BOOL BthAGATHandler(LPSTR szCommand, DWORD cbCommand); </li></ul><ul><li>void BthAGATSetCallback(PFN_SendATCommand pfn); </li></ul><ul><li>typedef DWORD (*PFN_SendATCommand) (LPSTR szCommand, DWORD cbCommand); </li></ul><ul><li>DWORD BthAGOnVoiceTag(BOOL fOn); </li></ul><ul><li>HKEY_LOCAL_MACHINEOFTWAREicrosoftluetoothudioGatewayTAGExtModule </li></ul><ul><li>Neúplná dokumentace na MSDn  </li></ul>
    14. 14. Komunikace přes WiFi <ul><li>Většina vývojářů předpokládá, že Microsoft poskytne nějaké API pro správu WiFi. Žádné závazné API neexistuje. </li></ul><ul><li>Pouze OEM partn e ři jsou odpovědní za WiFi modul a jeho možnosti. </li></ul><ul><li>OEM API nen í veřejné. </li></ul><ul><li>Volitelná podpora WZC, NDIS... </li></ul>
    15. 15. Probl émy <ul><li>Při změně IP adresy, DHCP, masce sítě musíte většinou resetovat PDA. </li></ul><ul><li>Wifi Profily aplikují profil ihned – bez resetu. </li></ul><ul><li>U některých zařízení (MDA Vario) problémy s nahráním ovladače WiFi. </li></ul><ul><li>Změna </li></ul>
    16. 16. Reinicializace adaptéru přes NDIS /IO <ul><li>HANDLE hDevice = CreateFile(DD_NDIS_DEVICE_NAME, GENERIC_READ |GENERIC_WRITE, F ILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, </li></ul><ul><li>0, </li></ul><ul><li>NULL); </li></ul><ul><li>if (hDevice == INVALID_HANDLE_VALUE) </li></ul><ul><li>{ </li></ul><ul><ul><ul><ul><li>return false; </li></ul></ul></ul></ul><ul><li>} </li></ul><ul><li>int adapterNamefullLength = adapterName.GetLength() + 2; </li></ul><ul><li>WCHAR* pAdapterName = new WCHAR[adapterNamefullLength]; </li></ul><ul><li>if (!pAdapterName) </li></ul><ul><li>{ </li></ul><ul><li>return false; </li></ul><ul><li>} </li></ul><ul><li>wcscpy(pAdapterName , adapterName); </li></ul><ul><li>pAdapterName[adapterNamefullLength - 2] = L''; </li></ul><ul><li>pAdapterName[adapterNamefullLength - 1] = L''; </li></ul><ul><li>bool result = true; </li></ul><ul><li>if (!DeviceIoControl(hDevice, IOCTL_NDIS_REBIND_ADAPTER, pAdapterName, adapt erNamefullLength * sizeof(WCHAR), </li></ul><ul><li>NULL, </li></ul><ul><li>NULL, </li></ul><ul><li>NULL, </li></ul><ul><li>NULL)) </li></ul><ul><li>{ </li></ul><ul><li>result = false; </li></ul><ul><li>} </li></ul><ul><li>CloseHandle(hDevice); </li></ul>
    17. 17. Spouštění Wifi od Windows Mobile 5 - nedokumentováno !! <ul><li>g_DllWrlspwr = LoadLibrary(TEXT(&quot;ossvcs.dll&quot;)); </li></ul><ul><li>if (g_DllWrlspwr == NULL) </li></ul><ul><li>return FALSE; </li></ul><ul><li>pGetWirelessDevices = (_GetWirelessDevices)GetProcAddress(g_DllWrlspwr,MAKEINTRESOURCE(GetWirelessDevice_ORDINAL)); </li></ul><ul><li>if (pGetWirelessDevices == NULL) </li></ul><ul><li>return FALSE; </li></ul><ul><li>pChangeRadioState = (_ChangeRadioState)GetProcAddress(g_DllWrlspwr,MAKEINTRESOURCE(ChangeRadioState_ORDINAL)); </li></ul><ul><li>if (pChangeRadioState == NULL) </li></ul><ul><li>return FALSE; </li></ul><ul><li>pFreeDeviceList = (_FreeDeviceList)GetProcAddress(g_DllWrlspwr,MAKEINTRESOURCE(FreeDeviceList_ORDINAL)); </li></ul><ul><li>if (pFreeDeviceList == NULL) </li></ul><ul><li>return FALSE; </li></ul><ul><li>return TRUE; </li></ul>
    18. 18. Proč hack funguje? Odpovědí je pravděpodobně SNAPI.
    19. 19. SNAPI v Compact .Net Frameworku <ul><li>SystemS tate state = new SystemState(SystemProperty. DisplayRotation ); </li></ul><ul><li>state.Changed += new ChangeEventHandler(state_Changed); </li></ul>
    20. 20. Informace z telefonní části – GSM modulu <ul><li>Microsoft podporuje pro vývojáře aplikací pouze TAPI. </li></ul><ul><li>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. </li></ul><ul><li>Pomocí cell id lze například zjistit, kde se přibližně nacházíme. (Google Maps Mobile). </li></ul><ul><li>Ale jak se k těmto údajům dostat? </li></ul>
    21. 21. RIL <ul><li>RIL - Radio Interface layer </li></ul><ul><li>RIL proxy přenáší informace z OEM RIL driveru do vyšších (aplikačních) vrstev. </li></ul><ul><li>Dle informací z Microsoftu se neplánuje zveřejnění RILu pro aplikační vývojáře </li></ul><ul><li>Nyní částečně dokumentován na MSDN </li></ul>
    22. 22. Net Monitor Alfa <ul><li>Derivát komerčního projektu </li></ul><ul><li>Přes RIL čte údaje z GSM části </li></ul><ul><li>Integrace s BTS DB na GSM webu ( www.gsmweb.cz ) </li></ul><ul><li>  </li></ul>
    23. 23. A jak část .Net monitor pracuje? <ul><li>Today plugin je observer třídy, která zapouzdřuje přístup k RILu. </li></ul><ul><li>Dalším observerem je nyní instance třídy zapisující do souboru. </li></ul><ul><li>UKÁZKA RIL jádra </li></ul>
    24. 24. .NET C ompact Framework <ul><li>„ Ořezaný“ .NET Framework </li></ul><ul><ul><li>Snaha omezit jmenné prostory pouz pro compact edici </li></ul></ul><ul><ul><li>Vývoj ve Visual studiu (2008) </li></ul></ul><ul><ul><li>Pro mobilní zařízení neexistuje „Express“ edice </li></ul></ul><ul><ul><li>Rychlý vývoj „business“ aplikací </li></ul></ul><ul><ul><li>Přechod na Compact .Net Framework z velkého .Net Frameworku se zdá být snadný. </li></ul></ul><ul><ul><li>V ětšinou Compact .Net Framework pouze obalují nativní kód. </li></ul></ul><ul><ul><li>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í.  </li></ul></ul>
    25. 25. <ul><li>Standard </li></ul>Windows Mobile
    26. 26. Podpora různých rozlišení a orientace displeje <ul><li>Změna prvků za běhu aplikace  </li></ul><ul><li>Využití vlastnosti Anchor </li></ul><ul><li>„ Znásilnění“ lokalizace (localizable) ke změně vzhledu formuláře </li></ul>
    27. 27. Chcete konfigurovat PDA? Nebo získat aktuální nastavení PDA? <ul><li>public static XmlDocument ProcessConfiguration( XmlDocument configDoc, bool metadata ); </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?> </li></ul><ul><li><wap-provisioningdoc> </li></ul><ul><li><characteristic type=&quot;Registry&quot;> </li></ul><ul><li><characteristic type=&quot;HKCUSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections&quot;> <parm-query name=&quot;DefaultConnectionSettings&quot; /> </li></ul><ul><li></characteristic> </characteristic> </wap-provisioningdoc> </li></ul>
    28. 28. CSP -jedna z nejlepších věcí ve Windows Mobile <ul><li>S CSP můžete: </li></ul><ul><ul><li>Nastavit GPRS připojení </li></ul></ul><ul><ul><li>Nastavit maximální velikost stahovaných příloh </li></ul></ul><ul><ul><li>Odstranit všechny proxy. Nastavit proxy. </li></ul></ul><ul><ul><li>Nastavit čas a datum. </li></ul></ul><ul><ul><li>Nastavit /!!!!zjistit!!!! e mailov é účty v Pocket Outlooku. </li></ul></ul><ul><ul><li>Změnit /P ř idat hodnoty v registrech </li></ul></ul><ul><ul><li>http://msdn.microsoft.com/cs-cz/bb737536(en-us).aspx </li></ul></ul><ul><li>Wrapper nad nativní funkcí DMProcessConfigXml </li></ul>
    29. 29. Problém s CSP <ul><li>Jak nastavit a smazat právě jednu proxy ve Work Settings? </li></ul><ul><li>Žádná CSP nebyla vhodná. </li></ul><ul><ul><li>U jednoho nastavení smazány všechny proxy. </li></ul></ul><ul><ul><li>Nebo proxy byla nastavena, ale nebyla aktivní. </li></ul></ul><ul><li>Návrat ke starým praktikám  </li></ul><ul><ul><li>HKEY_LOCAL_MACHINECommConnMgrProviders{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E}HTTP-{BC2CEC33-AEF1-412e-ABAC-3D695B7BE57D}:DestId </li></ul></ul><ul><ul><li>Klíče DestId, Proxy a Enable. </li></ul></ul><ul><ul><li>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? </li></ul></ul>
    30. 30. Webové služby <ul><li>Podpora asmx i WCF </li></ul><ul><li>Pragramují se zcela stejně jako velkém .Net Frameworku </li></ul><ul><li>Vhodné např. pro vlastní oboustrannou synchronizaci dat mezi aplikací na PDA a serverovým modulem aplikace. </li></ul><ul><li>m_service = new medea9wsService(); </li></ul><ul><li>m_service.Connect_medea9ws(null, null, null); </li></ul>
    31. 31. Problémy při volání přes SSL  <ul><li>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() </li></ul><ul><li>   at System.Net.HttpWebRequest.finishGetResponse()    at System.Net.HttpWebRequest.GetResponse()    // ... </li></ul><ul><li>Důvod? CNF obdržel prázdný kryptovaný paket – velikost 0 bajtů po dekryptování. Server takový paket poslat může.. </li></ul><ul><li>Odstranění chyby (návody přímo z MS)  </li></ul><ul><ul><li>Nepoužívejte SSL. </li></ul></ul><ul><ul><li>Překonfigurujte webový server. </li></ul></ul><ul><ul><li>Vytvořit (nejlépe v nativním kódu) vlastní proxy pro navazání SSPI. </li></ul></ul><ul><ul><li>Vyčkat na nějakou další verzi CNF.  </li></ul></ul>
    32. 32. Zpracování WM_Hibernate v Compact .Net Frameworku <ul><li>Verze 1.x . Compact Net Frameworku nepodporovala přímé zpracování zprávy WM_Hibernate </li></ul><ul><li>Důsledek= >Syst ém často aplikaci „odstřelil“  </li></ul><ul><li>Od verze 2.0 je dostupná událost Hibernate </li></ul><ul><li>  MobileDevice.Hibernate += MobileDevice_Hibernate; void MobileDevice_Hibernate(object sender, EventArgs e)   {     if (m_myObject != null)     {     m_myObject.Dispose();     m_myObject = null;     }   } </li></ul>
    33. 33. Zajímavé části řízeného vývoje <ul><ul><li>WindowsMobile.PocketOutlook </li></ul></ul><ul><ul><li>WindowsMobile.Status </li></ul></ul><ul><ul><li>WindowsMobile.Telephony </li></ul></ul><ul><ul><li>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. </li></ul></ul>
    34. 34. a možná odpovědi?  René Stein Senior Software Architect http://renestein.net http://blog.renestein.net

    ×