You are on page 1of 74

Microchip TCP/IP Stack 5.

2
Bar SAMANCI
Her Ynyle Uygulamal TCP/IP Kullanm
( Yaptnz donanmlar dnyaya alsn )

05 / 2010 | Bar SAMANCI


www.barissamanci.net




1. Microchip TCP/IP Stack 5.20 S y f | 2 Microchip TCP/IP Stack V5.20






Giri
Bu kitap ta nereden kt? TCP/IP uygulamas uzun zamandan beri yapmay dndm bir
uygulamayd.Frsat bulup ilerledike not aldm ve notlar toparlayp Trke kaynak oluturmas
bakmndan yaynlamaya karar verdim.
Bu anlatlanlar ne ie yarar? Bu kitapta anlatlanlar ile yaptnz devreleri, modlleri ethernet
zerinden nasl internete balayp, tm dnyadan eriilir, kontrol edilebilir hale getirebileceiniz anla-
tlmr.Ayrca yaptnz devreyi nasl bir web sunucusuymu gibi kullanabileceiniz anlatlmtr.
Balant ekli olarak kablo kullanlmtr fakat kod dosyalar incelendiinde kablosuz modller ilede
aa balanp internete girilebilecei grlmektedir.
Tm ihtiyac olanlara faydal olmas dileiyle...





Bar SAMANCI
Elektronik Mhendisi
www.barissamanci.net
baris@barissamanci.net




www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 3 1. Microchip TCP/IP Stack 5.20




indekiler
Konu Sayfa
1. Microchip TCP/IP Stack 5.20 5
2. Stack Yaps ve Temel Dosyalar 6
2.1 Temel Dosyalar 7
2.2 TCPIPConfig.h Dosyas 8
2.3 HardwareProfile.h Dosyas 11
2.4 Main dosyas ve Cooperative Multitasking alma 12
3. Kullanlan Protokoller ve Modller 14
3.1 Announce 14
3.2 ARP 14
3.3 DNS 14
3.4 Dinamik DNS 15
3.5 HTTP 17
3.6 HTTP2 19
3.6.1 HTTP2 Dinamik deikenler 20
3.6.1.1 Dinamik deikenlere parametre gemek 21
3.6.1.2 Uzun ktlar 22
3.6.2 HTTP2 FORM ilemleri 23
3.6.2.1 GET Metodu 23
3.6.2.2 POST Metodu 25
3.6.3 HTTP2 Kimlik Dorulamas 27
3.6.3.1 Kimlik dorulamas istemek 28
3.6.3.2 Kimlik bilgilerini dorulamak 28
3.6.4 HTTP2 erezleri 28
3.6.5 HTTP2 Sktrma 30
3.7 ICMP 30
3.8 MPFS2 32
3.9 NBNS 33
3.10 SMTP 33
3.11 Reboot 35
3.12 SNMP 36
3.13 SNTP 36
3.14 SSL 36
3.14.1 SSL stemci Destei 37
3.14.2 SSL Sunucu Destei 37
3.14.3 Kstlamalar 37
3.15 TCP 38
3.16 TELNET 40
3.17 Tick 40
3.18 FTP 41
3.19 TFTP 42
3.20 UDP 42
4. Kullanlan Aralar ve Programlar 44
4.1 TCP/IP Configuration Wizard Arac 44
05 / 2010 | Bar SAMANCI


www.barissamanci.net




1. Microchip TCP/IP Stack 5.20 S y f | 4 Microchip TCP/IP Stack V5.20

Konu Sayfa
4.2 MPFS2 Arac 45
4.3 Ethernet Discoverer 46
4.4 MCHPDetect 47
5. Uygulama Donanm 48
5.1 Ethernet Devresi 48
5.2 lemci Devresi 49
5.3 emalar 50
5.3.1 Ethernet Devresi 50
5.3.2 lemci Devresi 51
5.3.3 Fotoraf 52
6. Uygulamalar 53
6.1 Port Ynlendirme 53
6.2 HTML Web Server 54
6.2.1 JavaScript ve AJAX ile Dinamik Deiken Ynetimi 54
6.2.2 Web Sayfalar ve alma Biimimleri 57
6.3 TCP Sunucu Uygulamas 60
6.3.1 PIC Yazlm 60
6.3.2 Bilgisayar Yazlm 63
6.4 TCP stemci Uygulamas Bilgisayar 66
6.5 TCP stemci Uygulamas SQL nternet Veritaban 68
6.6 TCP stemci Uygulamas Googleda Arama Yaptrtmak 71
6.7 UDP stemci Uygulamas 72
7. Sonu 74














www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 5 1. Microchip TCP/IP Stack 5.20




1. Microchip TCP/IP Stack 5.20
1. Microchip TCP/IP Stack 5.20

Microchip TCP/IP Stack i gelitirdiiniz uygulamalar eitli ethernet modlleri ile kablosuz
veya kablolu olarak alt alara veya internete balamanza yarayan kodlar topluluudur.Bunlar bir
nevi framework ktphanesi olarakta dnebiliriz.Yaptnz uygulamalar uzaktan kontrol edebilir,
veri toplama amacyla kullanabilir veya web sunucusu olarak kullanabilirsiniz.Yaplabilecekler size
baldr.Gelitirilmeye 2000 ylnn bandan itibaren balanmtr ve uanki en yeni srm 5.20b
dir.Ben bu dkman 5.20 iin hazrlarken 5.20b versiyonu microchip sunucularnda yerini ald.
Microchip, Stacki Microchip Application Libraries adndaki kod ktphanesine entegre etmitir.
Kullanmak iin bu ktphaneyi olduu gibi indirip kurmanz gerekmektedir.Dosya boyutu uanki
srmler iin 75MB-80MB arasndadr.Bu ktphaneyi uan iin Microchip Application Libraries
v2010-02-09 linkinden indirebilirsiniz. Microchip TCP/IP Stack linkinden Stack sayfasna gidebilirsiniz.
Bu kodlar altrabilmek iin bilgisayarnzda MPLAB (tercihen son srm) ve kullandnz ailenin
derleyicisi olmaldr.Ben 18F ailesi ile deneme yaptmdan C18 v3.35 derleyicisini kullandm.Kodlar
salkl bir ekilde derleyebilmek iin minimum versiyon 3.34 olmaldr.Ktphaneyi indirdiinizde
kurulacak olan kodlar tablo1.1 de gsterilmitir.
Library Current
Version
PIC Family Supported
PIC18F
(8-bit)
PIC24F
(16-bit)
PIC24H
(16-bit)
dsPIC
(16-bit)
PIC32
(32-bit)
MCHPFSUSB Framework 2.6a x x x
Graphics Library 2.01 x X x x
Memory Disk Drive (MDD) 1.2.5 x x x
TCP/IP Stack 5.20b x x X x x
mTouchCap Library 1.01 x x
Tablo 1.1 Microchip Application Libraries v2010-02-09
Tablo 1.1 den grld gibi TCP/IP kodlarn tm 16bit, 32bit aileleri ve 8bit ailesinden 18F
serisi PIC ler desteklemektedir.Ben bu dkman hazrlamaya 64K hafzas olan 18F4620 ile baladm
daha sonra baz modlleri bir arada altrabilecek kadar hafza olmadndan sknt ektim ve ayn
klfta 96K hafzas olan 18F4685 e getim fakat o bile ykl uygulamalarmda yetersiz kald. e
balarken yksek hafzal ilemcileri tercih etmenizi iddetle neriyorum. 48K dan kk hafzal
ilemcileride kullanmanz tavsiye etmem ok byk bir ihtimal ile uygulamanza bal olarak
derlediiniz kodlar ilemcinizin hafzasna smayacaktr.Eer HTTP zerinden mail gndermeyi, DNS
ve SSL gibi eitli modlleri kullanmay dnmeyip sadece web sunucusu ve uzaktan bilgi alma ile
kontrol amal uygulama gelitirmeyi dnyorsanz 18F4620 yeterli olacaktr.
Bu ktphane ile ethernet arayz olarak ENC28J60, ENCX24J600 serisi ipleri,dahili ethernet
ipleri barndran PIC ilemcileri veya ZeroG serisi kablosuz modlleri kullanabilirsiniz.


05 / 2010 | Bar SAMANCI


www.barissamanci.net




2. Stack Yaps ve Temel Dosyalar S y f | 6 Microchip TCP/IP Stack V5.20

2. Stack Yaps ve Temel Dosyalar
2. Stack Yaps ve Temel Dosyalar
Adndan anlalaca zere Stack, TCP/IP referans modelini kulanmaktadr.Bu drt katmanl
bir referans modelidir ve internet trafiinde uyulmas gereken baz kurallar standartlatrmaktadr.
Stack yapsnn TCP/IP modeline gre nasl ekillendirildiini grmek ve Stack hakknda bilgi sahibi
olmak iin AN833 uygulama notunu inceleyebilirsiniz.Ayn zamanda bu dosyay bu dkman
bulduunuz sktrlm dosya ierisindede bulabilirsiniz. ekil 2.1 de ve ekil 2.2 de TCPIP yaps ile
Stack karlatrmasn grebilirsiniz.

ekil 2.1 Stack yaps ile TCP/IP referans modeli karlatrmas


ekil 2.2 Stack katmanlar

Micochip TCP/IP Stack inin verdii destekler ve nemli noktalar aada listelenmitir.
o Optimized for all PIC18, PIC24, dsPIC and PIC32 families
o Supported Protocols: ARP, IP, ICMP, UDP, TCP, DHCP, SNMP, HTTP, FTP,
TFTP
o Socket support for TCP and UDP
o Secure Sockets Layer (SSL)
o NetBIOS Name Service
o DNS Domain Name System
o Ethernet Device Discovery
o Support for MPLAB C18, C30, and C32 compilers

www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 7 2.1 Temel Dosyalar




2.1 Temel Dosyalar

Stack dizin yaps ekil 2.3 te gsterildii gibidir. Bir ok
rnek, ara ve kod Stack ile birlikle gelmektedir.Genel olarak dizin
yaps yandaki ekildeki gibidir.Fakat Microchip Libraries ile
kurulum yaptysanz ek olarak USB, dokunmatik ekran kodlar,
hafza kodlar gibi gibi kodlar barndran klasrlerde
kurulmaktadr.Bunlar tablo 1.1 de ayrntl olarak grebilirsiniz.
uan itibariyle en yeni Stack srm 5.20b dir.
Stack kod dosyalarn standart kurulum iin C:\Microchip
Solutions\Microchip\TCPIP Stack dizini aldnra bulabilirsiniz. Bu
klasrde her modl iin bir ok dosya bulunmaktadr ve bunlarn
ou opsiyoneldir.Fakat her stack uygulamasnda bulunmas
gereken baz dosyalar vardr.Bu dosyalar aada tablo 2.1 de
gsterilmitir. Bu doslayardan nemli olanlarda alt balklarda
anlatlmtr.Ayrca anlatmlar TCPIP Demo App rnek uygulamas
zerinden yaplmtr. Modifiye ettiim uygulamay sktrlm
paketin ierisinde bulabilirsiniz.

ekil 2.3 Stack yaps .

Dosya Ad Aklamas
Main dosyalar
Bu dosyalar uygulama kodlarn barndrrlar.Bizim rneimizde MainDemo.c
adyla gemektedir.
ARP.c, ARP.h
Bu dosyalar IP adresleri ile balantl olan MAC adreslerinin zmlenmesi iin
kullanlr.
Delay.c, Delay.h
Baz stack fonksiyonlarna gecikme zaman salamak iin stack tarafndan
kullanlrlar.Kullanclarn bunlar kullanmamas nerilir nk bir takm artlara
bakldndan program kitleyebilirler.
Fiziksel Katman dosyalar Bunlar kullandmz fiziksel ethernet iplerinin dosyalardr.
Helpers.c, Helpers.h Bunlar baz stack fonksiyonlar iin yardmc dosyalardr.
IP.c, IP.h Bu dosyalar uygulamamza internet katmann sunmaktadr.
StackTsk.c, StackTsk.h Uygulamamzn tm isteklere cevap verebilmesini salayan stack kodlar
Tick.c, Tick.h Zamanla ilgili fonksiyonlara zaman bilgilerini salarlar.
TCPIPConfig.h Uygulama yazlm iin gerekli seenekleri barndrr.
HardwareProfile.h Uygulama donanm iin gereken seenekleri barndrr.
MAC.h Fiziksel MAC katman iin gerekli bir takm makro ve yaplar barndrr.
TCPIP.h Bu dosya stack iin gereke birincil dosyadr.Main dosyanz bunu eklemelidir.
Tablo 2.1 Bir Stack uygulamas gelitirebilmek iin gereken minimum dosyalar

05 / 2010 | Bar SAMANCI


www.barissamanci.net




2.2 TCPIPConfig.h Dosyas S y f | 8 Microchip TCP/IP Stack V5.20

2.2 TCPIPConfig.h Dosyas
Stack, bir ok modl destekleyecek ekilde yazlmtr ve tm kodlar i iedir.Kullanc iste-
dii modl kullanmak iin sadece baz tanmlamalar yapmaldr.Derleme zamannda MPLAB sadece
istenilen modlleri derleyerek istediimiz kodu bize verir.Tm bu modller ve haberleme iin
gereken dier ayarlar TCPIPConfig.h dosyas ierisindedir.Aada kullancya sunulan modller
listelenmitir.Kullanc bu yorum satrlarndan istediini aarak o modl kullanabilir.Baz modller bir
arada almamaktadr.Bunlarn kontrol derleme zamannda yaplr ve yanl bir durum varsa MPLAB
kullancya hata vererek durumu bildirir.rnein HTTP ve HTTP2 ayn anda kullanlamaz.
//#define STACK_USE_UART
//#define STACK_USE_UART2TCP_BRIDGE
//#define STACK_USE_IP_GLEANING
//#define STACK_USE_ICMP_SERVER
//#define STACK_USE_ICMP_CLIENT
//#define STACK_USE_HTTP_SERVER
//define STACK_USE_HTTP2_SERVER
//#define STACK_USE_SSL_SERVER
//#define STACK_USE_SSL_CLIENT
//#define STACK_USE_AUTO_IP
//#define STACK_USE_DHCP_CLIENT
//#define STACK_USE_DHCP_SERVER
//#define STACK_USE_FTP_SERVER
//#define STACK_USE_SMTP_CLIENT
//#define STACK_USE_SNMP_SERVER
//#define STACK_USE_TFTP_CLIENT
//#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE
//#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE
//#define STACK_USE_TELNET_SERVER
//#define STACK_USE_ANNOUNCE
//#define STACK_USE_DNS
//#define STACK_USE_NBNS
//#define STACK_USE_REBOOT_SERVER
//#define STACK_USE_SNTP_CLIENT
//#define STACK_USE_UDP_PERFORMANCE_TEST
//#define STACK_USE_TCP_PERFORMANCE_TEST
//#define STACK_USE_DYNAMICDNS_CLIENT
//#define STACK_USE_BERKELEY_API
Aada dosya sistemi ve depolama ayarlar gsterilmitir.Bu konu ayrca MPFS2 altnda
anlatlmtr.Burada MPFS ve MPFS2 ile kullandmz dosya sistemini belirtmemiz gereklidir. Bu
bilgiler HTTP modlleri iin kullanlmaktadr. Daha sonra websayfalarmz EEPROM yada FLASH ta
saklamak istediimizi belirtiyoruz.Belirtmezsek varsaylan olarak sayfalarn program bellee
yklenecei varsaylr. Eer 1Mbit EEPROM kullanyorsak 25LC01024 satrn amamz ge-
rekmektedir.Kullandmz hafza birimlerinin banda sistemin gereksinimleri iin bir miktar alan bo
brakmamz gerekmektedir.Bunu MPFS_RESERVE_BLOCK tanm ile yapyoruz. EEPROM iin varsaylan
olarak 137byte,seri FLASH iin 4096byte tr. MAX_MPFS_HANDLES tanmlamas ilede MPFS2 sistem-
de ayn anda alabilecek maximum dosya saysn belirtiyoruz.MPFS klasik iin bu deerin bir etkisi
yoktur.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 9 2.2 TCPIPConfig.h Dosyas




//#define STACK_USE_MPFS
//#define STACK_USE_MPFS2

//#define MPFS_USE_EEPROM
//#define MPFS_USE_SPI_FLASH
//#define USE_EEPROM_25LC1024

#define MPFS_RESERVE_BLOCK (137ul)
#define MAX_MPFS_HANDLES (7ul)
Devremizin a bilgileride bu dosyada saklanmaktadr.Bu bilgiler NetBIOS isimlendirme
servisini kullanan sistemler iin devremizin host ad, yerel IP adresi, fiziksel MAC adresi, a geidi, a
maskesi gibi deerlerdir.Bu deerler yukarda bahsettiimiz gibi EEPROMun rezerve blgesinde
saklanrlar.lk alta program EEPROM u kontrol eder ve veri bulamayacandan varsaylan olarak
atadmz bu ayarlar EEPROMa ykler ve kullanmaya balar. Birok cihazda bulunan fabrika ayarlar
bizim devremizde bunlar olmaktadr.Daha sonraki allarda bu bilgiler EEPROM da bulunacandan
direk alnp kullanlmaya balanr.Bu ayarlar alma zamanndada deitirilebilir. Tekrar fabrika ayar-
larna dnmek iin BUTON0 basl tutulur ve RESET butonuna baslr. Drt saniye sonra program
EEPROM un rezerve blgesini temizler ve tekrar varsaylan deerleri kullanmaya balar.Bu bilgiler
aada gsterilmitir.
#define MY_DEFAULT_HOST_NAME "BRSMNC"

#define MY_DEFAULT_MAC_BYTE1 (0x00)
#define MY_DEFAULT_MAC_BYTE2 (0x04)
#define MY_DEFAULT_MAC_BYTE3 (0xA3)
#define MY_DEFAULT_MAC_BYTE4 (0x00)
#define MY_DEFAULT_MAC_BYTE5 (0x00)
#define MY_DEFAULT_MAC_BYTE6 (0x00)

#define MY_DEFAULT_IP_ADDR_BYTE1 (192ul)
#define MY_DEFAULT_IP_ADDR_BYTE2 (168ul)
#define MY_DEFAULT_IP_ADDR_BYTE3 (1ul)
#define MY_DEFAULT_IP_ADDR_BYTE4 (222ul)

#define MY_DEFAULT_MASK_BYTE1 (255ul)
#define MY_DEFAULT_MASK_BYTE2 (255ul)
#define MY_DEFAULT_MASK_BYTE3 (255ul)
#define MY_DEFAULT_MASK_BYTE4 (0ul)

#define MY_DEFAULT_GATE_BYTE1 (192ul)
#define MY_DEFAULT_GATE_BYTE2 (168ul)
#define MY_DEFAULT_GATE_BYTE3 (1ul)
#define MY_DEFAULT_GATE_BYTE4 (1ul)

#define MY_DEFAULT_PRIMARY_DNS_BYTE1 (192ul)
#define MY_DEFAULT_PRIMARY_DNS_BYTE2 (168ul)
#define MY_DEFAULT_PRIMARY_DNS_BYTE3 (1ul)
#define MY_DEFAULT_PRIMARY_DNS_BYTE4 (1ul)

05 / 2010 | Bar SAMANCI


www.barissamanci.net




2.2 TCPIPConfig.h Dosyas S y f | 10 Microchip TCP/IP Stack V5.20

#define MY_DEFAULT_SECONDARY_DNS_BYTE1 (0ul)
#define MY_DEFAULT_SECONDARY_DNS_BYTE2 (0ul)
#define MY_DEFAULT_SECONDARY_DNS_BYTE3 (0ul)
#define MY_DEFAULT_SECONDARY_DNS_BYTE4 (0ul)
A bilgilerinden sonra wireless alar iin kullanlacak ayarlar gelmektedir.Devamndada dahili
ethernet modl olan PIC32 ler iin bir takm ayarlar gelmektedir.Bunlar bizim konumuz olma-
dndan burada anlatlmamtr.Daha sonra Transport Layer Options altnda haberleme katma-
nnda kullanacamz haberleme trleri ve ayarlar gelir. Bu trler TCP ve UDP dir ve alt seviye
modllerdir. Dier modller tarafndan kullanlmaktadrlar. Bunlarn detaylar 3. blmde modller
konusu altnda anlatlmtr. Normalde, en bata belirtilen modller otomatik olarak TCP veya UDP
modln eklemektedirler fakat kendimiz zel bir modl gelitireceksek TCP mi UDP mi kullanacan
belirtmemiz gerekmektedir.Bunu STACK_USE_TCP ve STACK_USE_UDP tanmlamalar ile yaparz.Daha
sonra uygulamamzda devremiz istemci olarak alacaksa bunu belirtmemiz gerekmektedir.
STACK_CLIENT_MODE tanmlamas ile baz fonksiyonlar alr hale gelmektedir.Eer TCP modl
seilmise gereken soket tanmlamalarda bu alanda yaplr.UDP iinde maksimum soket says ve
checksum kontrol gibi tanmlamalarda bu alandadr.Bu alandan sonra uygulama zel ayarlar
gelir.Burda HTTP2, SSL,TELNET ve SNMP ayarlar bulunur.HTTP2 iin kimlik dorulama, erezler gibi
bilgiler yer alrken TELNET alannda TELNET portu, ifresi gibi ayarlar yer alr.Bu tanmlamalar aada
gsterilmitir.Bunlardan sonra dosya biter.
#define MAX_HTTP_CONNECTIONS (2u)
#define HTTP_DEFAULT_FILE "index.htm"
#define HTTPS_DEFAULT_FILE "index.htm"
#define HTTP_DEFAULT_LEN (10u)
#define HTTP_MPFS_UPLOAD "brsupload"
//#define HTTP_MPFS_UPLOAD_REQUIRES_AUTH
#define HTTP_USE_POST
//#define HTTP_USE_COOKIES
//#define HTTP_USE_AUTHENTICATION
//#define HTTP_NO_AUTH_WITHOUT_SSL
#define HTTP_SSL_ONLY_CHAR 0xFF
//#define STACK_USE_HTTP_APP_RECONFIG
#define STACK_USE_HTTP_MD5_DEMO
//#define STACK_USE_HTTP_EMAIL_DEMO

#define MAX_TELNET_CONNECTIONS (1u)
#define TELNET_PORT (23u)
#define TELNETS_PORT 992
//#define TELNET_REJECT_UNSECURED
#define TELNET_USERNAME baris"
#define TELNET_PASSWORD "samanci"
Kullancnn bu ayarlar elle deitirirken ne yaptn bilmesi gerekmektedir.Yoksa istenilen
sonu alnamayabilir, hata ile karlaabilirsiniz.Bu dosyay modifiye etmek iin TCPIP Configuration
Wizard program gelitirilmitir.Bu ara bir arayz sayesinde TCPIPConfig.h dosyasn dzenler ve
varsa hatalar bize bildirir.Blm 4.1 de bu ara anlatmtr.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 11 2.3 HardwareProfile.h Dosyas




2.3 HardwareProfile.h Dosyas
Bu dosya devremizin donanm zelliklerini barndran dosyadr.Bu dosyadan uygulamanza
eklediiniz donanmlarn zelliklerini ve PIC ile balantl olan pinlerini belirtebilirsiniz.Ayn zamanda
alma frekansnzda bu dosyada belirtebilirsiniz. Bizim uygulamamzda herhangi bir zel donanm
profili kullanmadmzdan bu deerler varsaylan olarak aadaki gibi atanmlardr.
#define GetSystemClock() (40000000ul) // Hz
#define GetInstructionClock() (GetSystemClock()/4)
#define GetPeripheralClock() GetInstructionClock()
HardwareProfile.h dosyasnn en banda bizden kullanmak istediimiz donanmn profili
beklenmektedir.Burda Microchipin bir takm deneme/gelitirme kartlarnn profil zellikleri vardr.
Eer herhangi bir donanm profili bulunamassa MPLAB ta seilen ilemciye gre bir takm profilleri
otomatik olarak bulunmaya allr.Eer bulunamassa MPLAB derleme zamannda donanm profili
bulunamad diye hata verecektir.ekil 2.4 te ilemciyi nasl deitireceimiz gsterilmitir.

ekil 2.4 MPLAB ta daha nce alm bir proje zerinde ilemciyi deitirmek
Ayrca sfrdan proje aacaksanz bir sorunla karlaabilirsiniz.Bu stackte kullanlan local
deikenlerin fazlalndan dolay stack frame too large" hatas olacaktr.Bunu engellemek iin
derleme ayarlarndan ekil 2.5 te gsterildii gibi Overlay seilmelidir. Ayrca Directories altnda
Include Search Path altna . ve ..\Microchip\Include eklenmedilir.Bunlar stack dosyalarnn yerini
belirtir.

ekil 2.5 Saklama biimi olarak overlay seiyoruz
05 / 2010 | Bar SAMANCI


www.barissamanci.net




2.4 Main dosyas ve Cooperative
Multitasking alma
S y f | 12 Microchip TCP/IP Stack V5.20

Ben kendi devremi yapacamdan aadaki ekilde bir donanm profili tanm ekledim.
HardwareProfile.h dosyasn inceleyerek yaptm deiiklikleri grebilirsiniz.
#define BRSMNC //Oluturduum donanm profili
Uygulamamz derlenirken donanm profillerinin tanmland alanda BRSMNC tanm yapl-
mm diye kontrol edilir ve doru ise yaptmz devreye gre uygulamamz derlenir. Tasarladm
devreyi 5. blmnde grebilirsiniz. Tasarladm bu devre iin balant pinleri ve donanmlarn
ayarlar HardwareProfile.h dosyasndan incelenebilir.Uzun olduu iin buraya yazmyorum.LCD
kullanacaksak eer, LCD pinlerini tanmladktan sonra kullandmz porta gre aadaki kodu
eklememiz gerekmektedir.Ben 4 bitlik haberleme modunu ve veri iin D portunun st 4 bitini
kullandmdan bunu aadaki gibi belirtmem lazm.
typedef struct
{
unsigned char : 4; //Alt nibble veri iin kullanlmyor.
unsigned char data : 4; //st nibble veri iin kullanyoruz.
} LCD_DATA;

#define LCD_DATA_IO (((volatile LCD_DATA*)&LATD)->data)
Bu kodu yazdktan sonrada LCDBlocking.c dosyasnda drt bitlik modu kullanacamz
belirtmemiz gerekmektedir.Aada bu tanmlama yaplmtr.
#define FOUR_BIT_MODE
//define SAMSUNG_S6A0032
Bu dosyada ayrca UARTmodl iin, STACK_USE_UART and STACK_USE_UART2TCP_BRIDGE
tanmlamalar yapldysa, UART tarafndan kullanlacak bir takm makrolarda tanmlanmtr.

2.4 Main dosyas ve Cooperative Multitasking alma
Main dosyas temel olarak iki ksmdan olumaktadr.lk ksm batlatma ksm ve ikinci ksm
ise alma ksmdr.Balatma ksmnda nce donanm ayarlar ve sisteme bal olan donanmlar
altrlr.rnek olarak bunlar LCD ve SPI donanmlar olabilir.Daha sonra stack tarafndan kullanlacak
olan baz fonksiyonlar ve modller balatlmaldr.Bunlardan ilki TickInit() tir. Bu fonksiyon dier stack
modlleri iin ve donanmmz iin zaman destei salamaktadr.Bu sayede uygulamamz zamandan
haberdar olabilmektedir.Daha sonra MPFSInit() fonksiyonu arlabilir.Bu fonksiyon websayfalarn
kullanacamz harici hafzaza birimini ve bal olduu SPI modln balatr.
Daha sonra InitAppConfig(void) fonksiyonu ile uygulamamzn konfigrasyonunu ayarlayan
fonksiyon arlr.Bu fonksiyon alma esnasnda gereken AppConfig deikeninin ieriini doldurur.
Bu deiken bir APP_CONFIG trnden yapdr.Bu yapnn ieriini StackTsk.h dosyasnda bulabilir-
siniz. En sonunda StackInit() fonksiyonu yardm ile Stacki balatrz.Bu fonksiyon TCPIPConfig.h dos-
yasndaki aktif edilen dier modlleride balatmaktadr.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 13
2.4 Main dosyas ve Cooperative
Multitasking alma




Stack balatldktan sonra ilk ksm bitmektedir.kinci ksm main() fonksiyonunun ierindeki
while dngsnde gemektedir.Bu dng ierisinde uygulamalar Cooperative Multitasking yntemi
ile almaktadr.Yani alan her grev iini bitirdikten sonra programn akn dier grevlere
vermek zere while dngsne geri dnmelidir.Bu ekilde yazlan btn modl ve fonksiyonlar bir
biri ile uyum ierisinde alabilmektedir.Sizde program yazarken bu kurala dikkat etmelisiniz.
Program yazacanz fonksiyonlarda sonsuz dnglere veya ok uzun gecikmelere neden olmamaldr.
While dngsndeki fonksiyonlar MainDemo.c dosyas ierisinde grebilirsiniz. Bu fonksiyonlarn iki
tanesi Stackin almasna devam edebilmesi iin kesin kullanlmas gereken fonksiyonlardr ve srek-
li olarak,tm isteklere en hzl bir biimde yant verebilmek iin arlabildikleri kadar hzl arl-
maldrlar.
Bu fonksiyonlardan StackTsk() fonksiyonu Stack iin gereken zamanlanm grevleri yerine
getirmektedir ve ayn zamanda gelen ve giden veri paketlerini iler.Dieri ise StackApplications()
fonksiyonudur ve kullandmz modllerin grevlerini yerine getirir (rnek olarak HTTP2). Her
StackApplications() fonksiyonu ars iin bir tane StackTsk() ars yaplmaldr.Bu fonksiyonlarda
geen zaman o anda yaplan isteklere gre deimektedir. rnein bir paket alnyorken StackTsk()
fonksiyonunda geen sre daha fazla olacaktr. Uygulamanz zaman hassasiyeti gerektiren bir uygu-
lama ise bunu gz nnde bulundurmanz gerekmektedir.
While dngsnde rnek olarak yazlm ek fonksiyonlarda vardr ve bunlardan bazlar
seeceimiz modllere gre uygulama yazlmna eklenip karlrlar. rnek olarak AnnounceIP() fonk-
siyonu.rnek olarak ProcessIO() fonksiyonu ierisinde, AN0 pinine bal bir potansiyometre iin ADC
evrimi yaplmaktadr.Ayn ekilde kendi giri k kodlarnz veya baka ilemler yapan kodlarnz bu
ekilde yazabilirsiniz.


05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.1 Announce S y f | 14 Microchip TCP/IP Stack V5.20

3. Kullanlan Protokoller ve Modller
3.1 Announce
Bu modl, DHCP etkinletirilmi alarda 30303 portundan UDP paketi ile gelen istek mesaj-
larnn cevaplanmasn salar.Bu sayede devremiz a zerinde bulunabilir hale gelmektedir. Genelde
aa yeni katlan cihazlar tm aa ulaacak ekilde ada biri varsa bana cevap versin eklinde bir
istek paketi yaynlarlar (broadcasting). Bizim announce modlmzde bu istei cevaplamaktadr. Port
numaras varsaylan olarak 30303 tr ve Announce.c dosyasnn ierinde tanmlanmtr.
#define ANNOUNCE_PORT 30303
Ethernet Discoverer ve MHCPDetect programlar Announce modln kullanan devreleri
bulmak iin kullanlabilirler.Bu programlar 4. Blmde anlatlmtr.
3.2 ARP
Adres zmleme Protokol (Adress Resolution Protocol) TCP/IP modelinin temel
katmanlarndan birisidir.A zerindeki donanmlar haberlemek iin kendilerine retim esnasnda
verilen fiziksel MAC adreslerini kullanrlar ve fiziksek olarak MAC adresleri zerinden
haberleirler.ARP 32 bitlik IP adreslerini, 48 bitlik fiziksel MAC adreslerine evirir. Bir paketin ada bir
donanma gnderilebilmesi iin o donanmn IP adresinin yan sra fiziksel adresininde bilinmesi
gereklidir. Internet protokol bu fiziksel adresleri renebilmek iin aa zel bir paket yollar.Bu
paketin ad ARP istek paketidir.Bu paketi alan donanmlar kendilerini ilgilendiriyorsa IP adreslerini ve
MAC adreslerini istek yapan donanma gnderirler.Aada ekil 3.1 de, windows ortamnda genel
olarak bir ARP isteinin nasl yaplabileceini gryorsunuz.Bizim devremiz krmz ile iaretlenmitir.

ekil 3.1 ARP protokol


3.3 DNS
Alan Ad Servisi (Domain Name Service) alan adlarnn IP adresleri ile ilikilendirilmesini
salar.Bu sayede bir alan adna yaplan istekler IP adreslerine evrilir ( rnein www.google.com iin
209.85.227.103 gibi). Stack uygulamamzda TCP ile haberleiyorsak bu ilemi TCPOpen fonksiyonu
otomatik olarak gerekletirmektedir.Tek yapmamz gereken
#define STACK_USE_DNS
tanmlamasn yapmaktr.UDP ile haberleiyorsak DNS ilemlerini bizim yapmamz gerekmektedir.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 15 3.4 Dinamik DNS




3.4 Dinamik DNS
Dinamik DNS de, DNS de olduu gibi alan adlarn ip adresleri ile ilikilendirmektedir. Fakat
biraz farkldr. DNS deimeyen sabit IP li sunucularda kullanlmaktadr. Fakat ev uygulamalarnda
veya bizim yaptmz gibi kendi devremizi tasarladmzda IP adresleri arada bir servis salaycmz
tarafndan gncellenecektir (Sabit IP istiyor iseniz salaycnza ekstra para deyip deimeten IP
alabilirsiniz). Bu durumda uzaktan eriimlerde deien IP adresimizi renmemiz gerekmektedir.Bu
da uzakta olduumuz iin mmkn deildir. Bu durumun stesinden gelmek iin dinamik DNS servis
salayclar kullanlabilir. Bunlardan en popleri DynDNS dir. DynDNS ye ye olduumuzda d IP
adresimizi hesabmz altna kaydetmektedir. Daha sonra ye olurken kullandmz isime herhangi bir
istek geldiinde DynDNS bu istekleri hesabmzda ilikili olan IP adresimize ynlendirir. Devremizde
dinamik DNS modln aktif ettiysek d IP adresimizi DynDNS ye periyodik olarak bildirir. (Bu
bildirimler ksa srelerde ve ok sk yaplyorsa, DynDNS ktye kullanm olarak yorumlayp hesabnz
kapatabilir). Bu modln aktif olabilmesi iin ayn zamanda DNS modlnnde aktif olmas
gerekmektedir. TCPIPConfig.h dosyasndaki bildirimler aada gsterilmitir.
#define STACK_USE_DNS
#define STACK_USE_DYNAMICDNS_CLIENT
imdi bu bildirimleri yaptktan sonra devremiz dinamik d IP adreslerimizi hizmet veren
DynDNS ye bildirecektir.rnee balamadan nce www.dyndns.com adresinden kayt olun. Ben
kullanc ad iin brsmncboard ve alan ismi iin brsmnc.dyndns.org setim.Kayt olurken o anki d
IP niz ile kayt oluyorsunuz.Kayt olduktan sonra hesabnz altnda alan adnz ve d IP niz ekil 3.2
deki gibi gzkecektir.

ekil 3.2 DynDNS hesab bilgileri
imdi DynDNS den aldmz bilgileri devremize geelim.Bunu iki ekilde yapabiliriz.lki
alma esnasnda verileri web sayfalar araclgyla devremize aktarabiliriz.Bunun iin rnek olarak
microchip in dyndns sayfas kullanlabilir.Aadaki ekilde bu sayfa gsterilmitir.

ekil 3.3 Microchip rnek web sayfalar zerinde dinamik DNS gncelleme
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.4 Dinamik DNS S y f | 16 Microchip TCP/IP Stack V5.20

Eer ilemci olarak PIC18F4620 veya hafzas 64K dan daha kk bir ilemci kullanyor iseniz
ayarlarnz bu sayfa zerinden yapmanz mmkn olmayacaktr.nk HTTP2, MPFS2, DNS, DynDNS,
POST metodu ve HTTP zerinden sayfa ykleme zelliklerini bir arada barndrmanz gerekir.Buda 64K
olan snrl hafzamza smayacaktr.imdi bizi bu sorundan kurtaracak ikinci yolun kodlarn yazalm.
Bu alternatif yol bu bilgileri derleme zamannda ilemcinin program hafzasna yklemektir.Bunun iin
StackInit() fonksiyonundan sonra aadaki kodlar yazmamz gerekmektedir.nk bu kodlarn
alabilmesi iin gereken DDNSInit balatma fonksiyonu, StackInit ile birlikte arlmaktadr.
if(TickGet() - t2 >= TICK_SECOND*1ul)
{
t2 = TickGet();
DisplayIPValue( DDNSGetLastIP() );
SuankiHariciIP=DDNSGetLastIP();
if(dwSonHariciIP != SuankiHariciIP.Val )
{
dwSonHariciIP=SuankiHariciIP.Val;
DDNSSetService(0);
DDNSClient.Username.szROM="brsmncboard";
DDNSClient.Password.szROM="FRENZ";
DDNSClient.Host.szROM="brsmnc.dyndns.org";
DDNSClient.ROMPointers.Host = 1;
DDNSClient.ROMPointers.Username = 1;
DDNSClient.ROMPointers.Password = 1;
DDNSForceUpdate();

DisplayIPValue( DDNSGetLastIP() );
}
}
Burada kullanlan ROM ifadeleri bilgilerin derleme esnasnda ilemcinin program belleine
ykleneceini belirtmektedir.Eer RAM olarak kullanrsanz, bilgileri HTTP sayfalar zerinden veya
baka bir ekilde alma esnasnda RAM bellee ykleyebilirsiniz.Bu kodlar IP adresiniz deitiinde
alacak bir art ile main fonksiyonu ierisindeki while dngsne yerletirirseniz, d IP adresiniz her
deitiinde alrlar ve istemcilerin brsmnc.dyndns.org ad ile devremize eriebilmelerini srekli
klarlar.Hemde srekli istek gndermemi olduumuzdan hesabmz riske girmez.Bu ekilde devremizi
skp nereye takarsak takalm, devremiz d IP adresimizi otomatik olarak DynDNS ye bildirir ve
devremiz devaml tm dnyadan eriilebilir olur.IP adresimizi DDNSGetLastIP() fonksiyonu ile
reniriz.Bu IP adresini bir yere kaydeder ve sonraki DDNSGetLastIP() fonksiyonundan dnen deer
ile karlatrrsak IP adresimizin deitii noktay yakalayabiliriz.Aadaki kod ile d IP adresimiz LCD
ye yazdrlmtr.
DisplayIPValue( DDNSGetLastIP() );
imdi modemimize reset atalm ve deien IP
adresini gzlemleyelim.ekil 3.4 de grld gibi deien
IP adresimiz yukardaki kod ile LCD ekranmza yazlmtr.
imdi DynDNS hesabmza giderek devremizin IP adresimizi
gncelleyip gncellemediini kontrol edelim.

ekil 3.4 Deien d IP adresimiz
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 17 3.5 HTTP





ekil 3.5 Deien d IP mizin DynDNS hesabmzdaki gncellenmi hali
ekilde 3.5 te grld gibi IP adresimiz otomatik olarak deimitir.Devremiz artk kendisini
gncelleyip brsmnc.dyndns.org adyla tm dnyadan eriilebilecek haldedir.


3.5 HTTP
HTTP protokol stack uygulamamzda bize web sunucusu kurma imkann verir.Ayrca web
sayfalar zerinden devremizi kontrol etme ve eitli parametreleri okuma yetenei vermektedir.
HTTP protokolnn srm eskidir ve ilk stack versiyonlarnda gelitirilmeye balanmtr. Yeni stack
srmlerinde daha gelimi imkanlar sunan HTTP2 kullanlmaktadr.Fakat gemie uyumluluk
bakmndan ve snrl hafza sorunu olan ilemcilerde HTTP kullanlabilir.Eski kodlar LegacyHTTPApp.c
dosyas ierisine aktarlmtr ve yeni kodlar CustomHTTPApp.c dosyas ierisinden okunabilir.
Versiyon 4.11 den itibaren HTTP2 kullanlmaya balanmtr.
HTTP protokoln kullandmzda HTML zerinden devremizin durumunu CGI dosyalar ve
javascript kodlar ile okuyup deitirebiliriz.HTML ierisinden arlan CGI kodlar ve javascript kodlar
sayfalarmza dinamik bir grnt salar. Sayfalarmza dinamik bir yap kazandran javascript kodla-
mas 6.1. blmde javascript ve ajax balnda anlatlmtr.Sayfa zerinde izlemek istediimiz bilgile-
ri %02, %2C gibi bir notasyon ile CGI dosyasyla sunucuya gnderiyoruz.Aada bu gsterilmitir.
<b>Status</b><br>
Pot0: %02<br>
Buttons: %0F %0E %0D %04<br>
LEDs: %15 %14 %13 %12 %11 %10 %01 %00<br>
Bu deerler 00 ile 99 arasnda olmaldr.Bu deerler sunucuya gittikten sonra belirtilen alanlar
doldurularak geri gelir ve javascript fonksiyonlar ile ilenerek sayfa ierisinde ilgili yerlere aktarlrlar.
LegacyHTTPApp.c dosyas ierisinde ilgili deiken parametrelerinden bazlar u ekilde tanmlan-
mtr.
#define VAR_LED0 (0x00)
#define VAR_LED1 (0x01)
#define VAR_ANAIN_AN0 (0x02)
#define VAR_STACK_VERSION (0x16)
#define VAR_STACK_DATE (0x17)
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.5 HTTP S y f | 18 Microchip TCP/IP Stack V5.20

Grld gibi CGI dosyasndaki %00 LED0 a, %02 AN0 a, %16 Stack versiyonuna denk
gelmektedir.Bu tanmlamalar yapldktan sonra istekler bir switch-case yaps ierisinde ilenmekte-
dirler. HTTPGetVar(BYTE var, WORD ref, BYTE* val) fonksiyonu ierisindeki bu switch-case yaps
aada gsterilmitir.Bu fonksiyonun parametrelerinden ilki yaplan istein ne olduunu belirtir.
kincisi ise istenilen verinin indisidir.nc parametre ise geri dndrlecek bilgilerin adresidir.
switch(var)
{
case VAR_LED0:
*val = LED0_IO ? '1':'0';
break;
case VAR_LED1:
*val = LED1_IO ? '1':'0';
break;

case VAR_ANAIN_AN0:
*val = AN0String[(BYTE)ref];
if(AN0String[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(AN0String[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;

case VAR_STACK_VERSION:
if(ref == HTTP_START_OF_VAR)
{
strncpypgm2ram((char*)VarString, (ROM char*)VERSION, sizeof(VarString));
}
*val = VarString[(BYTE)ref];
if(VarString[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(VarString[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
}
Eer uzaktan istek gndereceksek websayfasnn sonuna istek querrystring olarak eklenme-
lidir ve bu istekler void HTTPExecCmd(BYTE** argv, BYTE argc) fonksiyonu ile ilenir. rnein
yapacamz istein u ekilde olduunu dnelim index.htm?isim=Baris&soyisim=Samanci.Bu
durumda argv tamponu aadaki ekilde doldurulacaktr.Burada standart C de olduu gibi argv
gnderilen parametreleri tutan bir matris ve argc ise parametre saysn tutan deikendir.
argv[0] => index.htm
argv[1] => isim
argv[2] => Baris
argv[3] => soyisim
argv[4] => Samanci
Gnderilen istein trnn ne olduu ve istein ierii iin baz tanmlamalar yapmamz
gerekmektedir.Aada CGI komutlar ile ilikili yaplan bu tanmlamalar gsterilmitir.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 19 3.6 HTTP2




#define CGI_CMD_DIGOUT (0)
#define CGI_CMD_LCDOUT (1)
#define CGI_CMD_RECONFIG (2)

#define CMD_LED1 (0x0)
#define CMD_LED2 (0x1)
Daha sonra HTTPExecCmd fonksiyonunda switch-case ler yardm ile yukardaki tanmlar
kullanarak gelen verileri ileriz.Aada bu ii yapan kod paras verilmitir.
command = argv[0][0] - '0';
switch(command)
{
case CGI_CMD_DIGOUT:
var = argv[1][0] - '0';
switch(var)
{
case CMD_LED1:
LED1_IO ^= 1;
break;

case CMD_LED2:
LED2_IO ^= 1;
break;
}
memcpypgm2ram(argv[0],COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
break;
.....
}
Microchip in salad HTTP web sayfalarn WebPages dizini altnda bulabilirsiniz.HTTP
protokoln eski stack srmleriyle denedim.

3.6 HTTP2
HTTP2 web sunucusu modl HTTP web sunucusu gibi almaktadr fakat baz avantajlar
vardr. HTTP sunucusunda olduu gibi ykleyeceimiz web sayfalarn yine sisteme uygun bir dosya
formatna evirmemiz gerekmektedir.Fakat bu sefer MPFS2 formatnda yklememiz gerekmektedir.
MPFS2 bir sonraki balkta anlatlmtr.HTTP2 nin HTTP ye gre salad avantajlar tablo 3.1 de
gsterilmitir.
HTTP2 HTTP
E zamanl balantlar ileme yenetei Ezamanl balantlar kuyrua alnr.
Yksek performans Daha dk hafza ve sistem gereksinimleri
Basite indirgenmi API ler Eski srmler ile uyumluluk
Dinamik olarak oluturulan web sayfalar Dinamik olarak oluturulan web sayfalar
Formlar GET ve POST etme Sadece GET
Kimlik dorulama
HTTP erez destei
GZIP sktrma kabiliyeti
HTTP zerinden upload ilemleri
Tablo 3.1 HTTP2 HTTP karlatrmas
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.6 HTTP2 S y f | 20 Microchip TCP/IP Stack V5.20

HTTP2 web sunucusunun alabilmesi iin, kullancnn salamas gereken 3 bileen vardr. Bu
bileenler web sayfalar, MPFS2 imaj dosyalar (.bin veya .c) ve CustomHTTPApp.c ile HTTPPrint.h kod
dosyalardr.Web sayfalarn kullanc istee bal olarak yazabilir.Yazd web sayfalarn MPFS2 arac
ile EEPROM kullanyorsak .bin, PIC in program hafzasn kullanyorsak .c dosyas halinde derlememiz
gerekmektedir. BIN dosyalar daha sonradan oluturulup alma annda EEPROM a yklenerek,
alma esnasnda web sayfalar deitirilebilir.Fakat burda dikkat edilmesi gereken yaptmz
deiiklikler sonucu PIC yazlmnn yaptmz deiikliklere cevap verip veremeyeceidir.Bu konu
aada dinamik deikenler ile anlatlmtr. C dosyalarnn ise PIC yazlmnn derleme zamannda
salanmas gerekmektedir.Bu ekilde PIC in program hafzasna yerletirilebilirler.
//#define MPFS_USE_EEPROM
//#define MPFS_USE_SPI_FLASH
Bu ilemi satrlar ile yapyoruz.Eer iki satrda yorum satr ise websayfalar .C olarak derleme
zamannda derlenir ve PIC in hafzasna yerletirilir. #define MPFS_USE_EEPROM satr bildirim satr
ise web sayfalar .bin olarak EEPROMa yklenir.Ayrca HTTP2 ile dosyalarmz HTTP zerinden
sunucumuza ykleyebiliriz. Bunlar MPFS2 balnda detayl anlatlmtr. ekil 3.6 da HTTP2 nin al-
ma prensibi gsterilmitir.

ekil 3.6 HTTP2 iin salanmas gereken dosyalar
3.6.1 HTTP2 Dinamik deikenler
CustomHTTPApp.c ile HTTPPrint.h dosyalar yazdmz dinamik deikenlerin ynetimi iin
kullanlmaktadr. CustomHTTPApp.c dosyas sistemdeki dier kullanc ilemlerinide yerine getirecek
kodlar barndrmaktadr. Dinamik deikenler bir sayfa iin istekte bulunulduunda sayfann http
kodlar istemciye gnderilirken deiken alanlar doldurulup deitirilerek gnderilir. HTTP2
sayfalarnda dinamik deiken yaratmak istediimizde iki adet ~ arasna yazyoruz. rnein web
sayfasnn bir ksmnda ~sicaklik~ yazdmzda MPFS2 arac derleme esnasnda websayfalarndaki
dinamik deikenkeri rettii HTTPPrint.h dosyas ile balamaktadr.Bu yzden websayfalarn
deitirdiimizde PIC yazlmnda gncellemek gerekebilir. HTTPPrint.h dosyasnn ierisinde
yazdmz bu deiken iin void HTTPPrint_sicaklik(void); eklinde bir fonksiyon bildirimi
oluturulur ve bir switch/case blou oluturularak HTTPPrint_sicaklik(); fonksiyon ars bu bloun
iine yerletirilir.Daha sonra kullancnn HTTPPrint_sicaklik(); fonksiyonunun gvdesini oluturmas
gerekmektedir.Bunuda CustomHTTPApp.c dosyasnda oluturabilir.Bu dosya microchip tarafndan
salanan rnek bir dosyadr.Fakat kullanc isterse baka dosyada oluturabilir.Fonksiyon gvdesi
rnek olarak aadaki gibi yazlabilir.AN0 pinine bal analo deeri okuyup string olarak bal olan
HTTP soketine gndermektedir.Bal olan HTTP soketi sktHTTP ile elde edilir.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 21 3.6 HTTP2




void HTTPPrint_pot(void)
{
BYTE AN0String[8];
WORD ADval;

// A/D evrimi bitene kadar bekle
ADCON0bits.GO = 1;
while(ADCON0bits.GO);

// 10 bitlik deeri ASCII string e evir
ADval = (WORD)ADRES;
uitoa(ADval, AN0String);

TCPPutString(sktHTTP, AN0String);
}
3. 6. 1. 1 Dinamik deikenlere parametre gemek
Dinamik deikenlere, deiken adndan sonra parantez ierisinde parametreyi yazarak eitli
paramatreler gemek mmkndr.rnek olarak ~led(2)~ ifadesi sistemdeki LED2 yi ifade etmektedir.
Bu ekilde parametreli kullanmda kullancnn fonksiyonlarn gvdelerini olutururken parametreleri
ileyecek biimde yazmas gerekmektedir.rnek olarak ledler iin aada gsterilmitir.
void HTTPPrint_led(WORD num)
{
switch(num)
{
case 0:
num = LED0_IO;
break;
case 1:
num = LED1_IO;
break;
case 2:
num = LED2_IO;
break;
default:
num = 0;
}

TCPPut(sktHTTP, (num?'1':'0'));
return;
}

Parametreler WORD olarak aktarlmaktadr.Ayrca kullanc birok parametre kullanabilir.Tabi
bu durumda yukardaki rnekte olduu gibi parametreleri ileyebilecek fonksiyonlar yazmaldr.rnek
olarak ~motor(120,TRUE)~ gibi. Web sayfalarn derleme esnasnda MPFS2 arac bu dinamik
deikenleri tespit ederek yukarda bahsedildii gibi HTTPPrint.h dosyasn gnceller.Kullancya
sadece fonksiyonlarn oluturmak kalr.HTTPPrint.h dosyas aadaki gibi ekil alr.
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.6 HTTP2 S y f | 22 Microchip TCP/IP Stack V5.20

void HTTPPrint(DWORD callbackID);
void HTTPPrint_led(WORD);
void HTTPPrint_sicaklik(void);

void HTTPPrint(DWORD callbackID)
{
switch(callbackID)
{
case 0x0000000b:
HTTPPrint_led(2);
break;
case 0x0000000c:
HTTPPrint_led(1);
break;
case 0x00000017:
HTTPPrint_led(0);
break;
case 0x0000001c:
HTTPPrint_sicaklik();
break;
default:
// Bilinmeyen deerler iin kt mesaj !DEF
TCPPutROMArray(sktHTTP, (ROM BYTE*)"!DEF", 4);
}
return;
}

3. 6. 1. 2 Uzun ktlar
HTTP protokol gnderim iin snrl miktarda hafza ile almaktadr bu yzden btn veri
bir seferde gnderilmemelidir.Bu durum kullancnn callback fonksiyonunda gnderici tamponun
tamamas iin ele alnmaldr.HTTP2 web sunucu modl kullancnn callback fonksiyonu
arlmadan nce 16 bytelk alann bo olduunu garanti eder. 16 byte tan kk ktlar iin kullanc
fonksiyonunun sadece TCPPut fonksiyonunu arp iini bitirmesi gerekmektedir. Uzun ktlar iin ise
kullanc callback fonksiyonu, tampondaki bo alan tespit eder ve gerektii kadar veri gnderir ve
return ile iini bitirir.Tekrar bo hafza olutuunda fonksiyon tekrar invoke edilir ve kalan verilerde
bu ekilde bir ka seferde gnderilir.
Uzun ktlar ynetmek iin kullanc fonksiyonlar curHTTP.callbackPos deikenini kullan-
maldr.Bu bir WORD deikendir ve kullanc callback fonksiyonu ilk arldnda 0 a kurulur. Bu
deiken fonksiyonun bo hafza olutuunda tekrar arlp arlmayacan belirtmek iin 0 harici
bir deere kurulmaldr.Bu deer bir sonraki arda ilemin kald yerden devam etmesini salar. Her
ilem yapldnda, gnderilecek olan kalan miktar, bir sonraki arda kullanmak iin gncellemeliyiz.
En sonunda, iimiz bittiinde sisteme iimizin bittiini anlatmak iin bu deikenin ierisini tekrar 0 a
kurmalyz.
Aadaki rnekte lcd de yazan grntlenmek istenmitir.Bunun iin nce ~lcdtext~ ifadesi
ile dinamik deiken yaratlmtr.Daha sonra HTTPPrint_lcdtext() callback fonksiyonunda gereken
ilemler yaplmtr.nce fonksiyonun ilk defa arldm yoksa kalan ilemleri devam ettirmek
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 23 3.6 HTTP2




iinmi arldnn kontrol yaplmtr. TCPIsPutReady() fonksiyonu gnderici tamponda ne kadar
bo alan olduunu bize belirtmektedir. Bu deer bize geri gnderirken kontroll bir ekilde veri
gndermemizi salar.Gnderilecek alan kalmadnda fonksiyon sonlandrlr ve bo alan olutuunda
tekrar arlmay bekler.
void HTTPPrint_lcdtext(void)
{
WORD len;
// Ne kadar byte gndereceimizi renelim.
len = TCPIsPutReady(sktHTTP);

// Eer ilk defa arlyorsa...
if(curHTTP.callbackPos == 0)
curHTTP.callbackPos = 32;

// Bir seferde bit byte olacak ekilde yazabildiimiz kadar yaz
// Bir karakteri yazmas 12 byte srebilir.
// (Boluklar ve yeni satrlar gibi.Mesela &nbsp gibi)
while(len > 12 && curHTTP.callbackPos)
{
// 16 byte tan sonra LCD nin ikinci satr iin HTML de alt satra ge
if(curHTTP.callbackPos == 16)
len -= TCPPutROMString(sktHTTP, (ROM BYTE*)"<br />");

if(LCDText[32-curHTTP.callbackPos] == ' ' || LCDText[32-curHTTP.callbackPos] == '\0')
len -= TCPPutROMString(sktHTTP, (ROM BYTE*)"&nbsp;");
else
len -= TCPPut(sktHTTP, LCDText[32-curHTTP.callbackPos]);

curHTTP.callbackPos--;
}
}

3.6.2 HTTP2 FORM ilemleri
Bir ok uygulama kullancdan bilgi alma ve bilgi verme amal olarak formlar kullanmaktadr.
Genel uygulama olarak web sayfasnda bir kullanc formu oluturulur ve donanmmz verileri bu
form yardm ile iler.Bu web formlar genelde iki GET ve POST metodlarndan birini kullanarak
gnderilmektedir. HTTP2 modl bu metodlarn ikisinide desteklemektedir.
3. 6. 2. 1 GET Metodu
GET metodu veriyi URI nin sonuna querry string olarak ekler. Veriyi taraycnzn adres
ubuunda ? iaretinden sonra grebilirsiniz. Bu veri http://brsmnc/ forms.htm?led1=0&
led2=1&led3=0 eklindedir. Grld gibi birden fazla veriyide veriler arasna & iareti koyarak
gnderebiliriz. Get metodu ile gnderilen veri incelenip zlerek curHTTP.data dizisinde saklanr. Bu
veriler bellekte saklanrlar ve bellein boyutu curHTTP.data nn boyutu kadardr ve bu deer
varsaylan olarak 100 byte tr. HTTPExecuteGet fonksiyonu programc tarafndan GET metodunu
ileyip arlara cevap verebilecek ekilde kodlanmaldr. HTTPGetArg ve HTTPGetROMArg
fonksiyonlar gnderilen verileri almak iin kolay bir yntem sunmaktadr.
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.6 HTTP2 S y f | 24 Microchip TCP/IP Stack V5.20

Aadaki uygulama 3 LED in nasl web formlar ile nasl kontrol edileceini gstermektedir.
nce 3 adet checkbox ve bir adet buton kodlanmtr.
<form method="get" action=" forms.htm">
LED 1: <input type="checkbox" name="led1" value="1" /><br />
LED 2: <input type="checkbox" name="led2" value="1" /><br />
LED 3: <input type="checkbox" name="led3" value="1" /><br />
<input type="submit" value="Set LEDs" />
</form>
Kullancnn bu checkboxlardan LED1 ve LED3 yazanlar iaretlediini dnelim.Bu durumda
sunucuya aadaki string gidecektir.
GET / forms.htm?led1=1&led3=1 HTTP/1.1
Sunucu gelen bu stringi inceleyip aadaki gibi zmleyecektir ve curHTTP.data dizisinde
aadaki gibi saklayacaktr.
"led1\01\0led3\01\0\0"
Daha sonra programc tarafndan uygulanmas gereken HTTPExecuteGet fonksiyonu
arlmaktadr.Bu veriyi ilemek iin nce MPFSGetFilename fonksiyonu arlarak hangi formun
gnderildiini tespit etmek gerekmektedir.Daha sonra LEDlerin ilk durumu snk olarak varsaylp her
argman iin kontrol yaplp ilgili ledler set edilmektedir.Aada bunu yapan kod paras gsteril-
mitir.
HTTP_IO_RESULT HTTPExecuteGet(void)
{
BYTE *ptr, filename[20];
//Tek form kullanlacak ise bu ilemler yaplmayabilir.
//Dosya adn tespit et
MPFSGetFilename(curHTTP.file, filename, 20);

// Dosya adn kontrol et.
if(!strcmppgm2ram(filename, (ROM char*)"forms.htm" , 9) )
{
// LED lerin varsaylan durumunu snk olarak varsayalm
LED1_IO = 0;
LED2_IO = 0;
LED3_IO = 0;

// Her LED parametresini arayp ileyelim
ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE*)"led1");
if(ptr)
LED1_IO = (*ptr == '1');

ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE*)"led2");
if(ptr)
LED2_IO = (*ptr == '1');

ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE*)"led3");
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 25 3.6 HTTP2




if(ptr)
LED3_IO = (*ptr == '1');
}

// lemin bittiini belirtelim
return HTTP_IO_DONE;
}

3. 6. 2. 2 POST Metodu
Post metodunda veri taraycnn adres ubuunda gzkmez fakat paket yakalayc program-
lar ile takibi yaplabilir.Ayn URL kodlama yntemini kullanmaktadr. HTTP2 sunucusu veriyi herhangi
bir n inceleme ilemine tabi tutmaz ve tm POST verisi direk olarak TCP tamponuna aktarlr. Her-
hangi bir uygulama TCP tamponuna erierek veriyi alr ve zer. HTTPReadPostName ve
HTTPReadPostValue fonksiyonlar kullancya bu ilemleri yapabilmesi iin salanmtr.
ou POST metodunu ileyen fonksiyon yukardaki stack fonksiyonlarn kullanabilmek iin
durum makinalar (state machines) eklinde uygulanmaldr. inde bulunduumuz durumu
curHTTP.smPost deikeni ile reniriz. Yeni bir istek olutuunda bu durum deikeninin ierii 0
lanr.Yazacamz fonksiyonlar bir durumu deiken ad iin kullanrken dier durumu deeri iin kul-
lanmaldr.Baz ek durumlar uygulamaya bal olarak yararl olabilir.
Aadaki rnekte kullanc bir e-mail adresi, konusu ve gnderecei mesaj form yardm ile
PIC e gndermektedir.Grld gibi mesaj 100 byte tn zerinde olabilir.Bu yzden POST metodu
kullanlr.
<form method="post" action="/email.htm">
To: <input type="text" name="to" maxlength="50" /><br />
Subject: <input type="text" name="subject" maxlength="50" /><br />
Message:<br />
<textarea name="msg" rows="6"></textarea><br />
<input type="submit" value="Send Message" /></div>
</form>

Kullancnn yukardaki forma aadaki veriyi girdiini dnelim.
To: joe@picsaregood.com
Subject: Sent by a PIC
Message: I sent this message using my development board!
Bu veri TCP tamponunda aadaki ekilde saklanr ve HTTPExecutePost ile ilenmelidir
to=joe%40picsaregood.com&subject=Sent+by+a+PIC
&msg=I+sent+this+message+using+my+development+board%21
E-mail modln kullanabilmek iin adresin ve konunun okunup RAM de saklanmas daha
sonra mesajn gnderilmesi gerekmektedir. Mesaj, uzunluuna bal olarak RAM e smayabilir bir
kerede okunamayabilir.Bo alan kadar okunup, okunan veri e-mail modlne aktarlmaldr. Bu ii
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.6 HTTP2 S y f | 26 Microchip TCP/IP Stack V5.20

durum makinas kullanarak, HTTPReadPostName ve HTTPReadPostValue fonksiyonlar yardm ile
baarl bir ekilde yapabiliriz.Aadaki rnek callback fonksiyonu verilmitir.Bu rnek iin yukardaki
formun uygulamadaki tek form olduu varsaylm ve isim kontrol yaplmamtr.Mail adresi
curHTTP.data[0:49] alannda , konu curHTTP.data[50:99] alannda saklanmaktadr.Bu iyi bir zm
deildir fakat basit bir rnek oluturmaktadr.Bu sadece bir rnektir mail gndermek iin gereken
alanlar bo braklmtr.
HTTP_IO_RESULT HTTPExecutePost(void)
{
BYTE *dest, temp[16];

// Durum makinas deerlerini tanmla
#define SM_READ_NAME (0u)
#define SM_READ_VALUE (1u)
#define SM_START_MESSAGE (2u)
#define SM_SEND_MESSAGE (3u)

switch(curHTTP.smPost)
{
case SM_READ_NAME:
// Sradaki deiken adn oku. Eer tam isim bulunamadysa daha fazla veri iste.
// Bu fonksiyon geersiz verileri nleyerek tampon tamasn engeller
if(HTTPReadPostName(temp,16) == HTTP_READ_INCOMPLETE)
return HTTP_IO_NEED_DATA;

// "to" deerlerini curHTTP.data[0:49] alanna kaydet
if(!strcmppgm2ram((char*)temp, (ROM char*)"to"))
dest = curHTTP.data;

// "subject"deerlerini curHTTP.data[50:99] alanna kaydet
else if(!strcmppgm2ram((char*)temp, (ROM char*)"subject"))
dest = curHTTP.data + 50;

// "msg" ile karlaldnda gnderimi balat
else if(!strcmppgm2ram((char*)temp, (ROM char*)"to"))
{
curHTTP.smPost = SM_START_MESSAGE;
break;
}

// Beklenmeyen deerleri grmezden gel
else
dest = NULL;

//Sradaki duruma ge fakat break ile henz kma
curHTTP.smPost = SM_READ_VALUE;

case SM_READ_VALUE:
// Sradaki deeri oku. Eer deer bulunamadysa daha fazla veri iste.
// Bu fonksiyon geersiz verileri nleyerek tampon tamasn engeller
if(HTTPReadPostValue(dest,50) == HTTP_READ_INCOMPLETE)
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 27 3.6 HTTP2




return HTTP_IO_NEED_DATA;

// Yeni isim okuma durumuna dn
curHTTP.smPost = SM_READ_NAME;
break;

case SM_START_MESSAGE:
// TODO:Mesaj gnderimine balamak iin gerekli grevleri gerekle

//Mesaj gvdesini gnderme durumuna ge
curHTTP.smPost = SM_SEND_MESSAGE;
break;

case SM_SEND_MESSAGE:
// Mesaj TCP tamponunun saklayabileceinden daha uzun olabilir.Hatalar engellemek iin
// para para okunup e-mail modlne gnderilmelidir.Bu i TCP fonksiyonlarn
// direk olarak kullanp yaplabilir.

// Kalan veriyi gnder.
while(curHTTP.byteCount > 0)
{
// nce veri hazrm diye kontrol et
if(TCPIsGetReady(sktHTTP) == 0)
return HTTP_IO_NEED_DATA;

// TODO: TCPGetArray ile veriyi oku ve e-mail modlne gnder
}

// lem tamamland.
return HTTP_IO_DONE;
}

// Burada default alannda HTTP_IO_NEED_DATA y geri dndrmek HTTP2 sunucusunun,
// kullancya, daha fazla veri gelmeyeceinden dolay hata mesaj vermesine sebep olur
return HTTP_IO_WAITING;
}
Bu rnek HTTPReadPostName,HTTPReadPostValue,TCPIsGetReady, TCPGet ve TCPGetArray
fonksiyonlarnn kullanmn ve durum makinas modellemesini gstermektedir.Daha basit ve durum
makinas gerektirmeyen, bir ilemi direk yerine getirecek fonksiyonlarda HTTPReadPostPair
kullanlabilir.

3.6.3 HTTP2 Kimlik Dorulamas
HTTP protokol sucunulara,web sayfalarna eiim izni iin istemciden kullanc ad ve ifre
isteyecek bir yntem sunmaktadr.HTTP2 sunucumuzda bu kimlik dorulama yntemine sahiptir. Bu
sayede programclar web sayfas veya sayfalar iin kimlik dorulamas yapabilmektedir.Kimlik doru-
lama zellii programcnn salamas gereken iki adet callback fonksiyonundan meydana gelmektedir.
Bu fonksiyonlardan ilki HTTPNeedsAuth tur ve websayfasnn kimlik bilgisi isteyip istemediini belirtir.
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.6 HTTP2 S y f | 28 Microchip TCP/IP Stack V5.20

kinci fonksiyon ise HTTPCheckAuth tur ve girilen kullanc ad ve ifreyi kontrol ederek giri izni verir
veya reddeder.Baz durumlarda deiik sayfalar iin deiik kimlik bilgileri istenebilir.Bu iki fonksiyon
kendi aralarnda curHTTP.isAuthorized deikenini kullanarak haberleirler.Bu bir bytelk bir dei-
kendir.
3. 6. 3. 1 Kimlik dorulamas istemek
Bir sayfa iin ilk istek yapldnda HTTPNeedsAuth fonksiyonu sayfa iin kimlik dorulamas
gerekip gerekmediine bakar.HTTP2 sunucumuza nasl devam edilecei belirtmek iin bir bytelk bir
deer geri dner.Bu deerin en deerli biti giri izni gerekip gerekmediini bildirir. 0x80 ve byk
deerler iin giri izni gerekmez. 0x79 ve daha kk deerler iin giri iznine ihtiyacmz vardr.Bu
deer curHTTP.isAuthorized deikeninde ileride oluabilecek callback isteklerinde ilem yapabilme-
miz iin saklanr.Aadaki rnek en basit hali ile tm dosyalar iin giri izni istemektedir.
BYTE HTTPNeedsAuth(BYTE* cFile)
{
return 0x00;
}
Baz durumlarda sadece baz dosyalarn korunmas gerekir.Aadaki ikinci rnek
kullanicilar adndaki klasrdeki herhangi bir dosya iin giri izni istemektedir.
BYTE HTTPNeedsAuth(BYTE* cFile)
{
if(!memcmppgm2ram((void*)cFile, (ROM void*)"kullanicilar", 5))
return 0x00;

return 0x80;
}
rneimizi biraz daha gelitirelim.Aadaki rnekte /admin klasr iin sadece ynetici
pozisyonundaki kullanclara giri izni verilmektedir.Sitenin geri kalan ksm iinde dier kullanclarn
giri izni salamas gerekmektedir.
#define HTTP_AUTH_ADMIN (0x00)
#define HTTP_AUTH_OTHER (0x01)

BYTE HTTPNeedsAuth(BYTE* cFile)
{
if(!memcmppgm2ram((void*)cFile, (ROM void*)"admin", 5))
return HTTP_AUTH_ADMIN;

return HTTP_AUTH_OTHER;
}

3. 6. 3. 2 Kimlik bilgilerini dorulamak
HTTPCheckAuth fonksiyonu istenilen kaynaa erimek iin girilen kimlik bilgilerinin doru olup
olmadn kontrol etmektedir.Yine en deerli bit eriim iin iznimiz olup olmadn belirtir. Bu deer
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 29 3.6 HTTP2




curHTTP.isAuthorized deikeninde ileride oluabilecek callback isteklerinde ilem yapabilmemiz iin
saklanr.En basit ekli ile aadaki rnek bir adet kullanc/ifre iftinin tm sayfalardan nasl kabul
edildiini gstermektedir.
BYTE HTTPCheckAuth(BYTE* cUser, BYTE* cPass)
{
if(!strcmppgm2ram((char*)cUser, (ROM char*)"AliBaba") &&
!strcmppgm2ram((char*)cPass, (ROM char*)"Acil Susam") )
return 0x80;

return 0x00;
}
Baz durumlarda baz sayfalara eriebilmek iin farkl seviyelerde giri izni salamamz
gerektiini sylemitik.Aadaki rnek, stteki HTTPNeedsAuth rneklerinden ncs iin admin
klasrne giri inzi salamaktadr.
BYTE HTTPCheckAuth(BYTE* cUser, BYTE* cPass)
{
// nce yneticiler kontrol edilmelidir.
if(curHTTP.isAuthorized == HTTP_AUTH_ADMIN &&
!strcmppgm2ram((char*)cUser, (ROM char*)"admin") &&
!strcmppgm2ram((char*)cPass, (ROM char*)"s3cREt") )
return 0x80;

if(!strcmppgm2ram((char*)cUser, (ROM char*)"kate") &&
!strcmppgm2ram((char*)cPass, (ROM char*)"puppies!") )
return 0x80;

return 0x00;
}
Daha gelimi kullanm ekilleride mmkndr.rnek olarak kullanc/ifre iftleri EEPROM
gibi yada geici olmayan baka hafzalarda saklanarak son kullanc tarafndan alma esnasnda dei
tirilebilir.Baz uygulamalarda 0x80 zerindeki deerler kullanlarak HTTPCheckAuth fonksiyonunda
hangi kullancnn giri yapt renilebilir.Bunun gibi bir ok yntem gelitirilebilir.
3.6.4 HTTP2 erezleri
Tasarm olarak HTTP protokol durumdan ve oturumlardan bamsz almaktadr. Her ba-
lant bamsz bir oturumdur ve dierleri ile bir ilikisi yoktur. erez yntemi protokole bu sorunu
zmek iin getirilmitir.Bu zellik sunucuya kullancnn taraycsnda kk bir miktar veri olutura-
bilme imkan salar ve her istekte bu veriler sunucuya tekrar gnderilerek sunucunun istemcinin
durumundan haberdar olmasn salar.Genellikle gelimi kimlik ynetimi sistemleri iin kullanlmak-
tadrlar.
HTTP2 sunucumuzda erezler otomatik olarak alnmaktadr ve dier rneklerde olduu gibi
curHTTP.data ierisinde saklanmaktadr.erezlerin kontrol iin uygun olan alan HTTPExecuteGet
fonksiyonudur. HTTPGetArg veya HTTPGetROMArg fonksiyonlar kullanlarak deerlerin yerleri
belirlenir.Bu yntem URL parametreleri iin kullanlan alann bir ksmn kullanmaktadr.Dolaysyla
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.7 ICMP S y f | 30 Microchip TCP/IP Stack V5.20

erezlerin uygun olandan (varsaylan olarak 100 byte) daha fazla alan kullanmamasna dikkat
edimelidir.GET metodu ile URL yardmyla parametre alndktan sonra yeteri kadar alan yoksa erezler
kesilir.
erezler HTTPExecuteGet or HTTPExecutePost fonksiyonlar ierisinde oluturulabilirler. erez
oluturmak iin null ile sonlandrlm isim/deer iftlerinin curHTTP.data ierisinde saklanmas
gerekmektedir.Daha sonra curHTTP.hasArgs deikeninin isim/deer ifti saysna kurulmas gerek-
mektedir.rnek olarak bir erez aadaki ekilde oluturulur.
void HTTPExecuteGet(void)
{
...
strcpypgm2ram((char*)curHTTP.data, (ROM char*)"Renk\0Kirmizi");
curHTTP.hasArgs = 1;
...
}
Bundan sonra taraycdan yaplacak tm istekler curHTTP.data ierisinde saklanan Kirmizi ile
ilikilendirilmi Renk parametresini ierir

3.6.5 HTTP2 Sktrma
Tm modern web tarayclar GZIP ile sktrlm dosyalar alp aabilmektedirler. Sabit
dosyalar (dinamik deiken iermeyen) iin bu sktrma oran %60 a kadar kabilmektedir.MPFS2
arac ile sktrmak istediimiz dosya trlerini ve sktrlmamas gereken dosyalar belirleyebiliriz.
Sktrlacak dosyalar genellikle JavaScript ve CSS dosyalardr.Resim dosyalar zaten sktrlm
olduundan MPFS2 arac bunlar sktrmadan ele almaktadr.Sktrma zellii ile snrl miktardaki
hafza sorunumuz bir miktar zlm olur ve dosya boyutlar klecei iin transfer hz
artmaktadr. Sktrma yapmak iin herhangi bir ilem gerekmez. MPFS2 arac otomatik olarak
dosyalar sktrmaktadr. 4.2. blmde MPFS2 arac anlatlmtr. Ayrca sayfalara dinamik bir
grnm kazandrp masast uygulamas havas vermek istiyorsanz java script ve AJAX kullanmanz
gerekmektedir.Bu konuyu blm 6.1 de bulabilirsiniz.

3.7 ICMP
Internet Mesaj Kontrol Protokol (Internet Control Message Protocol) TCP/IP yapsnn bir
takm hata ve kendine z denetim mesajlar iin kullanlr.Sistemler aras kontrol mesajlar ICMP ile
aktarlmaktadr. Aslnda ICMP de bu mesajlar aktarabilmek iin IP yi kullanr. Hem IP hemde ICMP
TCP/IP referans modelinde Internet katmannda yer almaktadr.ICMP paketleri iin port numaras
gerekmez ve bu paketler an salkl ilemesi iin geri besleme salarlar.Bu paketlerin trleri vardr.
Bunlardan en ok bilineni Echo Reply dr.Bir baka deyile ping dir.ekil 3.7 de devremize ping
istei yapp gelen cevab gryoruz.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 31 3.7 ICMP





ekil 3.7 Devremize yaptmz ping isteinin cevab
ICMP modln aktif edebilmek iin aada gsterilen, TCPIPConfig.h dosyasndaki tanmla-
malar yaplmaldr.Burda SERVER tanmlamas gelen ping isteklerine cevap verebilmemizi, CLIENT ise
dier donanmlara ping isteklerinde bulunabilmeyi salamaktadr.
#define STACK_USE_ICMP_SERVER
//#define STACK_USE_ICMP_CLIENT
Aadaki ekil 3.8 de stack ierisindeki ICMP modlnn ak diyagram gsterilmitir.

ekil 3.8 ICMP Ping ilemi ak diyagram

ICMP modln kullanabilmek iin nce ICMPBeginUSage fonksiyonu ile bu modl baka
kullanan olup olmadn test ederiz. Fonksiyonun geri dn deeri TRUE ise modl kullanabiliriz
demektir, FALSE ise modl baka bir modl kullanyor demektir bu yzden kullanan modln hata
ile karlamamas iin dier fonksiyonlar kullanmamamz gerekmektedir.Eer TRUE deerini aldysak
ICMPSendPing fonksiyonu ile bir IP adresine, ICMPSendPingToHost fonksiyonu ile DNS adresine ping
gnderebiliriz.Daha sonra ICMPGetReply fonksiyonu ile gelen cevab okuyabiliriz.imiz bittiindede
dier modllerin bu modl kullanabilmesi iin ICMPEndUsage fonksiyonunu armamz gerek-
mektedir.Bu fonksiyonlarn bildirimleri aadaki gibidir.
BOOL ICMPBeginUsage();
void ICMPSendPing(DWORD dwRemoteIP);
void ICMPSendPingToHost(BYTE * szRemoteHost);
void ICMPSendPingToHostROM(ROM BYTE * szRemoteHost);
LONG ICMPGetReply();
void ICMPEndUsage();
Bu fonksiyonlardan ICMPSendPing fonksiyonu parametre olarak IP adresni almaktadr ve IP
adresi big endian yapsnda saklanmaktadr. Yani 192.168.1.222 adresi 0xC0A800DE olarak
geilmelidir. ICMPSendPingToHost fonksiyonu parametre olarak DNS ad almaktadr.Bu kullanm iin
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.8 MPFS2 S y f | 32 Microchip TCP/IP Stack V5.20

DNS modl etkinletirilmi olmaldr.Ayn ekilde ping isteinde bulunulacak DNS adresi program
belleimizde yer alyorsa ICMPSendPingToHostROM fonksiyonu kullanlmaldr.Ping isteinden sonra
ICMPGetReply fonksiyonu ile cevab alrz.Geri dn deeri -3 ise DNS adresi zmlenemedi, -2 ise
henz ping cevab gelmedi, -1 ise zaman amna ugrad (varsaylan 4 saniye), sfra eit ve byk ise
istek yapldktan sonra geen TICK saysdr.rnek olarak PingDemo.c dosyas incelenebilir.
3.8 MPFS2
MPFS2 Microchip tarafndan TCP/IP Stackin de kullanlmak zere gelitirilmi basit bir dosya
sistemidir.Bu sistem HTTP2 web sunucu modl ve SNMP modlnde kullanlmaktadr.MPFS2 ile
oluturulmu dosyalar harici EEPROM, PIC in dahili program hafzas yada seri FLASH ta saklanabil-
mektedir. MPFS2 ile harici hafza olarak 1Mbit e kadar olan 25AA/LCXXX EEPROM larn ve 32Mbit a
kadar olan SST 25VFxxxB seri FLASH larn kullanabiliriz.EEPROM veya FLASH kullanm TCPIPConfig.h
dosyasnda belirtmemiz gerekmektedir.Ayrca 1Mbit lik EEPROM kullanacamz belirtmemiz
gerekmektedir.nk MPFS2 ile dosya byklne gre adresleme yaplmaktadr. Standart olarak
16 bitlik adresleme ile 32KB a kadar adresleme yapabiliyorken 24bitlik adresleme modu ile 2MB a
kadar ve 32bitlik adresleme modu ile 2GB a kadar adresleme yapabiliriz.Hangi hafzann seilecei
TCPIPConfig.h dosyasnda belirtilmitir.
//#define STACK_USE_MPFS //Standart dosya sistemi.Gemi projeler iin
#define STACK_USE_MPFS2 //HTTP2 iin gelitirilmi dosya sistemi

#define MPFS_USE_EEPROM //Dosyalar saklamak iin EEPROM kullanlacak
//#define MPFS_USE_SPI_FLASH // Dosyalar saklamak iin FLASH kullanlacak

//#define USE_EEPROM_25LC1024 //1Mbit EEPROM kullanlacak

#define MPFS_RESERVE_BLOCK (137ul)
Bu bildirimlerin hepsi yorum satr olarak braklrsa MPLAB projemizi dahili hafzada alacak
ekilde derler ve web sayfalarn PIC in program hafzasna yerletirir.Ayrca hafza birimlerinin
banda bir miktar rezerve alan Stackin kullanm iin bo brakmamz gerekmektedir. Bu alan dona-
nmn bazbilgilerini saklamak iin kullanlmaktadr. EEPROM ile alacaksak bu deer yukarda
grld gibi 137 byte tr. FLASH ile alacaksak bu alan 4096 byte olmaldr.Ayrca HTTP zerinden
ykleme yapacaksak TCPIPConfig.h dosyasnda
#define HTTP_MPFS_UPLOAD "brsupload"
satrn belirtmemiz gerekmektedir.Bu deeri kullanarak ekil 3.9 da gsterildii gibi dosyalarmz
sunucumuza ykleyebiliriz.Bu ykleme ilemi HTTP nin POST metodunu kullanlarak yaplmaktadr. Bu
yzden uygulamanz derlerken post zelliini ve HTTP zerinden dosya ykleme zelliini etkin hale
getirmeniz gerekmektedir.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 33 3.9 NBNS





ekil 3.9 HTTP zerinden dosya ykleme
3.9 NBNS
NetBIOS sim Servisi (NetBIOS Name Service) DNS gibi IP numaralarnn isimler ile ilikilendiril-
mesini salar.Fark NBNS altalar iindir ve ayn adaki cihazlar aras kullanlr.Bu isimlendirme insan-
larn isimleri daha kolay hatrlamas sonucu IP adreslerinin hatrlanma zorluunun nne geer.
rnein Mutfak Bilgisayari, Barisin Bilgisayari gibi isimler IP adreslerine nazaran ok daha aklda
kalcdr.Bizim devremizde NBNS modln TCPIPConfig.h dosyasndaki aadaki tanmlamalar ile
kullanabiliriz.
#define STACK_USE_NBNS
#define MY_DEFAULT_HOST_NAME "BRSMNC"
Aada ekil 3.10 da NBNS servisinin altn grebilirsiniz.

ekil 3.10 NBNS adna ping istei
ICMP balndaki ekil 3.7 ile karlatrldnda BRSMNC adnn 192.168.1.222 ile
ilikilendirilmi olduunu gryoruz.

3.10 SMTP
Basit Mail Transfer Protokol (Simple Mail Transfer Protocol) e-posta gndermek iin sunucu
ile istemci arasndaki kurallar dzenleyen bir protokoldr. Port numaras 25 tir. stemciler SMTP
protokoln kullanarak eitli sunuculardan e-posta gnderebilirler.Bu sunucularn en yaygn ve
bilinenleri Gmail ve Hotmail dir.Bunlar gibi birok e-posta sunucusu vardr.Gmail ve Hotmail mail
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.10 SMTP S y f | 34 Microchip TCP/IP Stack V5.20

istemcilerden gelen gvenli balantlar kabul eder (SSL) .Bu servisleri kullanabilmek iin nce bu
sunuculara ye olmanz gerekmektedir. nk mail gnderirken balant onay gerekmektedir.
Gvenli balantlarn (SSL) port numaras 465 tir.Aada Gmail ve Hotmail iin gereken SMTP ayarlar
verilmitir.
GMAIL
Sunucu: smtp.gmail.com
Kullanc Ad:Kayt olurken girdiiniz kullanc ad
(rn: brssmnc@gmail.com)
ifre: Kayt olurken girdiiniz ifre
Port numaras: SSL iin 465 / TLS iin 587
HOTMAIL
Sunucu: smtp.live.com
Kullanc Ad: Kayt olurken girdiiniz kullanc ad
ifre: Kayt olurken girdiiniz ifre
Port numaras: SSL iin 465 / TLS iin 587
Bizim Stack uygulamamzda SMTP istemci modln desteklemektedir. Bu modl aktif
etmek iin TCPIPConfig.h dosyasndan #define STACK_USE_SMTP_CLIENT bildiriminin yaplmas
gerekmektedir. Daha sonra baz SMTP fonksiyonlarn sras ile ararak mail gnderebiliriz. Bu
fonksiyonlar SMTP_POINTERS yaps trnden SMTPClient adl deikeni kullanrlar. Gndere-
ceimiz mailin bilgilerini SMTPClient deikeni ierisine doldururuz ve daha sonra fonksiyonlar
kullanarak mail gnderme ilemini balatrz. Gndereceimiz bilgiler RAM de veya ROM da olabilir.
ROM dan gndereceksek SMTPClient.ROMPointers bayraklarnn set edilmesi gerekmektedir. Eer
gndereceimiz bilgiler RAM zerinde ise bu bayraklar temizlenmelidir.RAM zerinden gndermeye
rnek olarak, HTTP2 modlmzn POST zelliini kullanarak, devremiz zerinde barndrdmz
HTML sayfalardan mail gnderebiliriz. Bu bilgiler nce RAM e yazlmakta daha sonra SMTP
fonksiyonlar ile mail gnderilmektedir.eriini doldurmamz gereken SMTPClient deikeni ve nasl
kullanld aada gsterilmitir.Bu rnekte ROM da yer alan mailimiz buton1 e basldnda
gnderilmektedir.
SMTPClient.To.szROM = (ROM BYTE*)"brssmnc@gmail.com";//Gnderilecek adres
SMTPClient.ROMPointers.To = 1;

SMTPClient.Body.szROM = (ROM BYTE*)"Mesaj govdesi.Gonderilecek mesaji yaz";
SMTPClient.ROMPointers.Body = 1;

SMTPClient.Server.szROM = (ROM BYTE*)"smtp.gmail.com"; //Sunucu adresimiz
SMTPClient.ROMPointers.Server = 1;

SMTPClient.Username.szROM = (ROM BYTE*)"brssmnc@gmail.com";//Kullanc admz
SMTPClient.ROMPointers.Username = 1;

SMTPClient.Password.szROM = (ROM BYTE*)"Kayt olurken girdiiniz ifre";
SMTPClient.ROMPointers.Password = 1;

SMTPClient.From.szROM = (ROM BYTE*)"Gnderilen mesajn kimden gnderildii";
SMTPClient.ROMPointers.From = 1;

SMTPClient.Subject.szROM = (ROM BYTE*)"Mesaj bal";
SMTPClient.ROMPointers.Subject = 1;

SMTPClient.ServerPort=465; //Gmail SSL portu.
SMTPClient.UseSSL=1; //Gvenli SSL balants kullanyoruz.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 35 3.11 Reboot




Yukardaki rnekte mailimiz 465 portunu kullanacak ekilde gvenli balant (SLL) ile iletiliyor.
Gmail gveli balant kabul ettii iin SSL protokoln TCPIPConfig.h dosyasnda tanmlamamz
gerekmektedir. Bunu #define STACK_USE_SSL_CLIENT bildirimi ile yapyoruz.SSL kodlar Stack
uygulamamza dahili olarak gelmiyor malesef.Bu kodlar microchipdirect sitesinden SW300052 -
Data Encryption Libraries adyla uan iin $5 gibi bir crete satn almanz gerekmekte.Bu kodlar
projemize eklemeden projemizi derlemeye alrsak ARCFOUR.c dosyas bize hata oluturacak ve
projemiz derlenmeyecektir.Bu kodlar satn aldysanzda programmz SMTP mail modl ve SSL
modl dier modlleride kullandndan 64K hafzas olan 18F4620 ye smayacaktr.Eer
devrenizden Stack 5.20 ile mail gndermek istiyorsanz daha yksek hafzal bir ilemci
kullanmalsnz.Yukardaki kodlar SMTPDemo.c dosyasnda bulabilirsiniz.
SMTPClient deikenini doldurtuktan sonra SMTP fonksiyonlarn kullanarak mail gnderimini
gerekletiririz. Bunun iin nce SMTP modlnn kullanma amak iin SMTPBeginUsage()
fonksiyonunu armamz gerekmektedir.Fonksiyon TRUE dnyorsa SMTP modln kullanabiliriz
demektir.Ardndan SMTPSendMail() fonksiyonu ile mail gnderimini balatrz.Bundan sonra ana
dngmzdeki StackTask() fonksiyonu herarldnda SMTPTask() fonksiyonunu aracak ve
mailimiz adm adm gnderilecektir.Mailimizin gnderim durumunu renmek iin SMTPIsBusy()
fonksiyonunu arrz.Bu fonksiyon TRUE dnyorsa mail gnderme ilemi devam ediyor,FALSE
dnyorsa mailimiz gnderilmi, yada bir hata sonucu sonlanm demektir.Sonucu renmek iin ve
SMTP modln serbest brakmak iin SMTPEndUsage() fonksiyonunu arrz.Bu fonksiyon geriye
hata kodunu dnmektedir. Tanmlanm hata kodlar unlardr.
#define SMTP_CONNECT_ERROR (0x8001u)
#define SMTP_RESOLVE_ERROR (0x8000u)
#define SMTP_SUCCESS (0x0000u)
Bu kodlar SMTPDemo.c dosyas ierisinde bulunabilir.Eer SSL gerektirmeyen sunucu
kullanrsanz 25 numaral portu kullanmanz gerekmektedir. Port belirtmezseniz SMTP.c dosyasnda
varsaylan olarak tanmlanm olan 25 numaral port kullanlr.Posta gndermede sknt yayorsanz
25 numaral portunuz servis salaycnz (ttnet) tarafndan kapatlm olabilir.Mteri hizmetlerini
arayp renebilirsiniz.Ayrntl bilgiyi burdan alabilirsiniz.
3.11 Reboot
Reboot modl kullanclara, TCPIP kodlar alan devreye uzaktan eriip yeniden balatma
imkan vermektedir.Bu modl zellikle bootloader uygulamalarnda kullanlmaktadr.Internet ze-
rinden gnderilecek firmware lerin PIC e yklenebilmesi iin ilemci reboot edilerek bootloader
rutinine girilir ve gnderilen kodlar bootloader yazlm tarafndan PIC in hafzasna yazlr.Reboot
modln aktif etmek iin TCPIPConfig.h dosyas ierisinde #define STACK_USE_REBOOT_SERVER
bildirimi yaplmaldr.Ayrca Reboot.c dosyasnda aadaki tanmlamalar yaplmtr.
#define REBOOT_PORT 69
#define REBOOT_SAME_SUBNET_ONLY
Bu tanmlamalardan ilki, reboot modl iin varsaylan portu 69 olarak ayarlamaktadr. kinci
tanmlama yaplm ise ayn alt adan gelecek isteklere izin verilmektedir.Internet zerinden
bakalarnn kodlar deitirmesi bu ekilde engellenebilir.Reboot modl 69 numaral portu
dinlemektedir. 69 numaral porta UDP zerinden R karakteri geldiinde ilemci reboot edilir. rnek
uygulamalar eitli ilemciler iin TCPIP Internet Bootloader App dizininden inceleyebilirsiniz.
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.12 SNMP S y f | 36 Microchip TCP/IP Stack V5.20

3.12 SNMP
Basit A Ynetimi Protokol (Simple Newtwork Management Protocol) a yneticilerine alar
zerindeki donanmlar ynetebilme imkan sunmaktadr.Byk alarda tercih edilen bir protokoldr.
A zerindeki cihazlar arttka bu cihazlarn balant zelliklerini, hzlarn, balant srelerini kontrol
eden kurallar belirler. versiyonu vardr ve bizim uygulamamz v2C yi desteklemektedir. Gvenlik
aklarnn olmas dolaysyla yaygnlamamtr ve kiisel alardada tercih edilmez. Uygulamalarnzda
kullanmak iin TCPIPConfig.h dosyasndaki #define STACK_USE_SNMP_SERVER bildirimini yapmanz
gerekmektedir.Daha detayl bilgi iin CustomSNMP.c dosyasn inceleyebilirsiniz.

3.13 SNTP
Simple Network Time Protocol adaki donanmlarn saatlerini gncel tutmas amal kulla-
nlmaktadr.Bizim devremizdede bu protokol kullanarak internet zerindeki sunuculardan zaman
alabiliriz.Devremizde bu protokol kullanabilmek iin DNS modlnnde aktif olmas gerekmektedir.
nk balanacamz sunucunun DN zmlemelerinin yaplmas gerekmektedir.Balanacamz
sunucu ve SNTP ile ilgile olan baz tanmlamalar aada gsterilmitir.
//#define NTP_SERVER "pool.ntp.org"
#define NTP_SERVER "tr.pool.ntp.org"
#define NTP_QUERY_INTERVAL (10ull*60ull * TICK_SECOND)
Normalde varsaylan olarak pool.ntp.org sunucusu kullanlr.Fakat biz tr.pool.ntp.org
sunucusu iin GMT+2 de olan lkemiz iin zaman alrz.Bunun gibi tm dnya saatleri ilgili sitede
bulunabilir.Devremiz saat gncellemesini 10 dakikada bir yapmaktadr. Yukardaki tanmdan bunu
grebilirsiniz.Bu sunuculardan alnan zamanUNIX Time olarak bilinen 1 Ocak 1970 - 00:00:00 dan
bu yana geen saniyelerin saysdr.Bu tarih UNIX sistemlerin doum yl olarak kabul edilmitir. rnek
olarak geri dnen saniye saysn bir yldaki saniye saysna blp 1970 eklerseniz, kalan bir aydaki
saniye saysna blp 1 eklerseniz yl ve ay bulursunuz.Ayn ekilde devam ederseniz tm okunabilir
tarihi elde etmi olursunuz. ekil 3.11 de sunucudan geri dnen zaman grlmektedir.Bu zaman
SNTP modlnden SNTPGetUTCSeconds
fonksiyonu ile alrz. Aada bu zamann
nasl lcd ye yazdrld gsterilmitir.
ultoa( SNTPGetUTCSeconds() ,LCDText);
LCDUpdate();

ekil 3.11 Sunucudan geri dnen UNIX zaman .
3.14 SSL
SSL modl TCP katmanna verileri ifreleyerek gnderme destei sunmaktadr.A dinleyen
yazlmlara kar gvenlik salar.Alveri siteleri, mail sunucular gibi bir ok uygulama gvenlik iin
SSL kullanmaktadr. Bizim stack kodlarmzda SSL destei vermektedir fakat kodlar Stacke dahil deil-
dir.Bu kodlarhttp://www.microchipdirect.com/productsearch.aspx?Keywords=SW300052adresinden
5$ karlnda indirebilirsiniz. Kod numaras SW300052 dir.Bu kodlar SSLv3 destei vermektedir.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 37 3.14 SSL




3.14.1 SSL stemci Destei
SSL istemcisi olabilmek iin nce TCPIPConfig.h dosyasndan #define STACK_USE_SSL_CLIENT
bildirimini yapmamz gerekmektedir.Daha sonra TCP balants kurmamz gerekmektedir.Daha sonra
TCPStartSSLSession fonksiyonunu ararak el skma (handshake) ilemlerini balatmamz gerek-
mektedir. Bu fonksyion am olduumuz TCP balantsnn handle deerini alr ve bildirimi u
ekildedir.
BOOL TCPStartSSLServer(TCP_SOCKET hTCP);
BOOL TCPSSLIsHandshaking(TCP_SOCKET hTCP);
Geri dn deeri TRUE ise SSL balants salanm demektir.FALSE deeri yetersiz bilgi anla-
mna gelmektedir.El skma ilemi sertifika sunucusu tarafndan salanan anahtar kullanmaktadr.
1024 bite kadar olan anahtarlar kullanlabilir. El skma ilemi balatldnda ilemin bittiini anlamak
iin yukarda bildirimi gsterilen TCPSSLIsHandshaking fonksiyonu FALSE dnnceye kadar arlma-
ldr.TRUE dnyorsa el skma ilemi devam ediyor demektir. El skma ilemleri baaryla
tamamlandktan sonra balantmz artk 128-bit ARCFOUR ifrelemesi ile korunuyor demektir. Eer
baarsz bir sonu aldysak SSL standartlarna gre TCP balantmzda sonlandrlr. Daha hzl
performans iin SSL modl sk yaplan balantlar nbelleklemektedir.Bylece en ok kullanlan
balantlar iin yeni ilemler yapmak gerekmez.Bu ayarlar TCPIPConfig.h dosyasndaki SSL Options
bal altnda bulabilirsiniz.Varsaylan olarak iki balant nbelleklenmektedir.
SSL istemci destei aktif edildiyse ve SMTP modl iin SMTPClient deikeninin UseSSL alan
set edilmi ise,SMTP balantlar gvenlikli olarak kurulmaktadr. SMTP.c dosyasn inceleyebilirsiniz.
3.14.2 SSL Sunucu Destei
SSL sunucu desteini balatmak iin nce TCPOpen() fonksiyonu ile soket almaldr. Bu
fonksiyon uygulama katmanndaki kaynaklara bir soket salamaktadr.Daha sonra TCPAddSSLListener
fonksiyonu ile farkl portlardan gelen balant istekleri deiimli olarak dinlenir.Fonksiyonlarn
bildirimi aadaki gibidir.Varsaylan olarak bir soket ile iki port kullanlabilir.
TCP_SOCKET TCPOpen(DWORD dwRemoteHost,BYTE vRemoteHostType,
WORD wPort,BYTE vSocketPurpose);

BOOL TCPAddSSLListener(TCP_SOCKET hTCP,WORD port);
BOOL TCPIsSSL(TCP_SOCKET hTCP);
Alan portta temel olarak balantlar gvensiz olarak salanmaktadr.Fakat gvenli balant
portundan bir balant geldiinde nce el skmas gereklemesi gerekmektedir.Eer uygulamanzda
gvenli balantlar tercih etmek istiyorsanz normal bir port ap gelen balantlar TCPIsSSL fonksi-
yonu ile gvenlimi deilmi diye kontrol etmeniz gerekmektedir.Bu fonksiyonun bildirimi yukarda
yaplmtr. STACK_USE_SSL_SERVER bildirimi yapldnda HTTP2 kodlar gvenli balantlar
otomatik olarak etkinletirmektedir.Varsaylan olarak HTTP2 modl normal balantlar iin 80 numa-
ral portu, gvenli balantlar iin 443 numaral portu dinlemektedir.
3.14.3 Kstlamalar
SSL yksek ilem gc ve hafza kayna olan kiisel bilgisayarlar iin tasarlanmtr.Bu yzden
snrl bellek ile alan gml uygulamalar iin tam SSL destei salanamayabilir.Bellek tasarrufu
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.15 TCP S y f | 38 Microchip TCP/IP Stack V5.20

yapmak iin SSL gerektiinde kullanlmaldr.SSL istemci modl herhangi bir sertifika dorulamas
yapmaz.Dorulama iin gereken sertifikalar iin bellek gerekmektedir.Bu yzden gvenlik tam olarak
salanamaz.Baz kiiler iin gvenlik aklar oluabilir.
3.15 TCP
TCP ( Transmission Control Protocol ) protokol, TCP/IP referans modelindeki tama katma-
nnn iki protokolnden birisidir.Gvensiz alar zerinden ak tabanl gvenli balantlar sunar. HTTP,
SMTP, FTP gibi protokoller iin temel oluturur.TCP zerinden yaplan balantlarda verinin iletilecei
garanti altna alnr.Yaplan balantlar el skma ilemlerinden getiinden utan uca balantlar
garantilenir.Uzak dmler ne kadar veri almaya hazr olduklarn duyururlar ve gnderici dmler
ona gre veri gnderirler. Gnderilen tm veriler iin onay mesaj (ACK) alnmaldr. Onay mesaj gn-
derene ulamassa veya hata mesaj ularsa gnderici mesaj tekrar tekrar gndermek zorundadr. Bu,
haberlemede oluan bozuk verileri, kayp verileri nler ve paketler otomatik olarak dzeltilir.
Bunlar salamak iin TCP modl tampon bellek ile almaktadr.Gnderici tampon dolu ol-
duunda ve alc onay mesaj vermedike tampona yeni veri eklenemez. Ayn ekilde alc tampon
dolu iken veya gndericiye onay mesaj gndermedike, gnderici dm yeni verileri gnderemez.
Bu durumlarda uygulama yazlm stack ana dngsne dnerek stack grev fonksiyonlarn ileterek
haberlemenin salanp bo alan almasn salar.ekil 3.12 de TCP modlnn almasn gsteren
ak diyagram verilmitir.

ekil 3.12 TCP ak diyagram
Utan uca yaplan TCP balantlar soket ad verilen balantlar ile yaplmaktadr. Soketler
TCPOpen fonksiyonu ile almaktadr.Bu ve dier fonksiyonlarn bildirimleri aadadr.
TCP_SOCKET TCPOpen(DWORD dwRemoteHost,BYTE vRemoteHostType,
WORD wPort,BYTE vSocketPurpose );
BOOL TCPIsConnected(TCP_SOCKET hTCP);
BOOL TCPWasReset(TCP_SOCKET hTCP);
WORD TCPIsPutReady(TCP_SOCKET hTCP);
BOOL TCPPut(TCP_SOCKET hTCP,BYTE byte);
void TCPFlush(TCP_SOCKET hTCP);
WORD TCPIsGetReady(TCP_SOCKET hTCP);
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 39 3.15 TCP




BOOL TCPGet(TCP_SOCKET hTCP,BYTE* byte);
#define TCPFind(a,b,c,d) TCPFindEx(a,b,c,0,d)
WORD TCPFindEx(TCP_SOCKET hTCP,BYTE cFind,WORD wStart,
WORD wSearchLen,BOOL bTextCompare);
void TCPDisconnect(TCP_SOCKET hTCP);
Fonksiyonlar iin detayl bilgiyi Stack API lerinde bulabilirsiniz.sim ve parametre olarak anla-
lr fonksiyonlardr.TCPOpen fonksiyonu ile soket alarak istemci dmlerden gelecek olan istekler
dinlenmekte yada uzak dmlere isteklerde bulunulmaktadr.Geriye alan soketin handle deerini
dnmektedir.Uzak dm DNS ad (www.microchip.com), NBNS (BRSMNC), IP adresi (192.168.1.222)
yada nceden zlm IP veya MAC bilgisini barndran NODE_INFO yaps ile tanmlanabilir.Eer
soket alamyorsa TCPIPConfig.h tan TCP default soket saysn arttrmay deneyebilirsiniz.Bir kere
balant salandktan sonra uygulamalar veri gnderebilir veya alabilir.Fakat her dngde modle
girite, yazlmnz soketin hala bal olup olmadn bildiren TCPIsConnected fonksiyonunu ar-
maldr.
Veri gndermek iin nce gnderim tamponunda ne kadar bo yer olduunu bize syleyen
TCPIsPutReady fonksiyonu arlmaldr.Geri dn deeri gnderilebilecek byte says kadardr.Daha
sonra herhangi bir TCPPut fonksiyonu arlarak veriler tampon bellee yazlmaktadr. TCPPut
fonksiyonu bir byte lk veri yazmaktadr.Fakat string yazan,ROM bellekten yazan trleride vardr. Veri
tampona yazldktan sonra TCPFlush fonksiyonu ile gnderimi balatlr ve uygulama tekrar main
dngsne geri dner.Daha sonraki TCP modl kodlarna girite gnderici tamponun yars doluysa
yada belli bir sre getiyse (varsaylan 40ms) tampondaki verilerin gnderimi otomatik olarak
balatlr.
Veri almak iin ise nce TCPIsGetReady fonksiyonu arlarak ne kadar veri okunabileceini
renmemiz gerekmektedir.Daha sonra veri gndermede olduu gibi TCPGet ailesinden bir fonksiyon
ile verimizi okuruz.TCPGet bir byte veri okurken eitli alternatifleri string okumaktadr. Aranan bir
veri varsa veriyi okumadan nce tampondaki yerini bulmamz gerekmektedir.Bunuda TCPFind
makrosu ile yaparz.Bu makro uzunluk bilgisi 0 olacak ekilde TCPFindEx fonksiyonunu
armaktadr.Bu fonksiyon aradmz karakterin tampondaki yerini geri dnmektedir.Fakat geri
dnlen indis ilk bulunan karakterindir. Bu aradmz bilgiye ait olmayabilir. Yine okuma ve yazma
fonksiyonlarnda olduu gibi TCPFind fonksiyonlarnnda string arayacak ekilde trevleri
vardr.Okunacak tm veriler okunduktan sonra ak tekrar main deki ana dngye vermemiz
gerekmektedir.
imiz bitip balanty sonlandrmak istediimizde TCPDisconnect fonksiyonunu armamz
gerekmektedir.Bu fonksiyonu arp ana dngye dnmeli ve kar tarafn balant kesme isteini
onaylamasn beklememiz gerekmektedir.Daha sonra soketler yeni balantlar dinlemek zere bota
durumuna dnerler.Eer kendiniz TCP uygulamas gelitiriyorsanz TCPIPConfig.h dosyasnda soket-
lerini bildirmeniz gerekmektedir.Bunu TCPIP Configuration Wizard arac ile yaparsanz daha salkl
olacaktr.Daha fazla bilgi iin API leri, GenericTCPClient.c, GenericTCPServer.c dosyalarn inceleyebi-
lirsiniz.Bu dosyalar uygulamanza dahil etmek iin TCPIPConfig.h dosyasndaki bildirimler aadaki
gibi yaplmaldr.
#defineSTACK_USE_GENERIC_TCP_CLIENT_EXAMPLE
#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.16 TELNET S y f | 40 Microchip TCP/IP Stack V5.20

3.16 TELNET
TELNET yerel a zerinden veya internet zerinden iki dmn interaktif olarak karlkl
olarak haberlemesini salar.Microchip in Stack ine eklenen TELNET kodlar istemciden gelecek olan
istekleri beklemektedir.Eer bir istek gelirse kullancya kullanc ad ve ifre sorulmaktadr. Kullanc
baar ile giri yaptysa programmz boardun gncel durumunu ve deikenlerin deerlerini periyodik
bir ekilde istemciye yanstmaktadr.Stack teki TELNET modl yeterince gelitirilmemitir ve birok
TELNET komutunu desteklememektedir.TELNET ilk olarak 4.00 versiyonu ile beta olarak eklenmitir
ve 4.02 versiyonu ile birlikte release olmutur fakat dediimiz gibi eksiklikleri hala vardr.Bu
srmden beri gelitirilmeyi beklemektedir.Aada TCPIPConfig.h dosyasnda TELNET modln
kullanabilmemiz iin gereken tanmlamalar gryorsunuz.
#define STACK_USE_TELNET_SERVER
#define TELNET_USERNAME "baris"
#define TELNET_PASSWORD "samanci"
imdi Windows Telnet program ile devremize balanp durumunu izleyelim.Aada ekil
3.13 de ilemler ve ktlar gsterilmitir. (NBNS ad yerine IP adresi kullanabileceimizi unutmayalm)

ekil 3.13 TELNET sunucusuna balanmak ve devredeki donanmlar izlemek

3.17 Tick
Tick modl stack uygulamamz iin gereken hassas zaman lmlerini yapmaktadr. 8bitlik
ilemcilerde timer0, 16bit veya 32bit ilemcilerde timer1 kullanlmaktadr.Modl kesmeler ile
srldnden hassas ve kararldr.Gerek zaman uygulamalar gelitirilebilir.Stack kodlarna zaman
lm ve zaman am gibi bilgileri salamak iin yazlmtr.Geciktirme fonksiyonlar yerine tick
modlnn kullanlmas ok daha verimli olacaktr.nk geciktirme fonksiyonlarnda ilemci hi bir
i yapmayan bo dnglerde oyalanmakta ve bu zaman dier modller iin boa geen bir zaman ol-
maktadr.Halbuki tick modl geen sreyi karlatrmakta bylece boa harcanan zaman
olumamaktadr.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 41




Yapmanz gereken o andaki tick saysn bir kenera almak, daha sonraki arlarda yeni tick
saysndan eski tick saysn karmaktr.Bu deer rnek olarak saniyedeki tick says ile karla-
trldnda art salanm ise istenilen ilem geekletirilir.Buna rnek olarak aadaki kodu inceleye-
bilirsiniz. 0.5sn sreler ile LED0 i terslenmektedir.
if(TickGet() - t >= TICK_SECOND/2ul)
{
t = TickGet();
LED0_IO ^= 1;
}
Kullanlan fonksiyonlar ve bildirimler aada gsterilmitir.Bu fonksiyonlar kullanarak birka
mikrosaniyeden birka yla kadar gecikme salayabilir, alarm kurabilirsiniz.Geen tick says 48 bitlik
bir deikende saklanmaktadr.
DWORD TickGet(); //Tick deikeninin alt 32 biti geri dner
DWORD TickGetDiv256();//Tick deikeninin orta 32 biti geri dner.
DWORD TickGetDiv64K();//Tick deikeninin st 32 biti geri dner

#define TICKS_PER_SECOND ((GetPeripheralClock()+128ull)/256ull)
#define TICK_SECOND ((QWORD)TICKS_PER_SECOND)
#define TICK_MINUTE ((QWORD)TICKS_PER_SECOND*60ull)
#define TICK_HOUR ((QWORD)TICKS_PER_SECOND*3600ull)


3.18 FTP
FTP protokol uygulamamz HTTP ile derlediysek sunucuya dosya aktarmaya yarayan bir
protokoldr. HTTP2 destei ile birlikte rafa kaldrlmtr.nk HTTP2 ile gelen POST metodu yardm
ile sayfalarmz HTML zerinden sunucumuza aktarabiliriz.FTP program olarak Microsoftun FTP
programn kullanabiliriz. LegacyHTTPApp.c dosyasnda FTP kullanc ad baris, ifre ise samanci
olarak tanmlanmtr.Bu bilgileri giri yapmak iin kullanacaz.Aada ekilde 3.14 te Microsoft FTP
program kullanlarak web sayfalarnn nasl upload yapld gsterilmitir.

ekil 3.14 FTP ile web sayfalarnn sunucuya upload ilemi
Bu rnek eski stack versiyonlar kullanlarak yaplmtr.Web safyalar yklenmeden nce
MPFS arac ile MPFS formatna evrilmelidir.Bu formatta tm dosyalar ayn dizinde olmal ve isimleri
8.3 dosya yapsna uymaldr.Aada tanmlamalar gsterilmitir. D alardan eriebilmek iin
05 / 2010 | Bar SAMANCI


www.barissamanci.net




3.19 TFTP S y f | 42 Microchip TCP/IP Stack V5.20

modeminizde 21 ve 20 numaral portlar ynlendirmeniz gerekmektedir.Bu konu blm 6.1 de port
ynlendirme balnda anlatlmtr.Ayrca FTP uygulamas eski stack srmleri ile denenmitir.
#define FTP_COMMAND_PORT (21u)
#define FTP_DATA_PORT (20u)
ROM char FTP_USER_NAME[] = "baris";
ROM char FTP_USER_PASS[] = "samanci";

3.19 TFTP
Trivial File Transfer Protocol UDP tabanl yazlmlar iin gvensiz dosya ykleme ve indirme
destei sunmaktadr.Basit yapsndan dolay az bellek tketir ve fonksiyonel olarak FTP ye benzemek-
tedir.TCPIPConfig.h dosyasnda #define STACK_USE_TFTP_CLIENT bildirimi ile kullanlabilir.

3.20 UDP
UDP (User Datagram Protocol) protokol, TCP/IP referans modelindeki tama katmannn iki
protokolnden birisidir.Hzl fakat gvensiz balant sunmaktadr. SNTP, SNMP, DNS ve baka proto-
koller iin temel oluturmaktadr. Gnderilen verilerin yerine ulap ulamad kontrol edilmez.Bu
yzden kontrol mekanizmas barndrmaz ve TCP ye gre 2-3 kat hzl almaktadr.Genellikle ses, g-
rnt gibi verilerin aktarmnda kullanlmaktadr.Veriler veribloklar halinde paketlenip gnderilirler
ve her paket birbirinden habersiz ve bamszdr.TCP de ise ak tabanl (stream based) iletiim
kullanlmaktadr.UDP paket tabanl olduu iin btnl salamak amacyla uygulama yazlmnz
ana dngye dnmeden nce herbir paketi oluturmal ve gndermelidir.Bu gnderim ilemleri bir
evride yaplmaldr. Ayr ayr alnan paketler alcda birletirilir.
Bir paket alndnda gereken kodlar paketi ilemek iin arlmaldrlar.Bir sonraki armda
eski paketler geerliliini yitirir ve kaybolurlar.Bu yzden ya paketleri ileyecek tm ilemler
yaplmaldr yada bir sonraki arlar iin paketler hafzada saklanmaldr.Aada ekil 3.15 de UDP
modlnn kullanmn anlatan ak diyagram verilmitir.

ekil 3.15 UDP Ak Diyagram
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 43 3.20 UDP




Soketler UDPPoen() fonksiyonu ile almaktadr.Bu fonksiyon gelecek balantlar dinlemek
amacyla yada uzak dmlere istemci olarak balanmak iin soket amaktadr.Bu ve dier
fonksiyonlarn bildirimleri aada gsterilmitir.
UDP_SOCKET UDPOpen(UDP_PORT localPort,NODE_INFO * remoteNode,
UDP_PORT remotePort);
WORD UDPIsPutReady(UDP_SOCKET s);
BOOL UDPPut(BYTE v);
void UDPFlush();
WORD UDPIsGetReady(UDP_SOCKET s);
BOOL UDPGet(BYTE * v);
void UDPClose(UDP_SOCKET s);
Fonksiyonlar iin detayl bilgiyi Stack API lerinde bulabilirsiniz.sim ve parametre olarak anla-
lr fonksiyonlardr. UDPOpen ile soketi atktan sonra veri gndermeye hemen balayabilirsiniz. Uzak
dmlerin zmlemesini yapmak iin DNS veya ARP modllerinin kullanm gerekebilir.Soket ala-
massa TCPIPConfih.h dosyasndan UDP soket says arttrlabilir. Veri gndermek iin ne kadar veri
gnderebileceimizi renme amal olarak UDPIsPutReady fonksiyonu arlmaldr.Bu fonksiyon ge-
riye ne kadar veri gnderebileceimizi dnmektedir.Veri saysn rendikten sonra UDPPut ailesin-
den bir fonksiyonu kullanarak veri sokete yazlmaldr. Bu fonksiyon bir byte lk veri gndermektedir
fakat string, dizi, ve ROM bellekten veri gnderen trleride mevcuttur.Veri sokete yazldktan sonra
UDPFlush fonksiyonu ile gnderim balatlmaldr.Bu ilemler bir admda yaplmaldr. Veri sokete ya-
zldktan sonra UDPFlush fonksiyonu arlmadan ana dngye dnersek bir sonraki girite veriler
kayp veya bozulmu olabilir.
Veri almak iin ise UDPIsGetReady fonksiyonu arlarak nekadar veri okunabileceini reni-
riz geri dn deeri okunabilecek veri saysdr ve sfrdan farkl olmaldr.Daha sonra UDPGet fonksi-
yonu ile veriyi okuruz.Get aileside Put ailesi gibidir ve eitli fonksiyonlar vardr.Tm veri okunduktan
sonra veriyi ilemeli yada devam niteliindeki ek verileri beklemek iin ana dngye dnmeliyiz.Fakat
bu durumda okunan verileri bir kenara kaydetmemiz gerekmektedir nk bu verilerin geerlilii bir
stack evrimi kadardr.Ek verilerde alndnda tm verileri bir kerede ileyebiliriz.Bu TCP deki tampon
mekanizmasna benzemektedir fakat farkldr.Bir UDP soketi ile iimiz bittiinde gelecekteki
kullanmlar iin onu sisteme geri brakmalyz.Bu ii UDPClose fonksiyonu ile yaparz.
rnek olarak BerkeleyUDPClientDemo.c dosyasn inceleyebilirsiniz. Bu dosyada SNTP
sunucularndan birisine UDP zerinden istemci olarak balanlp zaman bilgisi okunmaktadr.



05 / 2010 | Bar SAMANCI


www.barissamanci.net




4.1 TCP/IP Configuration Wizard
Arac
S y f | 44 Microchip TCP/IP Stack V5.20

4. Kullanlan Aralar ve Programlar
4.1 TCP/IP Configuration Wizard Arac
Bu program TCPIPConfig.h dosyasn grsel bir arayz ile dzenlemektedir.Bu program, bu
dosyay en hzl ve en gvenli dzenleme yoludur.Kullanclarn hata yapmas engellenmekte ve hatal
olan ksmlar kullancya bildirilmektedir. Program alta TCPIPConfig.h dosyasnn yolunu almak-
tadr. Show Advanved Settings seenei ilede daha detayl konfigrasyon yapma imkan
salarz.Programn al ekran aada ekil 4.1 de gsterilmitir.

ekil 4.1 TCP/IP konfigrasyon sihirbaz
Next butonu ile sayfalar arasnda ilerleyip en sonunda Finish butonu ile ayarlamamz bitiririz.
Burada tek bir ekilde hata oluabilir oda soket ayrld halde ilgili modln aktif edilmemesi yada
tam tersi sonucu oluur.Program aada ekil 4.2 deki gibi bizi uyarmaktadr.Bu durumda ilgili soket
seilip count alanndan soket says 0 lanmal yada arttrlmaldr.Baz durumlarda DEFAULT soketi
says arttrlmas gerekebilir.Bu durumlar stack kodlarn incelerken grebilirsiniz.

ekil 4.2 TCP/IP konfigrasyon sihirbaz
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 45 4.2 MPFS2 Arac




4.2 MPFS2 Arac
MPFS2 acac bize dosyalarmz MPFS2 formatnda derlemekte ve ayn zamanda istersek
sunucuya yklememizde yardmc olmaktadr.Bu ara 4 ksmdan olumaktadr ve genel grnm
ekil 4.3 te gsterildii gibidir.

ekil 4.3 MPFS arac
Birinci admda radiobutton lardan Webpage Directory seili ise program bizden kaynak web
sayfalarnn olduu dizini istemektedir.Bu seenek seili ise websayfalar derlenerek nc ksmda
belirtilen proje dizinine belirtilen isimde kaydedilmektedir.Birinci admda Pre-Built MPFS Image
radiobutton seili ise ikinci ve nc ksm kaybolmaktadr.Bu durumda program daha nce
derlenmi imaj dosyasn istemekte ve drdnc admda sunucuya yklemeyi beklemektedir.
kinci admda ise program bizden websayfalarn
ne ekilde derlemek istediimizi sormaktadr. Burada
BIN Image seenei seili ise dosyalar harici hafzaya
yklenecek ekilde derlenmektedir.Eer C18/C32
seenei seili ise program web sayfalarn MPLAB iin
derleme esnasnda PIC in hafzasna yerletirebilmesi iin
C dosyas eklinde derler.ekil 4.4 te grlen Advange
Settings ksm bize dosyalar MPFS mi yoksa MPFS2
eklindemi derlemek istediimizi sorar. HTTP2 iin
MPFS2 seilmelidir.Ayrca burada dinamik deiken
ieren sayfalarmzn uzantlarn belirterek aracn bu
dosyalar sktrmamas salanmaktadr. Ayrca sktrl-
ekil 4.4 MPFS2 arac gelimi seenekler
05 / 2010 | Bar SAMANCI


www.barissamanci.net




4.3 Ethernet Discoverer S y f | 46 Microchip TCP/IP Stack V5.20

mamasn istediimiz dosyalarn uzantlarn Do Not Compress alannda belirtebiliriz.Ek olarak MPFS
klasik seili ise program bizden harici hafzann banda kullanlacak olan rezerve alann boyutunu
istemektedir.
Drdnc admda ise program bizden dosyalar
sunucuya yklemek isteyip istemediimizi sormaktadr.
Checkbox seili ise dosyalar derleme ileminden sonra
sunucuya yklemek istediimizi belirtiriz.Eer seili
deilse sadece dosyalar ikinci admda istenilen ekilde
derlenmektedir. ekil 4.5 te gsterilen Settings diya-
lounda Device Adress ile belirtilen yere kartmzn ip
adresini veya NetBIOS isim servisini kullanyorsak
kartmzn adn brsmnc eklinde yazyoruz. Upload
Path olarak TCPIPConfig.h dosyasnda belirttiimiz
brsupload deerini kullanyoruz. ekil 4.5 Ykleme seenekleri
Aada ekil 4.6 da grld gibi dosyalar baarl bi ekilde derlenip sunucumuza yklen-
mi oldu.Krmz kutucuklarda gsterildii gibi baz dosyalar sktrlmtr.Ayn zamanda sayfalarda
kullanlan dinamik deiken says dosyalarn sa tarafnda 3 vars eklinde belirtilmitir.

ekil 4.6 MPFS2 ykleme sonucu

4.3 Ethernet Discoverer

ekil 4.7 Microchip Ethernet Device Discoverer arac
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 47 4.4 MCHPDetect




Ethernet Device Discoverer program adaki donanmlar Announce protokol yardm ile
tespit etmeye yarar.Ayn zamanda adaki devremiz ile masast programlarn nasl haberleeceini
gsteren gzel bir rnektir.Programn arayz yukarda ekil 4.7 de gsterilmitir.
Program ilk aldnda veya Discover Devices butonu tklandnda uygulama adaki
cihazlara varsaylan port olan 30303 portundan "Discovery: Who is out there?" mesajn ieren bir
UDP paketini yaynlar.A zerindeki Announce protokol aktif edilmi cihazlar bu mesaj aldnda
UDP paketi ile yant verirler.Bu paket host adn (NBNS) ve MAC adresini iermektedir.Bizim
devremizinde bu isteklere cevap verebilmesi iin Announce protokoln ektif etmemiz
gerekmektedir.Bunu TCPIPConfig.h dosyasndaki
#define STACK_USE_ANNOUNCE
tanmlamas ile yapyoruz.
Bu programn kodlar Microchip tarafndan ak olarak yaynlanmaktadr ve Microsoft Visual
C# veya Visual Studio IDEleri ile derlenip altrlabilir.Bu program masast uygulamalar ile
yaptmz devreyi a zerinden haberletirebilmek iin gzel bir rnek sunmaktadr.Gnderilen UDP
paketi aadaki ekilde gnderilmektedir.
byte[] DiscoverMsg = Encoding.ASCII.GetBytes("Discovery: Who is out there?");
GlobalUDP.UDPClient.Send(DiscoverMsg,DiscoverMsg.Length,new
System.Net.IPEndPoint(System.Net.IPAddress.Parse("255.255.255.255"), 30303));

4.4 MCHPDetect
Bu program yardm ile Announce portu olan 30303 numaral porttan gelen UDP anons
paketlerini yakalayabilir ve ierdii bilgileri izleyebilirsiniz. rnek olarak blm 4.3 te anlatlan
Ethernet Discoverer programnn gnderdii mesaj ekil 4.8 de grebilirsiniz.

ekil 4.8 MCPHDetect



05 / 2010 | Bar SAMANCI


www.barissamanci.net




5.1 Ethernet Devresi S y f | 48 Microchip TCP/IP Stack V5.20

5. Uygulama Donanm
Bu blmde uygulamay yaptm devreyi ve dkmanlarn bulacaksnz.Dkman ve Proteus
ema izimlerini sktrlm paketin ierisindede bulabilirsiniz. Devreyi iki para olarak tasarladm.
Amacm ilemci ve ethernet donanmlarn paralayarak gerektiinde ethernet arayz olarak farkl
bir donanm yada ilemci donanm iin gerektiinde farkl bir ilemci donanm kullanabilmektir. Bu
ekilde donanmlara esneklik kazandrdm. Siz kendi izimlerinizi yapabilirsiniz.
5.1 Ethernet Devresi
lk donanm ethernet arayzn oluturan donanmdr.Bu donanmda ethernet denetleyicisi
olarak ENC28J60 kullandm. Bu entegre RJ45 kablosu ile ethernete balanmakta ve SPI arayz ile
ilemciler ile haberlemektedir. RJ45 balantsnn trafolu olmas gerekmektedir.Bunu standart bir
RJ45 soketi alp ethernet trafosu ekleyerek yada hazr trafolu, ledli konnektrleri kullanarak
yapabilirsiniz. Ben izimlerimde Amphenol firmasnn RJMG163118101NR kod numaral rnn
kullandm.ekil 5.1 de ENC28J60 n balantlar gsterilmektedir.

ekil 5.1 ENC28J60 balantlar
ENC28J60 entegresi 3.3V ile almaktadr.Fakat 5V
girilere tolerans vardr.Bu yzden 5V ile alan ilemcilerin
klarn direk olarak ENC28J60a balayabilirsiniz fakat araya
kk deerli diren koyulmas tavsiye edilmektedir.Ben kendi
devremde 180 luk direnler kullandm. 5V luk ilemcilere
kta ise 3.3V olan voltajn 5 volt seviyesine karlmas
gerekmektedir.Bunu ekilde 5.1 de grld gibi kk bir
eklenti ile yapabiliriz.ekil 5.1 de kesikli izgiler ile gsterilen
ksm 74HCT08 (AND) yada 74HCT125 (Buffer) olabilir.Ben
tercihimi 74HCT125 ten yana kullandm. ekil 5.2 de balant-
larnn nasl yaplmas gerektii gsterilmitir.

ekil 5.2 74HCT125 balantlar
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 49 5.2 lemci Devresi




Bahsi geen direnler ve 74HCT125i ethernet devresinin 3.3V luk dier devreler ile olan
uyumunu bozmamak iin ilemci devresine yerletirdim.Ethernet devresinin zerinde 3.3V luk voltaj
reglatr bulunmaktadr.Kullanc ethernet devresini 5V luk baka bir karta takacaksa 5 voltluk
besleme, balant soketinin bir numaral pininden dahili reglatr kullanarak 3.3 volta drlp
kullanlabilir.Eer modern beslemeye sahip 3.3V luk bir ilemci kartna taklacaksa reglatr iptal
edilip beslemeyi direk olarak iki numaral pin zerinden ilemci devresinden alabilirsiniz.ekil 5.3 te J1
ile gsterilen balant pinlerini inceleyip fikir sahibi olabilirsiniz.Ayrca ENC28J60 entegresinin
revizyon numarasna gre 2.32K, 2.7k gibi farkl RBIAS deerleri nerilmektedir. Ben ekil 5.1 de
gsterildii gibi 2K kullandm ve bir sknt ile karlamadm. Kristale balanan kondansatrleride 22pf
kullandm.
ENC28J60 zerine son olarak syleyebileceimde entegrenin g tketiminin biraz fazla
olduu. zellikle aa ilk balanmaya alrken ve devremize istek geldiinde g tketimi artyor.Bu
yzden entegrede bir lklk hissedebilirsiniz.
5.2 lemci Devresi
kinci devremiz asl olan ilemci devresidir.Bu devrede ilemci olarak 64K hafzaya sahip olan
18F4620 kullandm daha sonra hafzann baz uygulamalar iin az gelmesi sonucu 96K hafzaya sahip
18F4685 e getim.Klf tipleri ve pinleri ayndr.Hafzas fazla fakat CCP modl tektir dolaysyla tek
kanaldan PWM alabiliriz.Sizede tm zelliklerden yararlanmak istiyorsanz yksek hafzal bir ilemci
kullanmanz iddetle tavsiye ediyorum.Sadece web sunucusu olarak kullanp uzaktan led yakmak,
scaklk deeri okumak istiyorsanz 64K lk ilemcileri kullanabilirsiniz fakat altna inmenizi tavsiye
etmem.lemci kristal frekans 10MHz dir.Ayrca RA4 pininin set edilmesi ilemciyi resetlemektedir.
Oluturmu olduum web sayfalarn sakladm EEPROM da bu devre zerindedir. EEPROM
olarak 25AA256 kullandm. Bu 32KB lk bir EEPROM dur ve websayfalarnn boyutu 32KB
amamaldr.EEPROM ilede SPI zerinden haberlemekteyiz.lemcimizin dier birimler ile olan
balantlarn blm 2.3 te anlattm gibi HardwareProfile.h dosyasnda belirtmeniz gerekmektedir.
Devrede kullancy bilgilendirme amac ile LED ve bir LCD kullandm.Kullancdan komut
almak iinse 2 buton kullandm.Siz kendi tasarmnza gre ilemcinin bota kalan pinlerini kullanarak
bu saylar arttrabilirsiniz. Devre MAX232 kullanarak rs232 zerinden bilgisayarla haberlemektedir.
Ayrca uygulamalarda senaryo oluturmak amac ile devreye scaklk sensr ve motor src entegre
ekledim.Scaklk sensr olarak LM35D kullandm ve pozitif scaklklar lecek ekilde ilemciye
baladm.Motor src entegre iinse L293D kullandm. Bu entegre H kprs diyotlarn dahili
olarak barndrmaktadr.Baka bir src kullanacaksanz H kprs kurmanz gerekebilir. lemcinin
2 PWM pini bu srcye bagldr bylece hem yn hemde hz kontrol yapabilmekteyiz.lemciyi
devre zerinde programlayabilmek iin ICSP balants ekledim. Pinleri kendi kullandm
programlaycya gre tasarladm.ICSP ile programlama yapacaksanz kendi programlaycnza gre bu
pinleri modifiye etmelisiniz. Bota kalan pinleri ek balantlar yapma amac ile bir araya topladm
fakat pcbde kullanmadm.Devrenin fotorafnda extension pinlerini gremessiniz.
Bu devre zerine son syleyeceim kaliteli bir voltaj reglatr kullanmanz ve soutucu
takmanzdr.ENC28J60 fazla g ektiinden reglatr snmaktadr.

05 / 2010 | Bar SAMANCI




5.3 emalar

5.3 emalar
5.3.1 Ethernet Devresi

2010 | Bar SAMANCI www.barissamanci.net
S y f | 50 Microchip TCP/IP Stack V5.20

ekil 5.3 ENC28J60 Ethernet devresi


www.barissamanci.net
Microchip TCP/IP Stack V5.20

www.barissamanci.net

Microchip TCP/IP Stack V5.20

5.3.2 lemci Devresi
05 / 2010 | Bar SAMANCI
S y f | 51
ekil 5.4 lemci devresi
2010 | Bar SAMANCI
5.3 emalar



05 / 2010 | Bar SAMANCI


www.barissamanci.net




5.3 emalar S y f | 52 Microchip TCP/IP Stack V5.20

5.3.3 Fotoraf

ekil 5.5 Uygulama donanmnn fotograf
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 53 6.1 Port Ynlendirme




6. Uygulamalar
6.1 Port Ynlendirme
Devremizi yerel ada 192.168.1.222 gibi bir IP adresi ile ok rahat bir ekilde kullanabiliriz.
Fakat bu IP bir yerel a IP sidir ve internet zerinde geersizdir.Ynlendiricili bir modeme sahipseniz
modeminiz yerel adaki donanmlar internet ana NAT ad verilen bir yntem ile amaktadr.
Trkesi A Adres evrimidir. Bu sayede yerel adaki tm bilgisayar ve donanmlarnz 95.14.47.36
gibi tek bir IP adresi zerinden d aa almaktadr. Yerel adaki donanmlar d adaki IP lere
isteklerde bulunduklarnda gelen cevaplar NAT tarafndan otomatik olarak istei yapan donanma
ynlendirilir. Fakat gelen bilgiler bizim isteklerimizin cevab deilse NAT tarafndan otomatik olarak
bloke edilmektedir.Bu sayede yerel a d alardan gelecek saldrlara kar korunmu olmaktadr.
Fakat baz durumlarda NATa gelen isteklerin kullanc tarafndan adaki donanmlara ynlen-
dirilmesi gerekmektedir.Bunuda modemimizin port ynlendirme zelliini kullanarak yapyoruz. D
ip adresimize port numaras ile yaplan istekler, o portun ynlendirilmi olduu IP adresine sahip olan
donanma gitmektedir.
rnein yaptmz devrenin yerel a adresi 192.168.1.222 idi. Devremizi HTTP protokol ile
web sunucusu olarak kullanmak istediimizi varsayalm.HTTP protokolnn port numaras 80 dir. O
halde modemimizin 80 numaral portunu 192.168.1.222 numaral yerel IP adresine ynlendirirsek
dardan 80 nolu portumuza balanan kiiler devremizi web snucusu gibi greceklerdir. Ayn ekilde
FTP ile dardan dosya yklemek indirmek istiyorsanz 20 ve 21, Telnet kullanmak istiyorsanz 23,
aada blm 6.3 te benim kendi tasarlam olduum uygulamay gerekletirmek istiyorsanz
setiim 2222 numaral portunuzu devrenizin yerel a adresine ynlendirmeniz gerekmektedir.

ekil 6.1 Port Ynlendirme
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.2 HTML Web Server S y f | 54 Microchip TCP/IP Stack V5.20

Ben ekil 6.1 de kendi modemim iin 80 numaral portun nasl ynlendirildiini gsterdim.
nce modeminizin HTML arayznden port ynlendirme mensne girin.Daha sonra 192.168.1.222
yerel IP adresi iin New ile yeni kural oluturalm.Burada Port Start ile Port End kutularna aralk
girersek modemimiz o aralktaki tm portlar devremize ynlendirecektir. Protokol TCP veya
TCP/UDP seip 80 numaral portu listemize ekleyelim ve uygulayalm.Daha sonra ayarlar
modemimize kaydedelim. Kendi modeminizin ayarlarnnn nasl yaplacan bilmiyorsanz internette
modem ismi ve port amak, port ynlendirmek gibi kelimeler ile aratrsanz kan eitli topluluklarn
sitelerinden renebilirsiniz.

6.2 HTML Web Server
Bu blmde EEPROM da barndrdmz HTML web sayfalar anlatlmtr.Bu web sayfalar
yardmyla HTTP zerinden devremizi kontrol edip scaklk gibi bilgileri okuyabiliriz.Web sayfalarna
canl ve esnek bir grnt salamak amacyla java script ve ajax kullanlmtr.Bu sayede HTTP2
modlmzde kullandmz dinamik deikenleri web zerinden sanki bir masast uygulamasym
gibi kontrol edebiliriz. Bu konu anlatldktan sonra web zerinden kontrol anlatlmtr.
6.2.1 JavaScript ve AJAX ile Dinamik Deiken Ynetimi
HTTP2 modl ile kullandmz dinamik deikenler, istemci sunucudan istekte bulunduun-
da istemciye gnderilen html kodlar arasna yerletirilirler.Deikenlerin deerleri sadece sayfa ilk
istenildiinde istemciye gnderilir daha sonra sabit bir ekilde deimeden kalr.Bundan sonra sayfa
her postback edildiinde tm sayfa sunucudan tekrar gelir ve deikenlerin yeni deerleri yerini alr.
Donanmn durumunu anlk olarak izleyecek isek sayfay devaml olarak yenilememiz gerekmektedir.
Bu ok kt ve kullansz bir zmdr.Bu sorunu JavaScript ve AJAX kullanarak zeriz. AJAX bir
tekniktir ve bu teknik ile arkaplanda alan bir nesne sunucudan istekte bulunur.Bu esnada sayfa
yenilenmez.AJAX asenkron olarak alt iin sunucudan gelen veri arkaplanda JavaScript kodlar ile
izlenir ve gerektii gibi ilenerek form bilgileri gncellenir.Bu ekilde uygulama k bir hale brnm
olur ayn zamanda anlk olarak deikenlerin deerlerini akc bir ekilde izleyebiliriz.Ayn ekilde bir
masast uygulamas gibi sayfay gncellemeden sayfa zerindeki kontrollerden donanmmza
komut gnderebiliriz.
AJAX teknii ilk olarak Microsoft firmas tarafndan IE5.0 da uygulanmtr.Bu teknikte
XmlHttpRequest adnda bir nesne asenkron olarak sunucudan istekte bulunabilir ve asenkron olarak
gelen cevaplar ilgili yerlere iletebilir.Bu esnada sayfann tm sunucuya gidip gelmeyeceinden hem
hz hem bantgenilii kazanm salar.AJAX tekniinin etkisi grldkten sonra birok popler tarayc
bu nesneyi kendi bnyesine katmtr.JavaScript kodu ile bir XmlHttpRequest nesnesi eitli tarayclar
iin aadaki gibi oluturulabilir
var newAjax.ajaxReq = new ActiveXObject("Microsoft.XMLHTTP"); //Microsoft IE tarayclar
var newAjax.ajaxReq = new XMLHttpRequest(); //Dier tarayclar
Hangi yntem ile nesne oluturacamz taraycy kontrol ederek belirtmemiz gerekmek-
tedir.Bu ilemi aadaki gibi yapabiliriz.
if(window.XMLHttpRequest) {
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 55 6.2 HTML Web Server




newAjax.ajaxReq = new XMLHttpRequest();
newAjax.ajaxReq.open((data==null)?"GET":"POST", newAjax.url, true);
newAjax.ajaxReq.send(data);
// IE kullanyor isek
} else if(window.ActiveXObject) {
newAjax.ajaxReq = new ActiveXObject("Microsoft.XMLHTTP");
if(newAjax.ajaxReq) {
newAjax.ajaxReq.open((data==null)?"GET":"POST", newAjax.url, true);
newAjax.ajaxReq.send(data);
}
Grld gibi AJAX nesnesi oluturuldukran sonra open metodu ile bir takm parametreler
geilmi ardndan send metodu ile istek gnderilmitir. open metodu bir takm parametreler
almaktadr.Bu parametreler yledir.
open (GET veya POST, URL , asenkron , kullancad, ifre)
Burada ilk parametre ile sunucuya yaplacak istein hangi metod ile yaplacan belirtiyoruz. Bunlar
HTTP2 bal altnda anlatlmt.kinci parametrede istek yaplacak sayfann URL sini berlitiyo-
ruz.Birinci parametrede GET kullanmsak querrystringler URL ile birletirilmelidir.nc paramet-
rede istein senkron veya asenkron olacan belirtiyoruz.Asenkron kullanm istediimiz iin bu
parametreyi true geiyoruz. Drdnc ve beinci parametreler opsiyoneldir ve istek yaplan sayfa
kullanc ad ve ifre istiyor ise doldurulmaldr. Bu konuda HTTP2 bal altnda anlatlmtr. Open
metodundan sonra send metodu ile isteimizi yolluyoruz.Bu ilem aada gsterilmitir.
newAjax.ajaxReq.open((data==null)?"GET":"POST", newAjax.url, true);
newAjax.ajaxReq.send(data);
Burdaki kodlar Microchipin salam olduu mchp.js rnek javascript dosyasnda yer almak-
tadr ve function newAJAXCommand(url, container, repeat, data) kullanc fonksiyonu ierisinde
bulunmaktadr.Bu fonksiyonun parametrelerinden ilki istek yaplacak sayfann URL sidir. kinci para-
metre ise websayfasnda bulunan gncellenecek bir alann ID si veya sunucudan dnen XML
cevabnn parametre olarak geilebilecei bir fonksiyon ad olabilir.nc parametre tekrar
yaplacan belirten parametredir ve true deeri geilerek sresiz olarak istek yaplacan belirtir.
Son parametre ise POST metodu iin kodlanm URL verileridir.
mchp.js dosyasndaki yap u ekildedir.Bir istek yaplaca newAJAXCommand fonksiyonu ile
AJAX nesnesi oluturulur, ilgili parametreleri doldurulur ve bu istek sunucuya gnderilir.Ayn
zamanda istek yaplan zaman bu nesne ierisine kaydedilir ve nesne global alanda tanmlanan ajaxList
diye isimlendirilen diziye atlr. Daha sonra snama yntemi ile bu dizi ierisindeki istekler elden gei-
rilerek cevap gelmimi diye baklmaktadr.Bu ilem pollAJAX() fonksiyonu ierisinde yaplmaktadr. Bu
fonksiyon setTimeout("pollAJAX()",10); fonksiyonu ile 10ms de bir periyodik olarak arlmaktadr.lk
ar setTimeout("pollAJAX()",500); ile yaplr.
pollAJAX fonksiyonunun gvdesinde bir for dngs vardr ve bu dng ajaxList adl dizideki
tm ajax nesnelerini elden geirerek durumlarn snamaktadr.

05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.2 HTML Web Server S y f | 56 Microchip TCP/IP Stack V5.20

for(i = ajaxList.length; i > 0; i--)
{
.......
}
For dngsnn ierisindeki ksm temel olarak 2 ana yapdan meydana gelmektedir.lk
ksmda yaplan isteklerin durumu kontrol edilmektedir ve cevap gelmi ise newAJAXCommand
fonksiyonunun ikinci parametresine geilen fonksiyon altrlarak istenilen alanlar doldurulmaktadr.
Bizim rneimizde bu fonksiyon updateStatus(xmlData) fonksiyonudur ve index.htm dosyasnn
ierisinde yer almaktadr.Cevabn gelip gelmedii aadaki kod yardm ile kontrol edilir.
if(curAjax.ajaxReq.readyState == 4 && curAjax.ajaxReq.status == 200) {

if(typeof(curAjax.container) == 'function'){
curAjax.container(curAjax.ajaxReq.responseXML.documentElement);
} else if(typeof(curAjax.container) == 'string') {
document.getElementById(curAjax.container).innerHTML = curAjax.ajaxReq.responseText;
}
Burada AJAX nesnesinin durumu ve HTML cevabn durumu kontrol edilerek ilemin tamam-
lanp tamamlanmadna karar verilmektedir. curAjax.ajaxReq.status == 200 kodu ile geri dnen
HTML kodu karlatrlmaktadr. statusText zellii ilede bu durumun text olarak karl alnabilir.
404 sayfa bulunamad durumu gibi 200 durumuda sayfa baar ile yklendi anlamna gelmektedir.
curAjax.ajaxReq.readyState == 4 satr ile ise AJAX isteinin durumu belirtilir.5 durum mevcuttur ve
bunlar aada gstetilmitir. 0 iin open metodunun kullanlmadn belirten uninitialized, 1 iin
sunucuya istek gnderildi ve ykleniyor anlamna gelen loading, 2 iin sunucuya istek gnderildi
anlamna gelen loaded, 3 iin sunucudan verinin geldiini fakat baka bir veririn daha beklendii
anlamna gelen interactive, 4 iin cevap tam olarak geldi anlamna gelen complete kullanlr.
Bu kontrollerden sonra gelen veririn bir alanam yazlaca yada bir fonksiyona parametre
olarakm geilecei kontrol edilir.Bunun iinde newAJAXCommand ile istek yaparken kullandmz
ikinci parametrenin tr kontrol edilir.Bu tr bir string ise container ierisindeki ID ile HTML elementi
bulunur ve ieriine sunucudan gelen, responseText ierisindeki cevap yazlr.Eer container tr bir
fonksiyon ise sunucudan gelen XML cevab bu fonksiyona parametre olarak geilmektedir.Bu
parametreler index.htm dosyasndaki updateStatus fonksiyonu tarafndan ilenmektedir.Aadaki
kod paras gelen veriye gre sayfa stndeki LEDler ile ilgili olan alan gncellemektedir.
for(i = 0; i < 3; i++) {
if(getXMLValue(xmlData, 'led'+i) == '1')
document.getElementById('led' + i).style.color = '#090';
else
document.getElementById('led' + i).style.color = '#ddd';
}
stek tamamlandktan sonra yeni istek yaplp yaplmayacan renmek iin daha nceden
newAJAXCommand fonksiyonuna getiimiz nc parametreye baklr.Eer bu parametre true ise
aadaki ekilde yeni istek yaplr.

www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 57 6.2 HTML Web Server




if(curAjax.repeat)
newAJAXCommand(curAjax.url, curAjax.container, curAjax.repeat);
pollAJAX fonksiyonunun ierisindeki for dngsndeki ikinci yap ise zaman amnn
kontroldr.stek yaplrken istek yaptmz zaman kaydettiimizi yukarda sylemitik.uanki zaman
ile istek yaptmz zaman karlatrlarak belli bir sre gemi ise zaman am kararna varabiliriz.Bu
deer bizim rneimiz iin 5 saniyedir ve global alanda tanmlanmtr.Bu durumda mesaj verebilir ve
istei gncelleyebiliriz.
mchp.js dosyasndaki son fonksiyon ise gelen XML verisinden istenilen veriyi eken getXMLValue
fonksiyonudur.Bu fonksiyon aadaki gibidir ve index.htm dosyasndaki updateStatus fonksiyonu
tarafndan XML verisini zmlemek iin kullanlmaktadr.Fonksiyon ars iin XMLverisi ve bu veri
ierisinde istenilen verinin dmnn ad eklindedir. rnek olarak getXMLValue(xmlData, 'led'+i)
function getXMLValue(xmlData, field) {
try {
if(xmlData.getElementsByTagName(field)[0].firstChild.nodeValue)
return xmlData.getElementsByTagName(field)[0].firstChild.nodeValue;
else
return null;
} catch(err) { return null; }
}
Sunucuya gnderilen istek newAJAXCommand('status.xml', updateStatus, true) eklindedir ve
status.xml dosyasnn ierisindeki veriler istenmektedir.

6.2.2 Web Sayfalar ve alma Biimimleri
Bu rnekte site tasarlamak yerine Microchipin WebPages2 klasrndeki sayfalar kullana-
caz.Kimlik dorulama, erezler, donanm durumunu izleme, donanm kontrol etme, mail gnderme
ve dinamik DNS ayarlar gibi bir ok destek bu site zerinde rneklendirilmitir. Siteye css kodlar,
header ve footer ile sabit ve dinamik bir yap kazandrlmtr.Dinamik deikenlerde olduu gibi
header ve footer kodlar ~inc:header.inc~ eklinde sayfann bana ve sonuna konularak istemciye
gnderilmektedir.Bu sayede hem bir miktar hafza kazanc salamaktayz hemde sayfalarmz sabit bir
grnm almaktadr.
rnee balamadan nce nc blmdeki ilgili ksmlar gzden geirilirse daha iyi
olacaktr.lk nce index.htm sayfasndaki dinamik deikenlerin nasl kullanldna bakalm. lgili html
kodu aadaki gibidir.
<div id="status">
<div id="loading" style="display:none">Error:<br />Connection to demo board was lost.</div>
<div id="display">
<span style="float:right;font-size:9px;font-weight:normal;padding-top:8px;text-
indent:0px">(click to toggle)</span>
<p>LEDs:<br /><span class="leds">
<a id="led7" onclick="newAJAXCommand('leds.cgi?led=7');">&bull;</a>
<a id="led6" onclick="newAJAXCommand('leds.cgi?led=6');">&bull;</a>
<a id="led5" onclick="newAJAXCommand('leds.cgi?led=5');">&bull;</a>
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.2 HTML Web Server S y f | 58 Microchip TCP/IP Stack V5.20

<a id="led4" onclick="newAJAXCommand('leds.cgi?led=4');">&bull;</a>
<a id="led3" onclick="newAJAXCommand('leds.cgi?led=3');">&bull;</a>
<a id="led2" onclick="newAJAXCommand('leds.cgi?led=2');">&bull;</a>
<a id="led1" onclick="newAJAXCommand('leds.cgi?led=1');">&bull;</a>
<a id="led0">&bull;</a>
</span></p>
<p>Buttons:<br />
<span id="btn3">?</span> &nbsp;
<span id="btn2">?</span> &nbsp;
<span id="btn1">?</span> &nbsp;
<span id="btn0">?</span></p>
<p>Potentiometer: <span id="pot0" style="font-weight:normal">?</span></p>
</div>
</div>

<table style="padding-left: 10px;">
<tr><td><b>Stack Version:</b></td><td>&nbsp;</td><td>~version~</td></tr>
<tr><td><b>Build Date:</b></td><td>&nbsp;</td><td>~builddate~</td></tr>
</table>

Status alan grld gibi iki alana blnmtr. lk alan loading alandr ve devremiz ile
iletiim kurulamadnda java script kodlar tarafndan grnr hale getirilmektedir.Bu sayede devre
ile balantnn olmadn belirten bir mesaj gsterilmektedir. kinci alan ise display alandr ve ledler,
butonlar, ve AN0 bacandaki analog gerilim gsterilmektedir.Dikkat edilirse ledleri simgeleyen
noktalara tklandnda yeni ajax komutu oluturulmakta ve ledler terslenmektedir.Yukardaki kodun
en altnda ise iki satrlk bir tabloda stack versiyonu ve kodun derlenme tarihi dinamik deiken
eklinde sayfaya yanstlmaktadr.Ekran grnts ekil 6.2 de gsterilmitir.

ekil 6.2 Index.htm dinamik deikenlerin html kts
imdi ajax konusunu okuduunuzu varsayarak ekil 6.2 teki noktalara tkladnzda gerekle-
enleri direk olarak anlatyorum. Bu noktalara tkladnzda newAJAXCommand fonksiyonu ile bir
ajax nesnesi oluturulur. Yukardaki kodlardan grld gibi newAJAXCommand fonksiyonunun
sadece URL parametresi 'leds.cgi?led=7' eklinde geilmitir.Dier parametreleri null dur. imdi
mchp.js dosyasndaki newAjax.ajaxReq.open((data==null)?"GET":"POST", newAjax.url, true); satrna
bakalm.Grld gibi newAJAXCommand fonksiyonunun data parametresi null olduundan ajax
isteimiz GET metodu ile yaplmaktadr.Yani 'leds.cgi?led=7' ifadesi querystring eklinde urlmizin
sonuna eklenmektedir. Bu istein ierii blm 3.6.2.1 de anlatlmtr.imdi CustomHTTPApp
dosyasndaki HTTPExecuteGet fonksiyonu ierisinde bu istein nasl ilendiine bakalm. nce dosya
ad tespit edilip istein hangi sayfadan yapld anlalmakta ve querystring ayrtrlarak istenilen
ilem gerekletirilmektedir. Kodlar aadadr.
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 59 6.2 HTML Web Server




//stein hangi sayfadan yapldn tespit edelim.
else if(!memcmppgm2ram(filename, "leds.cgi", 8))
{
// Hangi LEDin tersleneceini tespit edelim.
ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led");

// stenilen LEDi tersleyelim.
switch(*ptr) {
case '1':
LED1_IO ^= 1;
break;
case '2':
LED2_IO ^= 1;
break;
...
}

dynvars.htm sayfasnda ise dinamik deikenlerin sayfaya nasl yanstldn grebilirsiniz.
LEDlerin o anki durumu IP adresimiz, stack versiyonu gibi bilgiler sayfaya yanstlmtr.
forms.htm sayfasnda ise GET ve POST metodlarnn alma ekli anlatlmtr.LEDlerin
istenilen durumu GET metodu ile sunucuya gnderilerek kurulmaktadr. Save butonuna bastnzda
adres ubuunda URL yi grebilirsiniz. Sayfa 23 te kodlar verilmi ve alma ekli anlatlmtr. Ayn
ekilde POST metodu ile LCD ye mesaj gnderilebilmektedir. GET metodu ile snrl miktarda veri
gnderilebilecei, POST metodu ile snrsz miktarda verinin (dosya ykleme gibi) sunucuya gnderile-
bilecei, ayn zamanda gnderilen verinin URL de gzkmeyecei anlatlmtr. CustomHTTPApp
dosyasnda HTTPExecutePost fonksiyonu altnda POST ile ilgili ilemlerin kodlar vardr.
#if defined(USE_LCD)
if(!memcmppgm2ram(filename, "forms.htm", 9))
return HTTPPostLCD();
#endif
Yukarda grld gibi veri forms.htm sayfasndan geldiyse HTTPPostLCD fonksiyonu
arlmakta ve veri LCD ye yazlmaktadr.
auth.htm sayfasnda kimlik dorulama rnei anlatlmtr. protect dizini altndaki dosyalara
erimek iin kullancnn giri yapmas istenmektedir. Giri izni ile kimlik bilgilerinin kontrol aadaki
gibi yaplmaktadr.
// HTTPNeedsAuth fonk. da return ile dnlen bilgi 0x80 den kk. Giri izni iste
if(memcmppgm2ram(cFile, (ROM void*)"protect", 7) == 0)
return 0x00;

// HTTPCheckAuth fonk. da deri dnlen bilgi 0X80 ve daha byk giri kabul edildi
if(strcmppgm2ram((char *)cUser,(ROM char *)"admin") == 0
&& strcmppgm2ram((char *)cPass, (ROM char *)"microchip") == 0)
return 0x80;
Bu konu ile ilgili ayrntl bilgi sayfa 27, blm 3.6.3 te anlatlmtr.
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.3 TCP Sunucu Uygulamas S y f | 60 Microchip TCP/IP Stack V5.20

cookies.htm sayfasnda ise cookie oluturmak anlatlmtr.Kullancdan bir isim girmesi ve
favori ilemci grubunu iaretlemesi istenmektedir.Girilen isim balk alannda yazlmaktadr. Ayn
ekilde kullancdan ekrandaki gri alan dolduracak ekilde bir egzersiz yapmas istenilmektedir. Bu
konu ile ilgili ayrntl bilgi sayfa 29, blm 3.6.4 te anlatlmtr.
upload.htm sayfasnda kullancdan bir dosya yklemesi istenmektedir.Yukarda belirtildii
gibi veri POST metodu ile gnderildiinden bir ka MB lk (veya daha fazla) dosyalar bile rahata
ykleyebilirsiniz.Yklenen dosya bir takm ilemlerden geirilerek anlk olarak MD5 kts
hesaplanmaktadr. Sunucuda saklanmamaktadr.Fakat fat dosya sistemi ve SD kartlar ile bu rnek
gereklenirse HTTP zerinden SD karta dosyada yklenebilir.Aada upload.htm dosyasndan gelen
bilgi dosya olaca iin HTTPPostMD5 fonksiyonu agrlm ve dosyann MD5 i hesaplanmtr.
#if defined(STACK_USE_HTTP_MD5_DEMO)
if(!memcmppgm2ram(filename, "upload.htm", 10))
return HTTPPostMD5();
#endif
email/index.htm dosyasnda ise email rnei gsterilmitir.Bunu kullanabilmek iin
STACK_USE_SMTP_CLIENT bildirimi yaplm olmas gerekmektedir.Ayn zamanda mail POST metodu
ile PIC e gnderildiinden POST metodunu ektif etmeniz gerekmektedir. CustomHTTPApp.c dosya-
snda HTTPExecutePost fonksiyonunda yukardaki rneklerde olduu gibi HTTPPostEmail fonksiyonu
arlarak mail gnderimi gerekletirilmektedir.
Ayn ekilde dyndns/index.htm dosyasnda kullancdan dinamik DNS bilgileri web sayfas
zerinden alnmaktadr.

6.3 TCP Sunucu Uygulamas
6.3.1 PIC Yazlm
Bu uygulamada kendimize gre bir protokol oluturup, yazdmz masast uygulamas ile
TCP zerinden devremiz ile haberleip ona komut ve istek gndereceiz. Balamadan nce blm
3.15 teki TCP konusunu okumanz neririm. Burda anlatlan kodlar paket ierisinde bulabilirsiniz.
Haberlemeye balamadan nce arada gidip gelecek olan veriyi ve kurallarmz belirlememiz
gerekmektedir.Burdaki tm rnekler ve kurallar tarafmdan rnek olmas amacyla
tasarlanmtr.Devremizi sunucu olarak ayarlayp, bilgisayarmzdan yazdmz programla istemci
olarak bir takm isteklerde bulunacaz.Bu isteklerimiz ya komut yada veri istei olacaktr.Her istekten
nce istein baladn belirtmek iin ~ karakterini kullandm.Bu karakterden sonra gelen karakterleri
test ederek gelen istein ne olduunu anlayp istenilen ilemi gerekletir-dim. rnein LED1 i
yakmak iin devreye ~LD11, sndrmek iin ~LD10 gnderdim. LCD ye veri yaz-mak iin ~LCDBu
metin LCD ye yazilacak.$ eklinde bir veri gnderdim. Burada $ semboln verinin sonlandn
belirtmek amacyla kullandm.Bu mesaj alan devremiz LCD ye Bu metin LCD ye yazilacak.
yazmaktadir.Ayn ekilde devrenin o anki durumunun bilgisini ~IST mesajn gndererek istedim. Bu
mesaj alan devre LED, buton, motor ve scaklk bilgilerini bilgisayarmza gndermektedir. Komutlar
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 61 6.3 TCP Sunucu Uygulamas




BRSMNC.c dosyasndaki BrsSunucu fonksiyonunun banda bulabilirsiniz.Bu benim tasarladm
bir haberleme eklidir.Siz baka ekilde tasarlayabilirsiniz.
Haberleme kurallarmz tanmladmza gre nce sunucuyu balatacak kodlar yazalm ve
ardndan masast istemci uygulamamz yazalm.Balamadan nce TCPIPConfig.h dosyasndaki
STACK_USE_TCP tanmlamasn yapalm. Yada TCPIP Configuration Wizard aracndaki
seeneini seelim. Sonra ie gelen balantlar dinleyecek soketi amakla balayabiliriz.Aada
yazlmas gereken kod gsterilmitir.
sunucu = TCPOpen(0, TCP_OPEN_SERVER, 2222, TCP_PURPOSE_DEFAULT);
lk parametremiz soketin balanaca ip adresidir fakat biz sunucuyuzdur ve istemciler bize
balanacaktr.Bu yzden bu alan 0 olarak geilmitir. kinci parametre soketin tipi olarak
TCP_OPEN_SERVER olarak geilmitir. nc parametre gelen isteklerin hangi porttan geleceidir.
Ben kendi uygulamam iin 2222 setim. Son parametre soketin amacn belirtmektedir.Genel amal
olarak kullanacamzdan TCP_PURPOSE_DEFAULT yazyoruz. Eer soket alamassa TCPIPConfig.h
dosyasndan default soket saysn arttrmanz gerekebilir.Ayrca ayn yerde baka amalar iin
kullanlan n tanml soketleride grebilirsiniz.Soketin alp almadn geri dnlen handle deerini
kotrol ederek reniriz.Soket aldysa veri alp gndermeye hazrz demektir. Fakat her ilemden
nce soketin bal olup olmad TCPIsConnected fonksiyonu ile kontrol edilmelidir. Daha sonra ne
kadar veri okuyacamz TCPIsGetReady fonksiyonu ile reniriz ardndan TCPGetArray fonksiyonu ile
TCP tamponundaki veriyi okuruz.Aada bu ilemlerin nasl yapld gsterilmitir.Okunabilecek veri
says wVeri ye alnp bu kadar veri TCP tamponundan kullanc tamponu olan Tampona aktarlmtr.
f(!TCPIsConnected(sunucu))
return;
wVeri= TCPIsGetReady(sunucu);
TCPGetArray(sunucu, Tampon, wVeri);
Artk verimiz Tampon ierisinde anlamlandrlmay beklemektedir. imdi konunun banda
belirttiimiz ~ karakterlerini arayp gelen istekleri bulalm. ~ karakterinden sonra gelen karakterler
test edilerek istein ne olduu anlalmtr ve gerekli ilemler yaplmtr.Aada kod paras
verilmitir.
while(n<wVeri) //wVeri blou kadar tampondaki veriyi gezelim
{
if(Tampon[n]=='~')
{
if(Tampon[n+1] =='I' && Tampon[n+2] =='S' && Tampon[n+3] =='T')
{
sprintf(Tampon,"~LD0%u~LD1%u~LD2%u~BTN0%u~BTN1%u~MTR%u%u%04
u~SIC%04u",LED0_IO,LED1_IO,LED2_IO,BUTTON0_IO,BUTTON1_IO,MotorCalisiyor,M
otorSaatYonu,dutycycle, sicaklik);

TCPPutArray(sunucu, Tampon, sizeof(Tampon));
}
else if(Tampon[n+1] =='L' && Tampon[n+2] =='D' && Tampon[n+3] =='0')
{
LED0_IO=Tampon[4]-'0';
n+=4;
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.3 TCP Sunucu Uygulamas S y f | 62 Microchip TCP/IP Stack V5.20

}
...
Yukarda gelen ~IST ve ~LD0 komutlar gsterilmitir.Tm komutlar iin bunlar ayr ayr
yazlmaldr. stemci devrenin durumunu isteyen ~IST komutunu gnderdiinde yine uygun bir string
hazrlanp TCPPutArray ile istemciye gnderilir.Bu mesaj yukarda grlmektedir.Yine istemci
programmzda bu mesaj anlamlandrp bilgileri kullanc arayzne yanstacaz. ~LD0 komutu
alndnda ise bu komuttan sonra gelen ilk karakter 1 veya 0 dr ve LED in durumunu deitirir. LCD
ye veri yazmak iinse ~LCD...$ komutu kullanlr. $ karakteri verinin sonuna geldiini belirtmek iindir.
Aada kod paras verilmitir.
else if(Tampon[n+1] =='L' && Tampon[n+2] =='C' && Tampon[n+3] =='D')
{
BYTE nLCD=0;
n=n+4;
for( n ; Tampon[n]!='$' ; n++)
LCDText[nLCD++] = Tampon[n];

LCDText[nLCD]='\0';
LCDUpdate();
}
Yine ayn ekilde motor iin yazdmz kod blouna bakalm. Motor iin ~MTR komutundan
sonra motor verisi gnderilmitir. Bu veri ~MTR[A/Kapa][Yn][4 byte dutycycle] eklindedir.Kodlar
biraz uzun olduu iin kodlar gsterilmemitir.Timer2 ve PWM kodlardr.PWM1 ve PWM2 sinyal
retebilmek iin Timer2 yi kullanmaktadr. BRSMNC.c dosyasnn ierisinde kodlar bulabilirsiniz.
else if(Tampon[n+1] =='M' && Tampon[n+2] =='T' && Tampon[n+3] =='R')
{
dutycycle=(( WORD )(Tampon[6]-'0'))*1000 + (( WORD )(Tampon[7]-'0'))*100 + (( WORD
)(Tampon[8]-'0'))*10 + (Tampon[9]-'0');

if( Tampon[4]=='1')
{
// ... Motoru ama ilemleri
if( Tampon[5]=='1') // Yn 1 saat yn, 0 tersi
{
// ... Saat ynnde dndrecek ilemler
}
else if( Tampon[5]=='0')
{
// ... Saat ynnn tersinde dndrecek ilemler
}
}
else if (Tampon[4]=='0') // Kapa
{
// ... Motoru kapama ilemleri
}

MotorSaatYonu = Tampon[5]=='1' ? 1 : 0;// Motor kapal haldeyken yn deitirilebilmesi
iin
}
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 63 6.3 TCP Sunucu Uygulamas




Scaklk bilgisi ise MainDemo.c dosyasndaki ProcessIO fonksiyonu altnda hesaplanmtr.
Scaklk burada global sicaklik deikenine alnp BRSMNC.c dosyasnda kullanlmtr. Scaklk bilgisini
LM35 sensrnden almaktayz. Bu sensr bir derece bana 10mv dorusal gerilim vermektedir.Bu
yzden ltmz gerilimi 10 a blersek scakl bulmu oluruz. 10bit ADC modunda 5/1024mv luk
admlar ile lm yapabilmekteyiz. lm sonularnn daha kararl olabilmesi iin 64 deer toplanp
ortalamas alnmtr.Scaklk sonucu bulunduunda 10 ile arplp ondalk ksmda tamsay ksmna
dahil edilmitir. Bylece drt byte (123.5 derece) ile scakl bilgisayara gnderebiliriz. Bilgisayarda
ekrana yazdrrken 10 a blnp yazdrlmtr.Bu ilemler tamsay trnn ondalk say saklayan float
trne gre ok ok daha performansl almas sonucu yaplmtr.Aada kod paras
gsterilmitir.
okunanhamdeger+=*((WORD*)(&ADRESL));//10 bitlik evrim sonucunu deikenimize toplayalm

// 65536/1024 =64 16 bit deikene en fazla 64 adet 10bitlik ADC sonucu toplayabiliriz.
if(++cevrimsayisi == 64)
{
okunanhamdeger/=64 ; //okunan 64 deerin ortalamasn alalm
mvolt=okunanhamdeger*ADIM; //Adm = 5/01024
okunanhamdeger=(WORD) ( mvolt *1000);
//veriyi 10 ile arplm olarak tutalm. bilgisayarda 123.5 gibi ekillendirelim.
sicaklik=okunanhamdeger;
okunanhamdeger=0;
cevrimsayisi=0;
}
Scaklk bilgisini bilgisayara gnderirken ise ~SIC[4 byte scaklk bilgisi] formatnda
gnderiyoruz.
PIC yazlm ile ilgili syleyeceklerim bu kadar. imdi bilgisayardan BRSMNC devremizi kontrol
etmek iin masast programmz yazalm.

6.3.2 Bilgisayar Yazlm
Bilgisayar program iin C# dilini kullandm.Bu yzden programn alaca makinada .Net
Framework kurulu olmas gerekmektedir.Programdaki en can alc nokta soket programlama
konusudur.Balamadan nce soket programlama konusu zerine bilgi edinirseniz daha iyi olacaktr.
e balamadan nce Baglanti.cs adnda balanty yneten bir snf yazdm. Bu snf Baglanti,
Baglan, BaglantiyiKes, VeriGonder ve VeriAl isimli metodlar iermektedir.Ayrca balantnn olup
olmadn belirten public bool baglantivar property sini iermektedir. Bu snf kullanmak iin bu
snf trnden bir nesne yaratmamz gerekmektedir.Baglanti adinda iki adet kurucu metod
vardr.Bunlardan birisi default kurucu metod, tekisi ise IP adresi ve port numaras alp nesne
olutururken baglanty aan kurucu metodtur.Default kurucu metod ile nesne yaratrsak istediimiz
bir zamanda Baglan metodunu kullanarak balanty kurabiliriz.Metodlar anlatmaya balamadan
nce imzalarna ve snfn property lerine bakalm.
private TcpClient baglanti { get; set; }
private NetworkStream ns { get; set; }
public bool baglantivar { get; set; }
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.3 TCP Sunucu Uygulamas S y f | 64 Microchip TCP/IP Stack V5.20

private byte[] GonderilecekBytelar, AlinanBytelar;

public Baglanti(string hostname, string port)
public Baglanti()
public bool Baglan(string hostname, string port)
public void BaglantiyiKes()
public bool VeriGonder(string s)
public bool VeriAl(ref string sunucucevabi)
Baglan metodu kullancdan devremizin IP adresini ve port numarasn ekilde 6.3 teki arayz
vastasyla almaktadr. Baglan metodundaki en can alc ksm baglantnn kurulup a akmnn
(network stream) salanmas ve verinin alnaca alm tamponunun kurulmasdr.Bu ilemleri aada-
ki kod parasnda grebilirsiniz.
baglanti = new TcpClient(hostname, int.Parse(port));

if (baglanti.Connected)
{
baglanti.ReceiveTimeout = 5000;
baglanti.SendTimeout = 5000;
AlinanBytelar = new byte[baglanti.ReceiveBufferSize];
ns = baglanti.GetStream();
baglantivar = true;
return true;
}
Grld gibi balant TcpClient kurucu metodu ile salanm ve baglanti property sine
aktarlmtr.TCP de veri alveriinin akm eklinde olduunu sylemitik. Veri yazmak ve gndermek
iin gereken, balantmzn a akmn, ns isimli property ye atyoruz.Veri almlarnda ise verinin
alnaca AlinanBytelar isimli tamponu bu ksmda kuruyoruz.Burda ek olarak baglantivar property
mizi kuruyoruz. Metodun geri dn deeri grld gibi bool trndendir.Balantmz salanm
ise true, aksi halde false deerini geriye dnyoruz.
BaglantiyiKes metodu ise ak olan balanty kapatmaktadr.Balantdan nce a akmnn
kapatlmas gerekmektedir.Aada kodlar gsterilmitir.
ns.Close();
baglanti.Close();
baglantivar = false;
VeriGonder metodunda ise devreye string eklinde istediimiz veriyi gnderiyoruz.
Gndereceimiz komutun, PIC yazlmnda anlattmz gibi ~LD01 eklinde olmas gerekmektedir.
Aada ekil 6.3 te gsterilen arayzn kontrollerinden alnan bilgilerin uygun formata evrilip
VeriGonder metodu ile gnderilmesi gerekmektedir.Metod alnan stringi byte dizisi haline evirip a
akmna yazmakta ve Flush metodu ile gndermektedir.Eer bir problem ile karlalmadan veri
gnderildiyse VeriGonder metodu geriye true, aksi halde false dnmektedir.Bunuda balant var yada
yok eklinde yorumlayabiliriz.Aada veri gnderen kod paras gsterilmitir.
GonderilecekBytelar = System.Text.Encoding.ASCII.GetBytes(s);
ns.Write(GonderilecekBytelar, 0, GonderilecekBytelar.Length);
ns.Flush();
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 65 6.3 TCP Sunucu Uygulamas




VeriAl metodu ise devremizden gelen bilgileri okumaktadr.Okunan veri bytelar eklinde
okunmakta, stringe evrilmekte ve VeriAl metoduna referans geilen stringe oluturulan string
atanmaktadr.Bu veriler VeriAl metodunu aran kontroln olay metodunda, ayn PIC yazlmndaki
gibi ilenmektedir.Bu ilemler aada form konusunda anlatlmtr.VeriAl metodunun ise can alc
ksm aadaki gibidir.
ns.Read(AlinanBytelar, 0, baglanti.ReceiveBufferSize);
sunucucevabi = System.Text.Encoding.ASCII.GetString(AlinanBytelar);
Balant snfmz hakkda syleyeceklerim bu kadar. Muhtemel hata oluma potansiyeli olan
ksmlar try catch bloklar arasna alnmtr.Bu ekilde oluabilecek olas istisnalar yakalanmaya all-
mtr. Arayz anlatmadan nce ekran grntsn verelim.ekil de programmzn arayz gzk-
mektedir.

ekil 6.3 Sunucu olarak davranan PIC imize balanan istemci masast uygulamamz.
Grld gibi arayz drt ksmdan olumaktadr. Bu ksmlar devremiz ile balanty kuran
ve kesen, IP ve port numarasnn girildii Sunucu Ayarlar ksm, devremize bal led, LCD ve motor
gibi donnmlar yneten Komut Gnder ksm, devremizin o anki durumunu istediimiz Gncelleme
ksm ve devremize ait gelen bilgilerin kullancya yastld Donanm Durumu ksmdr. Komut gnder
ksmnda yaptmz bir deiiklik, ilgili kontroln olay metodunda, Baglanti snfndan oluturduu-
muz nesnenin VeriGonder metodu ile devreye gnderilmektedir. rnein LCD ve LED1 iin aadaki
kodlar yazlmtr.
b.VeriGonder("~LD1" + (checkBoxLED1.Checked ? "1" : "0"))
b.VeriGonder("~LCD" + textBoxLCD.Text + "$")
Gncelleme ksmnda kullanc, El ile yazan radiobuton seili ise Gncelle butonuna basarak
devreye bir adet istek mesaj gnderir.Eer otomatik seili ise bir timer yardm ile ms cinsinden
belirtilen periyot ile otomatik olarak devreye istek mesaj gnderilir.Devrenin cevab ise Baglanti
snfnn VeriAl metodu ile alnr ve PaneliGuncelle metoduna geilerek ilgili bilgiler Donanm Durumu
ksmndaki kontrollere yanstlr.Aada devreye gnderilen istek ve cevabn alnmas gsterilmitir.
b.VeriGonder("~IST")
string s = string.Empty;
b.VeriAl(ref s)
PaneliGuncelle(s);
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.4 TCP stemci Uygulamas
Bilgisayar
S y f | 66 Microchip TCP/IP Stack V5.20

Alnan cevap PaneliGuncelle metoduna geilmi ve Donanm Durumu ksmndaki kontroller
aadaki gibi gncellenmitir.Burdada PIC yazlmnda yatmz gibi bir yntem izliyoruz.
void PaneliGuncelle(string s)
{
string[] VeriParcalari = s.Split(new char[] { '~' });

foreach (var item in VeriParcalari)
{
if (item.StartsWith("LD0"))
labelLED0.Text = item[3] == '1' ? "1" : "0";
else if (item.StartsWith("BTN0"))
labelBTN0.Text = item[4] == '1' ? "" : "";
else if (item.StartsWith("MTR"))
{
labelMTR.Text = item[3] == '1' ? "Ak" : "Kapal";
labelMTRYON.Text = item[4] == '1' ? "Saat yn" :
"Saat yn tersi";
labelMTRDuty.Text = item.Substring(5);
}
else if (item.StartsWith("SIC"))
{
int tamsayi;
int.TryParse(item.Substring(3, 3), out tamsayi);
labelSIC.Text=tamsayi.ToString()+"." + item[6] + "'C";
}
Bilgisayar yazlmmz hakknda syleyeceklerim bu kadar. Uygulama yerel a zerinde gayet
hzl almakta ve hzl cevap vermektedir.Hata oluturabilecek ksmlar try catch bloklar arasna alp
hata olasln en aza indirmeye altm.Kodlar ve proje dosyasn paket ierisinde bulabilirsiniz.

6.4 TCP stemci Uygulamas Bilgisayar
Bu rnekte devremizi TCP istemcisi olarak ayarlayacaz ve bilgisayarda yazdmz bir sunucu
programa balanp mesaj gndereceiz. Balamadan nce TCPIP Configuration Wizard ile Custom
Protocol Over TCP seeneini semeniz gerekmektedir.Ayrca yeteri sayda default soket olduundan
emin olun.
e PIC kodunu yazmak ile balayalm. nce bir static TCP_SOCKET deikeni tanmlayalm.
Daha sonra TCPOpen fonksiyonu ile soketimizi aalm.TCPOpen fonksiyonu 4 parametre almaktadr.
Bu parametrelerden ilki hostname yada IP adresi olabilmektedir. kinci parametre ise soketin ne ile
alacadr (hostname IP ). nc parametre sunucunun port adresi, drdnc parametre ise
soketin ne amala alacadr. TCPIPConfig.h dosyasnda bu tanmlamalar grebilirsiniz. Biz genel
amal olarak aacamzdan drdnc parametreyi default geeceiz.Ayrca IP adresiniz DWORD
deikende saklanmaktatr ve little endian yapsnda olmaldr.Yani benim sunucu programmn
alt bilgisayarmn yerel IP si olan 192.168.1.3, 0x0301A8C0 eklinde saklanmaldr.Aada kod
gsterilmitir.
static TCP_SOCKET istemci = INVALID_SOCKET;
if( istemci == INVALID_SOCKET )
istemci = TCPOpen(0x0301A8C0 , TCP_OPEN_IP_ADDRESS, 2222, TCP_PURPOSE_DEFAULT);

www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 67
6.4 TCP stemci Uygulamas
Bilgisayar




if( istemci == INVALID_SOCKET )
return;

timer = TickGet();
if( !TCPIsConnected(istemci) )
{
if( TickGet()-timer> 5* TICK_SECOND)
{
TCPDisconnect(istemci);
istemci = INVALID_SOCKET;
}
return;
}
TCPPutROMString(istemci,(ROM BYTE*) "Sicaklik:");
uitoa(sicaklik/10,tampon);
TCPPutString(istemci,(BYTE *) tampon);
TCPPut(istemci, '.' );
TCPPut(istemci, sicaklik%10 +'0' );
TCPFlush(istemci);
Soket aldktan sonra kar tarafa balandm diye kontrol ediyoruz.Eer bir balant yoksa 5
saniyelik bir zaman am sresi sonunda balanty ve soketi kapatp geri dnyoruz.Balant
salanmsa sunucuya veri gndermeye hazrz demektir. Ben bu uygulamada scaklk deerini
sunucuya gnderdim.Scaklk deerini WORD deikende ondalk basamada saklamak iin 10 ile
arplm olarak tutulduunu hatrlayn.Veri gnderirken ROM hafzamzdaki Sicaklik stringini,
ardndan gerek scaklk deerinin tamsay ksmn ardndan bir nokta ve scaklk deerinin ondalk
ksmn gnderdim. rnein giden veri Sicaklik:12.3 eklinde olacaktr.Bu kodlar BrsIstemci
fonksiyonu iindedir ve bu fonksiyon main fonksiyonundaki ana dngden 3 saniyede bir
arlmaktadr.Kodlar BRSMNC.c dosyasnda bulabilirsiniz.

imdi C# ile bir konsol uygulamas yazalm ve sunucu eklinde konfigre edelim. Bunun iin
nce TcpListener snfndan bir nesne yaratmamz ve gelecek olan balantlar dinlememiz gerekmek-
tedir.Dinleme ilemini ve gelen balantlar kabul etme ilemini TcpListener snfnn AcceptSoket
metodu ile yapyoruz ve balant salandnda metodun geri dn olan balanty TcpClient
snfndan bir nesneye alyoruz.Daha sonra balantnn akmn NetworkStream trnden bir nesneye
alarak gelen mesajlar okuyabiliyoruz.stersek ayn nesne ile mesajda gnderebiliriz.Aada bu ii
yapan kod paras gsterilmitir.
TcpListener dinleyici = new TcpListener(System.Net.IPAddress.Any ,2222);
TcpClient soket = new TcpClient();
//Devremizin max. gnderip alabilecei byte says 200
byte[] alinanbytelar = new byte[200];

dinleyici.Start();
Console.WriteLine(" >> Sunucu balatld");
soket = dinleyici.AcceptTcpClient();
Console.WriteLine(" >> Balant istei kabul edildi");


05 / 2010 | Bar SAMANCI


www.barissamanci.net




S y f | 68 Microchip TCP/IP Stack V5.20

while ((true))
{
try
{
NetworkStream ns = soket.GetStream();
ns.Read(alinanbytelar, 0, 200);
string gelenmesaj =
System.Text.Encoding.ASCII.GetString(alinanbytelar);
gelenmesaj = gelenmesaj.Substring(0,gelenmesaj.IndexOf('\0'));
Console.WriteLine(" >> Devreden gelen mesaj(" +
DateTime.Now.ToLongTimeString()+"): " + gelenmesaj);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Devremizden 3 saniyede bir scaklk deerinin gnderildiini sylemitik.Aada ekil 6.4 te
sunucumuzun ekran grnts grlmektedir.

ekil 6.4 stemci PIC imizin masast sunucu programmza gnderdii mesaj


6.5 TCP stemci Uygulamas SQL nternet Veritaban
Bu rnektede blm 6.4 te olduu gibi bir rnek yapacaz.Fakat bu rneimizde devremiz bir
ASP.NET sayfasna verileri http GET methodlar ile gnderecektir.Bu verileri querystring eklinde alan
sayfamz ise SQL veritabanna kayt edecektir.Bu bilgiler scaklk ve LED0 bilgisi olacaktr.Ayn
zamanda sunucu zamann kullanp verilerin geldii zamanda kayt edeceiz.
nce verilerin tutulaca bir SQL tablosu yaratalm.Benim yarattm tablonun SQL sorgusunu
aada grebilirsiniz.
CREATE TABLE brsmncboard (
Id int PRIMARY KEY IDENTITY,
Tarih datetime ,
Sicaklik float,
LED0 varchar(1)
)
www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 69
6.5 TCP stemci Uygulamas
SQL nternet Veritaban




Query stringimiz ?SIC=12.3&LED0=1 eklinde olsun.imdi bir ASP.NET sayfas hazrlayalm.
Bu sayfann Page_Load olaynda SQL balantmz kuralm ve gelen query stringi ayrtrarak tablo-
muza kaydedelim.Bu ileri yapan kod paras aada gsterilmitir. Bu sayfann ad
brsmncboardekle.aspx olsun.
SqlConnection sc = new SqlConnection();
string cs = WebConfigurationManager.ConnectionStrings["CSTR"].ToString();
sc.ConnectionString = cs;
sc.Open();

SqlCommand scmd = new SqlCommand("", sc);
scmd.CommandType = System.Data.CommandType.Text;

scmd.CommandText = "INSERT INTO brsmncboard (Tarih,Sicaklik,LED0) VALUES (
getdate() ," + Request.QueryString["SIC"].ToString() + ",'" +
Request.QueryString["LED0"] + "')";

scmd.ExecuteNonQuery();
sc.Close();
imdi www.barissamanci.net/brsmncboardekle.aspx? SIC=12.3&LED0=1 eklinde bir istek-
te bulunduumuzda ASP.NET sayfamz URL nin sonundaki verileri alp SQL veritabanmza kayt
edecektir.nternet ksmn bitirdiimize gre PIC kodlarn yazmaya balayabiliriz.Fakat balamadan
nce GET metodunun ieriini renmemiz gerekmektedir. Yukardaki istei yapabilmek iin
sunucuya aadaki formatta bir mesaj gndermemiz gerekmektedir.
GET /brsmncboardekle.aspx? SIC=12.3&LED0=1 HTTP/1.0
Host: www.barissamanci.net
Connection: close
Bu bilgiyi rendikten sonra kodumuzu yazmaya balayabiliriz.Yazacamz kodun blm 6.4
teki rnekten kk bir fark vardr. Birincisi soketi aarken kullanacamz parametreler, ikincisi ise
yukardaki get metodunu oluturmaktr.
imdi soketimizi aan TCPOpen fonksiyonunu yazalm. Bu rnekte RAM zerinde yer alan
host adn kullanarak soket aacaz bu yzden birinci parametreye sunucu ad dizisininin adresini
DWORD trnden gsterici olarak gememiz gerekmektedir.Host ad kullanacamzdan DNS modl-
nn de aktif edilmesi gerektiini unutmayn.Birinci parametrete RAM zerindeki host ad dizisinin
adresini getikten sonra ikinci parametreye RAMdeki host adn kullandmz bildiren
TCP_OPEN_RAM_HOST parametresini gemeliyiz.HTTP protokol zerinden istek yapacamzdan
HTTP nin port numaras olan 80 i nc parametreye geiyoruz. Drdnc parametre ise nceki
rnekte olduu gibi bu soketi genel amal kullanacamzdan TCP_PURPOSE_DEFAULT geiliyor.
Daha sonra yukarda gsterildii gibi GET isteini hazrlayp gndermek kalyor. Bunuda aadaki gibi
yapyoruz.steimizi yaptktan sonrada soketimizi kapatyoruz.
uitoa(sicaklik/10,tampon);
TCPPutROMString(istemci, (ROM BYTE*)"GET ");
TCPPutROMString(istemci, (ROM BYTE*)"/brsmncboardekle.aspx?SIC=");
TCPPutString(istemci,(BYTE *) tampon);
TCPPut(istemci, '.');
TCPPut(istemci, sicaklik %10 +'0' );
05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.5 TCP stemci Uygulamas
SQL nternet Veritaban
S y f | 70 Microchip TCP/IP Stack V5.20

TCPPutROMString(istemci, (ROM BYTE*)"&LED0=");
TCPPut(istemci, LED0_IO + '0');
TCPPutROMString(istemci, (ROM BYTE*)" HTTP/1.0\r\nHost: ");
TCPPutString(istemci, sunucuAdi);
TCPPutROMString(istemci, (ROM BYTE*)"\r\nConnection: close\r\n\r\n");
TCPFlush(istemci);
TCPClose( istemci );
istemci=INVALID_SOCKET;
Bu fonksiyonu BRSMNC.c dosyasnda BrsIstemciVeriTabani adnda bulabilirsiniz.Bu
fonksiyonu MainDemo.c dosyasndan 30 ar saniye aralklar ile ardmz dnelim. Her 30
saniyedeki verileri internet zerindeki veritabanmza kayt edecektir. Ben rnek olmas amacyla
btn bir gece devreyi altrdm ve verileri kaydettim. Kendime bir SQL sorgu sayfas yaptm ve
verileri ekil 6.5 teki gibi ektim.

ekil 6.5 Devremizin SQLe gnderdii verilerimizin ASP.NET sayfalarndan sorgulanmas

Soldaki ekilde tm veriler eklenme srasna gre ekilmitir.Sadaki ekilde ise veriler scaklk
deerinin azalan deerine gre ekilmitir. Grld gibi scaklk en yksek 30.7 derece ile 11:35:37
de kaydedilmitir. imdi bir dnn 10 larca devre ile 100 lerce sensrn dnyann eitli
yerlerinden volkanik hareketleri, sismik hareketleri, kutuplardaki scaklklar, rzgarlar merkezi bir
veri tabanna kaydettiini. Btn veriler tek bir noktadan elinizin altnda olurdu .





www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 71
6.6 TCP stemci Uygulamas
Googleda Arama Yaptrtmak




6.6 TCP stemci Uygulamas Googleda Arama Yaptrtmak
Bu uygulamada bilgisayar ve veritaban uygulamarnda oldugu gibi bir yol izleyeceiz. Tek
fark sunucudan gelen cevaplar rs232 zerinden bilgisayardaki terminal programna aktarlacaktr.
Hem istek yapacamzdan hemde gelen veriyi alacamzdan kod tasarm durum makinalar ile
tasarlanmtr.Bu rnekte Microchipin hazr olarak sunduu GenericTCPClient.c dosyasndaki kodlar
kullanlacaktr. Bir nceki veritaban uygulamasnda yaptmz gibi isteimizi GET metodu ile Google a
ileteceiz ve geri dnen HTML kodlarn Hyperterminal programna rs232 zerinden aktaracaz. nce
GenericTCPClient.c dosyasndaki dizileri aadaki gibi deitirelim ve google.com.tr de turkiye
aramasn yaptralm.
static BYTE ServerName[] = "www.google.com.tr";
static WORD ServerPort = 80;
static ROM BYTE RemoteURL[] = "/search?hl=tr&q=turkiye";
Bu rnei altrabilmek iin TCPIPConfig.h dosyasnda ki STACK_USE_UART
STACK_USE_DNS ve STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE bildirimlerini yapmamz
gerekmektedir.Kodumuzu derleyip altrdktan sonra devremizdeki BUTTON1_IO butonuna
bastmzda google.com.tr ye istek yaplr ve dnen HTML cevap HyperTerminale yazdrlr.ekil 6.6
da ekran grnts gsterilmitir.Dikkat edilirse pencere bal title etiketleri arasnda turkiye
Googleda Ara eklinde gzkmektedir.
ekil 6.6 Devremizden google.com.tr de yaptrdmz turkiye aramasnn sonucu


05 / 2010 | Bar SAMANCI


www.barissamanci.net




6.7 UDP stemci Uygulamas S y f | 72 Microchip TCP/IP Stack V5.20

6.7 UDP stemci Uygulamas
Bu uygulamada Reboot modln kullanarak ilemciyi uzaktan resetleyeceiz, kendi yazd-
mz masast uygulamas ile LCD ye karakter yazdracaz ve MCHPDetect aracna mesaj gndere-
ceiz.
Reboot modln blm 3.11 de anlatmtk. Bu modl etkin iken 69 numaral UDP portun-
dan R karakteri alndnda ilemciyi resetlemektedir.Ethernet bootloader yazlmlar iin kullanldn
sylemitik. Bu modl TCPIPConfig.h dosyasndaki STACK_USE_REBOOT_SERVER bildirimi ile aktif
ediyoruz.
imdi 2222 UDP portunu dinleyecek bir kod yazalm ve bu yazdmz kod gelen karakterleri
LCD ye yazsn.nce bir UDPSocket deikeni tanmlayp sunucu olarak bir balant aalm. Ardndan
bu balant zerinden veri gelmimi kontrol edelim.Veri gelmi ise bu veriyi LCD ye yazalm. Aada
kodlar gsterilmitir.
static UDP_SOCKET udpsunucu = INVALID_UDP_SOCKET;
if(udpsunucu == INVALID_UDP_SOCKET)
udpsunucu = UDPOpen(2222, NULL, INVALID_UDP_PORT);

//Soket alamamsa geri dn
if(udpsunucu == INVALID_UDP_SOCKET)
return;

// Bekleyen bir veri yoksa geri dn
if(!UDPIsGetReady(udpsunucu))
return;

//Bir byte lk veri oku
UDPGet(&b);

LCDText[0]=b;
LCDText[1]='\0';
LCDUpdate();
UDPOpen fonksiyonunda birinci parametreye dinleyeceimiz port olarak 2222 yazyoruz.
kinci ve nc parametre sunucu olarak alacamz iin bizi ilgilendirmiyor. UDPGet fonksiyonuna
ise BYTE trnden b deikeninin adresini geip bir byte lk veriyi b deikenine alyoruz.Ardndan
bunu LCD ye yazyoruz.
imdi masast uygulamamz yazalm. Dil olarak C# kullandm. Programn .Net framework
kurulu makinalarda alacan unutmayn.
Yandaki gibi bir form tasarlayalm.stei yapacamz IP
adresi, port numaras, gndereceimiz karakter ve gnder
butonu ekleyelim. Gnder butonunun Click olayna ise
aadaki kodu yazalm
ekil 6.7 UDP istemci program

www.barissamanci.net 05 / 2010 | Bar SAMANCI

Microchip TCP/IP Stack V5.20 S y f | 73 6.7 UDP stemci Uygulamas




IPAddress ip = IPAddress.Parse( textBoxIP.Text);
int port = int.Parse(textBoxPort.Text);
uc.Send(new byte[]{(byte)textBoxKarakter.Text[0]},1,new IPEndPoint(ip,port));
Burada uc UdpClient trnden bir nesnedir.Bu nesnenin send metodu ile yukarda
grld gibi bir karakterlik veriyi arayzde girilen IP ve port numarasna gnderiyoruz. imdi
masast uygulamamz aalm ve 2222 numaral porta bir karakter gnderelim. Gnderdiimiz
karakteri LCD de greceksiniz. imdi port numarasn deitirelim ve 69 yapalm. R karakteri
gnderdiinizde ilemciniz resetlenecek ve tekrar alacaktr. LCD nin ilk altaki duruma geldiini
grebilirsiniz.
imdi bilgisayarnzda blm 4.4 te gsterilen MCHPDetect programn an.Bu programn
Announce protokoln kullandn ve 30303 numaral porttan gelen balantlar dinlediini
sylemitik. Yazdmz masast programda IP adresine bilgisayarnzn IP adresini giriniz ve portu
30303 olarak girin. Benim IP adresim 192.168.1.3 t ve 30303 nolu porttan B karakterini gnderdim.
ekil 6.8 de yakalanan B karakterini grebilirsiniz.

ekil 6.8 UDP zerinden MCHPDetect programna veri gndermek



05 / 2010 | Bar SAMANCI


www.barissamanci.net




7 Sonu S y f | 74 Microchip TCP/IP Stack V5.20


7. Sonu
7 Sonu
Bu kitapta 8 bitlik 18F serisi ilemciler ile internete nasl balanlaca, her alanda nasl
uygulama gelitirilebilecei anlatlm ve gsterilmitir. Bu kitaptaki tm satrlar tamamen bana aittir,
rnekler aksi belirtilmedike tarafmdan yazlmtr ve hepsi sayfa 52 deki donanm ile test
edilmitir.htiyac olanlara yardm dokunmas dileiyle


Bar SAMANCI
Elektronik Mhendisi
www.barissamanci.net
baris@barissamanci.net

You might also like