티스토리 뷰
Problem#1
RFID Anti-collision, Query Tree Protocol
(RFID 충돌방지기법, 질문트리프로토콜)
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<stack>
#include<fstream>
using namespace std;
int IDENTIFICATION = 0; //1개의 노드가 응답한 횟수
//스택
class Reader { // 질의 주머니
int cycle; // 2개이상 노드가 응답한 횟수
int IDLE; // 0개의 노드가 응답한 횟수
int COLLISION;
string temp; // 스택에서 꺼낸 수를 저장
stack<string> g;
public:
Reader();//기본생성자
Reader(int); // 변환생성자
Reader(Reader& R);//복사생성자
void result();
void creatQuery(int); //태그들에게 보낼 질의 메세지를 만드는 함수
string sendQuery(); //태그들에게 질의 메세지를 보내는 함수
void responsQuery(int); //태그들로 부터 오는 응답메세지를 처리하는 함수
};
Reader::Reader() // 기본생성자
{
cycle = 0;
IDLE = 0;
COLLISION = 0;
}
Reader::Reader(int n)//변환 생성자
{
cout << "변환생성자" << endl;
}
Reader::Reader(Reader &R)//복사생성자
{
cout << "복사생성자" << endl;
}
void Reader::creatQuery(int tagNum)//태그들에게 보낼 질의 메세지를 만드는 함수
{
if (tagNum > 1)
{
g.push(temp + "1");
g.push(temp + "0");
temp = g.top();
g.pop();
}
if (tagNum == 1 || tagNum == 0)
{
temp = g.top();
g.pop();
}
}
string Reader::sendQuery()//태그들에게 질의 메세지를 보내는 함수
{
cout << "\n";
cycle++;
cout << "==== " << cycle << " cycle" << " ====" << endl;
return temp;
}
void Reader::responsQuery(int tagNum)//태그들로 부터 오는 응답메세지를 처리하는 함수
{
if (tagNum == 1)
{
IDENTIFICATION++;
}
else if (tagNum == 0)
{
IDLE++;
}
else
{
COLLISION++;
}
}
void Reader::result()
{
cout << "\n";
cout << "Total " << cycle << " Cycle<s>" << endl;
cout << IDLE << " IDLE Cycle<s>" << endl;
cout << COLLISION << " COLLISON Cycles<s>" << endl;
cout << IDENTIFICATION << " IDENTIFICATION Cycles<s>" << endl;
}
class Tag // 태그 아이디를 담고 있는 변수
{
string ID[10];
int num; // 태그의 갯수
int count;
public:
Tag(); // 기본생성자
Tag(int); // 변환생성자
Tag(Tag& T); // 복사생성자
void receiveQuery(string); //질의를 수신하고 처리하는 함수
int sendReader(); //리더에게 메세지를 보내는 함수
void tagprint(); // 태그의 정보(태그 이름과 아이디)를 출력하는 함수
void creat_bin(int); // 태그의 아이디를 만드는 함수
};
Tag::Tag() // 기본 생성자
{
char c;
int i = 0;
int n = 1;
string buffer[6];
ifstream is;
is.open("qt.dat"); // 파일을 읽는다.
cout << "\n";
if (!is.fail()){
cerr << "qt.dat 로부터 성공적으로 태그를 읽었습니다!" << endl;
}
is.get(c);
while (!is.eof()) // 읽고 분리해서 배열에 넣는다.
{
if (c != 44)
{
buffer[i] += c;
n++;
}
else
{
i++;
}
is.get(c);
}
num = (int)buffer[0].at(0)-'0'; // 첫번재 5를 개수에 넣는다.
for (int i = 1; i < 6; i++) // 나머지는 태그에 넣는다
{
ID[i-1] = buffer[i];
cout << "Tag"<<i-1<<": " <<ID[i - 1] << endl;
}
count = -1;
is.close();
}
Tag::Tag(int n) // 변환 생성자
{
num = n;
creat_bin(n);
count = -1;
}
Tag::Tag(Tag& T) // 복사생성자
{
cout << "복사생성자" << endl;
}
void Tag::receiveQuery(string querybag) // 질의를 수신하고 처리하는 함수
{
int i = 0;
if (querybag.empty())
{
cout << "Query: e" << endl;
for (int i = 0; i < num; i++)
{
cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
}
count = 4;
}
else
{
cout << "Query : " << querybag << endl;
count = 0;
for (int i = 0; i < num; i++)
{
if (querybag.length() == 4)
{
if (querybag.at(0) == ID[i].at(0) && querybag.at(1) == ID[i].at(1) && querybag.at(2) == ID[i].at(2) && querybag.at(3) == ID[i].at(3))//네번째 수
{
cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
count++;
}
}
else if (querybag.length() == 3)
{
if (querybag.at(0) == ID[i].at(0) && querybag.at(1) == ID[i].at(1) && querybag.at(2) == ID[i].at(2))//세번째 수
{
cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
count++;
}
}
else if (querybag.length() == 2)
{
if (querybag.at(0) == ID[i].at(0) && querybag.at(1) == ID[i].at(1))//두번째 수
{
cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
count++;
}
}
else if (querybag.length() == 1)
{
if (querybag.at(0) == ID[i].at(0))// 첫번째 수
{
cout << "Response: " << ID[i] << " <TAG" << i << ">" << endl;
count++;
}
}
else
{
cout << "오류!!" << endl;
}
}
}
}
int Tag::sendReader() // 리더에게 메시지를 보내는 함수
{
return count;
}
void Tag::tagprint() // 태그의 정보를 출력하는 함수
{
for (int i = 0; i < num; i++)
{
cout << "Tag" << i << ": " << ID[i] << endl;
}
}
void Tag::creat_bin(int n) // 십진수를 랜덤으로 뽑아서 2진수로 만든
{
int temp1[10]; //정수를 램덤으로 뽑아 저장하는 배열
char temp2[5];
for (int i = 0; i < n; i++)// 십진수를 0부터 15까지 태그의 개수만큼 랜덤으로 뽑는다.
{
temp1[i] = rand() % 15; //0~15까지 랜덤으로 뽑는다.
for (int j = 0; j < i; j++)//중복검사
{
if (temp1[i] == temp1[j])
{
i--;
}
}
_itoa_s(temp1[i], temp2, 2);
ID[i] = temp2;
//문자열에 4자리를 맞추기위해서 앞에 0을 넣는다.
if (ID[i].length() == 1)
{
ID[i].insert(0, "000");
}
if (ID[i].length() == 2)
{
ID[i].insert(0, "00");
}
if (ID[i].length() == 3)
{
ID[i].insert(0, "0");
}
}
}
■ 전역변수 IDENTIFICATION
- 1개의 노드가 응답한 횟수를 0으로 초기화 한다.
■ 구현한 클래스 설명
● Reader 클래스는 질의주머니를 만드는 클래스 입니다.
1) 기본생성자를 실행시키고 cycle, IDLE, COLLISION을 0으로 초기화.
2) void creatQuery(int tagNum)
- 태그들에게 보내는 질의를 만드는 함수입니다.
- 태그 ID가 응답한 수가 한번 초과되면 스택을 이용해서
string temp와 “1”,“0”을 쌓습니다.
- top을 temp에 넣습니다.
- 위에 쌓은 “0”을 뺍니다.
- 태그 ID가 1이거나 0이면 top을 temp에 저장시키고
스택에서 뺍니다.
3) string sendQuery()
- 태그들에게 질의를 보내는 함수
- cycle를 출력하고 string temp를 반환한다.
4) void responsQuery(int tagNum)
- 태그들로부터 오는 응답메세지를 처리하는 함수
- 태그 ID가 응답한 횟수인 tagNum이 1이면 IDENTIFICATION을 1증가
- tagNum이 0이면 IDLE를 1증가
- tagNum이 0과1이 아니라면 COLLISION을 1증가한다.
5) void result()
- 마지막 결과를 출력해주는 함수이다.
● Tag 클래스는 태그 아이디를 담고 있는 변수입니다.
1) 기본생성자
- 파일을 실행시킬 때에는 기본생성자가 실행되어 파일을 읽고 ID와
ID의 개수를 변수에 저장시킵니다.
2) 변환생성자
- ID의 개수를 입력받고 ID를 만들 함수를 호출하고 ID가 반응한 횟수를 -1
로 초기화한다. -1로 초기화하는 이유는 첫 번째로 Reader::creatQuery를
호출할 때 조건에 안 들어가게 해야 하기 때문이다.
3) void receiveQuery(string querybag)
- querybag는 질의를 담고있습니다. 질의가 비어있으면 모두가 응답하고
2보다 큰 의미없는 숫자 4를 ID의 응답한 횟수에 저장합니다.
- querybag가 비어있지 않으면 querybag를 출력하고 ID랑 비교해서 겹치면
몇 개인지 확인하고 저장합니다.
4) int sendReader()
- ID가 응답한 count를 반환합니다.
5) void tagprint()
- 태그의 정보를 출력하는 함수
6) void creat_bin(int n)
- 태그의 ID를 만들 개수를 입력받아 ID를 만드는 함수
- 십진수로 1~15 중 n개만큼 무작위로 뽑아서 이진수로 변환하여
문자열에 저장한다.
● Simulator 클래스는 프로젝트를 구현하는 클래스이다.
1) 기본생성자
- num는 1번 파일 실행과 2번 사용자입력을 저장하는 변수로 0으로
초기화 시킨다.
2) void start()
- 프로그램을 시작하는 함수
- 1번을 num에 저장하면 파일실행을 구현한다.
- 2번을 num에 저장하면 사용자입력을 구현한다.
- 반복해서 IDENTIFICATION이 ID개수 보다 작으면 실행됩니다.
■ 구현한 메인한수 설명
- srand((unsigned int)time(NULL));// 시드값을 바꿔준다.
- Simulator를 선언하고 start()를 호출해서 프로그램을 시작한다.
■ 실행화면
'IT > Back-end' 카테고리의 다른 글
[C++] 체널 랑데부(Channel Rendezvous) (0) | 2022.03.28 |
---|---|
[C++] Bingo game 빙고게임 (0) | 2022.03.28 |
[C++] 무선 링크 및 개수 구하기 (0) | 2022.03.28 |
JPA와 JDBC ? (0) | 2021.04.04 |
c++과 JAVA(자바) 차이점? (0) | 2021.03.27 |