Upload
renestein
View
2.202
Download
3
Embed Size (px)
DESCRIPTION
Citation preview
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