Sayt bo'limlari
Muharrir tanlovi:
- Shaxsiy ma'lumotlarni qayta ishlash tamoyillari, shartlari va maqsadlari Korxonada shaxsiy ma'lumotlarni qayta ishlash maqsadlari
- Qozog'istonda onlayn kreditlar - eng yaxshi takliflar
- Mantiq algebra funksiyalarining superpozitsiyasi Monotonik mantiqiy funksiyalar
- Axborot tizimi nima?
- Mantiqiy ifodadan mantiqiy sxemaga o'tish va aksincha
- Nijniy Novgorod rus pochtasining sharmandaligi
- Geografik axborot tizimlarini ishlab chiqish GISning asosiy vazifalari
- Vektor va rastr grafika
- "To'g'ridan-to'g'ri elektr toki" taqdimoti "O'tkazgichlarning ketma-ket va parallel ulanishi" mavzusidagi fizika darsi uchun taqdimot (8-sinf)
- Birlamchi kalitlarni kasr sonli ma'lumotlar turlarini yaratish
Reklama
Quruvchi bilan mahalliy tarmoq uchun Sniffer. Windows uchun oddiy sniffer yozish |
Ushbu maqolada biz Windows OS uchun oddiy sniffer yaratishni ko'rib chiqamiz. KirishMaqsad: IP protokoli orqali uzatiladigan tarmoq trafigini (Ethernet, WiFi) ushlaydigan dasturni yozing. Umid qilamanki, sizga qiziqarli bo'ladi. Nazariya (o'qish shart emas, lekin tavsiya etiladi)Hozirgi vaqtda zamonaviylarning aksariyati axborot tarmoqlari TCP/IP protokoli stekining asosiga asoslanadi. TCP/IP protokoli stegi (Transmission Control Protocol/Internet Protocol) tarmoqlarda ishlatiladigan turli darajadagi tarmoq protokollarining umumiy nomidir. Ushbu maqolada bizni asosan IP protokoli - marshrutlanganligi qiziqtiradi tarmoq protokoli, bir tarmoq tugunidan ikkinchisiga paketlar deb ataladigan ma'lumotlarni kafolatsiz etkazib berish uchun ishlatiladi (to'g'riroq atama - datagram). Amaliyot (mohiyatli suhbat)Ayni paytda juda ko'p narsa yaratilgan dasturiy ta'minot trafikni tinglash uchun. Ulardan eng mashhuri: Wireshark. Tabiiyki, maqsad uning yutuqlarini yig'ish emas - biz tarmoq interfeysini shunchaki "tinglash" orqali trafikni ushlab turish vazifasi bilan qiziqamiz. Shuni tushunish kerakki, biz xakerlik qilmoqchi emasmiz begona tirbandlik. Biz shunchaki xostimiz orqali o'tadigan trafikni ko'rishimiz va tahlil qilishimiz kerak. Bu nima uchun kerak bo'lishi mumkin:
libpcap/WinPcap kutubxonasiga asoslangan Wiresharkdan farqli o'laroq, bizning analizatorimiz ushbu drayverdan foydalanmaydi. Bundan tashqari, bizda hech qanday haydovchi bo'lmaydi va biz o'z NDISni yozmaymiz (oh dahshat!). Bu haqda ushbu mavzuda o'qishingiz mumkin. U shunchaki foydalanib, passiv kuzatuvchi bo'ladi faqat WinSock kutubxonasi. Bunday holda haydovchidan foydalanish ortiqcha. Qanaqasiga? Juda oddiy. Windows 2000 (NT 5.0) dan boshlab, tarmoq segmentini tinglash uchun dastur yaratish juda oson bo'ldi, chunki uni tarmoq drayveri rozetkani barcha paketlarni qabul qilish rejimiga o'tkazish imkonini beradi. Promiscuous rejimini yoqishuzun bayroq = 1; SOCKET rozetkasi; #define SIO_RCVALL 0x98000001 ioctlsocket(soket, SIO_RCVALL, &RS_Flag);Bizning dasturimiz IP-paketlarda ishlaydi va Windows Sockets kutubxonasining 2.2 versiyasi va xom rozetkalardan foydalanadi. IP-paketga to'g'ridan-to'g'ri kirish uchun rozetkani quyidagicha yaratish kerak: Xom rozetkani yaratishs = rozetka (AF_INET, SOCK_RAW, IPPROTO_IP);Bu erda doimiy o'rniga SOCK_STREAM(TCP protokoli) yoki SOCK_DGRAM(UDP protokoli), biz qiymatdan foydalanamiz SOCK_RAW. Umuman olganda, xom rozetkalar bilan ishlash nafaqat trafikni ushlab turish nuqtai nazaridan qiziq. Aslida, biz paketning shakllanishi ustidan to'liq nazoratni qo'lga kiritamiz. To'g'rirog'i, biz uni qo'lda shakllantiramiz, bu, masalan, ma'lum bir ICMP paketini yuborish imkonini beradi... Davom etishga ruxsat. Ma'lumki, IP-paket sarlavha, xizmat ma'lumoti va aslida ma'lumotlardan iborat. Bilimingizni yangilash uchun bu yerga qarashingizni maslahat beraman. Keling, IP sarlavhasini tuzilma shaklida tasvirlaymiz (RSDN-dagi ajoyib maqola tufayli): IP-paket strukturasi tavsifitypedef struct _IPHeader ( unsigned char ver_len; // sarlavha versiyasi va uzunligi unsigned char tos; // xizmat turi imzolanmagan qisqa uzunlik; // butun paketning uzunligi imzosiz qisqa identifikator; // Id unsigned short flgs_offset; // bayroqlar va ofset imzolanmagan char ttl ; // umr bo'yi imzolanmagan char protokoli; // protokol imzolanmagan qisqa xsum; // nazorat summasi imzolanmagan long src; // jo'natuvchining IP manzili imzolanmagan long dest; // maqsad IP manzili imzosiz qisqa *paramlar; // parametrlar (320 tagacha) bit) unsigned char *ma'lumotlar; // ma'lumotlar (65535 oktetgacha) )IPHeader;Tinglash algoritmining asosiy funktsiyasi quyidagicha ko'rinadi: Yagona paketni yozib olish funktsiyasiIPHeader* RS_Sniff() ( IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) ( hdr = (LPIPHeader) )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(hisoblash, hdr); qaytaring hdr; ) aks holda 0; )Bu erda hamma narsa oddiy: biz standart rozetka funktsiyasidan foydalangan holda ma'lumotni olamiz recv, va keyin ularni kabi tuzilishga nusxalash IPHeader. Keling, tarmoq interfeysimizga kiradigan barcha paketlarni tortib olaylikwhile (to'g'ri) (IPHeader* hdr = RS_Sniff(); // agar (hdr) IP paketiga ishlov berish ( // konsolda sarlavhani chop etish ) )Biroz mavzudan tashqariBu erda va quyida muallif ba'zi muhim funktsiyalar va o'zgaruvchilar uchun RS_ (Raw Sockets-dan) prefiksini yaratdi. Men loyihani 3-4 yil oldin qildim va menda xom rozetkalar bilan ishlash uchun to'liq huquqli kutubxona yozish g'oyasi bor edi. Ko'pincha bo'lganidek, (muallif uchun) muhim natijalarga erishgandan so'ng, ishtiyoq susaydi va masala mashg'ulot misolidan uzoqqa bormadi. Asosan, siz oldinga borishingiz va yuqorida joylashgan barcha keyingi protokollarning sarlavhalarini tavsiflashingiz mumkin. Buning uchun maydonni tahlil qilish kerak protokol tuzilishida IPHeader. Misol kodiga qarang (ha, kalit bo'lishi kerak, jin ursin!), bu erda sarlavha paket IP-da qaysi protokolni qamrab olganiga qarab ranglanadi: /* * Paketni rang bilan ajratib ko'rsatish */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // paket bo'sh bo'lmasa, boshqa SetConsoleTextColor(0x07) ; // bo'sh to'plam agar (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // "dr else=" uchun to'plamni qaytaring (agar = mahalliy" h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "mahalliy" qabul paketi ) agar (h->protocol == PROT_ICMP || h-T=Protocolor) (0x70) ; // ICMP paketi ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // IP-in-paket, L2TP ) boshqacha if(h) - >protocol == 53 || h->protocol == 56) ( SetConsoleTextColor(0x4C); // TLS, shifrlangan IP ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A); ) ) Biroq, bu ushbu maqola doirasidan sezilarli darajada tashqarida. Bizning o'quv misolimiz uchun, qaysi va qaysi trafik kelayotgan xostlarning IP manzillarini ko'rib chiqish va uning vaqt birligi uchun miqdorini hisoblash kifoya qiladi (tugallangan dastur maqolaning oxirida arxivda joylashgan) . IP sarlavhasi ma'lumotlarini ko'rsatish uchun siz datagram sarlavhasini (ma'lumotni emas) satrga aylantirish funktsiyasini amalga oshirishingiz kerak. Amalga oshirish misoli sifatida biz quyidagi variantni taklif qilishimiz mumkin: IP sarlavhasini satrga aylantirishinline char* iph2str(IPHeader *iph) (const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=% d hlen=%d tos=%d len=%d id=%d bayroq=0x%X ofset=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s”, BYTE_H (iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->uzunlik), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET (ntohs(iph->flgs_offset)), iph->ttl, iph->protokol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest)); qaytish r; )Yuqorida keltirilgan asosiy ma'lumotlarga asoslanib, biz IP-trafikni mahalliy tinglashni amalga oshiradigan ushbu kichik dasturni (o'rqinchli nom ss, oddiy sniffer uchun qisqa) olamiz. Uning interfeysi quyidagi rasmda ko'rsatilgan. Men manba va ikkilik kodni bir necha yil oldin bo'lgani kabi taqdim etaman. Endi men unga qarashdan qo'rqaman va shunga qaramay, u juda o'qilishi mumkin (albatta, o'zingizga bu qadar ishonib bo'lmaydi). Hatto Visual Studio Express 2005 kompilyatsiya qilish uchun etarli bo'ladi. Biz nima bilan yakunladik:
E'tiboringiz uchun rahmat, sizni va barchangizni Rojdestvo bayrami bilan tabriklayman! Ushbu maqolada biz Windows OS uchun oddiy sniffer yaratishni ko'rib chiqamiz. KirishMaqsad: IP protokoli orqali uzatiladigan tarmoq trafigini (Ethernet, WiFi) ushlaydigan dasturni yozing.Imkoniyatlar: Visual Studio 2005 yoki undan yuqori. Bu erda tasvirlangan yondashuv shaxsan muallifga tegishli emas va ko'plab tijorat, shuningdek, mutlaqo bepul dasturlarda (salom, GPL) muvaffaqiyatli qo'llaniladi. Bu ish, birinchi navbatda, tarmoq dasturlash bo'yicha yangi boshlanuvchilar uchun mo'ljallangan, ammo ular umuman rozetkalar va xususan Windows soketlari sohasida kamida asosiy bilimlarga ega. Bu yerda men tez-tez taniqli narsalarni yozaman, chunki mavzu sohasi o'ziga xosdir, agar biror narsani o'tkazib yuborsam, boshim chigal bo'ladi. Umid qilamanki, sizga qiziqarli bo'ladi. Nazariya (o'qish shart emas, lekin tavsiya etiladi)Hozirgi vaqtda zamonaviy axborot tarmoqlarining aksariyati TCP/IP protokoli stekining asosiga asoslangan. TCP/IP protokoli stegi (Transmission Control Protocol/Internet Protocol) tarmoqlarda ishlatiladigan turli darajadagi tarmoq protokollarining umumiy nomidir. Ushbu maqolada bizni asosan IP protokoli qiziqtiradi - bir tarmoq tugunidan ikkinchisiga paketlar deb ataladigan (to'g'riroq atama - datagram) bo'lingan ma'lumotlarni kafolatsiz etkazib berish uchun ishlatiladigan yo'naltirilgan tarmoq protokoli.Biz uchun ma'lumot uzatish uchun mo'ljallangan IP-paketlar alohida qiziqish uyg'otadi. Bu OSI tarmoq ma'lumotlar modelining juda yuqori darajasi bo'lib, siz o'zingizni qurilmadan va ma'lumot uzatish vositasidan ajratib olishingiz mumkin, faqat mantiqiy tasvir bilan ishlaydi. Ertami-kechmi tarmoq trafigini ushlab turish, kuzatish, qayd etish va tahlil qilish vositalari paydo bo'lishi mantiqan to'g'ri. Bunday vositalar odatda trafik analizatorlari, paket analizatorlari yoki snifferlar (ingliz tilidan sniff - sniff) deb ataladi. Bu tarmoq trafigi analizatori, boshqa tugunlar uchun mo'ljallangan tarmoq trafigini ushlab turish va keyinchalik tahlil qilish yoki faqat tahlil qilish uchun mo'ljallangan dastur yoki apparat-dasturiy qurilma. Amaliyot (mohiyatli suhbat)Hozirgi vaqtda trafikni tinglash uchun juda ko'p dasturiy ta'minot yaratilgan. Ulardan eng mashhuri: Wireshark. Tabiiyki, maqsad uning yutuqlarini yig'ish emas - biz tarmoq interfeysini shunchaki "tinglash" orqali trafikni ushlab turish vazifasi bilan qiziqamiz. Shuni tushunish kerakki, biz xakerlik qilmoqchi emasmiz begona tirbandlik. Biz shunchaki xostimiz orqali o'tadigan trafikni ko'rishimiz va tahlil qilishimiz kerak.Bu nima uchun kerak bo'lishi mumkin:
Qanaqasiga? Juda oddiy. Windows 2000 (NT 5.0) dan boshlab, tarmoq segmentini tinglash uchun dastur yaratish juda oson bo'ldi, chunki uning tarmoq drayveri barcha paketlarni qabul qilish uchun rozetkani sozlash imkonini beradi. Promiscuous rejimini yoqishuzun bayroq = 1; SOCKET rozetkasi; #define SIO_RCVALL 0x98000001 ioctlsocket(soket, SIO_RCVALL, &RS_Flag);Bizning dasturimiz IP-paketlarda ishlaydi va Windows Sockets kutubxonasining 2.2 versiyasi va xom rozetkalardan foydalanadi. IP-paketga to'g'ridan-to'g'ri kirish uchun rozetkani quyidagicha yaratish kerak: Xom rozetkani yaratishs = rozetka (AF_INET, SOCK_RAW, IPPROTO_IP);Bu erda doimiy o'rniga SOCK_STREAM(TCP protokoli) yoki SOCK_DGRAM(UDP protokoli), biz qiymatdan foydalanamiz SOCK_RAW. Umuman olganda, xom rozetkalar bilan ishlash nafaqat trafikni ushlab turish nuqtai nazaridan qiziq. Aslida, biz paketning shakllanishi ustidan to'liq nazoratni qo'lga kiritamiz. To'g'rirog'i, biz uni qo'lda shakllantiramiz, bu, masalan, ma'lum bir ICMP paketini yuborish imkonini beradi... Davom etishga ruxsat. Ma'lumki, IP-paket sarlavha, xizmat ma'lumoti va aslida ma'lumotlardan iborat. Bilimingizni yangilash uchun bu yerga qarashingizni maslahat beraman. Keling, IP sarlavhasini tuzilma shaklida tasvirlaymiz (RSDN-dagi ajoyib maqola tufayli): IP-paket strukturasi tavsifitypedef struct _IPHeader ( unsigned char ver_len; // sarlavha versiyasi va uzunligi unsigned char tos; // xizmat turi imzolanmagan qisqa uzunlik; // butun paketning uzunligi imzosiz qisqa identifikator; // Id unsigned short flgs_offset; // bayroqlar va ofset imzolanmagan char ttl ; // umr bo'yi imzolanmagan char protokoli; // protokol imzolanmagan qisqa xsum; // nazorat summasi imzolanmagan long src; // jo'natuvchining IP manzili imzolanmagan long dest; // maqsad IP manzili imzosiz qisqa *paramlar; // parametrlar (320 tagacha) bit) unsigned char *ma'lumotlar; // ma'lumotlar (65535 oktetgacha) )IPHeader;Tinglash algoritmining asosiy funktsiyasi quyidagicha ko'rinadi: Yagona paketni yozib olish funktsiyasiIPHeader* RS_Sniff() ( IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) ( hdr = (LPIPHeader) )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(hisoblash, hdr); qaytaring hdr; ) aks holda 0; )Bu erda hamma narsa oddiy: biz standart rozetka funktsiyasidan foydalangan holda ma'lumotni olamiz recv, va keyin ularni kabi tuzilishga nusxalash IPHeader. Va nihoyat, biz cheksiz paketlarni yozib olish tsiklini boshlaymiz: Keling, tarmoq interfeysimizga kiradigan barcha paketlarni tortib olaylikwhile (to'g'ri) (IPHeader* hdr = RS_Sniff(); // agar (hdr) IP paketiga ishlov berish ( // konsolda sarlavhani chop etish ) )Biroz mavzudan tashqariBu erda va quyida muallif ba'zi muhim funktsiyalar va o'zgaruvchilar uchun RS_ (Raw Sockets-dan) prefiksini yaratdi. Men loyihani 3-4 yil oldin qildim va menda xom rozetkalar bilan ishlash uchun to'liq huquqli kutubxona yozish g'oyasi bor edi. Ko'pincha bo'lganidek, (muallif uchun) muhim natijalarga erishgandan so'ng, ishtiyoq susaydi va masala mashg'ulot misolidan uzoqqa bormadi.Asosan, siz oldinga borishingiz va yuqorida joylashgan barcha keyingi protokollarning sarlavhalarini tavsiflashingiz mumkin. Buning uchun maydonni tahlil qilish kerak protokol tuzilishida IPHeader. Misol kodiga qarang (ha, kalit bo'lishi kerak, jin ursin!), bu erda sarlavha paket IP-da qaysi protokolni qamrab olganiga qarab ranglanadi: /* * Paketni rang bilan ajratib ko'rsatish */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // paket bo'sh bo'lmasa, boshqa SetConsoleTextColor(0x07) ; // bo'sh to'plam agar (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // "dr else=" uchun to'plamni qaytaring (agar = mahalliy" h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "mahalliy" qabul paketi ) agar (h->protocol == PROT_ICMP || h-T=Protocolor) (0x70) ; // ICMP paketi ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // IP-in-paket, L2TP ) boshqacha if(h) - >protocol == 53 || h->protocol == 56) ( SetConsoleTextColor(0x4C); // TLS, shifrlangan IP ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A); ) ) Biroq, bu ushbu maqola doirasidan sezilarli darajada tashqarida. Bizning o'quv misolimiz uchun, qaysi va qaysi trafik kelayotgan xostlarning IP manzillarini ko'rib chiqish va uning vaqt birligi uchun miqdorini hisoblash kifoya qiladi (tugallangan dastur maqolaning oxirida arxivda joylashgan) . IP sarlavhasi ma'lumotlarini ko'rsatish uchun siz datagram sarlavhasini (ma'lumotni emas) satrga aylantirish funktsiyasini amalga oshirishingiz kerak. Amalga oshirish misoli sifatida biz quyidagi variantni taklif qilishimiz mumkin: IP sarlavhasini satrga aylantirishinline char* iph2str(IPHeader *iph) (const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=% d hlen=%d tos=%d len=%d id=%d bayroq=0x%X ofset=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s”, BYTE_H (iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->uzunlik), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET (ntohs(iph->flgs_offset)), iph->ttl, iph->protokol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest)); qaytish r; )Yuqorida keltirilgan asosiy ma'lumotlarga asoslanib, biz IP-trafikni mahalliy tinglashni amalga oshiradigan ushbu kichik dasturni (o'rqinchli nom ss, oddiy sniffer uchun qisqa) olamiz. Uning interfeysi quyidagi rasmda ko'rsatilgan. Men manba va ikkilik kodni bir necha yil oldin bo'lgani kabi taqdim etaman. Endi men unga qarashdan qo'rqaman va shunga qaramay, u juda o'qilishi mumkin (albatta, o'zingizga bu qadar ishonib bo'lmaydi). Hatto Visual Studio Express 2005 kompilyatsiya qilish uchun etarli bo'ladi. Biz nima bilan yakunladik:
Hayrli kun! Ishda qandaydir tarzda muammo paydo bo'ldi - I2C orqali ishlaydigan va uning protokolini tushunish kerak bo'lgan qurilma bor edi. Shuning uchun bizga I2C interfeysi uchun sniffer kerak bo'lib, u I2C orqali kelgan va ketadigan hamma narsani UART portiga, so'ngra konvertor orqali kompyuterning COM portiga chiqaradi. BoshlashMenda faqat bir nechta Atmeg8 bor edi va men ularni nega ishlatmaslikka qaror qildim. Keyinchalik, hidlash sxemasi haqida savol tug'ildi.Ikkita variant bor edi - snifferni parallel ravishda yoki ochiq kontaktlarning zanglashiga olib yoqing. Shubhasiz, birinchi variant ancha sodda ko'rinadi, bu aslida butunlay noto'g'ri bo'lib chiqdi. Lekin birinchi narsa. Qisqacha aytganda, interfeysning o'zi haqida. I2C (Atmelda TWI) ikkita simdan foydalanadi - SCL va SDA. Birinchisi signalni soatlash uchun javob beradi, ikkinchisi to'g'ridan-to'g'ri ma'lumot uzatish uchun javobgardir. Interfeysda START va STOP holatlari ham mavjud. Shunday qilib, mening birinchi fikrim zondni olib, bir tomondan uni atmega8 ning tashqi uzilish oyog'iga, ikkinchi tomondan, SDA chizig'iga ulash va oldingi chetini ushlash va o'tgan vaqt bo'yicha 0 yoki 1 ni aniqlash edi. Shubhasiz, bu juda yomon ishlashi kerak edi, chunki STOP signali to'g'ri ishlov berilmagan. Ikkinchi fikr xuddi shu narsani qilish edi, lekin SCL liniyasidagi uzilishni ushlang va uzilishdan foydalanib, oddiy raqamli oyoqqa ulangan SDA liniyasini o'qing. Xuddi shu STOP holatidan tashqari bu erda hamma narsa yanada qulayroq ko'rinardi, lekin men uni non taxtasida yig'ib, nima bo'lishini ko'rishga qaror qildim. Quyidagi kodda aniq xatolar topsangiz, oldindan uzr so'rayman, chunki men rad etilgan kod versiyalarini tiz cho'kib xotiramdan qayta tiklayapman. Interrupt ishlov beruvchisi kodi quyidagicha ko'rinadi: ISR(INT0_vect) ( cli(); agar (bitIsHigh(PINB, 0)) uart_send_char("1"); aks holda uart_send_char("0"); sei(); ) Statik uint8_t ma'lumotlari = 0; statik uint8_t idx = 7; ISR(INT0_vect) ( cli(); maʼlumotlar |= bitIsHigh(PINB, 0)<< (idx--);
if (!idx)
{
uart_send_char(data);
data = 0;
idx = 7;
}
sei();
}
To'g'ri yo'ldaParallel sxema yordamida snifferni qanchalik amalga oshirishga harakat qilsam ham, hech narsa chiqmadi. Shunga asoslanib, faqat bitta variant qoldi - bu bo'shliqqa mikrokontrollerni kiritish kerak edi, ya'ni u javob moslamasi uchun ham master, ham asl master uchun qul bo'lishi kerak. Ehtimol, chalkash tuyuladi, lekin aslida bunday emas.Atmega8 bortida faqat bitta I2C apparati mavjud bo'lganligi sababli, ishlash uchun siz protokol uchun dasturiy ta'minotni yozishingiz kerakligi aniq. Natijada quyidagi kod paydo bo'ldi: ISR(TWI_vect) ( cli(); uint8_t statusi = TWSR; uint8_t b; char s; s = 0; _delay_ms(1); switch (holat va I2C_STATUS_MASK) (holat I2C_STATUS_SR_RX_ADR_ACK:/* US case I2C_str_ARC: uint8_t b; char s; s = 0; _delay_ms(1); "- AW:"); uart_send_int(TWDR); i2csoft_start(); i2csoft_open_write(I2C_ADDRESS); tanaffus; holat I2C_STATUS_SR_RX_DATA_ACK:/* I2C_STATUS_SR_RX_DATA_NACKW =% bosma; bp DRX: (% 2;) yuborish_str( s); i2csoft_write_byte(b); break; case I2C_STATUS_SR_RX_STOP_RESTART: uart_send_str("E\n"); _delay_ms(10); do ( _delay_us(5); i2csoft_start(); ) while(!i2csoft_start(); Case I2C_STATUS_BUS_ERROR: uart_send_str("B\n"); break; case TW_ST_SLA_ACK: uart_send_str("-AR:"); uart_send_int(TWDR); b = i2csoft_read_byte(); sprintf(s, b", "%.2); uart_send_str(s); TWDR = b; break; case TW_ST_DATA_ACK: b = i2csoft_read_byte(); sprintf(s, " %.2X", b); uart_send_str(s); TWDR = b; break; case TW_ST_DATA_NACK: case TW_ST_DATA_LAST_ b = i2csoft_read_byte(noto'g'ri); uart_send_str("L\n"); sindirish; standart: uart_send_char("U"); uart_send_int(holat); uart_send_char(" "); sindirish; ) TWCR |= (1< Agar kimdir qiziqsa, manbalarni olish mumkin |
Mashhur:
Yangi
- Qozog'istonda onlayn kreditlar - eng yaxshi takliflar
- Mantiq algebra funksiyalarining superpozitsiyasi Monotonik mantiqiy funksiyalar
- Axborot tizimi nima?
- Mantiqiy ifodadan mantiqiy sxemaga o'tish va aksincha
- Nijniy Novgorod rus pochtasining sharmandaligi
- Geografik axborot tizimlarini ishlab chiqish GISning asosiy vazifalari
- Vektor va rastr grafika
- "To'g'ridan-to'g'ri elektr toki" taqdimoti "O'tkazgichlarning ketma-ket va parallel ulanishi" mavzusidagi fizika darsi uchun taqdimot (8-sinf)
- Birlamchi kalitlarni kasr sonli ma'lumotlar turlarini yaratish
- 1c chakana savdoda tovarlarni taqqoslash 8