ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
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