Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #70, ОКТЯБРЬ 2004 г.

Возьми ОпСоСа под контроль!

Мингулов Денис

Хакер, номер #070, стр. 070-126-3


Все точно так же для SMS и MMS - их цена тоже может варьироваться, ведь обычно длинные SMS оплачиваются как несколько коротких.

Помни, что данные о длительности звонка на твоем телефоне могут не совпадать с данными оператора, как и твои часы с часами оператора при отслеживании изменения тарифа.

Делаем базу данных для тарифа

Различаем виды звонков

Для всех звонков, совершенных на номера > = strPhoneFirst и < strPhoneLast, будут использоваться соответствующие тарифы.

const TInt KStrPhoneLength=32;

TInt32 iTariffLen; // всего тарифов поддерживается

TInt32 *arrayTariff; // массив тарифов для входящих звонков

TBuf<KStrPhoneLength> strPhoneFirst; // первый телефонный номер

TBuf<KStrPhoneLength> strPhoneLast; // следующий за последним телефонный номер

При таком задании базы можно использовать сокращенные номера, например, +7-902 как strPhoneFirst и +7-903 как strPhoneLast - в это множество попадут все номера от +7-902-000-0000 до +7-902-999-9999.

О каждом тарифе по его номеру мы узнаем, какой он - для входящего или исходящего звонка, SMS или MMS. В TInt32 iTariffNum храним номера тарифов верхнего уровня, зависящих от времени.

Зависимость от времени

TInt32 iTariffCostLen; // длина массива с ценами

CTimeTariff *arrayTariffCost; // номера тарифов с ценами

В CTimeTariff задается промежуток времени - с днем недели, флагом праздничного дня

Для обсчета события из лога надо найти в нашей базе соответствующий времени тариф, проверить, чтобы тип записи подходил нашему событию, и вычислить, во сколько оно нам обошлось.

Если же событие лежит на границе тарифов (например, звонок в 23:58 на 10 минут, а с 00:00 начинается льготное время), то надо знать, как оно будет учитываться – по одному тарифу или двум. В некоторых тарифах цена минуты разговора в этом случае не будет меняться до конца звонка. Так что в CTimeTariff также задаем флаг, что делать в такой ситуации.

Цены

TInt32 iQuant; // единица тарификации - в секундах

TInt16 iCostLen; // длина массива с ценами

TReal *arrayCost; // массив цен

TInt32 iNext; // что делать, если звонок больше: n - кольцо с n-ой (0 - считать с начала, =iCostLen-1 - повторять последнюю)

Для SMS достаточно знать стоимость одного сообщения - TInt16 iCost.

Кроме того, не забудь, что надо включить в нашу базу абонентскую плату.

Особенности подсчета стоимости GPRS

К сожалению, у многих операторов очень непростая тарификация GPRS, и со стороны пользователя узнать, сколько было потрачено, можно лишь приблизительно, ведь из логов ты можешь узнать только время начала соединения, длительность и общий трафик - полученный и посланный. А операторы предпочитают делить эту большую сессию на подсессии по 15-20 минут, так как соединение с GPRS может длиться месяцами, если нет никаких проблем.

Таким образом, большая сессия из лога телефона в 4 часа 10 минут может быть поделена на 16 подсессий по 15 минут и одну 10-минутную, для каждой из них будет отдельно учтен бесплатный порог и сделано округление.

Назад на стр. 070-126-2  Содержание  Вперед на стр. 070-126-4