#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#pragma comment (lib, "wsock32.lib")
#include "EventAndState.h"
#define LOCALPORT 9999
int state;
SOCKET s;
label *p,lab[MAXTIME];
char sendbuf[125];
char recvbuf[125];
char buf[125];
struct select command;
struct sockaddr_in remote;
int k;
int ready_fsm(int event)
{
(*p).next_state = READY;
switch(event)
{
case SELECT:
(*p).next_state = select();
break;
case QUERY://在READY向ARBITRATE状态过度时,收到了QUERY命令,包含Q值,以生成slot,如果盘存标志位置为B,那么就不再参与状态变化
(*p).next_state = query1(s,buf,sendbuf,(*p).next_state);
break;
default:
(*p).next_state = READY;
break;
}
return (*p).next_state;
}
int arbitrate_fsm(int event)
{
int retval,q;
(*p).next_state = ARBITRATE;
switch(event)
{
case SELECT:
(*p).next_state = select();
break;
case QUERY:
(*p).next_state = query1(s,buf,sendbuf,(*p).next_state);
break;
case QUERYREP:
if((*p).slot == 0)
{
(*p).slot = 1000;
printf("now the slot is %d\n",(*p).slot);
}
else
{
(*p).slot--;
printf("now the slot is %d\n",(*p).slot);
if((*p).slot == 0)
{
(*p).rn16 = rand();
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,(char*)&(*p).rn16,sizeof((*p).rn16));
retval = sendto(s,sendbuf,sizeof(sendbuf),0,(SOCKADDR*)&remote,sizeof(remote));
(*p).next_state = REPLY;
}
}
break;
case QUERYADJUST:
(*p).next_state = queryadjust(s,buf,sendbuf,(*p).next_state);
break;
default:
(*p).next_state = ARBITRATE;
break;
}
return (*p).next_state;
}
int reply_fsm(int event)
{
int retval,q;
(*p).next_state = ARBITRATE;
switch(event)
{
case SELECT:
(*p).next_state = select();
break;
case QUERY:
(*p).next_state = query1(s,buf,sendbuf,(*p).next_state);
break;
case QUERYREP:
(*p).next_state = ARBITRATE;
break;
case QUERYADJUST:
(*p).next_state = queryadjust(s,buf,sendbuf,(*p).next_state);
break;
case ACK:
(*p).next_state = ack_acknlg(s,buf,sendbuf);
break;
default:
(*p).next_state = ARBITRATE;
break;
}
return (*p).next_state;
}
int acknlg_fsm(int event)
{
(*p).next_state = ARBITRATE;
switch(event)
{
case SELECT:
(*p).next_state = select();
break;
case QUERY://部分没读懂!!?????
break;
case QUERYREP:
case QUERYADJUST:
(*p).next_state = queryrep();
break;
case ACK:
(*p).next_state = ack_acknlg(s,buf,sendbuf);
break;
case REQ_RN:
(*p).next_state = reqrn_acknlg(s,buf,sendbuf);
break;
default:
(*p).next_state = ARBITRATE;
break;
}
return (*p).next_state;
}
int open_fsm(int event)
{
(*p).next_state = OPEN;
switch(event)
{
case SELECT:
(*p).next_state = select();
break;
case QUERY://部分没读懂!!?????
break;
case QUERYREP:
case QUERYADJUST:
(*p).next_state = queryrep();
break;
case ACK:
(*p).next_state = ack(s,buf,sendbuf,(*p).next_state);
break;
case NACK:
(*p).next_state = ARBITRATE;
break;
case REQ_RN:
(*p).next_state = reqrn(s,buf,sendbuf,(*p).next_state);
break;
case READ:
(*p).next_state = read(s,buf,sendbuf,(*p).next_state);
break;
case WRITE:
(*p).next_state = write(s,buf,sendbuf,(*p).next_state);
break;
case KILL:
(*p).next_state = kill(s,buf,sendbuf,(*p).next_state);
break;
case LOCK:
(*p).next_state = OPEN;
break;
case ACCESS:
(*p).next_state = access(s,buf,sendbuf,(*p).next_state);
break;
}
return (*p).next_state;
}
int secured_fsm(int event)
{
(*p).next_state = SECURED;
switch(event)
{
case SELECT:
(*p).next_state = select();
break;
case QUERY://部分没读懂!!?????
break;
case QUERYREP:
case QUERYADJUST:
(*p).next_state = queryrep();
break;
case ACK:
(*p).next_state = ack(s,buf,sendbuf,(*p).next_state);
break;
case NACK:
(*p).next_state = ARBITRATE;
break;
case REQ_RN:
(*p).next_state = reqrn(s,buf,sendbuf,(*p).next_state);
break;
case READ:
(*p).next_state = read(s,buf,sendbuf,(*p).next_state);
break;
case WRITE:
(*p).next_state = write(s,buf,sendbuf,(*p).next_state);
break;
case KILL:
(*p).next_state = kill(s,buf,sendbuf,(*p).next_state);
break;
case LOCK:
(*p).next_state = SECURED;
break;
case ACCESS:
(*p).next_state = access(s,buf,sendbuf,(*p).next_state);
break;
}
return (*p).next_state;
}
int main()
{
WSAData wsa;
struct sockaddr_in local;
int retval;
int event,len;
fd_set read_list;
len = sizeof(remote);
WSAStartup(0x0202,&wsa);
s = socket(AF_INET,SOCK_DGRAM,0);
if(s == INVALID_SOCKET)
{
printf("Creating socket error\n");
return 0;
}
local.sin_family = AF_INET;
local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
local.sin_port = htons(LOCALPORT);
retval = bind(s,(sockaddr*)&local,sizeof(local));
//初始化标签
for(k=0;k<MAXTIME;k++)
{
lab[k].slot =100;
lab[k].S = 0;
lab[k].inventry = 'A';
lab[k].accesspassword = 123456;
lab[k].killpassword = 654321;
memset(lab[k].epc,0,sizeof(lab[k].epc));
memcpy(lab[k].epc,"abcdefg",7);
// printf("%s\n",l.epc);
strcpy(lab[k].user,"This is label!You get the correct USER information!Congratulation!By Teson.");
// printf("%s\n",l.user);
}
state = READY;
while(1)
{
for(k=0;k<MAXTIME;k++)
{
p = (lab+k);
switch((*p).state)
{
case READY:
printf("My current state:READY\n");
break;
case ARBITRATE:
printf("My current state:ARBITRATE\n");
break;
case REPLY:
printf("My current state:REPLY\n");
break;
case ACKNLG:
printf("My current state:ACKNLG\n");
break;
case OPEN:
printf("My current state:OPEN\n");
break;
case SECURED:
printf("My current state:SECURED\n");
break;
case KILLED:
printf("My current state:KILLED\n");
break;
}
}
FD_ZERO(&read_list);
FD_SET(s,&read_list);
retval = select(0,&read_list,NULL,NULL,NULL);
if(retval == SOCKET_ERROR)
break;
else
{
if(!FD_ISSET(s,&read_list)){
continue;
}
retval = recvfrom(s,(char*)&recvbuf,sizeof(recvbuf),0,(SOCKADDR*)&remote,&len);
if(retval <= 0)
{
retval = WSAGetLastError();
printf("1st recv error:%d\n",retval);
goto end;
}
memcpy(&buf,recvbuf,sizeof(recvbuf));//将recvbuf的内容复制到buf中就不会出现recvbuf传递到子函数中数据为空的情况???
memcpy(&command,recvbuf,sizeof(recvbuf));
event = command.cmd;
printfcmd(event);
}
for(k=0;k<MAXTIME;k++)
{
Sleep(200);
p = (lab+k);
switch((*p).state)
{
case READY:
(*p).state = ready_fsm(event);
break;
case ARBITRATE:
(*p).state = arbitrate_fsm(event);
break;
case REPLY:
(*p).state = reply_fsm(event);
break;
case ACKNLG:
(*p).state = acknlg_fsm(event);
break;
case OPEN:
(*p).state = open_fsm(event);
break;
case SECURED:
(*p).state = secured_fsm(event);
break;
case KILLED:
(*p).state = KILLED;
break;
}
}
}
//close the socket immediately
end:
closesocket(s);
WSACleanup();
return 0;
}
评论0