اطلاعیه

Collapse
No announcement yet.

uIP یک پشتهٔ TCP/IP خوب برای AVR

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    uIP یک پشتهٔ TCP/IP خوب برای AVR


    مدتها بود میخواستم یک پشتهٔآ‌ TCP/IP خوب برای AVR پیدا کنم و کار کردن با شبکه رو راحت!
    قبلا چند تجربه یا کتابخونهٔ Tuxgraphic داشتم.. خوب بود، ولی راستش خیلی بهم ریخته کدزنی شده بود و براحتی نمیشد باهاش کنار اومد. بخاطر همین رفتم سراغ یک پشتهٔ دیگه، بنام uIP (خونده میشه Micro IP)
    توابعی که در اختیار برنامهآ‌نویس قرار میده خیلی شسته رفته و قابل درک هست و براحتی و بدون درد میشه باهاش برنامهآ‌های تمیز و بزرگی نوشت (:

    میکروکنترلر انتخابیم ATmega128 و کنترلر شبکه ENC28J60 بود. نکته جالب قضیه این هست که uIP برای معماری پردازندهآ‌ها و همچنین کنترلرهای شبکه مختلفی قابل استفاده هست و یک پورت عالی از ورژن 0.9 این کتابخونه برای AVR و ENC28J60 وجود داره. (لینکهای دانلود در انتهای پست آورده شده)

    پس برد رو درست کردم و افتادم به ور رفتن با این کتابخونه.

    تست اول این بود که برد ساخته شده به Ping جواب میده؟ که براحتی یا چند خط کد ساده که در مثالآ‌های کتابخونه بود این قابلیت بدست اومد. کد رو در زیر میارم و شروع میکنم به توضیح قسمتهای اصلیش :
    کد PHP:
    #include "global.h
    #include "uip.h"
    #include "nic.h"
    #include "uip_arp.h"
    #include "compiler.h"

    #define BUF ((struct uip_eth_hdr *)&uip_buf[0])

    /*****************************************************************************
    * Periodic Timout Functions and variables
    *
    * The periodic timeout rate can be changed depeding on your application
    * Modify these functions and variables based on your AVR device and clock
    *  rate
    * The current setup will interrupt every 256 timer ticks when the timer
    *  counter overflows. timerCounter must count until 0.5 seconds have
    *  alapsed
    *****************************************************************************/

    #define TIMER_PRESCALE  1024
    #define TIMERCOUNTER_PERIODIC_TIMEOUT 15

    static unsigned char timerCounter;

    void initTimer(void){
     
    TCCR2=0x05;
     
    TCNT2=0x00;
     
    OCR2=0x00;
     
    TIMSK |= _BV(TOIE2);
     
    timerCounter 0;
    }


    ISR(TIMER2_OVF_vect){
     
    timerCounter++;
    }


    /*****************************************************************************
    * Main Control Loop
    *****************************************************************************/
    int main(void){
     
    unsigned char i;
     
    unsigned char arptimer=0;
     
     
    // init NIC device driver
     
    nic_init();

     
    // init uIP
     
    uip_init();
     
     
    // init ARP cache
     
    uip_arp_init();

     
    // init periodic timer
     
    initTimer();
     
     
    sei();

     while(
    1){
      
    // look for a packet
      
    uip_len nic_poll();
      
      if(
    uip_len == 0){
       
    // if timed out, call periodic function for each connection
       
    if(timerCounter &gtTIMERCOUNTER_PERIODIC_TIMEOUT){
        
    timerCounter 0;
        for(
    0&ltUIP_CONNSi++){
         
    uip_periodic(i);
         
    // transmit a packet, if one is ready
         
    if(uip_len &gt0){
          
    uip_arp_out();
          
    nic_send();
         }
        }
        
    /* Call the ARP timer function every 10 seconds. */
        
    if(++arptimer == 20)
        {
         
    uip_arp_timer();
         
    arptimer 0;
        }
       }
      }else{ 
    // packet received
       // process an IP packet
       
    if(BUF->type == htons(UIP_ETHTYPE_IP)){
        
    // add the source to the ARP cache
        // also correctly set the ethernet packet length before processing
        
    uip_arp_ipin();
        
    uip_input();

        
    // transmit a packet, if one is ready
        
    if(uip_len &gt0){
         
    uip_arp_out();
         
    nic_send();
        }
       }else if(
    BUF->type == htons(UIP_ETHTYPE_ARP)){   // process an ARP packet
        
    uip_arp_arpin();
        
    // transmit a packet, if one is ready
        
    if(uip_len &gt0)
         
    nic_send();
       }
      }
     }

     return 
    1;



    در خطوط اول برنامه که یکسری فایل هیدر مربوط به کتابخونهٔ uip الحاق شده.
    نکته مهمی که در این کتابخونه وجود داره این هست که باید تابعی بنام uip_periodic هر نیم ثانیه و تابع uip_arp_timer هر ۱۰ ثانیه اجرا بشن. بخاطر همین نیاز هست که در پردازنده یک سیستم زمانآ‌بندی راهآ‌اندازی بشه. در AVR میشه اینکار رو خیلی تمیز و راحت با یک تایمر و وقفه سرریز ایجاد کرد. در این مثال من از تایمر شماره ۲ در Mega128 که ۸ بیت هست استفاده کردم. Prescale روی ۱۰۲۴ در فرکانس 8MHz تنظیم هست،پس هر ۱۲۸ میکروثانیه یک تیک داریم و هر ۲۵۶ تیک تایمر معادل تقریبا ۳۳ میلیآ‌ثانیه میشه. پس تقریبا هر ۱۵ باری که تایمر ۲ سرریز داشته باشد، زمانی معادل ۴۹۰ میلیآ‌ثانیه طی شده است.
    عدد ۱۵ را در یک Define بنام TIMERCOUNTER_PERIODIC_TIMEOUT در برنامه تعریف کردهآ‌ایم.

    پس از نوشتن سیستم زمانآ‌بندی، سراغ تابع main میرویم. در ابتدای تابع راهآ‌اندازیآ‌های اولیه کتابخانه انجام میشه.این راهآ‌اندازیآ‌ها از nic_init برای پایینآ‌ترین سطح کتابخانه (راهآ‌اندازی کنترلر ENC28J60) شروع میشود و بعد از آن راهآ‌اندازی اصلی کتابخانه بنام uip_init را داریم. سپس سراغ uip_arp_init میرویم که راهآ‌اندازی مربوط به جداول ARP است. در ادامه سیستم زمانآ‌بندی توسط تابع initTimer که خودمان با استفاده از تایمر نوشتیم راهآ‌اندازی میآ‌شود و وقفهآ‌های کلی توسط sei فعال خواهد شد.

    بعد از تمام این مقدمات، سراغ حلقه اصلی برنامه میریم که کل هیچ وقت نباید پایان داشته باشه.
    خب، در این حلقه ابتدا توسط تابع nic_poll بررسی میشه که آیا فعالیت جدیدی در کنترلر شبکه داریم یا خیر. اگر خروجی این تایع 0 باشد، یعنی فعلا خبری از فعالیت شبکه نیست و میتونیم با خیال راحت کارهای دیگری انجام بدیم. این کارهای دیگه، میتونه بررسی تعداد سرریزهای تایمر باشه که اگر به عدد ۱۵ رسید که معادل با ۵۰۰ میلیآ‌ثانیه هست، تابع uip_periodic فراخونده بشه. این تابع در اصل وضعیت اتصالات فعلی رو چک میکنه و مثلا اگر در جایی از برنامه یک کانکشن جدید ایجاد شده باشه، به محض فراخوانی این تابع، برنامه از این اتصال جدید گاه میشه. یا مثلا اگر به یک اتصال قدیمی دادهآ‌های فرستاده شده باشه (که در حافظه موقت ذخیره میشن)، این اطلاعات توسط تابع nic_send به کنترلر ارسال و از اون روی شبکه فرستاده بشن.
    همچنین تعداد سرریزهای اگر به ۲۰ رسید، به معنی طی شدن زمان ۱۰ ثانیه هست. همونطور که گفته شد، تابع uip_arp_timer باید هر ۱۰ ثانیه فراخوانی بشه تا جدول ARP مجددا مرتب بشه. (لطفا نپرسید ARP چیه، در اینترنت به اندازه کافی در موردش اطلاعات هست)


    حالا اگر خروجی nic_poll برابر با صفر نبود چی ؟
    خب این به معنی این هست که فعالیت جدیدی در کنترلر شبکه بوجود اومده و یکسری داده از شبکه دریافت شده. قرار نیست ما بدونیم این دادهآ‌ها چطوری هستن و بایت به بایت چه معنیآ‌ای دارن. این کارها رو خود uIP انجام میده. فقط مهمه که بدونیم دادهآ‌ها از چه نوعی هستن تا بر طبق اون توابع درستی از uIP رو فراخوانی کنیم تا خودش کارهارو درست کنه (:
    ما میتونیم توسط المنت type در یک ساختار که برای راحتی بیشتر اسم این ساختار BUF گزاشته شده، متوجه بشیم که اطلاعات جدیدی که در از کنترلر شبکه دریافت شده، از چه جنس هستن. یه نوع بسته مختلف داریم که در فایلآ‌های هیدر کتابخونه برای هر کدومش یک Define وجود داره :
    FILE: uip_arp.h

    کد PHP:
    #define UIP_ETHTYPE_ARP 0x0806
    #define UIP_ETHTYPE_IP 0x0800
    #define UIP_ETHTYPE_IP6 0x86dd 


    هر کدوم اینها در این قسمت کد بررسی میشن و بر طبق نوع بسته، توابع خاصی بترتیب فراخوانی میشن.

    خب، با توشتن این کدها در اصل برنامه شما قادر هست یک ارتباط پایهآ‌ای با شبکه رو برقرار کنه و در اصل بستر برای ارتباطات پیچیدهآ‌تر بوجود اومده. شما حالا میتونید بردتون رو از شبکه Ping کنید و ازش جواب بگیرید.
    ولی یک سوال مهم: IP دستگاه چیست ؟!

    به این سوال در پست بعدی جواب میدم ... پس به سبک این برنامهآ‌های تلویزیونی یک تبلیغ واسه پست بعدی برم (:
    در پست بعدی یاد خواهیم گرفت :
    * چطور تنظیمات IP دستگاه خود را انجام دهیم (IP دستگاه، netmask و gateway)
    * چطور یک سرور ساده و با ادب بسازیم که به هر اتصال جدید متن Welcome رو بفرسته (:

    لینکآ‌ها :
    ## دانلود کتابخونه از اینجا

    ## دانلود مرجع کامل uIP از اینجا
    چگونه هوشمندانه بپرسیم

    #2
    پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

    سلام.خیلی عالی هست مطالب.دست گلت مرسی! :mrgreen: خدایی خیلی جالب بود.فقط چندتا مورد! یکی اینکه لینک دانلود کتابخونه نیاز به عضویت تو اون سایت داره؛ اگه امکانش هست جای دیگه پلود بشه؛ اگه نه واسم ایمیل بزنین تا پلود کنم بزارم اینجا.
    مورد بعدی اینکه اگه با میکروهای PIC کار کردین یا اطلاعاتی راجع بهش دارین؛ با کدوم سری این میکروها میشه این کارها رو انجام داد؟
    باز هم ممنون. :applause:

    دیدگاه


      #3
      پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

      سلام
      ممنون . مطلب خیلی جالبی گذاشتید .

      امکانش هست شماتیک برد رو هم بذارید؟
      با تشکر
      تاپیک جامع سیستم مدیریت ساختمان BMS و خانه هوشمند Smart Home
      دانلود مجموعه آموزشی شرکت Altium ا (Altium Training)
      مقالات و فایل های آموزشی نرم افزار Labview
      حل مشکل درایور و راه اندازی FT232 های غیراورجینال

      دیدگاه


        #4
        پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

        نوشته اصلی توسط شاهرخ
        سلام.خیلی عالی هست مطالب.دست گلت مرسی! :mrgreen: خدایی خیلی جالب بود.فقط چندتا مورد! یکی اینکه لینک دانلود کتابخونه نیاز به عضویت تو اون سایت داره؛ اگه امکانش هست جای دیگه پلود بشه؛ اگه نه واسم ایمیل بزنین تا پلود کنم بزارم اینجا.
        مورد بعدی اینکه اگه با میکروهای PIC کار کردین یا اطلاعاتی راجع بهش دارین؛ با کدوم سری این میکروها میشه این کارها رو انجام داد؟
        باز هم ممنون. :applause:
        در اینجا پلود کردم.
        با PIC کار نکردم، ولی با هر میکروکنترلری که پورت SPI و یک کامپایلر C استاندارد و حداقل [s]30KB[/s] 15KB حافظه برنامه و 2KB حافظه SRAM داشته باشه میشه از این کتابخونه استفاده کرد (:
        چگونه هوشمندانه بپرسیم

        دیدگاه


          #5
          پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

          نوشته اصلی توسط محمد م
          سلام
          ممنون . مطلب خیلی جالبی گذاشتید .

          امکانش هست شماتیک برد رو هم بذارید؟
          با تشکر
          راستش این بردی که در عکس میآ‌بینید فقط برای اتصال به شبکه نیست و روش ماژول GSM هم قرار داره و در نتیجه یک برد توسعه خوب فقط برای شبکه نیست. پس قرار دادن شماتیک کل اون در این پست بیآ‌معنی هست.
          برای نحوه اتصال ENC28J60 به میکروکنترلر از شماتیکهای Tuxgraphic استفاده کنید و همچنین پست زیر رو مطالعه بفرمایید:
          http://www.eca.ir/forum2/index.php?topic=29428.0

          چگونه هوشمندانه بپرسیم

          دیدگاه


            #6
            پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

            با تشکر از انتشار مطالب،
            می خواستم بدونم که ساده ترین راه پیاده سازی پروتوکل های RTP و SIP چیه؟ آیا با uIP میشه پیاده سازیشون کرد؟

            دیدگاه


              #7
              پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

              به این سوال در پست بعدی جواب میدم ... پس به سبک این برنامهآ‌های تلویزیونی یک تبلیغ واسه پست بعدی برم (:
              در پست بعدی یاد خواهیم گرفت :
              * چطور تنظیمات IP دستگاه خود را انجام دهیم (IP دستگاه، netmask و gateway)
              * چطور یک سرور ساده و با ادب بسازیم که به هر اتصال جدید متن Welcome رو بفرسته (:

              مطالبتون واقعا عالی بود

              **درست مثل تبلیغات بازرگانی شد میگن تا چند دقیقه بعد ادامه برنامه ولی خوابشو ببین کی به کی است نیم ساعت بعد (خوب این هم میشه چند دقیقه دیگه)

              جسارت نباشه ها داشتم تبلیغات بازرگانی ها رو مورد نقد قرار میدادم

              دیدگاه


                #8
                پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                اقا دمت گرم ما که مثل این سریال ها بد در گیر قسمت بعدی پروژه شدیم
                من به آمار زمین مشکوکم...
                اگر این شهر پر از آدم هاست......
                پس چرا این همه دل ها تنهاست؟

                دیدگاه


                  #9
                  پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                  سوال: چطور برای uIP تنظیمات IP را انجام دهیم :
                  جواب: اینکار به ۳ روش قابل انجام هست. یک روش انجام این تنظیمات بصورت Hard Code هست ولی روش دوم این قابلیت وجود داره که بصورت Run Time تنظیمات انجام بشن. عنوان روش سوم هم Ping IP address asignment هست و چون خودم درک نکردم نمیتونم توضیح بدم، به مستندات رجوع کنید.

                  در روش اول باید به سراغ فایل تنظیمات این کتابخانه بنام uipopt.h برویم. یک تعریف در این فایل بنام UIP_FIXEDADDR وجود دارد که بصورت پیشآ‌فرض ۱ است. در ادامه هم تعاریف مشخصی برای تنظیمات IP وجود داره که برنامهآ‌نویس میتواند آنها را تغییر دهد.
                  کد PHP:
                  #define UIP_FIXEDADDR  1

                  #define UIP_IPADDR0   192 /**< The first octet of the IP address of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_IPADDR1   168 /**< The second octet of the IP address of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_IPADDR2   1  /**< The third octet of the IP address of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_IPADDR3   25  /**< The fourth octet of the IP address of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */

                  #define UIP_NETMASK0  255 /**< The first octet of the netmask of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_NETMASK1  255 /**< The second octet of the netmask of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_NETMASK2  255 /**< The third octet of the netmask of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_NETMASK3  0  /**< The fourth octet of the netmask of
                                  
                  this uIP node, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */

                  #define UIP_DRIPADDR0  192 /**< The first octet of the IP address of
                                  
                  the default router, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_DRIPADDR1  168 /**< The second octet of the IP address of
                                  
                  the default router, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_DRIPADDR2  1  /**< The third octet of the IP address of
                                  
                  the default router, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */
                  #define UIP_DRIPADDR3  1  /**< The fourth octet of the IP address of
                                  
                  the default router, if UIP_FIXEDADDR is
                                  1. \hideinitializer 
                  */ 


                  همانطور که در کد بالا میبینید، IP دستگاه بر روی 192.168.1.25، netmask بر روی 255.255.255.0 و آدرس gateway بر روی 192.168.1.1تنظیم شده است.

                  در روش دوم، مقدار تعریف UIP_FIXEDADDR باید برابر با 0 قرار داده شود و توسط توابع خاصی تنظیمات IP صورت گیرد. نمونه کد زیر نحوه تنظیمات IP را در این حالت نشان میآ‌دهد :

                  کد PHP:
                  u16_t ipaddr[2];
                  uip_ipaddr(ipaddr192,168,1,200);
                  uip_sethostaddripaddr );
                   
                  uip_ipaddr(ipaddr255,255,255,0);
                  uip_arp_netmask[0] = ipaddr[0];
                  uip_arp_netmask[1] = ipaddr[1];
                   
                  uip_ipaddr(ipaddr192,168,1,1);
                  uip_arp_draddr[0] = ipaddr[0];
                  uip_arp_draddr[1] = ipaddr[1]; 


                  در ابتدا یک آرایه با دو عضو ۱۶ بیتی بنام ipaddr تعریف شده. توسط تابع uip_ipaddr، آدرس IP مورد نظر به آن شکلی که مرسوم هست درون ۲ بایت جا داده میشه (به روشی که خود کتابخونه لازم داره). سپس توسط تابع uip_sethostaddr که در اصل یک define در فایل uip.h هست، آدرس IP تنظیم میشه.بعدش نوبت به netmask و gateway میرسه که در ورژن مورد استفادهٔ uip برای این دو تعریفی وجود نداره، پس مستقیما متغیرهای عمومی کتابخونه رو با آدرسهای مورد نظر پر میکنیم.

                  این هم از نحوه تنظیمات آدرسآ‌های شبکهٔ دستگاه، در پست بعدی سرور خودمون رو که روی پورت ۲۳ گوش ایستاده و به هر کانکشن جدید پیغام Welcome رو میفرسته مینویسیم (:
                  چگونه هوشمندانه بپرسیم

                  دیدگاه


                    #10
                    پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                    نوشته اصلی توسط Ali_Asadzadeh
                    با تشکر از انتشار مطالب،
                    می خواستم بدونم که ساده ترین راه پیاده سازی پروتوکل های RTP و SIP چیه؟ آیا با uIP میشه پیاده سازیشون کرد؟
                    آشنایی کاملی با این پروتکلها ندارم، ولی بهرحال اگر در لایه Application از مدل TCP/IP قرار دارن حتما میشه با uIP پیادهآ‌سازی بشن. بعنوان یک مرجع برای مقایسه عرض کنم که در مستندات uIP دیدم که براحتی کلاینت DHCP، کلاینت DNS، سرور و کلاینت SMTP، سرور و کلاینت Telnet و همچنین سرور و کلاینت Web پیادهآ‌سازی شده.
                    چگونه هوشمندانه بپرسیم

                    دیدگاه


                      #11
                      پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                      ساخت سرور توسط uIP
                      در این پست سعی دارم بگم چطور میتونیم توسط uIP یک سرور ساده درست کنیم. هدف ساختن یک سرور هست که بر روی پورت ۲۳ گوش ایستاده تا به درخواستآ‌ها جواب بده. جوابی هم که در ابتدای برقراری ارتباط به یک کلاینت ارسال میشه Welcome هست، و در ادامه کلاینت هر بایتی ارسال کنه، سرور به اون جواب OK میده.
                      این تعریف کاری بود که باید انجام بشه. حالا بریم ببینیم چطوری میشه اینکارو انجام داد (:
                      روند کار خیلی مشخص و ساده هست و ایدهٔ جالبی برای ساخت اپلیکیشنآ‌های مختلف استفاده شده. فایل سورس و هیدری بهمراه کتابخونه uIP وجود داره بنام app.c و app.h
                      ما کدهای مربوط به مدیریت سرورمون رو در اینجا مینویسیم. اگر به فایل app.h نگاهی بیندازید دو تابع دیده میشه. example1_init و example1_app
                      در example1_init راهآ‌اندازی اولیه سرور رو انجام میدیم که همون باز کردن پورت ۲۳ و گوش ایستادن روی این پورت هست. فراخوانی این تابع باید توسط برنامهآ‌نویس در ابتداری تابع main و بعد از راهآ‌اندازیآ‌های اولیه کتابخونه انجام بشه.

                      تابع دوم example1_app بود. این تابع هیچ کجا توسط ما فراخوانی نمیشه، بلکه توسط خود کتابخونه uIP هر موقع نیاز باشه فراخوانی میشه. یعنی هر موقع نیاز باشه که دادهٔ ورودی از شبکه تجزیه و تحلیل بشه، uIP این تابع رو فراخوانی میکنه و کار رو به عهدهٔ ما میزاره.

                      اسم این دو تابع هر چیز دیگهآ‌ای میتونه باشه. تابع init که فراخوانیش دست خودمون هست و میدونیم به چه نامی صدا بزنیمش. ولی اسم تابع دوم رو باید به کتابخونه بگیم که بدونه چطوری اپلیکیشن مارو صدا بزنه. برای اینکار در فایل app.h یک تعریف بنام UIP_APPCALL وجود داره که باید برابر با نام تابع دلخواهمون قرار بگیره.

                      خب حالا برای ساخت سرورمون، فایل app.h را بصورت زیر مینویسیم :
                      کد PHP:
                      #ifndef _APP_H_
                      #define _APP_H_

                      /*****************************************************************************
                      * "A Very Simple Application" from the uIP 0.9 documentation
                      *****************************************************************************/

                      /* UIP_APPSTATE_SIZE: The size of the application-specific state
                        stored in the uip_conn structure. (not used, but has to at least be one) */
                      #define UIP_APPSTATE_SIZE 1

                      #include "uip.h"

                      void example1_init(void);
                      void example1_app(void);

                      #define FS_STATISTICS 0

                      #define UIP_APPCALL   example1_app


                      #endif 


                      برای app.c هم بصورت زیر عمل میکنیم :
                      کد PHP:
                      /*****************************************************************************
                      * "A Very Simple Application" from the uIP 0.9 documentation
                      *****************************************************************************/

                      #include "app.h"

                      void example1_init(void)
                      {
                          
                      uip_listen(HTONS(23));
                      }


                      void example1_app(void)
                      {
                          if(
                      uip_connected() || uip_rexmit()){
                              
                      uip_send("welcome\n", 8);
                          }
                          
                          if(
                      uip_newdata())
                          {
                              
                      uip_send("ok\n", 3);
                          }



                      انقدر تمیز و مشخص کار شده که فکر نکنم نیازی به توضیح اضافه باشه، فقط یک توضیح کوچک در مورد توابع استفاده شده بدم.
                      uip_listen برای باز کردن یک پورت و گوش ایستادن بر روی اون هست. توجه به این نکته لازمه که شماره پورت توسط تعریف HTONS باید از host byte order به network byte order تبدیل بشه.

                      uip_connected هم زمانی True میشه که کانکشن جدید داشته باشیم و به ازای هر کانکشن فقط یکبار True برمیگردونه.

                      uip_rexmit هم زمانی که توسطuIP دادهآ‌ای فرستاده میشه ولی به هر دلیلی به مقصد نرسه، True میشه

                      uip_newdata هم زمانی برابر با True هست داده جدیدی داشته باشیم.

                      حالا دیگه براحتی میشه یک سرور وب ساخت که به هر کلاینت جدیدی که بهش متصل میشه صفحه HTML حاوی کلمه Hello World رو ارسال کنه (:
                      چگونه هوشمندانه بپرسیم

                      دیدگاه


                        #12
                        پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                        سلام اقای رستمی ادامه بده مضوع داره جالب میشه
                        من به آمار زمین مشکوکم...
                        اگر این شهر پر از آدم هاست......
                        پس چرا این همه دل ها تنهاست؟

                        دیدگاه


                          #13
                          پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                          نوشته اصلی توسط محمد فاطمیه
                          سلام اقای رستمی ادامه بده مضوع داره جالب میشه
                          مطالب کلی گفته شده، دیگه دوستان باید کار کنند و تجربیات یا مشکلات احتمالی رو مطرح کنند تا دیگران استفاده کنند.
                          چگونه هوشمندانه بپرسیم

                          دیدگاه


                            #14
                            پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                            سلام
                            میگم اقای رستمی عزیز این مدار که تو سایت tuxgraphics هستش و جنابعالی تو یه پست دیگه کامل ازش جواب گرفتی کار کنیم یا این تاپیکو بریم دنبالش؟
                            من به آمار زمین مشکوکم...
                            اگر این شهر پر از آدم هاست......
                            پس چرا این همه دل ها تنهاست؟

                            دیدگاه


                              #15
                              پاسخ : uIP یک پشتهٔ TCP/IP خوب برای AVR

                              نوشته اصلی توسط محمد فاطمیه
                              سلام
                              میگم اقای رستمی عزیز این مدار که تو سایت tuxgraphics هستش و جنابعالی تو یه پست دیگه کامل ازش جواب گرفتی کار کنیم یا این تاپیکو بریم دنبالش؟
                              در پست اول اشاره کردم که کار کردن با پشتهٔ Tuxgraphic کمی مشکله و توابعش بهم ریخته هست. ولی uIP خیلی تر و تمیز نوشته شده. حالا بستگی داره به انتخاب خودتون که از کدوم بیشتر لذت میبرید.
                              چگونه هوشمندانه بپرسیم

                              دیدگاه

                              لطفا صبر کنید...
                              X