NDEF 데이터 읽기 및 쓰기 기능 소개
NDEF(Non-Contact Forum Data Exchange Format)는 NFC 기기 간에 표준화된 데이터 교환을 가능하게 하는 포맷입니다. 이 형식을 사용하면 다양한 장치가 미리 정의된 규칙 없이도 직접 데이터를 읽거나 쓸 수 있습니다. 카드 종류에 관계없이, 우아기술사의 모든 NFC 리더기 제품은 이 표준을 지원합니다.
주요 지원되는 NDEF 데이터 유형은 다음과 같습니다:
- 0: 텍스트 데이터 (Text Type)
- 1: http://www. 접두사 포함 웹 주소
- 2: https://www. 접두사 포함 웹 주소
- 3: http:// 접두사 포함 웹 주소
- 4: https:// 접두사 포함 웹 주소
- 5: 전화번호 (tel:)
- 6: 이메일 주소 (mailto:)
- 7: 문자 메시지 (sms:)
이 외에도 더 많은 유형이 존재하며, 자세한 사양은 NFC 포럼 공식 문서를 참조하세요.
우아기술사 웹 플러그인의 NDEF API
이 플러그인은 M1 카드, NTAG 등 다양한 NFC 태그에 대해 NDEF 쓰기/읽기 작업을 지원하며, 4개의 주요 함수를 제공합니다.
- NDEF 기록 추가 (메모리 내 저장)
NDEF_AddRecord(type, content)
type: NDEF 데이터 유형 코드 (0~7)content: 실제 데이터 문자열 (예: "example.com" → URI=1 경우 "www." 생략)
함수 호출 시 태그에 직접 작동하지 않으며, 내부 리스트에만 저장됩니다.
- 모든 기록 삭제 (메모리 내)
NDEF_ClearAllRecords()
- 파라미터 없음
- 현재 메모리에 저장된 모든 기록을 제거
- 메모리 내용을 태그에 쓰기
NDEF_Write()
- 파라미터 없음
- 현재 메모리에 저장된 모든 기록을 선택된 NFC 태그에 기록
- 태그에서 모든 기록 읽기
NDEF_Read()
- 파라미터 없음
- 태그에 저장된 모든 NDEF 기록을 읽어와 반환
JavaScript 예제 코드
다음은 실용적인 사용 예제입니다:
// 메모리에 새로운 기록 추가 (예: 웹사이트)
function addNdefRecord() {
const recordType = 1; // www. 접두사 포함
const urlContent = "youwokeji.com.cn"; // 'www.' 생략 가능
rfidreader.Repeat = 0;
rfidreader.NDEF_AddRecord(recordType, urlContent);
}
// 전체 목록 초기화
function clearNdefList() {
rfidreader.Repeat = 0;
rfidreader.NDEF_ClearAllRecords();
}
// 메모리의 모든 기록을 태그에 쓰기
function writeNdefToTag() {
rfidreader.Repeat = 0;
rfidreader.NDEF_Write();
}
// 태그에서 데이터 읽기
function readNdefFromTag() {
rfidreader.Repeat = 0;
rfidreader.NDEF_Read();
}
모든 작업 결과는 콜백 함수로 전달됩니다:
rfidreader.onResult(function(response) {
switch (response.FunctionID) {
case 51: // AddRecord 성공 여부
if (response.Result > 0) {
alert("기록 추가 성공");
}
break;
case 52: // ClearAll 성공 여부
if (response.Result > 0) {
alert("기록 목록 비움 성공");
}
break;
case 53: // Write 성공 여부
if (response.Result > 0) {
alert(`태그에 쓰기 성공: 카드번호 ${response.CardNo}`);
}
break;
case 54: // Read 성공 여부
if (response.Result >= 0) {
const cardNumber = response.CardNo;
const dataType = response.ValData;
const dataValue = response.strData;
console.log(`읽은 데이터 - 유형: ${dataType}, 값: ${dataValue}`);
}
break;
}
});
각 함수는 태그에 직접 접근하는 것이 아니라, 내부 큐를 통해 관리되며, 최종적으로 Write 또는 Read를 통해 실제 물리적 작업이 수행됩니다.