Смекни!
smekni.com

Апаратно–програмний комплекс GSM-МТМ (стр. 9 из 11)

3. Александр Фролов, “Язык СИ”, М: «Питер», 1999г, 450с., ил.

4. http://www.simens.com/index.htm Система команд мобільного телефону (англ.) s25modCom.pdf, 52 Kb.

5. ECCOM bridge руководство по експлуатации, 1996г.,, ECCOM_BRIDGE.PDF, 491Kb

6. Справка по Visual Basic 5.0, %Program files%Microsoft Exchange/office/1049/vbaoff9.chm

7. Cправка по Microsoft Outlook 2000, %program files%Microsoft Exchange/Office/1049/vbaoutl9.chm

8. Справка по Microsoft Access 2000, %windir%help/Access.chm

9. Манн Ентони.

10. М23 Visual Basic 5. Руководство разработчика.:

11. Пер. с англ. – К.: Диалектика, 1997–705с.: ил. – Парал. тит. англ.

12. ISDN 966–506–115–1 (рус)

13. Конспекс лекцій по Access, Мунтяну Р.П. викладач кафедри КСМ, Чернівецького Національного Університету 2001 рік

14. ГОСТ 19.001-77 ЕСПД. Общие положения.

15. ГОСТ 19.101 -77 ЕСПД, Виды программ и программных документов.

16. ГОСТ 19.104-78 ЕСПД. Основные надписи.

17. ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам.

18. ГОСТ 19,401-78 ЕСПД. Текст программы.

19. ГОСТ 19.402-78 ЕСПД. Описание программы.


ДОДАТОК 1

Затверджено

Л.ФФ.57149-ТП 12 01-1

“ПРОГРАМНО-АПАРАТНИЙ КОМПЛЕКС MTM↔GSM”

ПРОГРАМА ОБРОБКИ ДЗВІНКІВ

ТЕКСТ ПРОГРАМИ

Анотація

Опис програми Л.ФФ.57149-ТП 12 01-1 містить текст програми bridge.c. Текст програми містить коментарі у важко зрозумілих місцях.

#include <dos.h>

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

#include <sys/types.h>

#include "uart.h"

#include "get_word.h"

#include "common.h"

#include "modem.h"

//#include "mod_link.h"

//#include "timer.h"

#include "tools.h"

#include "conf.h"

const PHONE = 1;

const MOBILPHONE = 2;

char *device = "COM1"; // номер послідовного порта, у форматі

// COMn, де n від 1 до 4

chardelay = 0, // затримка передачі між символами

unsigned speed = 9600; // швидкість обміну даними

char initialize[80]; // команда ініціалізації

char dropline[80]; // команда покласти трубку

char dialPrefix[80]; // префікс номера

char dialSuffix[80]; // суфікс номера

char maxTime [80]; // максимальний час розмови

char numDigits [80]; // максимальна кількість цифр у наборі коду

char LPT[10]; //Адреса порту прінтера

int LPTin = 1;

int LPTout = 0;

int PhoneNum;

char dialNumber[80]; // телефонній номер

int tarifIn;

int tarifOut;

double money;

double START_money;

int dir;//напрям розмови

int tarifConnect;

int countSec = 0;

extern void Csleep(time_t interval); // затримка виконання програми на задану кількість секунд

extern void Cdelay(int milliseconds); // затримка виконання програми на задану кількість мілісекунд

void PhoneDown(void); // покласти трубку на МТМ

int initializeDevice(void); // ініціалізація пристрою

char * waitRing(void); // Очікуємо дзвінок

void saveLog(char *timeStart,char *timeEnd,char *Number,char *direction); // записати ЛОГ файл

void beep(int no){ // біпер в МТМ

while (no>0){

Cdelay(100);

sound(700);

Cdelay(100);

nosound();

no--;

}

}

void decUserMoney(int direct){

// Тарифікація на міст (Direct=PHONE – тарифікація на місто, у іншому випадку

//на мобільний телефон)

float tOut1 = tarifOut/60.0; //GSM

if (direct == PHONE) money = money - tOut1;

else{

if (countSec == 0) money = money - tarifIn;

countSec++;

if(countSec == 60) countSec = 0;

};

};

//почати розмову поки не закінчиться ліміт або гроші

void StartToking(int direction){

char timeStart[80];

char timeEnd[80];

char buf[80];

char * tim;

int i=0;

//очистили буфер

if (r_count_pending()>0) sread(buf,r_count_pending(),0);

Cdelay(200);

do{

sendstr("AT+CPAS"); //команда видає 4 коли мобільні телефони встановили зв‘язок

Cdelay(200);

if (r_count_pending()>0) {

sread(buf,r_count_pending(),0); // 0 при наборі номера

if (strstr(buf,"+CPAS: 0")!=NULL) {

printf("&bsol;nКiнець зв'язку!!! &bsol;n");

Csleep(1);

PhoneDown();

return;

};

if (strstr(buf,"+CPAS: 4")!=NULL){

//початок розмови зчитуємо час

if (r_count_pending()>0) sread(buf,r_count_pending(),0);

sendstr("AT+CCLK?");

Cdelay(200);

if (r_count_pending()>0) sread(timeStart,r_count_pending(),0);

for (i=0;i<strlen(timeStart)-1;i++)

if ((timeStart[i]=='O')&&(timeStart[i+1]=='K')){

break;

}

timeStart[i+2]='&bsol;0';

printf(timeStart);

printf("&bsol;n");

break;

}

}

} while(1);

i = atoi(maxTime);

countSec = 0;

//почати відлік часу і зменшити гроші на рахунку абонента

do{

decUserMoney(direction);

if (i==30) beep(4); // чотири гудка коли часу залишилось 30 сек

sendstr("AT+CPAS");

Cdelay(200);

sread(buf,r_count_pending(),0);

Cdelay(700);

if (strstr(buf,"+CPAS: 0")!=NULL){

break; // розмову закінчено

}

if (i<0){ beep(3); Csleep(1); break; }//час вийшов кiнець розмови

i--;

}while ((i>0)&&(!kbhit()));

//кiнець розмови зчитуємо час

if (r_count_pending()>0) sread(buf,r_count_pending(),0);

sendstr("AT+CCLK?");

Cdelay(200);

if (r_count_pending()>0) sread(timeEnd,r_count_pending(),0);

for (i=0;i<strlen(timeEnd)-1;i++)

if ((timeEnd[i]=='O')&&(timeEnd[i+1]=='K')) break;

timeEnd[i+2]='&bsol;0';

printf(timeEnd);

sendstr("AT+CHUP");

sendstr("&bsol;nATZ");

printf("&bsol;nКiнець зв'язку!!! &bsol;n");

Csleep(1);

PhoneDown();

if (direction == PHONE) {

if (START_money!=money) money = money - tarifConnect;

saveLog(timeStart,timeEnd,dialNumber,"з MTM");

}

else saveLog(timeStart,timeEnd,dialNumber,"з GSM");

};

// підняти трубку на МТМ

void PhoneUp(){

asm{

mov dx,LPTout

mov al,080h

out dx,al;

}

};

// Опустити трубу

void PhoneDown(){

asm{

mov dx,LPTout

mov al,00h

out dx,al;

}

};

// вивести повідомлення про помилку

void error(int no){

printf("&bsol;n&bsol;nПОМИЛКА!!!&bsol;n");

switch (no){

case 0:printf("&bsol;nOk!");break;

case 1:printf("&bsol;n Пристрiй не вдаєтсья проiнiцiалiзувати...&bsol;n");break;

case 2:printf("&bsol;n");break;

case 3:printf("&bsol;n Надто велика затримка при наборi номера...&bsol;n");break;

case 4:printf("&bsol;n Номера в базi даних не iснує або у власника номеру закiнчився час&bsol;n");break;

}

};

// очікування дзвінків (з МТМ або з GSM)

char * waitRing(){

char rString[200];

char *ch;

int i=0;

int fromCity;

Csleep(1);

rString[0]='&bsol;0';

sendstr("ATZ");// повторна ініціалізація

Cdelay(100);

sendstr("AT+CLIP=1");

Cdelay(200);

while (r_count_pending()!=0) sread(rString,r_count_pending(),0);

do{

rString[0]='&bsol;0';

Csleep(1);

fromCity = isRing();

if (fromCity!=0) {

if (r_count_pending()>0) sread(rString,r_count_pending(),0);

return "CITY"; // надійшов дзвінок з міста

}

if (r_count_pending()>40) { // дзвінок надійшов з мобільного телефону

sread(rString,r_count_pending(),0);

ch = strstr(rString,"38");

i=0; while((ch[i]>='0')&&(ch[i]<='9'))i++; ch[i]='&bsol;0';

dialNumber[0]='&bsol;0';

strcat(dialNumber,ch); // визначаємо номер мобільного телефону

if (ch!= NULL) return "MOBIL";

}

}while (!kbhit());

return "BREAK";

};

// шукаємо номер у базі і у разі якщо номер існує і на рахунку є гроші повертаємо його реквізити

int getPhoneNumber(int op,int *code,char *phone,int *tarifIn,int *tarifOut,double *money,int *dir){

//op == 1 == in phone->...

//op == 2 == out code->...

FILE *handle;

char Scode[5],

SPhone[15],

StarifIn[5],

StarifOut[5],

Smoney[8],

Sdir[6],

buf[100],

sbuf[15];

int i,j,index;

handle = fopen("Users.dat", "r");

if (handle == NULL) return -1;

index = -1;

itoa(*code,Scode,10);

j=strlen(Scode);

if (j<3){

for (i=j-1;i>=0;i--) Scode[2-(j-i-1)]=Scode[i];

for (i=0;i<3-j;i++)Scode[i]='0';Scode[3]='&bsol;0';

}

while(!feof(handle)){

index ++;

fgets(buf,100,handle);

i=0;

while (buf[i]!=' ')sbuf[i]=buf[i++];sbuf[i]='&bsol;0';

if ((op==PHONE)&&(strcmp(sbuf,Scode)==0)){

j=0;i++;while(buf[i]!=' ')phone[j++]=buf[i++];phone[j]='&bsol;0';

j=0;i++;while(buf[i]!=' ')StarifIn[j++]=buf[i++];StarifIn[j]='&bsol;0';

j=0;i++;while(buf[i]!=' ')StarifOut[j++]=buf[i++];StarifOut[j]='&bsol;0';

j=0;i++;while(buf[i]!=' ')Smoney[j++]=buf[i++];Smoney[j]='&bsol;0';

j=0;i++;while(buf[i]!='&bsol;n')Sdir[j++]=buf[i++];Sdir[j]='&bsol;0';

break;

}//end if op

else{

j = atoi(sbuf);

*code = j;

j=0;i++;while(buf[i]!=' ')sbuf[j++]=buf[i++];sbuf[j]='&bsol;0';

if ((op==MOBILPHONE)&&(strcmp(sbuf,phone)==0)){

j=0;i++;while(buf[i]!=' ')StarifIn[j++]=buf[i++];StarifIn[j]='&bsol;0';

j=0;i++;while(buf[i]!=' ')StarifOut[j++]=buf[i++];StarifOut[j]='&bsol;0';

j=0;i++;while(buf[i]!=' ')Smoney[j++]=buf[i++];Smoney[j]='&bsol;0';

j=0;i++;while(buf[i]!='&bsol;n')Sdir[j++]=buf[i++];Sdir[j]='&bsol;0';

break;

}

}

};// end while

if (feof(handle)) {

fclose(handle);

return -1;

};

*tarifIn = atoi(StarifIn);

*tarifOut = atoi(StarifOut);

tarifConnect = atoi(StarifConnect);

if (strstr(Sdir,"MT")!=NULL)*dir=PHONE;

if (strstr(Sdir,"GSM")!=NULL)*dir=MOBILPHONE;

if (strstr(Sdir,"MTGSM")!=NULL)*dir=3;

START_money = atof(Smoney);

*money = atof(Smoney);

fclose(handle);

if ((op==*dir)||(*dir == 3))return index;

else return -1;

};

// після розмови залишок зберігаємо у файлі

void SaveMoney(int index){

FILE* handle;

char Smoney[20];

char buf[100];

long siz = 0;

int i,j;

char Sdelta[40];

int k = 0,delta = 0;

//перевiрка визначаємо рiзницю часу

//index=index+1;

//кiнець

handle = fopen("Users.dat", "rb+");

if (handle == NULL) return;

while((!feof(handle))&&(index-->0)) {

fgets(buf,100,handle);

siz += strlen(buf);

};

i=0;k=0;

fgets(buf,100,handle);

while (buf[i]!=' ')i++;

i++;while (buf[i]!=' ')i++;

i++;while (buf[i]!=' ')i++;

i++;while (buf[i]!=' ')i++;

k = i+1;

ltoa(money,Smoney,10);

j=strlen(Smoney);

if (j<5){

for (i=j-1;i>=0;i--) Smoney[5-(j-i)]=Smoney[i];

for (i=0;i<5-j;i++)Smoney[i]='0';Smoney[5]='&bsol;0';

};

fseek(handle,siz+k,SEEK_SET);

fwrite(&Smoney,strlen(Smoney),1,handle);

fclose(handle);

};

// отримуємо час розмови у секундах для визначення часу розмови

unsigned long getSec(char *tim){

char *Ssec;

int i = 0,k = 0,numDigit=0;

unsigned long res = 0;

Ssec = strstr(tim,",");

Ssec[10]='&bsol;0';

while (Ssec[i]!='&bsol;0') {

if ((Ssec[i]<'0')||(Ssec[i]>'9')){i++;continue;};

if (k==2){

if (i>4) res=res*60+numDigit; numDigit=0; k=0;

}

numDigit=numDigit*10+(Ssec[i]-48);

k++; i++;

}

return res*60+numDigit;

}

// записуємо протокол розмови у формі дата розмови час розмови кількість витрачених грошей

// номер телефону з якої сторони був дзвінок МТМ чи GSM

void saveLog(char * timeStart,char * timeEnd,char *phoneNumber,char *direction){

FILE * f;

char Smoney[20];

double mresult = 0;

unsigned long intmres = 0;

unsigned long tStart = getSec(timeStart);

unsigned long tEnd = getSec(timeEnd);

char spase[3] = " ";

int i,j,delta = 0;

char Sdelta[10];

if (tStart>tEnd){

tEnd+=3600;

}

delta = tEnd-tStart;

itoa(delta,Sdelta,10);

f=fopen("Log.dat","at");

i=0;

while ((timeStart[i]>'9')||(timeStart[i]<'0'))i++;

for (j=i;j<i+18;j++)timeStart[j-i]=timeStart[j];timeStart[17]='&bsol;0';

intmres = ((long)(money));

if (strcmp(direction, "з GSM")==0) money = intmres;

else money = intmres-1;

mresult = START_money-money;

ltoa(mresult,Smoney,10);

fwrite(timeStart,strlen(timeStart),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(Sdelta,strlen(Sdelta),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(Smoney,strlen(Smoney),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(phoneNumber,strlen(phoneNumber),1,f);

fwrite(spase,strlen(spase),1,f);

fwrite(direction,strlen(direction),1,f);

fputs("&bsol;n",f); fclose(f);

};

// отримати число видане контролером DTMF

int getDigit(int criticalTime){

int i,res = 0;

char b;

char *st;

while((inportb(LPTin)&STROB)==0);

do{

b = inportb(LPTin);

delay(60);

if (criticalTime-- < 0) break;

}while ((b&STROB)!= 0);

if ((b & DIGIT1)!=0) res = res+1;

if ((b & DIGIT2)!=0) res = res+2;

if ((b & DIGIT3)!=0) res = res+4;

if ((b & DIGIT4)!=0) res = res+8;

itoa(res,st,10);

if (criticalTime<0) return -1; //timeout

else return res;

};

//************************************************************************************************************

//********************** обробити дзвінок з міста ***********************************

//********************************************************************************************************

void phoneCity(){

int digit[3];//читаємо кому абонент телефонної лiнiї хоче подзвонити

int i,no = 0;

int PhoneNum = 0;

int tarifUser;

int isDigit,credits;

int MD = atoi(numDigits);