0

2 台のラップトップ マシンを使用して実験をセットアップしました。1 台は送信機として機能し、もう 1 台は受信機として機能します。送信機は、設定されているさまざまなタイマーの期間に応じて、さまざまなサイズのパケットを継続的に送信します。受信機はこれらのパケットをキャプチャし、プログラムの終了時に PRR を計算します。

送信機と受信機の距離はわずか 6 ~ 7 フィートです。

この TCP/IP 設定で 0.87 のパケット受信率は正常ですか、それとも低い側ですか?

送信機:

 void sendMedicalStream(void) {

  timer_count ++;

  if(timer_count % 5 ==0) {        

  memcpy(pu8 ,(struct pulse_oxim_packet*)& oxim_packet , sizeof(struct 
              pulse_oxim_packet));
   x=send(s,pu8,sizeof(u8aSendBuffer),0); 
  }

  if(timer_count % 50 == 0) {    
   memcpy(pu8 ,(struct ecg_data*)& wifi_ecg_data , sizeof(struct ecg_data));
   x=send(s,pu8,sizeof(u8aSendBuffer),0);
  }

   if(timer_count % 10 == 0) {  
   memcpy(pu8 ,(struct resp_monitor_packet*)& rsp_mon_packet , sizeof(struct   
                                                              resp_monitor_packet));
   x=send(s,pu8,sizeof(u8aSendBuffer),0);
    }

    if(timer_count % 120 == 0) {  
    memcpy(pu8 ,(struct self_check_glucose_monitor_packet*)& gm_packet , sizeof(struct 
                           self_check_glucose_monitor_packet));
    x=send(s,pu8,sizeof(u8aSendBuffer),0);
   }

     if(timer_count % 30 == 0) {  
    memcpy(pu8 ,(struct self_check_weight_monitor*)& wm_packet , sizeof(struct 
                                                   self_check_weight_monitor));
     x=send(s,pu8,sizeof(u8aSendBuffer),0);
    }

  if(timer_count % 25 == 0) {  
   memcpy(pu8 ,(struct asthma_monitor*)& as_mon_packet , sizeof(struct asthma_monitor));
   x=send(s,pu8,sizeof(u8aSendBuffer),0);
   }

  if(timer_count % 35 == 0) {  
    memcpy(pu8 ,(struct  sc_blood_press_mon_packet*)& bp_mon_packet , sizeof(struct 
                      sc_blood_press_mon_packet));
    x=send(s,pu8,sizeof(u8aSendBuffer),0);
  }

 if(timer_count % 45 == 0) {  
  memcpy(pu8 ,(struct  insulin_pump_packet*)& ins_pump_packet , sizeof(struct 
                         insulin_pump_packet));
   x=send(s,pu8,sizeof(u8aSendBuffer),0);
  }


  if(timer_count % 15 == 0) { 
   memcpy(pu8 ,(struct  fetal_heart_monitor *)& fhm_packet , sizeof(struct 
                            fetal_heart_monitor));
    x=send(s,pu8,sizeof(u8aSendBuffer),0);
  }
   if(timer_count % 180 == 0) {  
   memcpy(pu8 ,(struct dialysis_machine *)& dial_mach_packet , sizeof(struct 
                      dialysis_machine));
   x=send(s,pu8,sizeof(u8aSendBuffer),0);

  }

  if(timer_count == 10000)
   timer_count = 0;
  }

 int main(int argc,char **argv)
  {

struct sockaddr_in sin;

 /* Packet Title DEtails */
    strcpy(fhm_packet.title,"Fetal-Heart-Rate-Monitor");
    strcpy(bp_mon_packet.title,"Blood-Pressure-Monitor");
    strcpy(ins_pump_packet.title,"Insulin-Pump-Monitor");
    strcpy(wm_packet.title,"Weight-Monitor");
    strcpy(as_mon_packet.title,"Asthma-Monitor");
    strcpy(gm_packet.title,"Glucose-Level-Monitor");
    strcpy(rsp_mon_packet.title,"Infant-Respiratory-Monitor");
    strcpy(dial_mach_packet.title,"Dialysis-Machine");


    /* Socket Details */   
    len=sizeof(struct sockaddr);

    if(argc==2){
    host =argv[1];
    }

   /* translates the host name into peer's IP address */

   hp=gethostbyname(host);
    if(!hp){
    fprintf(stderr,"duplex-talk : uknown host : %s\n",host);
    exit(1);
    }

   /* build address data structures */

    bzero((char *)&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    bcopy(hp->h_addr,(char *)(&sin.sin_addr),hp->h_length);
    sin.sin_port = htons(SERVER_PORT);

     /* active open */
    if((s = socket(PF_INET,SOCK_STREAM,0))<0) {
    perror("duplex-talk : socket");
    exit(1);
     }

    if(connect(s, (struct sockaddr *)&sin, sizeof(sin)) <0) {
    perror("duplex-talk : connect");
    exit(1);
   }


  /* Timer Details */

  struct itimerval it_val;  /* for setting itimer */

   if (signal(SIGALRM, (void (*)(int)) sendMedicalStream) == SIG_ERR) {
   perror("Unable to catch SIGALRM");
    exit(1);
   }


   it_val.it_value.tv_sec =     MIN_INTERVAL/1000;
   it_val.it_value.tv_usec =    (MIN_INTERVAL*1000) % 1000000;   
   it_val.it_interval = it_val.it_value;

   if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
   perror("error calling ECG setitimer()");
   exit(1);
   }


 /* main loop : get and send lines of text */
  int i=0,j=0;  
 while(1);

 }

レシーバー:

 int main(int argc,char *argv)
  {
   char * pu8 = u8aSendBuffer;
   signal(SIGINT,INThandler);
struct sockaddr_in sin;
struct sockaddr addr;
socklen_t fromlen;
char buf[MAX_LINE];


len=sizeof(struct sockaddr);

/* build address data structues */

bzero((char *)&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);

/* setup passive open*/

if((s=socket(PF_INET,SOCK_STREAM,0))<0) { 
      perror("duplex-talk:socket");
       exit(1);
   }

   if((bind(s,(struct sockaddr *)&sin, sizeof(sin))) < 0){

    perror("duplex-talk: bind");
    exit(1);
   }

    // listen
  listen(s,MAX_PENDING);

    if((new_s = accept(s,(struct sockaddr *)&sin, &len)) < 0) {
    perror("duplex-talk : accept");
     exit(1);
  }

  while(1)
  {


    recv(new_s,pu8,sizeof(u8aSendBuffer),0);

    p_ptr = (struct pulse_oxim_packet *)pu8;
    ecg_ptr = (struct ecg_data *)pu8;
    resp_mon_ptr = (struct resp_monitor_packet *)pu8;
    gmon_ptr = (struct self_check_glucose_monitor_packet *)pu8;
    wmon_ptr = (struct self_check_weight_monitor *)pu8;
    asmon_ptr = (struct asthma_monitor *)pu8;
    bp_mon_ptr = (struct sc_blood_press_mon_packet *)pu8;
    ins_pump_packet = (struct insulin_pump_packet *)pu8;
    ft_mon_ptr = (struct fetal_heart_monitor *) pu8; 
    dial_mach_ptr = (struct dialysis_machine *) pu8;     



  if( p_ptr != NULL && strcmp(p_ptr->title,"Pulse-Oximeter-Data") == 0) 
    recv_count++;
  if( ecg_ptr != NULL &&  strcmp( ecg_ptr->title,"ECG-Monitor-Data") == 0 )
    recv_count++;
  if( gmon_ptr != NULL &&  strcmp( gmon_ptr->title,"Glucose-Level-Monitor") == 0 )
     recv_count++;
  if( asmon_ptr != NULL &&  strcmp( asmon_ptr->title,"Asthma-Monitor") == 0 )
     recv_count++;
  if(wmon_ptr != NULL &&  strcmp( wmon_ptr->title,"Weight-Monitor") == 0 )
     recv_count++;
    if( ins_pump_packet != NULL && strcmp( ins_pump_packet->title,"Insulin-Pump-Monitor") 
                             == 0)
     recv_count++;
  if( bp_mon_ptr != NULL &&  strcmp(bp_mon_ptr->title,"Blood-Pressure-Monitor") == 0 )
     recv_count++;
  if( ft_mon_ptr != NULL &&  strcmp( ft_mon_ptr->title,"Fetal-Heart-Rate-Monitor") == 0 )
     recv_count++;
   if( dial_mach_ptr != NULL &&  strcmp( dial_mach_ptr->title,"Dialysis-Machine") == 0 )
     recv_count++;
   }

   return 0;
  }
4

1 に答える 1

1

私はネットワークの専門家ではありませんが、送信機が継続的にパケットを送信している場合、通常よりもはるかに多くの干渉が ACK パケットに発生している可能性が非常に高くなります。

私の推測では、接続が飽和しないようにごくわずかに変更すると、パケット受信率がはるかに高くなることがわかります。

編集: あなたのコードを見て、考えられる問題の 1 つは、ストリームベースのソケットを作成したにもかかわらず、それを 1 つとして扱っrecvていないことです。呼び出しごとに正確に 1 つのパケットを取得すると想定しています。:

recv(new_s,pu8,sizeof(u8aSendBuffer),0);

からの戻り値を使用して、実際に受信したrecvバイト数を確認する必要があります。

この場合、受信ウィンドウが非常に小さいため、無視しても問題ない可能性があります(何が何であるかはわかりませんsizeof(u8aSendBuffer))が、一般的には、ストリームをパケットのシーケンスとして扱うべきではありません: データのストリームとして扱う必要があります。必要なだけのデータを受け取る場合と受け取らない場合があります。

于 2012-07-22T20:06:01.693 に答える