Мазмуну:

RC522 жана PN532 RFID негиздери: 10 кадам
RC522 жана PN532 RFID негиздери: 10 кадам

Video: RC522 жана PN532 RFID негиздери: 10 кадам

Video: RC522 жана PN532 RFID негиздери: 10 кадам
Video: Code Typhon Studio / Обзор / Преимущества, особенности / Установка, удаление / Object Pascal IDE 2024, Ноябрь
Anonim
RC522 жана PN532 RFID негиздери
RC522 жана PN532 RFID негиздери

ЭСКЕРТҮҮ: Менде азыр RC522 жана PN532 үчүн Arduino кодун сунуштаган Instructables бар.

Бир нече убакыт мурун мен эксперимент үчүн үч башка RFID модулун сатып алдым. Мурунку долбоордо мен негизги коопсуздук функциясын аткаруу үчүн 125 кГц жөнөкөй модулду кантип колдонуу керектигин айтып бергем. Мындай модулдар окуу үчүн гана тэгдерди колдонот, андыктан процесс идентификаторду издейт, кааласа дүкөнгө сактайт жана сакталган идентификаторлор менен салыштырат. Мен сатып алган башка модулдар 13.56-МГцте иштейт жана окууга да, жазууга да мүмкүн болгон тегдерди колдонот, андыктан аларды негизги коопсуздук үчүн колдонуу-бул текке кетүү. Эки жалпы модулда RC522 чипи же PN532 чипи колдонулат - экөө тең NXP тарабынан жасалган.

Эгерде сиз менин башка долбоорлорумдун бирөөсүн окуган болсоңуз, анда мен арзан PIC микроконтроллерлерин жана программасын ассамблея тилинде колдонгонду жакшы көрөм. Ошентип, мен издеген нерсе модулдар жана RFID тегдери менен сүйлөшүү үчүн зарыл болгон кадамдардын ырааттуулугу болду. Модулдар үчүн интернетте көптөгөн программалар бар болсо да, алардын көпчүлүгү Arduino үчүн 'C' программасында жазылган жана SPI интерфейсин колдонушат. Ошондой эле, чиптер жана Mifare тегдери үчүн колдонмолор бир аз чечмеленет. Бул билдирүү, биринчи кезекте, мен долбоорду баштаганда мен каалаган маалыматты камтыйт. Мен ошондой эле ар бир модулда талап кылынган негизги буйруктарды аткаруу үчүн PIC чогултуу программалык программаларын камтыйт. Сиз PIC жана/же ассамблея тилин колдонбосоңуз да, баштапкы код жок дегенде сизге ар бир кадамды аткаруу үчүн керектүү конкреттүү буйруктар жөнүндө жакшы түшүнүк бериши керек.

1 -кадам: Сериялык интерфейстер

Сериялык интерфейстер
Сериялык интерфейстер
Сериялык интерфейстер
Сериялык интерфейстер
Сериялык интерфейстер
Сериялык интерфейстер
Сериялык интерфейстер
Сериялык интерфейстер

Бул модулдарда колдонулган чиптердин экөө тең SPI, I2C же UART (HSSP) аркылуу байланышууга жөндөмдүү. PN532 модулу каалаган интерфейсти тандоо үчүн колдонулган DIP которгучуна ээ, бирок MFRC522 модулу SPI интерфейси үчүн каттуу. Мен PICтин камтылган UART'ин колдонууну туура көрөм, ошондуктан MFRC522 модулун UART режимине алуунун жолу барбы же жокпу үчүн интернеттен издедим. Мен тапканым, тактадагы бир изди кесүү бул трюкту кылмак. Кесүү чиптин EA пининен 3.3 вольтту эффективдүү түрдө жок кылат. Техникалык жактан EA пини жерге туташтырылышы керек, бирок чип пин тыгыздыгын эске алганда, көп адамдар бул ширетүү эрдигин тарта алышпайт. Эч кабатыр болбоңуз, анткени EA пиндин ички тартылуусу жок жана эски TTL логикалык кириштерине окшоп "сүзбөйт". Кесүү үчүн чип диаграммасына жана такта бөлүмүнүн сүрөтүнө кайрылыңыз. Кыска изиңизди EA пинине түз эле кесип жатканыңызды текшериңиз.

2 -кадам: Аппараттык

Аппараттык
Аппараттык

UART байланыштары үчүн аппараттык туташуулар жогорудагы диаграммада көрсөтүлгөн. MFRC522 үчүн UART туташуулары тактада белгиленген эмес, бирок схемада көрсөтүлгөндөй, SDA пини UART маалыматын алат жана MISO пини UART маалыматын өткөрөт. PN532 модулу тактанын ылдый жагында UART белгилерине ээ.

Эки модуль тең 3.3 вольтто иштейт жана PIC TX пининен 5 вольттуу логикалык деңгээл да чектелиши керек. ЖК туташуусу-бул менин мурунку долбоорлорумдун бир катарында колдонулган 4-биттик стандарттык орнотуу. Билдирүүлөрдүн баардыгы үчүн демейки формат 1602 ЖК стандартына орнотулган (2 саптан 16 белги). Менде дагы 2 саптуу ЖКнын 40 белгиси бар, мен мүчүлүштүктөрдү оңдоо учурунда чийки маалымат таштандылары үчүн колдоном, андыктан программалык камсыздоого кошумча дисплей мейкиндигин колдонууга мүмкүнчүлүк берген аныктаманы киргиздим.

3 -кадам: Маалымат блоктору

Бул долбоор үчүн колдонулган Mifare Classic 1k тегдери 16 сектор катары конфигурацияланган, бир секторго төрт маалымат блогу, бир маалымат блогуна 16 байт. 64 маалымат блокторунун ичинен 47си гана колдонууга жарактуу. 0 маалымат блогу өндүрүүчүнүн маалыматын камтыйт жана 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 жана 63 блоктору Трейлер блоктору деп аталат. Трейлер блоктору ар бир сектордун акыркысы жана аларда эки ачкыч жана блокко кирүү биттери бар. Баскычтар жана блокко кирүү биттери ошол сектордогу маалымат блокторуна гана колдонулат, андыктан ар бир сектор үчүн башка ачкычтар жана кирүү эрежелери болушу мүмкүн. Демейки баскычтар "FF FF FF FF FFh" деп коюлган. Бул негизги долбоор үчүн мен бир гана маалымат блогун колдоном жана демейки ачкычтарды жана жетүү биттерин сактайм. Бул карттарга байланыштуу көптөгөн документтер бар, андыктан аларды тереңирээк изилдөөнү кааласаңыз, онлайнда "Mifare" издеңиз же NXP веб -сайтына баш багыңыз.

4 -кадам: Жалпы операция

Эки модуль тең жеткиликтүүлүгү жана тегдерге кирүү жолу менен уникалдуу болгону менен, ишти бүтүрүү үчүн талап кылынган жалпы процесс бар. Бул долбоор үчүн биз тегдер Mifare Classic 1k түрү деп ойлойбуз жана антенна талаасында бир эле убакта бир тегге уруксат берип жатабыз. Негизги кадамдар төмөндө аныкталган.

· Модулду баштоо: Жалпысынан бул үчүн чипке регистрлерге маанилерди жазуу, "ойготуу" буйруктарын жөнөтүү жана антеннаны күйгүзүү сыяктуу нерселер талап кылынат. Батарея менен иштөөчү тиркемеде сиз батарейканы үнөмдөө үчүн антеннаны күйгүзүп жана өчүргүңүз келет, бирок бул жөнөкөй колдонмо үчүн биз аны бир жолу күйгүзүп, анан күйгүзүп коёбуз.

· Крипто желегин тазалаңыз (522 гана): Теги тастыкталганда, колдонуучуга теги менен болгон байланыштар шифрленээрин билдирүү үчүн желек орнотулат. Бул желек кийинки сканерлөөнүн алдында колдонуучу тарабынан тазаланышы керек, сканерленген тег ошол эле болсо да.

· Тег издөө жана тег "Мен бул жердемин" деп жооп берет. Эгерде модуль тез жооп албаса, ал угууну токтотот. Бул биз теги табылганга чейин сканерлөө буйруктарын модулга кайра -кайра жөнөтүшүбүз керек дегенди билдирет.

· Колдонуучунун идентификациялык номерин (UID) алыңыз: тег сканерлөө сурамына чектелген маалымат менен жооп берет, мисалы, тегдин түрү. Бул анын UIDин алуу үчүн башка буйрукту жөнөтүшүбүз керектигин билдирет. UID Mifare Classic 1k тегдери үчүн төрт байт. Эгерде башка тегдер үчүн узагыраак болушу мүмкүн, бирок бул долбоор аларга жооп бербейт.

· Теги тандоо (522 гана): UID колдонуучу окуу жана жазуу үчүн аныктыгын текшерүүнү каалаган тегди тандоо үчүн колдонулат. Бул антенна талаасында бирден ашык теги болушу мүмкүндүгүнө негизделген. Бул биздин жөнөкөй колдонмо үчүн андай эмес, бирок биз баары бир тегди тандашыбыз керек.

· Тегдин аныктыгын текшерүү: Бул этикетти окууну же жазууну кааласак, бул кадам талап кылынат. Эгерде биз каалаган нерселердин баары жөнөкөй коопсуздук тиркемесинин тегдерин айырмалоо болсо, анда UID жетиштүү. Аныктыгын текшерүү UIDди билүүнү жана биз киргибиз келген теги маалымат секторунун крипто ачкычын билүүнү талап кылат. Бул долбоор үчүн биз демейки ачкычтарды карманып турабыз, бирок менин кийинки проектим баскычтарды электрондук капчык катары колдонулушу үчүн өзгөртөт.

· Тегди окуу же жазуу: Окуулар ар дайым суралган маалыматтар блогунун бардык 16 байтын кайтарат. Жазуулар бардык 16 байттын бир убакта жазылышын талап кылат. Эгерде сиз ошол эле маалымат секторунда башка блокту окууну же жазууну кааласаңыз, тегдин дагы бир жолу тастыкталышынын кереги жок. Эгерде сиз башка маалымат секторундагы блокту окууну же жазууну кааласаңыз, анда бул сектордун ачкычын колдонуу менен тегди дагы бир жолу тастыктоо керек.

5 -кадам: MFRC522 модулуна кирүү ырааттуулугу

Баштоо тартиби мен караган тиркемелердин көбүндө табылган бул негизги кадамдарды камтыйт:

· Маалыматтын байтын жөнөтүү (кийинки абзацты караңыз)

· Жумшак абалга келтирүү

· RF алуучунун пайдасын коюңуз (эгер демейкиден башка нерсе керек болсо)

· ASK модуляция пайызын 100% га коюңуз

· CRC эсептөөлөрү үчүн уруктун маанисин коюңуз

· Антеннаны күйгүзүңүз

· Программалык камсыздоонун версиясын алуу (талап кылынбайт)

Түшүнүксүз себептерден улам менин модулум иштейт жана маалыматтын байтысыз жазуу буйругун алды деп ойлойт. Билбейм, бул менин модулумдагы көйгөйбү, бирок мен башка жерде ага шилтеме көргөн жокмун. Мен аппараттык жана программалык камсыздоону баштапкы абалга келтирүү менен эксперимент жүргүздүм жана көйгөйдү чечкен жокмун. Менин чечимим, модулду баштоо тартибинин башталышында "0" (белгисиз) катталуу үчүн жасалма окуу чалуусун кошуу болчу. Эгерде модуль муну белгисиз жазуу буйругу үчүн маалымат катары көрсө, анда эч кандай терс таасирлери көрүнбөйт. Эгерде ал муну окуу буйругу катары караса, анда пайдалуу эч нерсе болбойт. Мен маселени толук аныктай албаганым мени тынчсыздандырат, айрыкча модулдун аппараттык абалга келтирилиши көйгөйдү чечпейт.

RC522 чипи бир катар реестрлерден турат, алардын көбү окуу жана жазуу болуп саналат. Жазууну аткаруу үчүн, регистрдин номери модулга жөнөтүлөт, андан кийин жазылуучу мааниге ээ болот. Окууну аткаруу үчүн, регистр номерине 0x80 кошулган жана ал модулга жөнөтүлөт. Жазуу буйругуна жооп - бул кирген реестрдин жаңырыгы. Окуу буйругуна жооп реестрдин мазмуну. Программалык камсыздоо ошол билимдин жардамы менен буйруктун туура аткарылганын текшерет.

6 -кадам: PN532 модулуна кирүү ырааттуулугу

Баштоо тартиби бул керектүү кадамдарды камтыйт:

· Инициализация сабын жөнөтүү: Бул UART интерфейсине мүнөздүү. Колдонмодо UART интерфейси интерфейсте аныкталган бешинчи четте ойгонот деп айтылат. Бул 0x55, 0x55, 0x00, 0x00, 0x00, 0x00 жөнөтүүнү сунуштайт. Көпчүлүк учурда, четтери көтөрүлгөн белгилердин жетиштүү саны болушу керек жана алар буйруктун кириш сөзүнө окшош болбошу керек (00 00 FF).

· Модулду ойготуу: Колдонуучунун колдонмосунда көмүлгөн, бул модуль "LowVbat" деп аталган уйку абалына өткөнүн көрсөтөт. Бул абалдан чыгуу үчүн биз "SAMConfiguration" буйругун жөнөтүшүбүз керек.

PN532 буйруктардын преамбуланы, билдирүүнү жана постамблды камтыган аныкталган билдирүү форматында жөнөтүлүшүн күтөт. Жооп билдирүүлөрү ошол эле форматта. Буйрук жана жооп билдирүүлөрүнө TFI (Frame Identifier) жана командалык версия кирет. Буйрук 0xD4 TFI колдонот жана жооп 0xD5 колдонот. Буйруктун версиялары ар кандай, бирок жооп ар дайым команданын версиясын көбөйтөт жана TFIден кийинки байтка кайтарат. Бул ырааттуулук жооп билдирүүлөрүн тиешелүү маалыматты оңой сканерлөөгө мүмкүндүк берет.

Ар бир буйрук билдирүүсү (преамбуланын артынан) билдирүүнүн узундугунан, 2нин билдирүүнүн узундугунан, TFIден, буйруктан, маалыматтан, контролдук суммадан жана постамблдан турат. Программа жеке буйруктарды куруп, андан кийин текшерүү суммасын эсептеп, постамблды кошкон күн тартибин чакырат.

Жооп үчүн билдирүүнүн форматы буйрукка окшош. Типтүү жоопко ACK (00 00 FF 00 FF 00) кирет, андан кийин буйрукка конкреттүү жооп берилет. Ар бир буйруктун жообу 00 00 FF кириш сөзү менен башталат. Жоопто TFI байт D5 болушу керек, андан кийин команданын номери 1 менен көбөйтүлүшү керек. Биздин "SAMConfiguration" буйругу үчүн (14) 15 болмок. "SAMConfiguration" командасы бул жоопту алат: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Жөнөтүлө турган башка модулга тиешелүү буйруктар бар, бирок алар бул колдонмо үчүн керек эмес. Мен, бирок, камтылган программанын версиясынын номерин алуу үчүн чакырыла турган күн тартибин киргиздим. Типтүү жооп (АККдан жана преамбуладан кийин) мындай болмок: 06 FA D5 03 32 01 06 07 E8 00. "01 06 07" программалык камсыздоонун 1.6.7 версиясын көрсөтөт.

7 -кадам: Тегдердин кирүү ырааттуулугу

Модуль даяр болгондон кийин, биз тегдерге тиешелүү буйруктарды жөнөтө алабыз. Тег маалыматын окуу же жазуу үчүн анын идентификациялык номери (UID) болушу керек. UID жана ачкыч белгилүү бир маалымат маалымат секторуна окууга/жазууга уруксат берүү үчүн колдонулат. Тег маалыматтарынын окулушу/жазылышы ар дайым көрсөтүлгөн маалымат блогунун бардык 16 байтында жүргүзүлөт. Бул кадимки тиркеме маалымат блогун окуп, маалыматтарды каалагандай өзгөртүп, анан жаңы маалыматты кайра тегге жазат дегенди билдирет.

8 -кадам: Программалык камсыздоо

Үзгүлтүк иштетүүчү программасы PIC UART бир байт маалыматты алган сайын чакырылат. Менин мурунку UART долбоорлорумдун кээ биринде мен үзгүлтүккө учурагычты колдонуунун ордуна RX үзгүлтүк желегин сурамжылай алдым. Бул программалык камсыздоо үчүн андай эмес, айрыкча PN532 RC522ге караганда бир кыйла жогору ылдамдыкта байланышат. UC интерфейси RC522 9600 бод менен чектелген, ал эми PN532 үчүн демейки 115k жана аны 1.288M бады катары коюуга болот. Алынган байттар буфердик аймакта сакталат жана программалык камсыздоонун негизги бөлүгү аларды керектүү учурда алат.

New_Msg желеги байттардын алынгандыгын жана Byte_Count канча экенин көрсөтөт. Мен программалык камсыздоого мүчүлүштүктөрдү оңдоо учурунда алуу буферинин мазмунун көрсөтүү үчүн чакырыла турган "Disp_Buff" тартибин киргиздим. Кайтып келген билдирүүлөрдүн айрымдары кадимки 1602 дисплейден ашып кетет, бирок менде интернеттин ашыкча электроника сайтынан тапкан 2 саптуу ЖКнын 40 белгиси бар. "Max_Line" аныктамасы сиздин LCD өлчөмүңүз үчүн коюлушу мүмкүн. Эгерде "Max_Line" жетсе, "Disp_Buff" тартиби экинчи сапка жазуу менен уланат. Эгерде сизде 4 саптуу ЖК болсо, үч жана төртүнчү сызыктарга өтүү үчүн ошол тартипке бир аз код кошсоңуз болот. PN532 үчүн, желек бар, аны бардык алынган байттарды таштап кетет же жөн эле окуу маалыматынан 16 маалыматтын байттарын төгөт.

Кабыл алуу буферин же Byte_Countту тазалоонун кажети жок, анткени New_Msg желегин тазалоо Byte_Countтун үзгүлтүккө учуроочу тарабынан тазаланышына алып келет жана бул буфердеги индекс катары колдонулат. New_Msg, адатта, ар бир буйрук кадамынын алдында тазаланат, ошондо бул буйрукка тиешелүү натыйжалар оңой эле жайгашып, текшерилет. RC522де бул буфердин адатта 1ден 4 байтка чейин бар экенин билдирет. Кээ бир учурларда, мисалы, маалымат блогу окулат, байттарды FIFOдон кабыл алуу буферине жылдыруу үчүн Read_FIFO буйругу бир нече жолу берилиши керек. PN532 үчүн бардык командалык жыйынтыктар кабыл алуу буферине түшөт, андыктан керектүү конкреттүү байттарды табуу үчүн сканерлөө процедурасы жүргүзүлөт.

Программалык камсыздоонун негизги цикли тегди издейт, андан кийин тегди окуу/жазуу үчүн тастыктайт. Бул жерде камтылган тестирлөө программасы үчүн Junk_Num өзгөрмөсү негизги цикл аркылуу ар дайым өзгөртүлүп турат жана тегге жазуу учурунда колдонулат. Жазылган маанилер Junk_Num мааниси менен Junk_Num 1дин толуктоосунун ортосунда кезектешип турат. Акыр -аягы, 16 жазылган баалуулуктар окулат жана көрсөтүлөт. Ар бир билдирүүнү окууга убакыт берүү үчүн ар бир кадам үчүн дисплей билдирүүлөрү бар. Ката билдирүүлөрү да берилет, бирок, адатта, теги операция учурунда алынып салынганда гана пайда болушу керек.

Программалык камсыздоону инициализациялоонун бир бөлүгү - бул коддун бөлүмү, ал күйгүзүлгөндө гана аткарылат жана программалык камсыздоону баштапкы абалга келтирүү аныкталса, өткөрүп жиберилет. Ката билдирүүлөрү негизинен негизги циклден чыгуу жолу катары программалык камсыздоону баштапкы абалга келтирүү менен аяктайт. Баштапкы абалга келтирүү "Tilt" тартибинде болот, ал жөн гана Watchdog Timer'ди иштетет, андан кийин чексиз циклге кирип, күтүү убактысын күтөт.

9 -кадам: MFRC522 уникалдуу программалык камсыздоо

RC522 чипи тегдер менен байланышты ишке ашыруу үчүн PN532 чипине караганда төмөнкү деңгээлдеги көрсөтмөлөрдү талап кылат. Бул ассемблер тилиндеги программалоого окшош, "С" программасына окшош. Дагы бир маанилүү айырмачылык, RC522 теги менен болгон байланыш FIFO буферинен өтүүсүн талап кылат. "Write_FIFO" жана "Read_FIFO" көнүмүштөрү бул милдеттерди чечет. MFRC522 программалык камсыздоосу негизги функциялар курулган төмөнкү деңгээлдеги көптөгөн командалардын бөлүмүн камтыйт.

RC522 үчүн теги буйруктун суммасын эсептөө PN532ге караганда такыр башкача. FIFOдо тег буйругу курулгандан кийин, контролдук сумманы эсептөө үчүн модулдун буйругу жөнөтүлөт. 16-бит натыйжасы автоматтык түрдө тег буйругуна кошулбайт, бирок эки 8-биттик регистрден окуу үчүн жеткиликтүү. Сумманы эсептөө FIFOдогу маалыматтарды жок кылат, андыктан керектүү ырааттуулук төмөнкүдөй:

· FIFOдо буйрукту түзүңүз

· Чек суммасын эсептөөнү буйрук кылыңыз

· Кайрадан FIFOдо буйрукту түзүңүз

· CRC регистрлерин окуңуз жана FIFOго текшерүү суммасынын байттарын жазыңыз

· Transceive же Authenticate буйругун жөнөтүңүз

Transceive буйругу FIFO буферин өткөрүп, андан кийин автоматтык түрдө кабыл алуу режимине өтөт жана теги боюнча жоопту күтөт. Transceive буйругу BitFramingRegisterдеги StartSend битин жөндөө менен берилиши керек, чынында маалыматтарды берүү үчүн. Аутентификация буйругу андай талапка ээ эмес.

Жалпысынан алганда, Интернетте жеткиликтүү болгон Arduino "C" кодунун колдонмолору туура жооптун өз убагында кабыл алынышын камсыз кылуу үчүн үзгүлтүккө учуроочу желектин регистрлерин жана күтүү убактысынын регистрин колдонушат. Менин оюмча, бул убакыттын өтпөй турган критикалык тиркемеси үчүн ашыкча нерсе. Анын ордуна, мен жоопту күтүп, анан анын туура экенин текшерүү үчүн программалык камсыздоонун кыска мөөнөтүн колдоном. Mifare тегдери үчүн колдонмо ар кандай транзакциялардын убактысын деталдаштырат жана күтүлгөн сандагы байттарды алууга убакыт да уруксат берилген. Бул убакыт кечигүүлөрү төмөнкү деңгээлдеги командалык программалардын көбүнө курулган.

10 -кадам: PN532 уникалдуу программалык камсыздоо

Модуль инициализациялангандан кийин, тегди табуу жана аныктыгын текшерүү үчүн керектүү кадамдар тийиштүү буйрукту жазуу жана керектүү маалыматтарды аткаруу менен ишке ашат. Скандоо буйругу UIDди кайтарат, ал аутентификация үчүн колдонулат. Андан кийин, тегдин окулушу жана жазылышы даректелген маалымат блогу үчүн 16 байтты жөнөтөт же кайтарат.

Инициализация ырааттуулугу мурда деталдаштырылган жана ошол эле программалык программа SAMConfiguration буйругун жөнөтүп, модулду "LowVbat" абалынан чыгарат. Калган негизги буйруктар, мисалы, Скандоо, Аныктоо, Окуу/Жазуу, жөн гана тиешелүү тартипте курулган. Текшерүү суммасы командалык байттарды кошуу, толуктоо жана 1ди кошуу менен 2дин толуктоосу менен эсептелет. 8-бит жыйынтыгы постамблдун алдында буйрук сабына кошулат.

RC522 сыяктуу FIFO жок, ошондуктан толук жооп билдирүүлөрү автоматтык түрдө кабыл алынат. "Find_Response" процедурасы TFI (0xD5) үчүн алынган маалымат буферин сканерлейт. Күнүмдүк күтүлгөн билдирүүлөр кандай болорун билүүдөн пайдаланып, маалыматтарды камтыбаган жөнөкөй ACK жоопторун этибарга албайт. TFI табылгандан кийин, керектүү жооптор анын белгилүү ордун ээлейт. Эхо жана команданын статусунун байттары кийинчерээк текшерүү үчүн "Read_Buff" тартиби менен сакталат.

Бул бул пост үчүн. Менин башка электроника долбоорлорумду текшериңиз: www.boomerrules.wordpress.com

Сунушталууда: