Skip to main content

Quick Start

This guide walks through connecting to an rf IDEAS reader, reading metadata, and using reader features in all supported languages.

1. Define the Reader

Every RIK application starts by defining which reader to connect to:

#include "Reader/AbstractReader.h"
#include "Reader/Reader.h"

using namespace Rik;
using namespace RikCommon;

ReaderDefinition readerDef{};
readerDef.DeviceId.VendorId = 0x0C27;
readerDef.DeviceId.ProductId = 0x3BFA;
readerDef.ProtocolType = PROTOCOL_TYPE_FEATURE_REPORT;

2. Connect and Initialize

// Create instance (retries up to 3 times on connection failure)
auto handle = AbstractReader::CreateReaderInstance(readerDef, 3);
auto* app = AbstractReader::GetInstance(handle);

// Initialize -- connects to the reader and populates metadata
app->Init();

3. Read Metadata

auto metadata = app->GetMetadataStruct();
std::cout << "Part Number: " << metadata.PartNumber << std::endl;
std::cout << "Serial Number: " << metadata.SerialNumber << std::endl;
std::cout << "Firmware: " << metadata.FirmwareVersion << std::endl;
std::cout << "Product: " << metadata.Product << std::endl;

// Force refresh from device (bypasses cache)
auto fresh = app->GetMetadataStruct(true);

4. Use Reader Features

auto* reader = dynamic_cast<Reader*>(app);

// Beep the reader
reader->Beep(2, RikProtocol::BEEP_DURATION_SHORT);

// Beeper volume
RikProtocol::BeepVolume volume;
reader->GetBeeperVolume(volume);
reader->SetBeeperVolume(RikProtocol::BEEP_VOLUME_HIGH);

// Card data
CardData cardData;
reader->GetCardData(cardData);
if (!cardData.IsEmpty()) {
std::cout << "Bits: " << cardData.GetBitCount() << std::endl;
}

5. Clean Up

app->Close();
AbstractReader::DestroyInstance(handle);
tip

In C# and Python, prefer using using / with statements for automatic cleanup instead of calling Dispose() / dispose() manually.

Complete Example

main.cpp
#include <iostream>
#include "Reader/AbstractReader.h"
#include "Reader/Reader.h"

int main() {
using namespace Rik;
using namespace RikCommon;

ReaderHandle handle = nullptr;
try {
ReaderDefinition readerDef{};
readerDef.DeviceId.VendorId = 0x0C27;
readerDef.DeviceId.ProductId = 0x3BFA;
readerDef.ProtocolType = PROTOCOL_TYPE_FEATURE_REPORT;

handle = AbstractReader::CreateReaderInstance(readerDef, 3);
auto* app = AbstractReader::GetInstance(handle);
app->Init();

auto metadata = app->GetMetadataStruct();
std::cout << "Part Number: " << metadata.PartNumber << std::endl;

auto* reader = dynamic_cast<Reader*>(app);
reader->Beep(2, RikProtocol::BEEP_DURATION_SHORT);

app->Close();
AbstractReader::DestroyInstance(handle);
return 0;
} catch (const ReaderException& e) {
std::cerr << "Error: " << e.Message << std::endl;
if (handle) AbstractReader::DestroyInstance(handle);
return 1;
}
}

Next Steps