STM32F103C8'e ethernet çipi bağlamak

Başlatan z, 17 Eylül 2016, 18:33:38

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Peki biz PC'de 80 portunu internet için kullanıyoruz. Server tarafında da mı 80 portu kullanılıyor?

Sırf explorer'da IP numaramı yazabiliyorum ve bana TCP paket geliyor diye UDP yi boşveriyorum. Doğrudan TCP'ye geçeceğim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#212
Sağolasın Hercules'ı indirdim ve kurdum.

Şu soruma ne olur bir cevap.

Ben minik bir serverim ve benim port adresim ne olacak?

@gerbay

Önerin için sağol. UDP tamam oldu dediğimde bu siteye bağlanmayı deneyeceğim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Tamam Hercules olunca iş kolaylaştı.  UDP'yi yazarım.

Ping sorgusuna yaptıklarımın çok benzeri buna da yapılacak görünüyor.

Çocuk oyuncağı.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam daha önce de yazmıştım ama görmediniz galiba.Cisco nun packet tracer diye bi programı var.Merak ettiğiniz şeyleri simüle edebilirsiniz.

muhendisbey

80 web portu, hem istemcide hem sunucuda.

Advanced ip scanner diye bir program var, eğer kartınız ip'sini almışsa bu program ip'sini gösterebilir açık portları listeleyebilir.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

yamak

Alıntı yapılan: muhendisbey - 28 Eylül 2016, 10:33:23
80 web portu, hem istemcide hem sunucuda.

Advanced ip scanner diye bir program var, eğer kartınız ip'sini almışsa bu program ip'sini gösterebilir açık portları listeleyebilir.
Hocam source port 80 olmak zorunda değil.Zaten NAT kullanan sistemlerde source port a direkt müdahale edilemez, modem tarafından belirlenir.

z

#217
UTP protokolünde gelen paketi çözümleyen ve UDP ile data yollayan fonksiyonumu yazdım.

Şimdilik demo olarak UDP mesaj alırsam gönderene udp ile cevap yazıyorum.
Anladığım kadarıyla UDP mesaja cevap vermek zorunda değilim. (Doğrumudur?)

Fakat asıl sorun, IP paket boyu 1500 byte civarlarında. Bu da tek pakette gönderilecek data uzunluğuna sınır getiriyor.

UTP ile 3Kb data nasıl yollanır?

IP Headerda yer alan Flag, Fragment Offset ve TTL alanları ile ilgilenmemiştim.

Alıntı YapBayraklar
Üç bitlik bu alan paket parçalarının kontrol edilmesi ve tanımlanabilmesi amacıyla kullanılmaktadır. Yüksek basamaktan düşüğe doğru sıralı olmak üzere bayrak bitleri su şekildedir:

bit 0: Ayrılmış; sıfır olmalıdır.[not 1]
bit 1: Parçalandırmama işareti (DF, Don't Fragment)
bit 2: Daha Parça Var işareti (MF, More Fragments)
Eğer DF bayrağı ayarlanmışsa ama paketin aktarımı esnasında yönlendirilebilmesi için parçalandırılması gerekiyorsa, paket düşürülür ve hata iletisi gönderilir. Bu ayar parçalandırma işlemleriyle ilgilenecek miktarda kaynağı bulunmayan bir hosta paket gönderirken kullanılabilir. Bir diğer kullanım alanı da paketin aktarım yolunun desteklediği maksimum paket boyutunu ölçmektir. Bu ölçme IP yazılımı tarafından kendiliğinden veya ping veya traceroute gibi bazı ağ tanılama araçlarıyla kullanıcı tarafından gerçekleştirilebilir. MF biti, kendisinden sonra gelecek başka parçaların olduğu paketlerde 1 olarak, son paketlerde ise 0 olarak işaretlidir. Parçalandırılmamış paketler de kendilerinin ilk ve son parçası olarak düşünülebileceğinden bu paketlerde MF biti 0'dır. Parçalandırılmış paketlerin de son parçaları hariç tüm parçalarında bu bit 1 olarak ayarlıdır. MF biti 0 olan bir paketin tek başına bir paket mi yoksa bir paketin parçası mı olduğu Parçanın Başlangıç Konumu alanından anlaşılır. Zira o alan tek parçadan oluşan paketlerde 0 olacaktır.

Parçanın Bağıl Konumu (Fragment Offset)
Orijinal paketin başlangıcına göre parçanın bağıl konumunu belirten bu alandaki 13 bit uzunluğunda olan sayının birimi sekiz bayttır (64 bit). Yani parçanın, orijinal paketin kaçıncı 64 bitlik kısmından itibaren olan kısmını içerdiğini belirtir. Bu alanla en fazla (213 – 1) × 8 = 65.528 bayt uzunluğunda konum belirtilebilir ancak bu başlık da dahil edildiğinde maksimum IP paket boyutunu (65.535) aşmaktadır (65.528 + 20 = 65.548 bayt).

Yaşam süresi (Time To Live) (TTL)
Sekiz bitten oluşan yaşam süresi paketlerin internet üzerinde döngülere takılarak sonsuza kadar kalmasını engeller. Teorik olarak bu alan paketin kalan ömrünü saniye türünden belirtir ve yol üzerinde paketin üzerinden geçtiği her düğüm yaşam süresi alanından paketin işlenmesi sırasında geçen süreyi düşer. 1 saniyeden kısa geçen süreler 1 saniyeye yuvarlanır. Günümüzde paketler yönlendiriciler üzerinden 1 saniyeden çok daha küçük sürelerde aktarıldığından uygulamada bu alan atlama sayısının ölçüsü olarak kullanılır. Yönlendiriciler paketi teslim aldığında TTL alanını bir azaltır. Sayı sıfır olduğunda paket düşer ve göndericiye ICMP Zaman Aşımı (ICMP Time Exceeded) iletisi gönderilir.

Traceroute yazılımı da paketin kaynaktan hedefe giderken üzerinden geçtiği yönlendiricilerin listesini oluştururken yönlendiricilerden gelen ICMP Zaman Aşımı iletilerini kullanır.

http://youtu.be/Qe2jWNQFXXQ

Şimdi yavaş yavaş karşılaşacağım zorlukları hissetmeye başladım. Eğer ENC çipimin ethernet kablosuna bir PC bağlı olsaydı, PC'de de sadece internet gezgini olsaydı işler çok kolaydı.

Fakat internetten web sayfama gireceklerin sayısı çok fazla olabilir. Gönderdiğim paketler yolda kaybolabilir. Bir şeyleri kayıt altına almam gerekecek gibi görünüyor.

Fakat ana felsefeyi (canavarın zırhını) bilmediğim için kodlamanın geri kalanı için bu aşamada
yanlış işler yaparsam günlerce özene bözene ucunu sivrilttiğim değneği canavara saplamaya kalktığımda değneğin ucu kırılabilir.

Bu durumda yeni bir değnek bulup ucunu sivriltmem gerekecek. Bu da kod yazımında zaman kaybı demek.

Zaman kaybetmemi mi istiyorsunuz?

Bana paket yollayıp cevap olarak benden paket bekleyen bir cihaza, ethernet portumdan dışarı saldığım paket ulaşmazsa bundan sonra nasıl diyaloglar olur?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

#218
Alıntı yapılan: z - 28 Eylül 2016, 15:27:11
Fakat asıl sorun, IP paket boyu 1500 byte civarlarında. Bu da tek pakette gönderilecek data uzunluğuna sınır getiriyor.

UTP ile 3Kb data nasıl yollanır?

IP Headerda yer alan Flag, Fragment Offset ve TTL alanları ile ilgilenmemiştim.
Hocam 1500 byte'tan fazla gönderilme durumu network katmanında yani ip protokolünde halledilemesi gerekiyor.Bir paketin parçalarının hepsinin identification a aynı olmalı ve flags bitlerinden MF bitinin değeri son parça haricindekiler 1 olmalıki karşı taraf parçanın devamının geldiği bilebilsin.Parçanın hangi sırada olduğu da fragment offset kısmında bildirilmeli.Böylece karşı taraf parçaları birleştirebilir.

Alıntı Yap
Bana paket yollayıp cevap olarak benden paket bekleyen bir cihaza, ethernet portumdan dışarı saldığım paket ulaşmazsa bundan sonra nasıl diyaloglar olur?
Hocam bu da tcp protokolünde hallediliyor.TCP protokolünde ack alınamayan,ya da nack alınan paketler karşı tarafa tekrar gönderilir.Tabi web server için tcp de yeterli değil tcp nin üzerine bir de http yazmanız gerekecek.

z

#219
Bu durumda @gerbayın büyük datalar yollayan UDP fonksiyon yaz demesinin nedeni anlaşıldı.

En azından UDP demo fonksiyonumda 30 bye değilde 4..5K veri yollamayı deneyeyim.
uzun data yollama mantığını anladım. IP headerda  flag ve ofset ile bu sorunu kolayca çözerim.

Fakat şu soru kafamı kurcalıyor.

Ben ramı az minik bir işlemciyim. Üstelik küçük bir HTML sayfası yayınlamak gibi de basit bir görevim var.

UDP ile işim yok ama hadi var diyelim;

UDP ile uzunca bir data bloğu göndermem gerekiyor ve bunu mecburen paketlere bölüp parça parça yollayacağım.

Ben bu işlerle uğraşırken bir yandan da yeni paketler ENC çipine giriyor.

Bu durumda en az iki seçenekten birini seçmem lazım.

Seçenek 1: UDP ile 1. paketi yolladıktan sonra gelen paketlerle hiç ilgilenmeyip 2. UDP paketi yollayıp o bitince 3. UDP paleti yollayıp en nihayetinde UDP ile gönderilecek veriler bittikten sonra ENC bufferda birikmiş yeni paketlerle ilgilenmeyi düşünüyorum.

Seçenek 2: Böyle yapmayıp 1. UDP yi yolla. İşim bitmedi diye bir yere not yaz. Bu nota Target MAC, IP, Port  adreslerini ve data alanından gönderdiğin en son verinin adresini de yaz, sonra gelen paketlerle ilgilen, fırsatını bulunca ya da bir süre geçince bir ara notlar bölümünde yarım kalmış iş varmı diye bak, varsa onlarla ilgilen ....  tarzında bir yazılıma mı yönelmeliyim?

Basit bir html sayfa yayınlamak gibi amacım var ve kodlaması daha basit olan 1. tercihi yapmak istiyorum.  2. tercih ise kelimenin tam anlamı ile PClere 4x4 web server yazılımı kodlarken  gerekli gibi duruyor. 

Fakat TCP'yi kodlamaya başladığımda mecburen 2. seçenek mi işin içine girecek?

Gerçekten de bu belirsizliğin aşılması yeni yazılacak kodlar için hayati derecede önemli.

Önümde bir tuzak var gibi hissediyorum.

1. seçenek kolay yazılır ve web gezgininin ağzına istediği kadar bal doldurulur. Bu esnada ağzını açıp beklemekten sıkılanlar web gezginleri olacak.

2. seçenek yazması daha zor (RTOS ve Linked List işin içine sokulup kod yazımı kolaylaştırılabilir) fakat bu durumda her web gezginin ağzına bir parmak bal çalıp ve biraz daha bekle deme şansımız var.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hgs

20k az degil aslında.
sizin web sayfası kac kb ?

z

O anlamda söylemedim. Paketler ramdaki buffer alanına okunup/yazıldığı için web sayfasını  flashda tutarım ve parça parça rama yazıp yollarım. Dolayısı ile web sayfamın boyu ramdan ziyade flash boyuna bağlı.

Ben ramı az minik bir işlemciyim derken PC ile göreceli olarak kendimi acındırdım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#222
Hocam fonksiyonlara parametre gönderme ve alma  konusunda standartımın olmayışı konusunda tamamen haklısın. Bu konuda hiç bir standartım yok.

Ama neden yok?

Hep diyorum ya C sizin kodlarınızı kalıplara sokuyor kodlarınız derlendiğinde belli bir formda
kodlar üretiliyor.

Ve hemen ardından da diyorum ki asm ile yazdığım kod en baba C kodundan daha kısa ve daha hızlı olur.

İşte bu iddiamın 1. dayanağı parametre paslaşmada standarta gitmemem.

Bunun acaip faydaları var. Fakat çok fazla kafa yormak ve eldeki sınırlı registeri çok iyi kullanmak gerekiyor. (İşte burda insan zekası ile kalıplara sokulmuş C derleyicisinin savaşı var.)

Sonuçta bir fonksiyonu R0, R1 ile çağırıyorum bir başka fonksiyon R7, R8 ile.
Bir fonksiyondan R0 ile dönüyorum bir diğerinden R5 ile.

Bu bana göre kısa kodlama için avantaj fakat yazılan kodu anlama kolaylığı açısından dezavantaj.
Bu dezavantajı da her fonksiyonun başına detaylı register kullanım açıklaması ile gideriyorum.

Benim için 1 byte 1 byte'dır. Şu ana kadarki kodlamada sadece 3 tane global değişken kullandım. Local değişken sayısı ise 0.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhendisbey

Alıntı yapılan: yamak - 28 Eylül 2016, 10:47:26
Hocam source port 80 olmak zorunda değil.Zaten NAT kullanan sistemlerde source port a direkt müdahale edilemez, modem tarafından belirlenir.
O kısmını bilemiyorum hocam ancak apache server kurduğumda bu şekilde bir haberleşme kurmuştum. Modemden 80 portunu açarak dışarıdan web erişimi sağlayabiliyordum.
UDP yada TCP ye varana kadar içerisine de girmedim. Sadece UDP'nin hızlı ve güvensiz, TCP'nin güvenli yavaş olduğunu biliyorum. En azından derslerde öyle anlattılar.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

yamak

Hocam source port isletim sistemi tarafindan belirleniyor. Hangi port boşsa onu kullaniyor. Tabi programci mudahale etmez direkt sistem cagrilarini kullanarak yazarsa. Daha sonra modem NAT protokolu geregi bu source porta gore bi look up table tutar. Bu source portu look up table a client in local ip si ile birlikte kaydeder ve source ip ile kendi ip sini yani agin internete ciktigi gercek ip ile degistirir portu da herhangi bir port numarasi ile. Daha sonra bu port gelen paketlerin port ve local ip lerini look up tabledan bakarak client inkilerle degistirir. Boylece internete cikan her client in gercek ipsi olmak zorunda olmaz. Bu NAT sayesinde ipv4 bizi bu zamana kadar idare etti. Ama artik yetmiyor mecburenv6 ya geciyoruz