27.11.2014 Views

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

coding<br />

вводить их в картографическом сервисе,<br />

чтобы определить точку на карте. Это не<br />

очень удобно.<br />

ЗАЧЕМ ЭТО ВООБЩЕ<br />

НУЖНО?<br />

Прелесть подобного шпионского ПО в том, что<br />

потенциальная целевая аудитория покрывает<br />

не только ревнивых мужей и недобросовестных<br />

деловых партнеров (как в случае с<br />

sms-шпионами), но и, к примеру, заботливых<br />

мамаш, желающих убедиться, что их дитя<br />

утром идет в школу, а не бухать «ягуар» в<br />

подъезд с пацанами. Подобный софт может<br />

Open Image<br />

{<br />

file<br />

…<br />

использоваться и в качестве трекера — например,<br />

хозяин «Бентли» может выдать шоферу<br />

корпоративную мобилу и отслеживать маршрут<br />

передвижения. Конечно, на рынке присутствуют<br />

трекинговые сервисы, но используемые там<br />

приложения скрываться не обучены и потому<br />

заметны в системе.<br />

Image<br />

border<br />

РЕАЛИЗАЦИЯ ПРОГРАММЫ<br />

С точки зрения функционала приложения,<br />

очевидны три основные составляющие:<br />

• Функционал сокрытия программы в системе;<br />

• Функционал определения координат;<br />

• Функционал отправки координат на сервер.<br />

Первый пункт мы уже освещали, мягко говоря,<br />

неоднократно. Я рекомендую ознакомиться со<br />

статьей «Зло-кодинг под Symbian» в мартовском<br />

номере z, — там этот процесс подробно и<br />

доступно описан. А мы тем временем сосредоточимся<br />

на двух оставшихся компонентах.<br />

ФУНКЦИОНАЛ<br />

ОПРЕДЕЛЕНИЯ КООРДИНАТ<br />

Собственно функционал определения координат<br />

предельно прост — важно определиться<br />

лишь с логикой их получения и отправки. Для<br />

ясности изложения я предполагаю, что ты уже<br />

знаком с основами программирования под<br />

Symbian, умеешь использовать активные объекты<br />

и можешь создать, например, простейший<br />

таймер. Что касается логики зловреда,<br />

опять же, для простоты, я предлагаю реализовать<br />

функционал периодического определения<br />

текущих координат устройства и отправки<br />

их на сервер.<br />

Для реализации периодики опроса GPSприемника<br />

используется обертка вокруг<br />

стандартного симбиановского класса CTimer.<br />

По сути, это класс, унаследованный от CTimer<br />

и содержащий в своем конструкторе все<br />

необходимые действия по инициализации и<br />

настройке таймера. Также членом оберточного<br />

класса является ссылка на объект обсервера<br />

(Observer), который ответственен за выполнение<br />

действий по событию срабатывания<br />

таймера. Полный код класса CGpsTroyTimer<br />

находится на нашем диске. Здесь мы его не<br />

будем приводить, поскольку он довольно тривиален.<br />

Кстати, создание подобных оберточных<br />

классов над стандартными системными —<br />

хорошая практика разработки как под symbian,<br />

так и под любую объектно-ориентированную<br />

систему. Поскольку основная логика работы<br />

программы у нас содержится в классе AppUi,<br />

то, тем самым, мы освобождаем его конструктор<br />

и деструктор от кровавого месива кода,<br />

отвечающего за инициализацию и настройку<br />

тайминга. Для обработки события тика таймера<br />

необходимо унаследовать AppUi от класса<br />

MTimeOutNotifier (смотри заголовочный файл<br />

Timer.h). Так мы покажем, что AppUi — это тот<br />

самый обсервер, который содержит метод, вызываемый<br />

при срабатывании тика.<br />

class CGpsTroyAppUi : public<br />

MTimeOutNotifier<br />

public: // from MTimeOutNotifier<br />

void TimerExpiredL(); //ìåòîä,<br />

âûçûâàåìûé ïðè òèêå òàéìåðà<br />

private:<br />

CGpsTroyTimer* iTimer; //ñîáñòâåííî,<br />

îáúåêò òàéìåðà<br />

…<br />

}<br />

Теперь в конструкторе CGpsTroyAppUi необходимо<br />

лишь создать таймер:<br />

iTimer = CUniTelTimer::NewL(<br />

EPriorityStandard, *this);<br />

iTimer->After(KTimeOut);<br />

– и реализовать метод TimerExpired() примерно<br />

следующим образом:<br />

Save<br />

Show Annotation<br />

User::LeaveIfError(<br />

Tools<br />

void CGpsTroyAppUi::TimerExpiredL()<br />

{<br />

GetPosition();<br />

iTimer->After(KTimeOut);<br />

}<br />

Здесь мы выполнили метод GetPosition(),<br />

отвечающий за определение координат<br />

устройства, и заново запустили таймер, чтобы<br />

обеспечить периодичность определения<br />

местоположения.<br />

Перейдем к функционалу определения<br />

координат. Для этого нам понадобится использовать<br />

объекты классов RPositionServer,<br />

RPositioner, TPositionInfo и TPosition. Рассмотрим<br />

каждый из них чуть подробнее:<br />

• RPositionServer — основной интерфейс<br />

к Location Server. В свою очередь, Location<br />

Server — это такой процесс, который отвечает<br />

за обработку клиентских обращений<br />

приложений к базовой функциональности<br />

GPS-приемника. RPositionServer служит для<br />

установки соединения с Location Server и получения<br />

соответствующего хэндла ресурса.<br />

• RPositioner — открывает субсессию к<br />

Location Server, которая уже используется<br />

для получения координат. Кроме того, объект<br />

класса RPositioner содержит информацию о<br />

последней полученной позиции, а также — о<br />

частоте опроса GPS-приемника.<br />

• TPositionInfo — структура, содержащую полную<br />

информацию, полученную от спутников.<br />

• TPosition –структура, содержащая информацию<br />

о координатах устройства (долгота,<br />

широта, высота, скорость и т.д.) и скорости его<br />

передвижения.<br />

Более детальное описание классов можно (и<br />

нужно) посмотреть в SDK. Если обобщить, то<br />

код упомянутого метода GetPosition может выглядеть<br />

примерно так:<br />

iPositionServer.Connect());<br />

User::LeaveIfError(iPositioner.<br />

Open(iPositionServer));<br />

User::LeaveIfError(<br />

iPositioner.SetRequestor(<br />

CRequestor::ERequestorService,<br />

CRequestor::EFormatApplication,<br />

My Favorite<br />

KRequestor));<br />

Macro<br />

TPositionUpdateOptions<br />

updateOptions;<br />

updateOptions.SetUpdateInterval(<br />

KUpdateInterval);<br />

updateOptions.SetUpdateTimeOut(<br />

KUpdateTimeout);<br />

User::LeaveIfError(<br />

iPositioner.SetUpdateOptions(<br />

updateOptions));<br />

Cancel();<br />

iPositioner.NotifyPositionUpdate(<br />

iPositionInfo,iStatus);<br />

SetActive();<br />

Объяснять нечего — код смело можно отнести<br />

к самодокументированным. Обрати внимание,<br />

что запрос на получение координат может выполняться<br />

довольно долго, поэтому запускается<br />

на выполнение асинхронно. Это значит, что<br />

класс CGpsTroyAppUi необходимо унаследовать<br />

от CActive и реализовать метод RunL().<br />

Именно он будет выполняться при получении<br />

координат.<br />

void CGpsTroyAppUi::RunL()<br />

{<br />

switch(iStatus.Int())<br />

{<br />

case KErrNone:<br />

{<br />

//êîîðäèíàòû óñïåøíî ïîëó÷åíû<br />

TPosition position;<br />

iPositionInfo.GetPosition(<br />

position);<br />

TInt latitude =<br />

position.Latitude();<br />

//ïîëó÷àåì øèðîòó<br />

TInt longitude =<br />

position.Longitude();<br />

XÀÊÅÐ 07 /127/ 09<br />

101

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!