Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: z - 11 Ekim 2016, 17:15:18

Başlık: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 11 Ekim 2016, 17:15:18
(http://www.cncdesigner.com/wordpress/wp-content/uploads/IOT_STM32F103C8-KIT1.png)

Keil proje dosyaları (https://github.com/Bunalmis/ENC28J60---STM32F103C8)

(Paket kaybı ile ilgilenmez. İnternet ortamında test edilmedi)


/****************************************************************************
  WebInit   fonksiyonu STM32F103C8 ve ENC28J60 cipinin init islemlerini yapar
  WebStart  fonksiyonu Server yazilimini baslatir
  AddString fonksiyonu verilen stringi hedef rama yazar ve son adresi dondurur
  PageLoad  fonksiyonu hazirladiginiz web sayfasinini yayinlar ve ziyaretci sayisini okur
  WebPage   fonksiyonu icine kendi kodlarimizi yaziyoruz
  Dikkat: Yayinladiginiz MyWeb alani (array'i) ustunde yapacaginiz her degisiklik aninda
  yayinlanan sayfada da degisime neden olur. Sayfayi bir kez hazirlayip bir daha
  degistirmeyecekseniz tek MyWeb gibi bir array ile calisabilirsiniz.
  Dinamik sayfa uygulamasi yapacaksaniz iki ayri MyWeb arayi ile calismalisiniz
  Dikkat: Sayfa hazirlamadan ziyaret sayacini okumamalisiniz
 
  Devre semasi ve aciklamalar icin : w w w .cncdesigner.com/wordpress/?p=6424
****************************************************************************/

#include "stdio.h"
#include "Web.h"

char MyWeb1[1460];                                  // MYyWeb1 degistiriken MyWeb2'i yayinla
char MyWeb2[1460];                                  // MYyWeb2 degistiriken MyWeb1'i yayinla

char MyMAC [6]={0x77,0x77,0x77,0x77,0x77,0x77};
char MyIP  [4]={95,0,177,1};                    // ipconfig ile ogreneceksiniz ya da modemden ayirdiginiz IP

void SystemInit()
{
        WebInit(MyMAC, MyIP);         // Donanimi ayarla
}

int main()
{
        WebStart();                                      // Serveri calistir
}

void WebPage()
{
char* index;
char dinamik[50];
int ziyaret=1;
int TextSize=1;

        while(1)
         {
           index= AddString(MyWeb1,&StartHtml);     
           index= AddString(index, (char*) "<H1>STM32F103C8 - ENC28J60</H1>");
           sprintf(dinamik,"<H%d>Text Size=%d</H%d>",TextSize,TextSize,TextSize);
           index=AddString(index, dinamik);           
           if (++TextSize>6) TextSize=1;
           sprintf(dinamik,"<H4>Ziyaretci: %d </H4>",ziyaret);
           index=AddString(index, dinamik);
           index=AddString(index,&Ver);
           *index=0;                                           // Sayfanin sonuna null karakteri ekler
           ziyaret=PageLoad(MyWeb1);                 // MyWeb1 alani gosterilecek

//         Su anda MyWeb1 yayinda. MyWeb1 uzerindeki html kodlari bozarsak sayfa da bozulur

//         Radikal degisiklikleri MyWeb2 uzerinde yapalim

           index= AddString(MyWeb2,&StartHtml);     
           index= AddString(index, (char*) "<H1>Merhaba, Picproje uyeleri</H1>");
           index=AddString(index,&Ver);
           sprintf(dinamik,"<H2>Ziyaretci: %d </H2>",ziyaret);
           index=AddString(index, dinamik);
           sprintf(dinamik,"<H%d>Text Size=%d</H%d>",TextSize,TextSize,TextSize);
           index=AddString(index, dinamik);           
           if (++TextSize>6) TextSize=1;
           *index=0;                                            // Sayfanin sonuna null karakteri ekler

           ziyaret=PageLoad(MyWeb2);                 // MyWeb2 alani yayinda

//         Su anda MyWeb2 gosterimde. Artik MyWeb1 uzerinde oynayabilirsiniz. 

         }
}


@gerbay hocam bak bende C ile kodlamaya başladım. Bu ne rahatlıkmış yahu.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: ErsinErce - 11 Ekim 2016, 17:56:22
Pinler, SPI kanalı bile değiştirilemiyor hocam


gelen buruk dönmesin,
buyrun komple açık kaynak demo program,
keilin eski versiyonuna göredir mdk legacy yüklemeniz gerekmektedir.

http://www.mediafire.com/file/33fcxfm16qfldzu/STM32_ENC28J60_DEMO.rar (http://www.mediafire.com/file/33fcxfm16qfldzu/STM32_ENC28J60_DEMO.rar)
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Mucit23 - 11 Ekim 2016, 20:07:21
Z peki bundan sonra kodu gelistirecekmisin. Aynı anda birden fazla cihaz bağlanı kurarsa ne olacak. Beni en çok meraklandıran yer burası.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 11 Ekim 2016, 20:12:13
Evet geliştirmek istiyorum fakat önümde 2 engel var.

1) Birden fazla client ile yazılımı zorlayacak ortamım yok.
2) TCP de gönderdiğim pakete ACK almazsam yada karşı taraf paketi yanlış aldığını bildirse
ne yapacağımı bilmiyorum.

Bu projenin asıl zevki zaten bundan sonraki kodlamada. Şuana kadar yapılan işler işin hikaye kısmıydı.

Önce bu sorunları çözmem gerekiyor.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: engerex - 11 Ekim 2016, 20:42:42
Stress Test uygulamaları var. Ama saniyede binlerce bağlantı yapıyorlar. Bağlantı hızını iyice kısman lazım. Çıktısı biraz çorba gibi olur.

Peki kodlamayı şöyle yapsan. Birinci istemciden ilk bağlantı geldi. Buna geç cevap ver ve beklet. Hemen 2. client ile bağlantıyı kur ve ardından ilk bağlantıya devam et bakalım olacak mı? Böyle bir yapay durum oluşturursan olabilir gibi.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 11 Ekim 2016, 23:30:37
El insaf. ARM CM3 çiplerde bahsediyorum.  ST'nin Stellaris serisi içinde öyleydi. Bayağı bir hazır CMSIS fonksiyon vardı.

Aşağıdaki kodlar demo kodlar.  Örnek olması için yazıldı.

Sana da bir şey beğendiremiyoruz.

Neyse onu bunu bırak da şimdi ne yapacağız?

Belli bir süre içinde ACK gelmedi ise son gönderdiğim paketi sorgusuz sualsiz tekrar yollayayım mı?


Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 12 Ekim 2016, 00:12:28
En başında UDP ile işim yok demiştik. Sırf TCP öncesi pratik kazanmak adına UDP'ye bulamıştık.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 12 Ekim 2016, 00:17:38
Hocam sen en iyisi kafamda oluşan bu tip sorulara cevap bulabileceğim kitap önerisinde bulun.

Yanlış olan, sorunu tam anlamadan kod yazmaya başlamam oldu. Kervan yolda düzeliyor fakat çok zaman kaybediyorum.



Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: ErsinErce - 12 Ekim 2016, 00:41:44
aradığınız kitap bu hocam buyurun https://www.redbooks.ibm.com/redbooks/pdfs/gg243376.pdf (https://www.redbooks.ibm.com/redbooks/pdfs/gg243376.pdf)

TCP/IP konusundaki sorularınız sayfa 153 te detaylıca basit bir dille anlatılıyor.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 12 Ekim 2016, 12:53:50
Anasını sattığımın Client'i, sana yolladığım dataları almadıysan yada bana yolladığın ACK bana ulaşmadı ise bana ne, bunun derdine ben mi düşeceğim.

!!! Hey sen !!!! O makinenin başında oturan arkadaş !!!!

Explorer da hani refresh butonu var ya ona bir daha bası ver. Diyerek bu projeyi kapatacağım.

Bu pojede web sayfasının max data boyu tek bir IP pakete sığacak boyutta olmak zorunda. IP parçalama işine girmedim. (Bu da demektir ki 1460 Byte dan oluşan bir HTML sayfa olusturabilirsiniz, yani html komutlar dahil yanyana 80 karakter 18 satır)

Türkcell kullandığım modemde  port yönlendirmesi yapmadığı için serverimi dış dünyaya açamıyorum. Dolayısı ile projemi gerçek anlamda deneyemiyorum.

Mevcut projede sorun olursa bunları gidereceğim. Eğer allı güllü sayfalar yapmayacaksanız
projenin işinizi göreceğini düşünüyorum.

Evet projeyi (kütüphaneyi) ASM ile geliştirdim. Ancak C konforunu devam ettirdim.

Verdiğim örnek proje tamamen C ile yazılmıştır. C ile kendi eklentilerinizi yapabilirsiniz.

Bu arada GitHub daki dosya yenilendi.

Port yönlendirme imkanına, STM32F103C8 ve ENC28J60 kitine sahip bir arkadaş projeyi deneyip webe açılırsa sayfasını ziyaret etmeyi çok isterim.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: MrDarK - 12 Ekim 2016, 12:55:16
Konu içindeki kişisel tartışmalar ve atışmalar konu seyri açısından kaldırıldı. Ortaya çıkan iyi kötü vs her emeğe saygı duymak gerektiğini düşünüyorum.

Bu başlık hakkında üyelerimiz teknik eleştiriler yapılabilir, konuyu gereksiz görülebilir veyahut çağ dışı sayılabilir. Fakat eleştirilerinde ve önerilerinde kibar uslüpları olmalı. Bu her iki üstadım içinde geçerli.

Bu konudaki atışma şeklindeki tartışmayı Genel Sohbette devam ettirebilirsiniz. Forumun esenliği adına bize yardımcı olacağınıza eminim.

Teşekkürler;
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: LukeSkywalker - 12 Ekim 2016, 13:30:47
@z keil kullanmıyorum. Hex kodunu da yüklersen deneyebilirim.
Bu arada şahsım adına konuyu kirlettiğim için özür dilerim.

mesaj birleştirme:: 12 Ekim 2016, 13:31:57

IP numarasını da 192.168.1.xxx
alt ağ geçidini de 192.168.1.1 olarak ayarlamalısın.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 12 Ekim 2016, 13:50:54
Tamam hex dosya hazırlayıp göndereceğim.

Ancak acelesi yok,

Şu anda biraz allı güllü sayfa hazırlamaya çalışıyorum. 1460 byte ile neler yapılabiliyor onu görmek istiyorum. Bu yüzden hemen yollayamayacağım.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: LukeSkywalker - 12 Ekim 2016, 14:13:54
Tamam hocam ben de müsait olduğum en kısa sürede denerim.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 12 Ekim 2016, 18:30:30
Hex dosya linki.

https://github.com/Bunalmis/ENC28J60---STM32F103C8/blob/master/MiniServer.hex (https://github.com/Bunalmis/ENC28J60---STM32F103C8/blob/master/MiniServer.hex)

Server IP: 192.168.1.7

1460 byte ile bu kadar sayfa yapılabiliyor. Tablolar kaldırılırsa bir kaç satır daha fazla sayfa olur.

Text dekorasyonlarından vazgeçilirse mektup bile yazılır.

(http://i.hizliresim.com/znk2yj.png) (http://hizliresim.com/znk2yj)
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Burak B - 13 Ekim 2016, 01:19:40
Alıntı yapılan: z - 12 Ekim 2016, 18:30:30
...

1460 byte ile bu kadar sayfa yapılabiliyor. Tablolar kaldırılırsa bir kaç satır daha fazla sayfa olur.
...


Aslında 1460 byte ile daha çok şey yapılabilir. Tüm iş kullandığınız teknolojiler, biraz text optimizasyonu ve tabiki gzip ile alakalı. :)

Bu arada PendSV_Handler fonksiyonunuzdaki değişken isimleri çok manidar. Aşağı yukarı şöyle bişi.


char *PendSV_Handler_0()
{
  char *result; // r0@1
  char v5; // r1@2
  int v6; // r1@2
  int v7; // t1@2
  int v8; // [sp+0h] [bp-20h]@2

  result = &Fuck_C;
  if ( Fuck_C != 1 )
  {
    __asm { CPSID   F }
    v5 = Task;
    result = (char *)Z_Stack;
    Z_Stack[2 * (unsigned __int8)Task] = (int)&v8;
    v6 = (v5 + 1) & 1;
    Task = v6;
    v7 = Z_Stack[2 * v6];
    __asm { CPSIE   F }
  }
  return result;
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 13 Ekim 2016, 01:58:11
Client'dan servere sayfa içeriğini gönder talebi geliyor. Güzelim asm kodlar sayfayı gönderirken system tick  düüüt devre arası, Asm hadi bırak biraz da C MCU ile oynasın diyor.

Asm de ".dittirme ebeni" şu an kritik bir iş yapıyorum eğer şimdi C MCU yu alırsa web sayfasının ..ına kor, C sonra oynasın diyor.

Yazdığım dile karışıyorsunuz yetmedi sıra değişken isimlerime mi geldi?.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Burak B - 13 Ekim 2016, 02:02:56
Estafirullah ne haddime. Koddaki espri anlayışı hoşuma gittiği için paylaşmak istedim.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 13 Ekim 2016, 02:10:01
Tek sayfaya yüklenmek yerine ana sayfa olsun butonlar olsun. Butona basınca servere istek gelsin ve serverde isteğe özel yeni bir sayfa oluştursun üzerine uğraşmak istiyorum.

Bu durumda ziyaretçiye 1400 byttetan çok daha fazlasını farklı sayfalarda sunabilirim.

Gzip algoritmasını bir şekilde buluruz da bahsettiğim yöntem daha basit olmaz mı?

İyi hatırlattın v6 = (v5 + 1) & 1; burayı v6 = v5 xor 1 yapalım 4 byte daha kazanalım. Kısa günün kârı.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Burak B - 13 Ekim 2016, 02:18:36
Bakın ben @gerbay değilim. Yani direkt hazır bilgi vermek adetim değildir. Ama ipucu veriyorum neden gzip' i sizin yazmanız gereksin ki ? Bırakın browser halletsin canım. :) Sizin kod yazmanıza gerek yok. Yani acaba neler HTTP header da -Accept- oluyor. Ayrıca javascript diye bir dil var. Neler yapabildiğine inanamazsınız ! Acaba 1460 bayta javascript ile neler ne tür algoritmalar ve işlevler sığdırılabilir. Hemde gzip de kullanılırsa bunu katlar bile...
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 13 Ekim 2016, 02:25:31
Server içinde dinamik sayfa oluşturmuyor muyum? Dinamik bir sayfayı kim zipliyecek?

Ben mi yanlış anladım?
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Burak B - 13 Ekim 2016, 02:30:30
Herşeyde dinamik değilki. Sabit veriler için bir payload hazırlanıp. Dinamik veriler pekala enjekte edilebilir gibi geliyor bana. ;) Mesela browserda bir adamınız olsa ve sizden sadece belli veriler için GET yapsa. Kabaca buna AJAX deniyor.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 13 Ekim 2016, 02:39:11
Yok ben o kadarından anlamam. (Aslını sorarsanız bu projeye bulaşıncaya kadar bunların hiç birinden anlamıyordum)

Client'daki tıklanan buton, radio button, check box vs konumlarını, text boxdan alınan şifre bilgisi okumayı öğrenirsem proje biraz daha anlam kazanacak en azından uzaktan bir evdeki cihazları açıp kapatabilirim.

Html kodlarla da program geliştiriciyi bunaltmak istemiyorum. Oraya da bir kolaylık getireceğim.

Yalnız sizin mantığınızı anlamıyorum. Forumda biz bayağı yardımcı olmaya çalışıyoruz. İp ucu ile geçiştirmiyoruz.

Bir iki kutsalımız dışında her soruya cevap veriyoruz. Hata mı ediyoruz?
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Burak B - 13 Ekim 2016, 02:40:57
Her yiğidin bir yoğurt yiyişi var diyelim. Buna saygı duymak lazım.

Bahsettiğiniz işleri yapabilmeniz için GET ve POST headerları oluşturabilmeniz ve yorumlayabilmeniz gerek. Şunu unutmayın HTTP ve HTML Hypertext üzerine kurulu bir dünya. Yani bolca hafıza ve string işlemi yapmak gerekiyor.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 13 Ekim 2016, 02:44:47
Gene de bu projeye katkılarınız dan dolayı hakkınız ödenmez.

Bahsettiğim soruların cevabını muhtemelen Wireshark ile kendim de deneyerek bulabilirim.

Tahminimce explorer aldığı sayfa bilgilerinden sonra ekranda buton tıklanırsa bana yeni bir paket yollayacak.

Ben de içinde Get arar gibi butonla ilgili bir ipucu arayacağım.

Gene de sağol.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: Burak B - 13 Ekim 2016, 02:50:18
Wireshark' ın yeri ayrı. Firefox için Firebug (https://getfirebug.com/) diye çok faydalı bir eklenti var. Mutlaka inceleyin. Kurun. Sayfaya sağ tıklayıp -Inspect with firebug- deyin. Açılan paneli gezin. Özellikle -Net- sekmesine bir gözatın. İşlerim bitti bana müsade. :) Size kolay gelsin.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: yamak - 13 Ekim 2016, 11:03:49
Alıntı yapılan: z - 13 Ekim 2016, 02:44:47
Gene de bu projeye katkılarınız dan dolayı hakkınız ödenmez.

Bahsettiğim soruların cevabını muhtemelen Wireshark ile kendim de deneyerek bulabilirim.

Tahminimce explorer aldığı sayfa bilgilerinden sonra ekranda buton tıklanırsa bana yeni bir paket yollayacak.

Ben de içinde Get arar gibi butonla ilgili bir ipucu arayacağım.

Gene de sağol.
Hocam normalde ajax kullanmazsanız sayfanın herhangi bir yerinde değişiklik yapmanız için tüm sayfayı yenilemeniz gerekir.
Ayrıca charles proxy adında bir program var.Bu hhtp işlerinde baya işinize yarar.http paketlerini yakalıp ve durdurup üzerinde değişiklik yapmanıza dahi izin verir.Http için wiresharktan daha çok işinize yarar bence.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: ErsinErce - 13 Ekim 2016, 11:36:04
Bütün dünya artık ssl bağlantıya geçiyor, let's encrypt gibi çözümler çıkmaya başladı maliyetten kurtulmak için.
eğer bir cihaz çalıştıracağım x işini buna yükleyeceğim diyorsanız güvenlik önlemleride almak gerekiyor.
Bu sebepten 1KB lik veri ile bağlantı işi zor hocam.
HTTP ye girmeden raw veri ile işinizi halletseniz neyse ama http ile bu yapı kısa ömürlü
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 13 Ekim 2016, 13:17:04
Anasayfa altına linkler koyarak sayfa sayısını artırdım.

Dolayısı ile bu çok rahatlattı.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 14 Ekim 2016, 02:18:41
http://youtu.be/vEpDRtwMf_I (http://youtu.be/vEpDRtwMf_I)

Bazı şeyler daha konforlu olsu.

Github dosyaları henüz yeni yazılım dosyaları ile değiştirilmedi.

Client'dan gelen sayfa isteği eskiden kütüphane tarafından cevaplanıyordu, C tarafı sadece sayfa bilgilerini yeniliyordu.

Projenin yeni halinde istek doğrudan C tarafına bildiriliyor.
Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 14 Ekim 2016, 14:44:58
HTML kodlarla link verme, get ve post metodu nasıl kullanılır, radio buton, button, text alanı, şifre degerleri nasıl okunuyor konusunda örnek.


/*
    [url=http://www.cncdesigner.com]www.cncdesigner.com[/url]
    facebook.com/Cnc-Designer-337826782908966
    Dikkat: TexCopy ile yerlestireceginiz datalarin toplam uzunlugu
    en fazla 1460 byte olabilir. Program kontrol etmez
    Demo program
*/

#include "stm32f10x.h"
#include "Web.h"
#include "stdio.h"
#include "string.h"

unsigned counter=0;                                 // Ziyaretci sayaci
char  DestinationMAC [6];                           // Paketin geldigi cihazin MAC adresi
char  DestinationIP[4];                             // IP paketin geldigi cihazin IP nosu
short DestinationPort[2];                           // IP paketin gonderen cihazin port nosu

char text[128];                                     // Dinamik islemler icin yazboz alani

char Cikis=0;                                       // Cihazlari calistirma/durdurma bilgisi
char Giris=0;                                       // Switch bilgileri

unsigned short PortA;
unsigned short PortB;
unsigned short PortC;
short ADC_CH0;
short ADC_CH1;

char MyMAC [6]={0x77,0x77,0x77,0x77,0x77,0x77};
char MyIP  [4]={192,168,1,7};                       // ipconfig ile ogreneceksiniz ya da modemden ayirdiginiz IP

void AnaSayfa(void);
void Sayfa1(char*, int);
void Sayfa2(char*, int);
void Sayfa3(char*, int);
void Sayfa4(char*, int);

void SystemInit()
{
           WebInit(MyMAC, MyIP);     // Donanimi ayarla
}

int main()
{
           WebStart();                              // Serveri calistir
}

/*************************************************************************************
           Sayfada Link veren html dizilimi
*************************************************************************************/

void  LinkVer(char SayfaNo)
{
           sprintf(text,"<a href=~http://%d.%d.%d.%d/%c~>",MyIP[0],MyIP[1],MyIP[2],MyIP[3],SayfaNo); TextCopy(text);
}

/*************************************************************************************
           Yeni html sayfaya baslarken html kod dizilisi
*************************************************************************************/

void Baslik()
{
           TextCopy((char*) "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
           TextCopy((char*) "<div align=~center~>");
           TextCopy((char*) "<table border=~0~ width=~620~><tr><td colspan=~4~ align=~center~ height=~50~>");
           TextCopy((char*) "<p><font size=~6~ color=~blue~>STM32F103C8-ENC28J60 Web Server</font></p></td></tr>");
//         TextCopy((char*) "<tr><td colspan=~4~ align=~center~><img src=~http://www.cncdesigner.com/asm.gif~></td></tr>");
}

/*************************************************************************************
           Basligi kapatan b�l�m
*************************************************************************************/

void Bitir(char ver)
{
           if (ver)
              {
                TextCopy((char*)"<tr><td height=~100~colspan=~4~ align=~center~>");
                LinkVer(' ');
                TextCopy(text);
                TextCopy((char*)"<p><font size=~4~ color=~green~>Ana Sayfaya geri d�n</font></p>");
              }
           TextCopy((char*)"</td></tr></table></div>");
}

/*************************************************************************************
           Serverde bulunmayan bir sayfa izlenmek isteniyor
*************************************************************************************/

void SayfaYok()
{
           Baslik();
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p><font size=~4~ color=~red~>Hata 404</font></p></b>");
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p><font size=~4~ color=~red~>B�yle bir sayfa bulunmamaktadir</font></p></b>");
           Bitir(1);
}         

/*************************************************************************************
           Servera gelen sayfa izleme talebi bu rutine yonlendirilir
           Datalar TCP paket icinde gelen verileri saklayan array dir
           Len, Datalar alanindaki verilerin byte cinsinden uzunlugudur
           Not: Datalar alani siz sayfa hazirlamaya basladiginizda bozulur
*************************************************************************************/

void WebPage(char* Datalar, int len)
{
short SayfaNo;

           counter++;

           SayfaNo=' ';
           if      (ThereAre((char*)"GET " )) SayfaNo=Datalar[5];     // Sayfa adlarini tek karakterle olusturun
           else if (ThereAre((char*)"POST ")) SayfaNo=Datalar[6];     // Yada bu kismi yeniden kodlayin
             
           switch(SayfaNo)
             {
               case ' ':  AnaSayfa(); break;
               case '1':  Sayfa1(Datalar, len)  ; break;
               case '2':  Sayfa2(Datalar, len)  ; break;
               case '3':  Sayfa3(Datalar, len)  ; break;
               case '4':  Sayfa4(Datalar, len)  ; break;
               default:   SayfaYok();
             }
}


/*************************************************************************************
           Ana sayfamiz
*************************************************************************************/

void AnaSayfa()
{
           Baslik();
           TextCopy((char*)"<tr><td width=~155~ align=~center~>"); LinkVer('1'); TextCopy(text); TextCopy((char*)"<p><font size=~4~ color=~green~>MCU Bilgileri</font></p></td>");
           TextCopy((char*)"<td width=~155~ align=~center~>"); LinkVer('2'); TextCopy(text);     TextCopy((char*)"<p><font size=~4~ color=~green~>Cihazlari ac kapat</font></p></td>");
           TextCopy((char*)"<td width=~155~ align=~center~>"); LinkVer('3'); TextCopy(text);     TextCopy((char*)"<p><font size=~4~ color=~green~>Sifreli menu</font></p></td>");
           TextCopy((char*)"<td width=~155~ align=~center~>"); LinkVer('4'); TextCopy(text);     TextCopy((char*)"<p><font size=~4~ color=~green~>Bakim menusu</font></p></td></tr>");
           Bitir(0);
}

/*************************************************************************************
           1. sayfa
*************************************************************************************/

void Sayfa1(char* Datalar, int len)
{

           Baslik();
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>MCU Bilgileri</font></p></b>");
           TextCopy((char*)"<tr><td colspan=~4~ align=~center~><table border=~0~ width=~200~ align=~center~>");
           sprintf(text,"<tr><td width=~80~ align=~center~><p>GPIO A</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",PortA);TextCopy(text);
           sprintf(text,"<tr><td width=~80~ align=~center~><p>GPIO B</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",PortB);TextCopy(text);
           sprintf(text,"<tr><td width=~80~ align=~center~><p>GPIO C</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",PortC);TextCopy(text);
           sprintf(text,"<tr><td width=~80~ align=~center~><p>An.Ch1</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",ADC_CH0);TextCopy(text);
           sprintf(text,"<tr><td width=~80~ align=~center~><p>An.Ch2</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",ADC_CH1);TextCopy(text); TextCopy((char*)"</table></td></tr>");
           Bitir(1);
}

/*************************************************************************************
           2. sayfa
*************************************************************************************/

void Sayfa2(char* Datalar, int len)
{
         
           if      (ThereAre((char*)"A=0")) Cikis=(Cikis & ~0x01);
           else if (ThereAre((char*)"A=1")) Cikis=(Cikis |  0x01);

           if      (ThereAre((char*)"B=0")) Cikis=(Cikis & ~0x02);
           else if (ThereAre((char*)"B=1")) Cikis=(Cikis |  0x02);


           Baslik();
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>Cihazlari acip kapama ve durum ogrenme menusu</font></p></b></td></tr>");
           TextCopy((char*) "<form method=~post~>");
           
           TextCopy((char*) "<tr><td width=~200~><b><p>Kombi ");
           if (Cikis&0x01) TextCopy((char*) "Calisiyor</p></b></td>");
                      else TextCopy((char*) "Calismiyor</p></b></td>");
           TextCopy((char*) "<td><input type=~radio~; name=~A~; value=~1~> Calistir</td><td><input type=~radio~; name=~A~; value=~0~> Durdur</td></tr>");

           TextCopy((char*) "<tr><td><b><p>Kettle ");
           if (Cikis&0x02) TextCopy((char*) "Calisiyor</p></b></td>");
                      else TextCopy((char*) "Calismiyor</p></b></td>");
           TextCopy((char*) "<td><input type=~radio~; name=~B~; value=~1~> Calistir</td><td><input type=~radio~; name=~B~; value=~0~> Durdur</td></tr>");

           TextCopy((char*) "<tr><td><b><p>Pencere ");
           if (Giris&0x01) TextCopy((char*) "Acik</p></b></td></tr>");         else TextCopy((char*) "kapali</p></b></td></tr>");

           TextCopy((char*) "<tr><td><b><p>Kapi ");
           if (Giris&0x02) TextCopy((char*) "Acik</p></b></td></tr>");         else TextCopy((char*) "kapali</p></b></td></tr>");

           TextCopy((char*) "<tr><td><b><p>Kedi ");
           if (Giris&0x04) TextCopy((char*) "disari cikti</p></b></td></tr>"); else TextCopy((char*)"i�eri girdi</p></b></td></tr>");

           TextCopy((char*) "<tr><td><b><p>Iceride ");
           if (Giris&0x08) TextCopy((char*) "birisi var</p></b></td></tr>");   else TextCopy((char*) "kimse yok</p></b></td></tr>");

           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>Kombi ve Kettle PA0 ve PA1 pinlerine baglidir</font></p></b></td></tr>");

           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~80~><b><p><input type=~submit~ value=~Gonder~></td></tr>");
           Bitir(1);
}

/*************************************************************************************
           3. sayfa
*************************************************************************************/

void Sayfa3(char* Datalar, int len)
{
           if ((ThereAre((char*)"Z=123456"))&&(ThereAre((char*)"W=Hirsizi+Vur")))
             {
               Baslik();
               TextCopy((char*) "<tr><td colspan=~4~ align=~center~ height=~150~><b><p><font size=~4~ color=~black~>Gizli Gorev Sayfasi</font></p></b>");
               TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p>Isteginiz yerine getirildi</p></b></td></tr>");
             }
           else if ((ThereAre((char*)"Z="))||(ThereAre((char*)"W=")))
             {
               Baslik();
               TextCopy((char*) "<tr><td colspan=~4~ align=~center~ height=~150~><b><p><font size=~4~ color=~black~>Gizli Gorev Sayfasi</font></p></b>");
               TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p>Yetkiniz yok ya da yanlis emir verdiniz</p></b></td></tr>");
             }
           else
             {
               Baslik();
               TextCopy((char*) "<tr><td colspan=~4~ align=~center~ height=~150~><b><p><font size=~4~ color=~black~>Gizli Gorev Sayfasi ( Gorev: Hirsizi Vur  Sifre: 123456 )</font></p></b>");
             }

           TextCopy((char*) "<form method=~post~>");
           TextCopy((char*) "<tr><td></td></tr>");
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~50~><b><p>Gorev  <input type=~text~; name=~W~></p></b></td></tr>");
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~50~><b><p>Sifre  <input type=~password~; name=~Z~></p></b></td></tr>");
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~50~><b><b><p><input type=~submit~ value=~Gonder~></td></tr>");
           TextCopy((char*) "<tr><td></td></tr>");
           Bitir(1);
}

/*************************************************************************************
           4. sayfa
*************************************************************************************/

void Sayfa4(char* Datalar, int len)
{
           Baslik();
           TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>Bakim menusu</font></p></b>");
           Bitir(1);
}

/*************************************************************************************
           Serverdan bagimsiz calisan kullanici kodlari

           Mevcut yapida asagidaki yapilandirmalar yapilmistir fakat degistirebilirsiniz

           A0..7 Output
           B8..B9 ADC
           B10..B15 Input
           PC15..PC13 Input

           A15, B3, B4, B5, B6 pin tanimlarini degistiremezsiniz. (SPI1 reserve)
           
*************************************************************************************/

void STM32F103()
{
           while(1)
             {
               PortA=GPIOA->IDR&0x0FFFF;
               PortB=GPIOB->IDR&0x0FFFF;
               PortC=GPIOC->IDR&0x0FFFF;

               ADC_CH0= ADC1->JDR1;
               ADC_CH1= ADC1->JDR2;
               if (!(ADC1->CR2&0x200000)) ADC1->CR2|=0x200000;

               GPIOA->BSRR=Cikis&~0x8000;                     // A15 Sisteme ait (reserve)
               GPIOA->BRR=~Cikis&~0x8000;                     // A15 Sisteme ait (reserve)

               Giris=(GPIOB->IDR>>8)&~0x03;                   // B8 B9 ADC
             } 
}

Başlık: Ynt: STM32F103C8 ile mini web server (full proje)
Gönderen: z - 17 Ekim 2016, 11:06:06
Yeni kütüphane ve yeni örnek demo program gene aynı linkten indirilebilir.

Keil proje dosyaları (https://github.com/Bunalmis/ENC28J60---STM32F103C8)

Örnek demo program daha zengin HTML kodlama ile yapıldı.

İstediğiniz kadar web sayfası ekleyebilirsiniz.
8 adet elektrikli cihazı internet üzerinden çalıştırılıp durdurulabilirsiniz.
8 adet switchi internet üzerinden okuyabilirsiniz.
2 adet analog voltajı internet üzerinden okuyabilirsiniz.

PA0..PA7 digital çıkışlar.
PC15, PC14, PC13 ve PB15..PB10 digital girişler.
PB9 ve PB8 Analog giriş.

(Bu yapılandırmayı yada I/O sayısını port çoğullama teknikleri ile değiştirebilirsiniz)

WEB sayfası ve kontroller tamamen C ile kodlanmıştır.

Her bir web sayfasının en fazla 1460 byte olacağı ve bu kontrolün denetiminin sizde olduğunu unutmayın.

(1460 byte'dan daha fazla uzun web sayfası oluşturursanız C değişkenleriniz ezilir ve kod çalışmaz)