📄 udp.c
字号:
#include "MyLib.h"
#define UpdateRam8 ((U8*)0xA0500000)
U32 code_len,code_sum;
U8 update_done;
U32 b_change;
U8 *P;/////
extern UploadTmp comtmp;
const U8 wrt[17]={" Writing Flash! "};
const U8 wait[17]={" Please Wait ! "};
const U8 suc[17]={"Update Succeeded"};
const U8 sta[17]={"Please Restart! "};
const U8 fal[17]={" Update False ! "};
const U8 sen[17]={"Copy Data to RAM"};
const U8 try[17]={"Please Try Again"};
void EnOrDisable_RealTime(U8 mode);
extern U8 b_sendrealtime;
void Read_UserAcc(U8 mode);
void Set_UserAcc(U8 mode);
void Set_TZGRP(U8 mode);
void Read_TZGRP(U8 mode);
void Set_TimeZone(U8 mode);
void Read_TimeZone(U8 mode) ;
void Read_Comb(U8 mode);
void Set_Comb(U8 mode);
void Read_LockTime(U8 mode);
void Set_LockTime(U8 mode);
void IP_sendrealtime(U8 *buf, U8 *ipaddr, U8 proto_id, U32 len)//len是上一级的长度
{
U8 *hwaddr;
U32 sum;
U8 hw[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
buf[0x0E]=0x45; // IPv4 with 20 byte header
buf[0x0F]=0; // Type_of_service
buf[0x10]=(len+20)/256; buf[0x11]=(len+20)%256; // Total_length
buf[0x12]=gIP_ident/256; buf[0x13]=gIP_ident%256; gIP_ident++;
buf[0x14]=buf[0x15]=0; // Fragment_info=0(not fragmented)
buf[0x16]=0x80; // Time to live
buf[0x17]=proto_id; // Protocol id
buf[0x18]=buf[0x19]=0; // Header checksum
MyMemcpy(buf+0x1A, gMyIP, 4); // Source IP
MyMemcpy(buf+0x1E, ipaddr, 4); // Dest IP
sum=Calc_checksum(buf+14, 20);
buf[0x18]=sum/256; buf[0x19]=sum%256;
hwaddr=Arp_resolve(ipaddr);//查找目标网卡物理地址
if(hwaddr==NULL){ // 无效IP地址
hwaddr=hw;
}
MyMemcpy(buf, hwaddr, 6); // 目的网卡MAC地址
MyMemcpy(buf+6, gMyPhy, 6); // 发送网卡MAC地址
buf[0x0C]=0x08; buf[0x0D]=0x00; // IP_Packet
DM9000_SendBuf(buf, len+34);
}
void UDP_Sendrealtime(U8* buf, U8* destIP, U32 len)
{
U32 sum;
buf[34]=buf[36]=gUDP_Port/256; buf[35]=buf[37]=gUDP_Port%256;
buf[38]=len/256; buf[39]=len%256; // len=整个UDP数据包的长度=1028+8
buf[40]=buf[41]=0; // UDP校验和=0(无校验)
MyMemcpy(buf+26, gMyIP, 4);
MyMemcpy(buf+30,destIP, 4);
sum=0xFFFF-Calc_checksum(buf+26, len+8);
sum+=(len+0x11);
sum=(sum&0xFFFF)+(sum>>16);
sum=0xFFFF-sum;
buf[40]=sum/256; buf[41]=sum%256;
IP_sendrealtime(buf, destIP, UDP_TYPE, len);
}
void UDP_Send(U8* buf, U8* destIP, U32 len)
{
U32 sum;
buf[34]=buf[36]=gUDP_Port/256; buf[35]=buf[37]=gUDP_Port%256;
buf[38]=len/256; buf[39]=len%256; // len=整个UDP数据包的长度=1028+8
buf[40]=buf[41]=0; // UDP校验和=0(无校验)
MyMemcpy(buf+26, gMyIP, 4);
MyMemcpy(buf+30,destIP, 4);
sum=0xFFFF-Calc_checksum(buf+26, len+8);
sum+=(len+0x11);
sum=(sum&0xFFFF)+(sum>>16);
sum=0xFFFF-sum;
buf[40]=sum/256; buf[41]=sum%256;
IP_send(buf, destIP, UDP_TYPE, len);
}
void UDP_SendImg(U8* destIP)
{
U32 Frame;
U8 SendBuf[1600];
#ifdef OV7620
for(Frame=0; Frame<103; Frame++){
SendBuf[42]=DeviceNO;SendBuf[43]=0xfe; SendBuf[44]=0; SendBuf[45]=Frame;
MyMemcpy(SendBuf+46, gImgBuf+Frame*1024, 1024);
UDP_Send(SendBuf, destIP, 1038);//send 1030B(data)+8B(UDP包头)
}
#else
for(Frame=0; Frame<300; Frame++){
SendBuf[42]=DeviceNO;SendBuf[43]=0xfe;
SendBuf[44]=Frame%256; SendBuf[45]=Frame/256;
MyMemcpy(SendBuf+46, gImgBuf+Frame*1024, 1024);
UDP_Send(SendBuf, destIP, 1038);
}
#endif
}
void Del_programe(void)
{
b_change=0x12345678;
Flash_SectorErase(0);
Flash_SectorErase(0x2000);
Flash_SectorErase(0x3000);
Flash_SectorErase(0x4000);
Flash_SectorErase(0x8000);
Flash_SectorErase(0x10000);
b_change=0;
}
void Write_Code(U32 len,U32 sum)
{
U32 i;
U16 dat;
U32 c_sum=0;
for(i=0;i<len;i++){
c_sum+=UpdateRam8[i];
}
if(c_sum==sum){
LCD_clear();//清屏
LCD_wrstr(2,0,(U8*)wrt,0);
LCD_wrstr(4,0,(U8*)wait,0);
Del_programe();
dat=len&0xFFFF;
b_change=0x12345678;
for(i=0;i<(len+1)/2;i++){
dat=UpdateRam8[i*2]+UpdateRam8[i*2+1]*0x100;
Flash_WriteWordPC(i,dat);
}
b_change=0;
LCD_clear();//清屏
LCD_wrstr(2,0,(U8*)suc,0);
LCD_wrstr(4,0,(U8*)sta,0);
}else{
LCD_clear();//清屏
LCD_wrstr(2,0,(U8*)fal,0);
LCD_wrstr(4,0,(U8*)try,0);
}
}
//下载用户记录和指纹数据,返回长度为68字节。
void UDPdownload_user(U16 id,U8* destIP)
{
U32 F_addr,R_addr;
U8 temp;
U8 sbuf[100];
U16 *p_u;
U16 j;
U32 addr,addr1;
sbuf[42]=DeviceNO;
sbuf[43]=15;
sbuf[44]=0xF1;
temp=Find_ID_addr(id,&R_addr,&F_addr); //查找ID号,有则返回对应的用户信息和指纹信息
if(temp==0){
sbuf[45]=id&0xFF;
sbuf[46]=(id>>8)&0xFF;
sbuf[47]=0;
sbuf[48]=0;
UDP_Send(sbuf, destIP, 76);
return;
}
if((temp==1)||(temp==2)){
if(temp==1){
p_u=RAM_user; //一般用户
}else{
p_u=RAM_admin; //管理者用户
}
sbuf[45]=id&0xFF;
sbuf[46]=(id>>8)&0xFF;
sbuf[47]=1;
for(j=0;j<4;j++){
if((p_u[R_addr+8+j*2]==0xFFFF)&&(p_u[R_addr+8+j*2+1]==0xFFFF)){
break;
}
addr1=addr=(p_u[R_addr+8+j*2]&0xFF)*0x10000+p_u[R_addr+8+j*2+1];
addr=addr*2;
sbuf[49+5*j]=(addr>>16)&0xFF;
sbuf[49+5*j+1]=(addr>>8)&0xFF;
sbuf[49+5*j+2]=addr&0xFF;
sbuf[49+5*j+3]=RAM_finger[addr1]&0xFF;
sbuf[49+5*j+4]=(RAM_finger[addr1]>>8)&0xFF;
}
sbuf[48]=j;
UDP_Send(sbuf, destIP, 76);
}
}
U8 net_dis[][17]={"Read Data...","write Data...","Clear Data...","read image...","write keyfun...","Read Info...","SynichronizeTime"};
U8 CHnet_dis[][17]={"读系统数据...","写系统数据...","清除数据...","采图像...","写功能键...","读系统信息...","同步时间..."};
U8 (*Pnet_dis)[17];
extern void Syn_Time(void);///PCcom.c
extern U8 FF232_rbuf[45];
extern U8 FF232_sbuf[45];
extern U8 disable_shotdown;
extern U8 work[2][12];
U32 Write_fprint(U8 *p_fprint);//写指纹数据
void UDP_receive(U8 *buf, U32 len)//buf[34]开始为UDP数据//len=UDP包头(8B)+UDP数据
{
U32 tmp,addr,i;
U8 k,type;
U16 id;
U8 temp;
U8 infbuf[32];
U32 R_addr,F_addr;
U32 faddr1,faddr2;
U16 *p,pkey[Max_index];
U8 SendBuf[1600],*p1;
if(!Language){
Pnet_dis=net_dis;
}else Pnet_dis=CHnet_dis;
if(*(U16*)(buf+0x24)==gUDP_Port&&buf[42]== DeviceNO&&buf[43]+buf[44]==0xff){// 本机UDP端口号和机号和命令校验
if(len==1040){ // 1KB数据写入FLASH
if(buf[43]==4&&netlock){ // 写FLASH
addr=buf[47]+buf[46]*0x100+buf[45]*0x10000;
if(addr<=0x1f0000){//&&addr>=0x30000
tmp=buf[48]*256+buf[49];//写FLASH 的有效字节数
if(tmp<=1024){
tmp=(tmp+1)/2;//WORD
addr=addr/2;p=(U16*)(&buf[50]);
for(i=0;i<tmp;i++,addr++)
Flash_WriteWordPC(addr,p[i]);
MyMemcpy(SendBuf+42,buf+42,68);
UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据
}
}
}else if((buf[43]==0x5A)&&netlock&&(update_done==1)){
k=buf[45]; //更新程序时第几包数据,
LCD_clear();//清屏
LCD_wrstr(3,0,(U8*)sen,0);
MyMemcpy(UpdateRam8+k*1024,buf+50,1024);
MyMemcpy(SendBuf+42,buf+42,68);
UDP_Send(SendBuf, buf+26, 76); //76包含UDP包头(8B)+UDP数据
if(k==code_len/1024){
Write_Code(code_len,code_sum);
update_done=0x00;
}
}
}else if(len==76){ // 读FLASH或执行命令(rlen=110)else if(len==76)
switch(buf[43]){
case 1: //lock device
if(netlock==0){
if(MCU_para[Compwd_index]==0xffff){
if(MyMemcmp(&buf[45],"888888",6))return;
}else{
if(MyMemcmp(&buf[45],&MCU_para[Compwd_index],6))return;
}
netlock=1;
MyMemcpy(SendBuf+42,buf+42,68);
UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据
}
break;
case 2: //unlock device
if(netlock){
netlock=gSendUDP=0;
MyMemcpy(SendBuf+42,buf+42,68);
UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据
}
break;
case 3: // FLASH擦除, 第1字节=要擦除的扇区号(0-34)(64KB为单位)
if(netlock){
addr=buf[45]*0x10000;
if(addr>=0x30000&&addr<=0x1f0000){//addr>=0x30000&&
Flash_SectorErase(addr/2);
MyMemcpy(SendBuf+42,buf+42,68);
UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据
}
}
break;
case 5: //read flash
if(netlock){
addr=buf[47]+buf[46]*0x100+buf[45]*0x10000;
if(addr<=0x200000){
addr=0xff800000+addr;
MyMemcpy(SendBuf+42,buf+42,6);
MyMemcpy(SendBuf+48,(U8*)addr,1024);
UDP_Send(SendBuf, buf+26, 1038);
}
}
break;
case 6: //count user
if(netlock){
MyMemcpy(SendBuf+42,buf+42,68);
FLASH_init();
tmp=WF.user_cnt+WF.admin_cnt;
SendBuf[46]=tmp&0xff;
SendBuf[45]=(tmp>>8)&0xff;
SendBuf[48]=p_record&0xff;
SendBuf[47]=(p_record>>8)&0xff;
SendBuf[50]=WF.fprint_cnt&0xff;
SendBuf[49]=(WF.fprint_cnt>>8)&0xff;
SendBuf[53] =(WF.user_addr)&0xFF;
SendBuf[52]=(WF.user_addr>>8)&0xFF;
SendBuf[51]=(WF.user_addr>>16)&0xFF;
SendBuf[55]=WF.admin_addr&0xFF;
SendBuf[54]=(WF.admin_addr>>8)&0xFF;
SendBuf[58]=WF.fprint_addr&0xFF;
SendBuf[57]=(WF.fprint_addr>>8)&0xFF;
SendBuf[56]=(WF.fprint_addr>>16)&0xFF;
SendBuf[60]=WF.user_cnt&0xFF;
SendBuf[59]=(WF.user_cnt>>8)&0xFF;
SendBuf[62]=WF.admin_cnt&0xFF;
SendBuf[61]=(WF.admin_cnt>>8)&0xFF;
UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -