#include “myhead.h”
#define BEEP_ON 0 //蜂鸣器响
#define BEEP_OFF 1 //蜂鸣器灭
#define DEV_PATH3 “/dev/ttySAC3”
#define DEV_PATH1 “/dev/ttySAC1” // CON2
#define DEV_PATH2 “/dev/ttySAC2”
sqlite3 db = NULL;
volatile unsigned int cardid ;
char license[100];
char pic_name[100];
static struct timeval timeout;
/ int init_sql()
{
int ret;
char *sql = “create table if not exists data(cardid integer primary key not null,license text,picpaht text);”;
ret=sqlite3_open("./data.db", &db);
if(ret!=0)
{
perror(“sqlite3_open is fail\n”);
}
ret=sqlite3_exec(&db,sql,NULL,NULL,NULL);
if(ret!=0)
{
perror("sqlite3_exec is fail\n");
}
return 0;
} */
int callback(void *p, int num_col, char **text, char **name)
{
int cnt = 0;
while(cnt<num_col)
{
printf("%-10s\t|", *(text+cnt));
cnt++;
}
printf("\n_______________________________________________\n");
printf("\n");
return 0;
}
unsigned char CalBCC(unsigned char *buf, int n)
{
int i;
unsigned char bcc=0;
for(i = 0; i < n; i++)
{
bcc ^= *(buf+i); //buf[i]
}
return (~bcc);
}
int callback1(void *p, int num_of_col, char **text, char **name)
{
printf(“出库车辆车牌号是:%s\n”,text[1]);
printf(“卡号:%#x\n”,text[0]);
printf(“图片路径:%s\n”,text[2]);
int ret = remove(text[2]);
if(ret == 0)
{
printf(“success\n”);
}
else
{
printf(“error\n”);
}
return 0;
}
int uart_set(int uartfd)
{
struct termios myios;
bzero(&myios,sizeof(myios));
//设置串口工作在本地模式
myios.c_cflag |= CLOCAL | CREAD;
cfmakeraw(&myios);
//波特率
cfsetispeed(&myios, B115200);
cfsetospeed(&myios, B115200);
//8位数据位
myios.c_cflag &= ~CSIZE; /* 用数据位掩码清空数据位设置 */
myios.c_cflag |= CS8; //CS5 CS6 CS7 CS8
//无奇偶校验
myios.c_cflag &= ~PARENB;
//1位停止位
myios.c_cflag &= ~CSTOPB; /* 将停止位设置为一个比特 */
//设置最小等待时间和最少字符数量
myios.c_cc[VTIME] = 0;
myios.c_cc[VMIN] = 1;
//刷新串口
tcflush(uartfd,TCIOFLUSH);
//配置生效
tcsetattr(uartfd,TCSANOW,&myios);
return 0;
}
void init_tty(int fd)
{
//声明设置串口的结构体
struct termios termios_new;
//先清空该结构体
bzero( &termios_new, sizeof(termios_new));
cfmakeraw(&termios_new);
//设置波特率
cfsetispeed(&termios_new, B9600);
cfsetospeed(&termios_new, B9600);
// CLOCAL和CREAD分别用于本地连接和接受使能
// 首先要通过位掩码的方式激活这两个选项。
termios_new.c_cflag |= CLOCAL | CREAD;
//通过掩码设置数据位为8位
termios_new.c_cflag &= ~CSIZE;
termios_new.c_cflag |= CS8;
//设置无奇偶校验
termios_new.c_cflag &= ~PARENB;
//一位停止位
termios_new.c_cflag &= ~CSTOPB;
// 可设置接收单词和等待时间,无特殊要求可以将其设置为0
termios_new.c_cc[VTIME] = 0;
termios_new.c_cc[VMIN] = 1;
// 用于清空输入/输出缓冲区
tcflush (fd, TCIFLUSH);
//完成配置后,可以使用以下函数激活串口设置
if(tcsetattr(fd, TCSANOW, &termios_new))
printf("Setting the serial1 failed!\n");
}
char get_bcc(char *buf,int n)
{
char bcc = 0;
int i;
for(i=0;i<n;i++)
{
bcc ^= buf[i];
}
return (~bcc);
}
int read_card(char *tty)
{
int fd = open(tty, O_RDWR | O_NOCTTY);
init_tty(fd);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
char WBuf[8], RBuf[128];
bzero(WBuf, 8);
WBuf[0] = 0x07; //帧长= 7 Byte
WBuf[1] = 0x02; //包号= 0 , 命令类型= 0x02:ISO14443A命令
WBuf[2] = 0x41; //命令= 'A',请求附近卡片信息
WBuf[3] = 0x01; //信息长度 = 1
WBuf[4] = 0x52; //请求模式: ALL=0x52
WBuf[5] = CalBCC(WBuf, WBuf[0]-2); //校验和
WBuf[6] = 0x03; //结束标志
fprintf(stderr, "正在检测卡片");
int count = 0;
while(1)
{
// 向串口发送指令
tcflush (fd, TCIFLUSH);
write(fd, WBuf, 7);
bzero(RBuf, 128);
read(fd, RBuf, 128);
//应答帧状态部分为0 则请求成功
if(RBuf[2] == 0x00)
{
printf("\n获取RFID卡信息成功[%d]: ", RBuf[3]);
int i;
for(i=0; i<RBuf[3]; i++)
{
printf("%c", RBuf[4+i]);
}
printf("\n");
break;
}
else
{
if(count%10 == 0)
{
fprintf(stderr, ".");
}
count++;
usleep(100*1000);
}
}
// =======================================
bzero(WBuf, 8);
WBuf[0] = 0x08; //帧长= 8 Byte
WBuf[1] = 0x02; //包号= 0 , 命令类型= 0x02
WBuf[2] = 0x42; //命令= 'B'
WBuf[3] = 0x02; //信息长度= 2
WBuf[4] = 0x93; //防碰撞0x93: 一级防碰撞
WBuf[5] = 0x00; //位计数0
WBuf[6] = CalBCC(WBuf, WBuf[0]-2); //校验和
WBuf[7] = 0x03; //结束标志
// 向串口发送指令
tcflush (fd, TCIFLUSH);
write(fd, WBuf, 8);
bzero(RBuf, 128);
read(fd, RBuf, 128);
//应答帧状态部分为0 则成功
int cardid;
if(RBuf[2] == 0x00)
{
int i, j;
for(i=RBuf[3]-1, j=0; i>=0; i--, j++)
{
memcpy((char *)&cardid+j, &RBuf[4+i], 1);
}
}
else
{
printf("获取卡号失败.\n");
exit(0);
}
printf("卡号: %#x\n", cardid);
close(fd);
return cardid;
}
char *province[]={“粤”, “赣”, “湘”, “鄂”, “贵”,
“黑”, “沪”, “京”, “蒙”, “藏”,
“甘”, “豫”, “鲁”, “晋”, “桂”,
“云”, “滇”, “辽”, “川”, “闵”,
“徽”, “苏”, “津”, “吉”, “冀”,
“陕”, “宁”, “浙”, “渝”, “琼”,
“港”, “澳”, “台”
};
char character[]={ ‘A’, ‘B’, ‘C’, ‘D’, ‘E’,
‘F’, ‘G’, ‘H’, ‘I’, ‘J’,
‘K’, ‘L’, ‘M’, ‘N’, ‘O’,
‘P’, ‘Q’, ‘R’, ‘S’, ‘T’,
‘U’, ‘V’, ‘W’, ‘X’, ‘Y’,
‘Z’, ‘0’, ‘1’, ‘2’, ‘3’,
‘4’, ‘5’, ‘6’, ‘7’, ‘8’,
‘9’
};
char *get_license()//随机获取一个数据
{
char num[6];
bzero(num,6);
bzero(license,100);
srand(time(NULL));
num[0]=character[rand()%36];
num[1]=character[rand()%36];
num[2]=character[rand()%36];
num[3]=character[rand()%36];
num[4]=character[rand()%36];
num[5]=character[rand()%36];
sprintf(license,"%s%s",province[rand()%33],num);
return license;
}
void *check_in(void * arg)
{
int beep_fd,cardid,ret;
char sql_1[100]=“insert into data values”;
char sql_2[100];
char *errmsg;
int i=0;
while(1)//循环读卡
{
//show_jpeg_share(0,0,1,"./getcard.jpg");
show_fullbmp("./getcard.bmp");
bzero(sql_2,100);
cardid=read_card("/dev/ttySAC3");
get_license();
//get_picture();
sprintf(sql_2,"%s(%#x,'%s','%s');",sql_1,cardid,license,pic_name);
ret = sqlite3_exec(db,sql_2,NULL,NULL,&errmsg);
printf("%s",sql_2);
/* if(ret!=0)
{
beep_fd=open("/dev/beep",O_RDWR);
for(i=0;i<5;i++)
{
ioctl(beep_fd,BEEP_ON,1); //蜂鸣器响
usleep(30000);
ioctl(beep_fd,BEEP_OFF,1); //蜂鸣器灭
usleep(30000);
}
close(beep_fd);
}
else{
beep_fd = open("/dev/beep",O_RDWR);
ioctl(beep_fd,BEEP_ON,1); //蜂鸣器响
sleep(1);
ioctl(beep_fd,BEEP_OFF,1); //蜂鸣器灭
close(beep_fd);
//system("madplay welcome.mp3 &");
} */
char *sql = "select license from data;";
ret = sqlite3_exec(db,sql,callback,NULL,NULL);
if(ret != 0)
{
printf("error2\n");
}
}
}
void *check_out()
{
int ret,beep_fd,k,cardid;
char sql_1[100]=“delete from data where cardid=”;//删除
char sql_2[100]=“insert into data values”;//添加
char sql_3[100]=“select * from data where cardid=”;//查询
char sql_4[100];
char sql_5[100];
char sql_6[100];
while(1)
{
show_fullbmp("./getcard.bmp");
bzero(sql_4,100);
bzero(sql_5,100);
bzero(sql_6,100);
cardid=read_card("/dev/ttySAC3");
sprintf(sql_4,"%s(%#x,'%s','123')",sql_2,cardid,license);
sprintf(sql_5,"%s%#x",sql_3,cardid);
sprintf(sql_6,"%s%#x;",sql_1,cardid);
ret=sqlite3_exec(db,sql_4,NULL,NULL,NULL);
if(ret!=0)
{
//show_jpeg_share(0,0,1,"./parking.jpg");
show_fullbmp("./parking.bmp");
ret = sqlite3_exec(db,sql_5,callback1,NULL,NULL);
if(ret != 0)
{
printf("sqlite3_exec error3\n");
}
ret = sqlite3_exec(db,sql_6,NULL,NULL,NULL);
if(ret==0)
{
printf("停车结束\n");
sleep(2);
}
}
else
{
ret = sqlite3_exec(db,sql_6,NULL,NULL,NULL);
printf("cardid no existence in sql!\n");
sleep(2);
}
}
}
void init_led_beep()
{
system(“rmmod led”);
system(“rmmod gec6818_beep”);
system(“insmod led.ko”);
system(“insmod gec6818_beep.ko”);
return ;
}
int main()
{
pthread_t tid1,tid2;
int ret;
char *errmsg;
char *sql = "create table if not exists data(cardid integer primary key not null,license text,picpaht text);";
//init_led_beep();
ret = sqlite3_open("data.db",&db);
if(ret != 0)
printf("sqlite3_open error!\n");
ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(ret != 0)
{
printf("sqlite3 exec error!\n");
printf("%s\n",errmsg);
}
printf("****\n");
//初始化数据库(打开数据和创建表)
//init_sql();//cardid integer primary key,license,picpath
//入场例程
pthread_create(&tid1, NULL, check_in, NULL);
//出场例程
pthread_create(&tid1, NULL, check_out, NULL);
getchar();
sqlite3_close(db);
return 0;
}