#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#pragma comment (lib, "wsock32.lib")
#include "EventAndState.h"
#include "Label_lst.h"
extern SOCKET s;
extern char recvbuf[200];
extern struct sockaddr_in remote,broadcast;
extern int rn16;
extern struct label_lst *lb;
extern int q;
int retval;
int len;
int judge_label()
{
int k=0,judge=0;
len = sizeof(remote);
int j = 0;
float max_wait;
printf("please input the time you want to wait for label to react(the accuracy is 50ms and you should put the multiple of 50ms)\n");
scanf("%f",&max_wait);
float t = 20*max_wait/1000;
printf("Your wait time is %f s\n",t);
while(1)
{
int iMode = 1; //0:阻塞
ioctlsocket(s,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置
retval = recvfrom(s,recvbuf,sizeof(recvbuf),0,(SOCKADDR*)&remote,&len);
if( retval == -1)
{
retval = WSAGetLastError();
if(retval = WSAEWOULDBLOCK && j<max_wait)
{
j++;
Sleep(20);
continue;
}
else if(j == max_wait)
break;
else if(retval != WSAGetLastError())
{
printf("recv label answer error:%d\n",retval);
break;
}
}
else k++;
}
if(k == 0)
{
printf("No label reply: the Q is too large.You should choose QUERYADJUST to adjust the Q\n");
return 1;
}
else if(k == 1)
{
printf("1 label reply\n");
struct query_ack quryack_cmd;
memcpy(&quryack_cmd,recvbuf,sizeof(quryack_cmd));
rn16 = quryack_cmd.rn16;
addsl(lb,quryack_cmd.rn16,remote);//将此标签加入链表
printf("the label RN16 has been recved success\n");
return 1;
}
else if(k > 1)
{
printf("Too many label reply: the Q is too small.You should choose QUERYADJUST to adjust the Q\n");
return 1;
}
return 0;
}
//发送select设置标签的Q值
int select()
{
struct select slct_cmd;
slct_cmd.cmd = SELECT;
slct_cmd.targe = SL;
retval = sendto(s,(char*)&slct_cmd,sizeof(slct_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send SELECT error:%d\n",retval);
return 0;
}
return 1;
}
//发送Query命令
int query()
{
//设定Q值****************************************************************************
printf("please input the value of Q you want to set(must smaller than 16)\n");
scanf("%d",&q);
//***********************************************************************************
struct query query_cmd;
query_cmd.cmd = QUERY;
query_cmd.q = q;//这里以后可以自己输入Q值,还可以考虑输入sel值
retval = sendto(s,(char*)&query_cmd,sizeof(query_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send QUERY error:%d\n",retval);
return 0;
}
//设定一定时长等待,若超过时长无标签响应,则减小Q值,大于一个标签响应,则增大Q值
len = sizeof(remote);
//初始化标签链表
initiatesl(&lb);
judge_label();
return 1;
}
int queryadjust()
{
int judge;
struct queryadjust queryaj;
queryaj.cmd = QUERYADJUST;
while(1)
{
printf("Please input 1 (you want to increase the Q) or 2 (you want to reduce the Q)\n");
scanf("%d",&judge);
if(judge == 2)
{
queryaj.updn = q-1;//协议中是在标签中修改Q值,即读写器告诉标签应该把Q值增大或减小或不变,这里简化为直接读写器将改好了的Q值发给标签
q = q - 1;
printf("now the Q is %d\n",q);
break;
}
else if(judge == 1)
{
queryaj.updn = q+1;
q = q + 1;
printf("now the Q is %d\n",q);
break;
}
else
{
printf("Please input the correct number\n");
}
}
retval = sendto(s,(char*)&queryaj,sizeof(queryaj),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send QUERYADJUST error:%d\n",retval);
return 0;
}
judge_label();
return 1;
}
int queryrep()
{
struct queryrep qrep_cmd;
qrep_cmd.cmd = QUERYREP;
retval = sendto(s,(char*)&qrep_cmd,sizeof(qrep_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send QUERYREP error:%d\n",retval);
return 0;
}
judge_label();
return 1;
}
int ack()
{
struct ack ack_cmd;
ack_cmd.cmd = ACK;
ack_cmd.rn16 = rn16;
retval = sendto(s,(char*)&ack_cmd,sizeof(ack_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send ACK error:%d\n",retval);
return 0;
}
//重新设置recvfrom为阻塞
int iMode = 0; //0:阻塞
ioctlsocket(s,FIONBIO, (u_long FAR*) &iMode);//阻塞设置
retval = recvfrom(s,recvbuf,sizeof(recvbuf),0,(SOCKADDR*)&remote,&len);
if( retval == -1)
{
retval = WSAGetLastError();
printf("recv epc error:%d\n",retval);
return 0;
}
struct ack_ack ack2_cmd;
memcpy(&ack2_cmd,recvbuf,sizeof(ack2_cmd));
//将接收到的epc存入列表中
int judge = 1;
retval = addcontent(lb,rn16,ack2_cmd.epc,judge);
printf("the label EPC has been recved success\n");
return 1;
}
int nack()
{
struct nack nack_cmd;
nack_cmd.cmd = NACK;
retval = sendto(s,(char*)&nack_cmd,sizeof(nack_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send NACK error:%d\n",retval);
return 0;
}
return 1;
}
int req_rn()
{
struct reqrn reqrn_cmd;
reqrn_cmd.cmd = REQ_RN;
reqrn_cmd.rn16 = rn16;
retval = sendto(s,(char*)&reqrn_cmd,sizeof(reqrn_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send REQRN error:%d\n",retval);
return 0;
}
printf("has sent REQRN to label\n");
struct reqrn_ack reqrnack_cmd;
int iMode = 0; //0:阻塞
ioctlsocket(s,FIONBIO, (u_long FAR*) &iMode);//阻塞设置
retval = recvfrom(s,recvbuf,sizeof(recvbuf),0,(SOCKADDR*)&remote,&len);
if( retval == -1)
{
retval = WSAGetLastError();
printf("recv REQRN_ACK error:%d\n",retval);
return 0;
}
memcpy(&reqrnack_cmd,recvbuf,sizeof(reqrnack_cmd));
int old_rn16 = rn16;
rn16 = reqrnack_cmd.rn16;
updatesl(lb,old_rn16,rn16);
printf("get the HANDLE success\n");
printf("the HANDLE is %d\n",rn16);
return 1;
}
int read()
{
struct read read_cmd;
read_cmd.cmd = READ;
read_cmd.membank = USER;
read_cmd.rn16 = rn16;
retval = sendto(s,(char*)&read_cmd,sizeof(read_cmd),0,(SOCKADDR*)&broadcast,sizeof(broadcast));
if(retval == -1)
{
retval = WSAGetLastError();
printf("send READ error:%d\n",retval);
return 0;
}
//重新设置recvfrom为阻塞
int iMode = 1; //0:阻塞
ioctlsocket(s,FIONBIO, (u_long FAR*) &iMode);//阻塞设置
Sleep(4000);//等4s再收
struct read_ack rdack_cmd;
retval = recvfrom(s,recvbuf,sizeof(recvbuf),0,(SOCKADDR*)&remote,&len);
if( retval == -1)
{
retval = WSAGetLastError();
if(retval = WSAEWOULDBLOCK)
return 0;
printf("recv USER error:%d\n",retval);
return 0;
}
memcpy(&rdack_cmd,recvbuf,sizeof(rdack_cmd));
if(rdack_cmd.head == 1 && rdack_cmd.rn16 == rn16)
{
int judge = 2;
retval = addcontent(lb,rn16,rdack_cmd.buf,judge);//将USER的内容存入链表
if(retval == 1)
{
printf("recv and save the USER success\n");
}
else if(retval == 0)
{
printf("recv and save the USER failed\n");
}
return 1;
}
else if(rdack_cmd.head == 0 && rdack_cmd.rn16 == rn16)
{
printf("read the USER error\n");
return 0;
}
else
printf("READ:not the same label reply\n");
return 1;
}
int write()
{
char user[100];
printf("Please input the content you want to be saved in label(the label rn16 is %d)\n",rn16);
scanf("%s",user);
struct write wt_cmd;
memcpy(wt_cmd.buf,user,sizeof(wt_cmd.buf));
int judge = 2;
retval = addcontent(lb,rn16,user,judge);
if(retval == 1)
{
printf("WRITE:save the USER success\n");
}
else if(retval == 0)
{
printf("WRITE:save the USER failed\n");
}
wt_cmd.cmd = WRITE;
wt_cmd.membank = USER;
wt_cmd.rn16 = rn16;
retval = sendto
没有合适的资源?快使用搜索试试~ 我知道了~
EventAndState-of-server.zip_6c
共1个文件
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 13 浏览量
2022-09-19
21:20:06
上传
评论
收藏 3KB ZIP 举报
温馨提示
iso18000——6c标准 读写器状态机
资源推荐
资源详情
资源评论
收起资源包目录
EventAndState-of-server.zip (1个子文件)
EventAndState.cpp 11KB
共 1 条
- 1
资源评论
局外狗
- 粉丝: 67
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功