Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/76: Рейтинг темы: голосов - 76, средняя оценка - 4.67
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841

Считыватель смарт карт ACR122

10.04.2014, 18:52. Показов 15534. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Кто имел дело с подобными считывателями, на диске с проектом есть Delphi проекты, работу которых я так и не смог понять, мне нужно при подносе карты к считывателю получать её 16-ти битный ключ. Кто в курсе как это можно сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2014, 18:52
Ответы с готовыми решениями:

Считыватель контактных смарт-карт на форму в HTML
Нужно внедрить систему считывания смарт карт (удос. личн.) на страницу в HTML Будьте добры, подкиньте несколько вариантов на чем это...

Ищу книги Патрик Гелль секреты программирования смарт карт Мытник Пасечник смарт карты и информационная безопасность
уже весь интернет обыскался не могу найти книги в электронном виде

Считыватель ACR122U не реагирует на смарт карту
Считыватель ACR122U не реагирует на смарт карту... Как определить интерфейс смарт карты? Схожа с той, что на картинке... Видит Mifire, ISO...

62
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
23.04.2014, 19:37  [ТС]
Кто может помочь перевести эти два Delphi проекта в С++ Builder? Один из них умеет по таймеру определять что карта подведена к считывателю, а второй умеет выдёргивать 16-битный ключик уникальный. Просто максимум на что меня хватило это скомпилить проект и проверить, при попытке перевода на с++ builder работать отказалось (в силу моего незнания Delphi).
Вложения
Тип файла: rar Other PICC Programming.rar (45.6 Кб, 73 просмотров)
Тип файла: rar Polling.rar (47.1 Кб, 66 просмотров)
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
23.04.2014, 19:52
DrSMERTb В двух проектах присутствует один и тот же модуль - ACSModule.pas. Его просто подключаешь в проект. При компиляции появится файл ACSModule.hpp, его подключаешь через #include.
Остаются только Polling.pas и OtherPICC.pas.
Их не трудно перевести. Я бы сначала в билдеровский проект скопировал .dfm файл, отвечающий за интерфейс формы. Потом перевёл бы обработчики событий, а потом всё остальное. При переводе, если что-то непонятно, то вбить в гугл и прочитать.
1
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
23.04.2014, 20:54  [ТС]
Цитата Сообщение от kzru_hunter Посмотреть сообщение
В двух проектах присутствует один и тот же модуль - ACSModule.pas. Его просто подключаешь в проект. При компиляции появится файл ACSModule.hpp, его подключаешь через #include.
, сразу после подключения при попытке компиляции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
[bcc32 Error] ACSModule.hpp(122): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(123): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(124): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(125): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(126): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(127): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(128): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(129): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(130): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(131): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(132): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(133): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(134): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(135): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(136): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(137): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(138): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(139): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(140): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(141): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(142): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(143): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(144): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(145): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(146): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(147): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(148): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(149): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(150): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(151): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(152): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(153): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(154): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(155): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
[bcc32 Error] ACSModule.hpp(156): E2293 ) expected
  Full parser context
    Unit1.cpp(6): #include ACSModule.hpp
    ACSModule.hpp(26): namespace Acsmodule
сразу после попытки подключения он в этом hpp файле нашёл 36 ошибок.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
23.04.2014, 21:28
Закомментируй строки, на которых ошибка вылазит.
1
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
24.04.2014, 16:43  [ТС]
kzru_hunter, а с чего проще пересести будет с Delphi или с Visual c++ на с++ builder?
0
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
24.04.2014, 17:02  [ТС]
Вот ещё DLL нашёл на сайте разработчика: как можно узнать список функций этой dll?
Вложения
Тип файла: rar x64.rar (29.9 Кб, 32 просмотров)
0
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
25.04.2014, 07:33  [ТС]
Чот посмотрел демки которые с этой dll лежали ни один не работает... Решил на Builder проверить переконвертил либу через coff2omf.exe, результат и при вызове из своей программы тот же... Может кто с переводом из Delphi в с++ Builder всё таки поможет эти сэмплы хотяб работают)

Добавлено через 12 часов 20 минут
kzru_hunter, говорили поможете) как вот эту строку переделать?
C++
1
tempstr = tempstr + Format("%.02X ",SendBuff[index]);
Добавлено через 10 минут
И вот этот момент в плане сто значит @ перед переменными?
C++
1
2
3
4
5
6
7
retCode = SCardTransmit(hCard,
                           @ioRequest,
                           @SendBuff,
                           SendLen,
                           Nil,
                           @RecvBuff,
                           @RecvLen);
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
25.04.2014, 10:08
Цитата Сообщение от DrSMERTb Посмотреть сообщение
И вот этот момент в плане сто значит @ перед переменными?
Знак @ перед переменной указывает адресс переменной в памяти. Если не ошибаюсь то в С++ Это &.

Вот нашел на просторах интернета. Но там нет адресса ссылка
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
25.04.2014, 10:31
Цитата Сообщение от Xank Посмотреть сообщение
Но там нет адресса ссылка
Почему нет? LP в типе означает long pointer, это указатель
1
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
25.04.2014, 12:24  [ТС]
а всё таки что делает вот эта строка?
Delphi
1
tempstr = tempstr + Format("%.02X ",SendBuff[index]);
и как можно её интерпретировать в с++ builder?
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
25.04.2014, 14:32
SendBuff какой тип?
Скорее всего подойдёт что-то наподобие IntToHex()
1
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
25.04.2014, 14:34
Цитата Сообщение от DrSMERTb Посмотреть сообщение
а всё таки что делает вот эта строка?
Код Delphi
1
tempstr = tempstr + Format("%.02X ",SendBuff[index]);
Форматирует вывод строки из int если не ошибаюсь, в Шестнадцатеричный т.е. Format(' %x', [140]) выдаст 8C.


упс можно удалить. не видел ответ.
1
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
25.04.2014, 14:36  [ТС]
Объявляю:
C++
1
SCARD_IO_REQUEST *ioRequest
При вызове
C++
1
2
3
4
5
6
7
retCode = SCardTransmit(hCard,
                           *ioRequest,
                           SendBuff,
                           SendLen,
                           Null,
                           &RecvBuff,
                           &RecvLen);
Функции
C++
1
int __stdcall SCardTransmit(unsigned hCard, LPCSCARD_IO_REQUEST pioSendPci, System::PByte pbSendBuffer, unsigned cbSendLength, LPCSCARD_IO_REQUEST pioRecvPci, System::PByte pbRecvBuffer, LPDWORD pcbRecvLength);
ругается
C++
1
2
3
[bcc32 Error] Unit1.cpp(84): E2034 Cannot convert 'SCARD_IO_REQUEST' to 'SCARD_IO_REQUEST *'
  Full parser context
    Unit1.cpp(64): parsing: void _fastcall TForm1::SendAPDU(int)
, как тут быть?
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
25.04.2014, 14:42
Цитата Сообщение от DrSMERTb Посмотреть сообщение
retCode = SCardTransmit(hCard, *ioRequest,
Там тоже указатель
C++
1
2
3
SCARD_IO_REQUEST ioRequest;
retCode = SCardTransmit(hCard,
                           &ioRequest,
1
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
25.04.2014, 14:43  [ТС]
mimicria, тогда пишет:
C++
1
2
3
[bcc32 Error] Unit1.cpp(84): E2034 Cannot convert 'Variant()' to 'SCARD_IO_REQUEST *'
  Full parser context
    Unit1.cpp(64): parsing: void _fastcall TForm1::SendAPDU(int)
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
25.04.2014, 14:48
Цитата Сообщение от DrSMERTb Посмотреть сообщение
Cannot convert 'Variant()' to 'SCARD_IO_REQUEST *'
Где-то значит неверное преобразование делаете. Без исходника сложно гадать
1
 Аватар для DrSMERTb
64 / 40 / 10
Регистрация: 12.11.2010
Сообщений: 841
25.04.2014, 14:49  [ТС]
mimicria,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "ACSModule.hpp"
 
 
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sButton"
#pragma resource "*.dfm"
TForm1 *Form1;
 
  SCARDCONTEXT hContext;
  SCARDCONTEXT hCard;
  SCARD_IO_REQUEST ioRequest;
  int retCode;
  int dwActProtocol, BufferLen;
  Byte  SendBuff[262], RecvBuff[262];
  int SendLen, RecvLen, nBytesRet;
  char Buffer;
  bool validATS;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
 {
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::DisplayOut(String output,int mode)
{
 
  if (mode==1) rbOutput->SelAttributes->Color = clBlue;
  if (mode==2) rbOutput->SelAttributes->Color = clRed;
  if (mode==3)
        {
        rbOutput->SelAttributes->Color = clBlack;
        output = "<< " + output;
        }
  if (mode==4)
        {
        rbOutput->SelAttributes->Color = clBlack;
        output = ">> " + output;
        }
 
 
  rbOutput->Lines->Add(output);
  rbOutput->SelAttributes->Color = clBlack;
  rbOutput->SetFocus();
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClearBuffers()
{
 
  for (int index=0;index<252;index++)
    {
      SendBuff[index] = 0x00;
      RecvBuff[index] = 0x00;
    }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SendAPDU(int mode)
{
int index;
String tempstr;
  ioRequest.dwProtocol = dwActProtocol;
  ioRequest.cbPciLength = sizeof(SCARD_IO_REQUEST);
 
  tempstr = "";
  for (index = 0; index<SendLen - 1; index++)
    {
    String f="%.02X ";
    tempstr = tempstr + SendBuff[index];
    }
  DisplayOut(tempstr,3);
 
  retCode = SCardTransmit(hCard,
                           &ioRequest,
                           SendBuff,
                           SendLen,
                           Null,
                           RecvBuff,
                           &RecvLen);
  if (retCode != SCARD_S_SUCCESS) {
    DisplayOut(GetScardErrMsg(retCode),2);
    SendAPDU(retCode);
 
  }
 
  tempstr = "";......
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
25.04.2014, 15:05
C++
1
2
3
int retCode;
// попробуй заменить
long retCode;
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
25.04.2014, 15:05
C++
1
2
  for (index = 0; index<SendLen - 1; index++)
     tempstr = tempstr + IntToHex(SendBuff[index],2);
Навскидку массивы SendBuff[262], RecvBuff[262] размер не совпадает с очищением for (int index=0;index<252;index++)

А ошибка может быть связана с кривыми типами, например:
первый параметр hCard должен быть типа SCARDHANDLE согласно описания
Получается он после вызова вот этого.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2014, 15:05
Помогаю со студенческими работами здесь

Считыватель магнитных карт для УТ 10.3
Добрый день. Конфигурация Управление торговлей 10.3. Подскажите пожалуйста, какой считыватель магнитных карт купить для подключения к...

Считыватель карт добавляет лишний символ
Добрый день. Возможно кто то встречался с подобной проблемой: Считыватель карт на POS терминале OTEK M667 добавляет следующий символ перед...

Arduino Nano v3 и заводской считыватель карт (Mifare, HID и тд)
Доброго времени суток ребята, Хочу спросить кто нибудь пробовал подключать заводской считыватель карт к Ардуино вместо готовых модулей...

Считыватель Matrix-II для бесконтактных карт PROXIMITY + AVR
Добрый день. Подскажите как получить считанную инфу на мегу16. На считыватели 3 клемы +12 GND DATA0.

Используя Arduino контролер и магнитный сканер, собрать считыватель карт
Задача: Используя Arduino контролер и магнитный сканер, собрать считыватель карт, и написать для него программу с БД хранящей информацию о...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru