Thông báo

Collapse
No announcement yet.

Giao thức TCP/IP và Web server với AVR

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nguyên văn bởi wind-gon Xem bài viết
    Mừng quá anh đã trở lại. Công việc của anh thế nào,có bận rộn,áp lực như trước mà anh nói không?
    Ah,Anh có thể nói rõ hơn phần này giúp em với???Em loay hoay mãi không sửa được.
    Hiện tại em đã làm xong đầy đủ phần mạch điều khiển được các thiết bị quạt,đèn(1 chiều + xoay chiều),cảm biến chống trộm,và lập trình hẹn thời gian.
    Công việc vẫn vậy, có khi còn bận rộn hơn, chán quá, làm hoài không hết, việc ở đâu cứ ùn ùn kéo tới.
    Nói chung cách làm như sau:
    I-Cập nhật trạng thái các relay và giá trị sensor cho Web:
    Mọi người để ý là trong nội dung trang web, ở chỗ giá trị của relay và sensor mình để 1 keyword tương ứng, đó là: %RL1, %RL2, %RL3, %RL4 và %AD0, %AD1.
    Chỗ này chính là chỗ cần thay thế các giá trị tương ứng trước khi gửi nội dung xuống cho client.
    Vậy trong hàm HTTPSend() (hàm gửi nội dung web xuống client) cần sửa lại để cập nhập các thông tin này. Ví dụ như sau:
    Code:
    void	HTTPSend(const prog_char progdata[],unsigned int dataLen,struct tcpSession *pSession, unsigned char endData)
    {
    	unsigned int i;
    	unsigned int srcDataIdx = 0;
    	unsigned char* dataBuffer;
    	unsigned char Flags;
    	unsigned char tmpChr,tmpVar;
    	unsigned char* tmpStr;
    	Flags = TCP_PSH_FLAG;
    	dataBuffer = ethGetBuffer() + ETH_HEADER_LEN + IP_HEADER_LEN + TCP_HEADER_LEN;
    	if(dataLen == 0){
    		Flags |= TCP_ACK_FLAG;
    		if(endData){
    			if(srcDataIdx == dataLen){
    				Flags |= TCP_FIN_FLAG;
    				pSession->sesState = TCP_STATE_FIN_WAIT1;
    			}
    		}
    		TCPPackedSend(pSession,Flags,0,dataBuffer);
    	}
    	while(srcDataIdx < dataLen){
    		i = 0;
    		while(i<MAX_SEGMENT_SIZE){
    			tmpChr = pgm_read_byte(progdata + srcDataIdx++);
    			if(tmpChr == '%'){	//Truong hop ung voi dieu khien relay ("%RLx) hay gia tri AD ("%ADx")
    				if( (i + 9) > MAX_SEGMENT_SIZE){	//Neu khong con du cho trong tren buffer
    					srcDataIdx--;
    					break;
    				}
    				//Tiep tuc neu du cho trong tren buffer
    				tmpVar = pgm_read_byte(progdata + srcDataIdx + 3) - 0x30;
    				if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')){
    					if(GetRelayState(tmpVar)){//checked
    						dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    						dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';
    					}
    					srcDataIdx += 4;
    				}else if((pgm_read_byte(progdata + srcDataIdx) == 'A') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'D')){
    					tmpStr = (unsigned char*)uInt2StrLen(LM35_TYP_DECODE(GetADC(tmpVar)),3);//(unsigned char*)uByte2Str(GetAD(tmpChr));
    					tmpVar = 0;
    					dataBuffer[i++] = tmpStr[tmpVar++];
    					dataBuffer[i++] = tmpStr[tmpVar++];
    					dataBuffer[i++] = '.';
    					dataBuffer[i++] = tmpStr[tmpVar++];
    					//while(tmpStr[tmpChr] != 0){
    					//	dataBuffer[i++] = tmpStr[tmpChr++];
    					//}
    					srcDataIdx += 4;
    				}else{// Neu truong hop khac:
    					dataBuffer[i++] = tmpChr;
    				}
    			}
    			else{
    				dataBuffer[i++] = tmpChr;	//Copy data to tcp data buffer
    			}
    			if(srcDataIdx==dataLen){
    				break;
    			}
    		}
    		Flags |= TCP_ACK_FLAG;
    		if(endData){
    			if(srcDataIdx == dataLen){
    				Flags |= TCP_FIN_FLAG;
    				pSession->sesState = TCP_STATE_FIN_WAIT1;
    			}
    		}
    		TCPPackedSend(pSession,Flags,i,dataBuffer);
    		//delay_ms(100);
    		#ifdef NETSTACK_DEBUG
    		printf("Sent %d byte\r\n",srcDataIdx);
    		#endif
    	}
    }
    //--------------------------------------------------------------------------------------
    Các bạn thấy khá đơn giản, khi tìm thấy ký tự %, nếu tiếp theo là RL1 (%RL1) thì ta thay trạng thái của Relay 1 vào: nếu Relay 1 đang đóng thì giá trị đó là "checked", nếu Relay 1 đang nhả, thì để trống (hay "unchecked").
    Tương tự, nếu ký tự tiếp theo là AD0 (%AD0) thì ta thay giá trị tương ứng đọc từ ADC vào.
    Chú ý khi thay các giá trị tương ứng ta phải tăng biến đếm (srcDataIdx) lên tương ứng với chiều dài mà ta thêm vào.

    Comment


    • II-Điều khiển relay khi nhận được HTTP post (người dùng nhấn nút Submit trên trang web):
      Cái này ta phải sửa trong hàm HTTPDataIn(), ở phần xử lý bản tin HTTP POST
      Ví dụ:
      Code:
      //--------------------------------------------------------------------------------------
      //Ham xu ly mot goi thuoc giao thuc HTP nhan duoc
      void httpDataIn(unsigned char *buffer,unsigned int bufferLen,struct tcpSession *pSession)
      {
      	unsigned char i;
      	unsigned char *tmpstr;
      	unsigned char tmpRelaySts;
      	//struct httpRequest rqst;
      	//Tim xem cophien HTTP service da co cho phien TCP nay khong
      	for(i=0; i < MAX_HTTP_SESSION; i++){
      		if((httpSessionTable[i].status != HTTP_STATUS_IDLE) && (httpSessionTable[i].pTCPSession == pSession))
      			break;
      	}
      	if(i == MAX_HTTP_SESSION){
      		//Tim 1 phien trong
      		for(i=0; i < MAX_HTTP_SESSION; i++){
      			if(httpSessionTable[i].status == HTTP_STATUS_IDLE){
      				httpSessionTable[i].pTCPSession = pSession;
      				break;
      			}
      		}
      	}
      	if(httpSessionTable[i].status == HTTP_STATUS_IDLE){
      	//If this is a new HTTP request
      		//Check for request method
      		httpGetRequest(buffer,bufferLen,&(httpSessionTable[i].rqst));
      		//TCPPackedSend(pSession,(TCP_ACK_FLAG),0,buffer);
      		if(httpSessionTable[i].rqst.method == HTTP_REQUEST_UNKNOWN){
      		//if invalid request, just cancel
      			httpSessionTable[i].status = HTTP_STATUS_IDLE;
      			return;
      		}else{
      		//Set HTTP session to HEADER_RECEIVED (for next process)
      			httpSessionTable[i].status = HTTP_STATUS_HEADER_RECEIVED;
      		}
      	}
      	//If got header
      	if(httpSessionTable[i].status == HTTP_STATUS_HEADER_RECEIVED){
      		//Check for auth string
      		if(httpSessionTable[i].auth != 1){
      			tmpstr = httpHeaderGetField(Auth_prog,&(httpSessionTable[i].rqst));
      			if(findstrdatamem(http_auth_password,tmpstr,httpSessionTable[i].rqst.body-tmpstr) != -1){
      				#ifdef HTTP_DEBUG
      				printf("Auth OK\n\r");
      				printfStr(http_auth_password);
      				printf("Input\n\r");
      				printfStr(tmpstr);
      				#endif
      				httpSessionTable[i].auth = 1;
      			//If not valid auth
      			}else{
      				#ifdef HTTP_DEBUG
      				printf("Auth fail\n\r");
      				printf("Auth string:");
      				printfStr(http_auth_password);
      				printf("\n\r");
      				printf("Received string:");
      				printfStrLen(tmpstr,0,20);
      				#endif
      				HTTPSend(http_header3,sizeof(http_header3)-1,pSession,0);
      				HTTPSend(Page0,sizeof(Page0)-1,pSession,1);
      				httpSessionTable[i].status = HTTP_STATUS_IDLE;
      				return;
      			}
      		}
      		//Process for each method
      		//If GET method
      		if(httpSessionTable[i].rqst.method == HTTP_REQUEST_GET){
      			#ifdef HTTP_DEBUG
      			printf("GET HEADER:\n\r");
      			printfStrLen(httpSessionTable[i].rqst.header,0
      					,(httpSessionTable[i].rqst.body - httpSessionTable[i].rqst.header) + httpSessionTable[i].rqst.bodyLen);
      			#endif
      			//If GET the main website
      			if((httpSessionTable[i].rqst.requestURI[0] == '/') && (httpSessionTable[i].rqst.requestURI[1] == ' ')){
      				HTTPSend(http_header1,sizeof(http_header1)-1,pSession,0);
      				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
      				httpSessionTable[i].status = HTTP_STATUS_IDLE;
      			//If error
      			}else{
      				HTTPSend(http_error_notimp,sizeof(http_error_notimp),pSession,1);
      				httpSessionTable[i].status = HTTP_STATUS_IDLE;
      			}
      			return;
      		//If POST method
      		}else if(httpSessionTable[i].rqst.method == HTTP_REQUEST_POST){
      			//Update POS data
      			if(findstr(PSTR("SUB=Submit"),buffer,bufferLen) != -1){
      				tmpRelaySts = 0x00;
      				if((findstr(PSTR("RELAY1=ON"),buffer,bufferLen)) != -1){
      					//SetRelayState(1,1);
      					tmpRelaySts += 1;
      					#ifdef HTTP_DEBUG
      					printf("Relay 1 on\r\n");
      					#endif
      				}else{
      					//SetRelayState(1,0);
      					//tmpRelaySts += 2;
      					#ifdef HTTP_DEBUG
      					printf("Relay 1 off\r\n");
      					#endif
      				}
      				if((findstr(PSTR("RELAY2=ON"),buffer,bufferLen)) != -1){
      					//SetRelayState(2,1);
      					tmpRelaySts += 2;
      					#ifdef HTTP_DEBUG
      					printf("Relay 2 on\r\n");
      					#endif
      				}else{
      					//SetRelayState(2,0);
      					//tmpRelaySts += 8;
      					#ifdef HTTP_DEBUG
      					printf("Relay 2 off\r\n");
      					#endif
      				}
      				if((findstr(PSTR("RELAY3=ON"),buffer,bufferLen)) != -1){
      					//SetRelayState(3,1);
      					tmpRelaySts += 4;
      					#ifdef HTTP_DEBUG
      					printf("Relay 3 on\r\n");
      					#endif
      				}else{
      					//SetRelayState(3,0);
      					#ifdef HTTP_DEBUG
      					printf("Relay 3 off\r\n");
      					#endif
      				}
      				if((findstr(PSTR("RELAY4=ON"),buffer,bufferLen)) != -1){
      					//SetRelayState(4,1);
      					tmpRelaySts += 8;
      					#ifdef HTTP_DEBUG
      					printf("Relay 4 on\r\n");
      					#endif
      				}else{
      					//SetRelayState(4,0);
      					#ifdef HTTP_DEBUG
      					printf("Relay 4 off\r\n");
      					#endif
      				}
      				UpdateCtrlSts(tmpRelaySts);
      				//Send HTTP data
      				HTTPSend(http_header1,sizeof(http_header1)-1,pSession,0);
      				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
      				httpSessionTable[i].status = HTTP_STATUS_IDLE;
      				return;
      			}else if(findstr(PSTR("APPLY=Apply"),buffer,bufferLen) != -1){
      				HTTPSend(http_header1,sizeof(http_header1)-1,pSession,0);
      				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
      				httpSessionTable[i].status = HTTP_STATUS_IDLE;
      			}else{
      				HTTPSend("",0,pSession,0);
      			}
      		}
      	}
      }
      //--------------------------------------------------------------------------------------
      Giải thích:
      - Khin người dùng nhấn Submit, client sẽ gửi 1 bản tin HTTPPost, request chính trang web đó, nhưng trong mesage body có chứa thông tin lấy từ form trên trang web (trạng thái các ôn check mà người dùng đã thay đổi).
      - Ví dụ, trên trang web (trong webpage.h) ta đã khai báo các ô check như sau:

      <p align="left"><input type="checkbox" name="RELAY1" value="ON"%RL1>Relay 01</p>
      <p align="left"><input type="checkbox" name="RELAY2" value="ON"%RL2>Relay 02</p>
      <p align="left"><input type="checkbox" name="RELAY3" value="ON"%RL3>Relay 03</p>
      <p align="left"><input type="checkbox" name="RELAY4" value="ON"%RL4>Relay 04</p>
      Đối với relay 1, khai báo như vậy tức là tên đối tượng là RELAY1 (name="RELAY1"), giá trị nhận được khi nó được check là ON (value="ON")
      Như vậy giả sử các check box 1 và 3 được check, 2 và 4 bỏ trống, thì khi nhấn Submit, thông tin sau sẽ được gửi đi:
      RELAY1=ON
      RELAY3=ON
      Còn điều khiển relay thế nào là do các bạn thôi. Ở trong ví dụ trên mình lưu trạng thái các relay trong biến tmpRelaySts, sau đó mới gọi hàm UpdateCtrlSts(tmpRelaySts) để thực thi các trạng thái đó.
      Chúc các bạn thành công. Xin lỗi vì đã để mọi người đợi quá lâu.

      Comment


      • Nguyên văn bởi chikichita Xem bài viết
        em bị vướng ngay đoạn này nè thầy,
        [ATTACH=CONFIG]48663[/ATTACH]

        ở đây có đoạn hàm
        HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
        gửi wed lên thì trước đó mình có phải lưu những checkbox đó vào trong RAM không hay là làm sao để chèn checkbox được ạ thầy em loay hoay mãi ở đoạn này mà không biết giải quyết thế nào cả.

        có khi em thay dòng này HTTPSend(Page1,sizeof(Page1)-1,pSession,1); bằng HTTPSend(HTTP_REQUEST_POST,sizeof(HTTP_REQUEST_POS T)-1,pSession,1) thì nó lên tùm lum hihi hài vãi chưởng luôn thầy, đúng là gà thiệt,
        Câu trả lời cho em đã có ở trên.

        Comment


        • Nguyên văn bởi vuxuansyhut Xem bài viết
          Chào thày Tâm và các bác. Lâu rồi không quay lại luồng này,giờ đọc thấy mấy chỗ khó hiểu quá. Xin thày và bác chỉ giúp.
          1 - Ở trong lưu đồ nói về phần giao thức TCP, nếu server đang ở trạng thái TCP_STATE_LISTEN, nếu nó nhận được SYN nó sẽ chuyển sang trạng thái TCP_STATE_SYN_RECEIVED và gửi trả ack=seq(client)+1, trong giai đoạn trao đổi dữ liệu TCP_STATE_ESTABLISHED thì ack=seq(client), các bác giúp em xem khi nào thì giá tri ack=seq(client)+1, khi nào thì ack=seq(client).
          2 -trên lưu đồ có chú thích "Receive ACK of FIN" làm sao xác đinh được ACK đó là cho FIN trong giai đoạn 1 bên kết thúc trao đổi dữ liệu còn bên kia vẫn còn
          3 -Tại sao tcpSessionTable[i].srcWin = 8192 mà không phải giá trị khác hay giá trị NETSTACK_BUFFERSIZE bằng bao nhiêu. Em vẫn chưa xác định được
          4 - Nếu có giá trị tcpSessionTable[i].srcWin = 8192 rồi thì có nghĩa là mỗi khi client nhận được 8192 byte thì mới reply xác nhận cho sever biết, em hiểu như vậy không biết có đúng không. Nếu như vậy thì việc kiểm tra sô byte nhận được và reply là do client tính toán và gửi, nhưng trong giao thức HTTP gói tin sẽ đực chia nhỏ thành các đoạn có độ dài MSS byte. Theo cách nghĩ của em thì MSS byte này nếu không là ước của srcWin thì khi client trả lời sẽ lệch thông số với sever gửi. Trên code của thày Tâm viết cho sever cũng không thấy có đoạn xử lý này.
          Mong mọi người giải thích giúp em.
          1-Giá trị ACK luôn là số seq của bản tin tiếp theo mà nó mong muốn được nhận:
          - Ví dụ: client nhận được 1 bản tin có seq = 1234, có chiều dài dữ liệu 1 byte (ví dụ bản tin SYN) thì nó sẽ trả lời với ACK là 1235.
          - Nếu nhận được 1 bản tin có seq là 6322, chứa dữ liệu gồm 1000 byte (từ byte thứ 6322 - 7321) thì nó sẽ xác nhận với ACK là 7322.
          Ở đây có 1 lưu ý quan trọng dễ mắc sai khi lập trình (mình vướng cái này phải debug mãi mới được). Đó là có 1 số bản tin đặc biết (ví dụ SYN) mặc dù không chứa 1 byte dữ liệu nào trong phần body, nhưng cũng được xem là có chiều dài dữ liệu bằng 1 (do đó seq và ack phải tăng lên).
          2-Ack đó có giá trị trường Ack phù hợp với giá trị của trường Seq của bản tin chứa cờ FIN.
          3-SrcWin trên do người lập trình chọn thôi, tùy thuộc tài nguyên, cách xử lý,...
          4-Đúng ra ý nghĩa của window trong tcp là client không được để số dữ liệu nhận được vượt quá chiều dài cửa sổ mà không xác nhận. Vì phía gửi sẽ lưu backup dữ liệu đã gửi trong buffer có chiều dài bằng cửa sổ này. Nếu buffer đầy, tức là khoảng cách từ ack cuối cùng nó nhận được đến byte cuối cùng mà nó vừa gửi bằng chiều dài của sổ, thì nó sẽ dừng lại không gửi tiếp, nếu sau timeout mà không có ack, nó sẽ gửi lại dữ liệu (từ ack cuối cùng).
          Như vậy không nhất thiết phía nhận phải đợi nhận đủ một đoạn dữ liệu bằng chiều dài window mới xác nhận ack, mà chỉ cần đảm bảo là phải xác nhận ack trước khi buffer phía gửi đầy (trước khi đạt tới chiều dài của cửa số, để quá trình gửi dữ liệu không bị gián đoạn). Do đó mới có khái niệm cửa sổ trượt trong TCP.
          Vậy thì chiều dài dữ liệu trong gói tin có là ước số của window hay không không quan trọng.

          Comment


          • dạ vâng em cám ơn thầy nhiều. Ngày mai bảo vệ đồ án rồi giờ thầy lên đúng là nắng hạn gặp mưa rào. Cám ơn thầy nhiều, chúc thầy nhiều sức khỏe. Mấy bữa này ngày đi làm ban đêm về làm đồ án mất ngủ đều đều, mệt mỏi quá thầy ơi.
            Mà thầy có biết loại modem nào hỗ trợ no-ip không thầy em tính làm một cái về lắp ở nhà để tiện điều khiển mà giờ kiếm thì chỉ có modem hỗ trợ dnydns.org thôi,
            Nguyên văn bởi nttam79 Xem bài viết
            Câu trả lời cho em đã có ở trên.

            Điện tử viễn thông - Hutech

            Comment


            • thầy ơi hàm GetRelayState(tmpVar) là hàm lấy giá trị RL1, RL2 ah thầy, vậy mình phải viết hàm này

              tức là nếu là %RL1 thi có phải hàm GetRelayState(tmpVar) trả về tương ứng số 1

              Điện tử viễn thông - Hutech

              Comment


              • Nguyên văn bởi chikichita Xem bài viết
                thầy ơi hàm GetRelayState(tmpVar) là hàm lấy giá trị RL1, RL2 ah thầy, vậy mình phải viết hàm này

                tức là nếu là %RL1 thi có phải hàm GetRelayState(tmpVar) trả về tương ứng số 1
                Đúng rồi, hàm đó tôi không post lên đây vì mọi người điều khiển relay hay gì đó theo cách của mình. Miễn là cập nhật theo trạng thái thực tế của relay 1 thôi.

                Comment


                • thầy ơi sao em vao thì bị mất Relay 01, nhưng sao nó không check

                  while(srcDataIdx < dataLen){
                  i = 0;
                  while(i<MAX_SEGMENT_SIZE){
                  tmpChr = pgm_read_byte(progdata + srcDataIdx++);
                  if(tmpChr == '%'){ //Truong hop ung voi dieu khien relay ("%RLx) hay gia tri AD ("%ADx")
                  if( (i + 9) > MAX_SEGMENT_SIZE){ //Neu khong con du cho trong tren buffer
                  srcDataIdx--;
                  break;
                  }
                  //Tiep tuc neu du cho trong tren buffer
                  tmpVar = pgm_read_byte(progdata + srcDataIdx + 3) - 0x30;
                  if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')&&(pgm_read_byte(progdata + srcDataIdx + 2) == '1'))
                  {
                  //if(GetRelayState(tmpVar))
                  {//checked
                  dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
                  dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';
                  }
                  srcDataIdx += 8;
                  }
                  else
                  {// Neu truong hop khac:
                  dataBuffer[i++] = tmpChr;
                  }
                  }
                  else{
                  dataBuffer[i++] = tmpChr; //Copy data to tcp data buffer
                  }
                  if(srcDataIdx==dataLen){
                  break;
                  }
                  }

                  Điện tử viễn thông - Hutech

                  Comment


                  • thầy có thể cho em xin đoạn đó được không ạ để em sửa lại theo chương trình của em xem thử,

                    Điện tử viễn thông - Hutech

                    Comment


                    • hihi chương trình em viết kiểu gì mà chiếm hết 98,8% bộ nhớ rồi, không ep thêm được nữa

                      Điện tử viễn thông - Hutech

                      Comment


                      • thầy ơi hướng dẫn dùm em ép giá trị đó vô Ram được không ạ

                        ví dụ như khi em viết chô wedpage thì em thêm "%RL1 checkew" rồi khi kiểm tra có check thì mình chỉ cần ép chữ "d" thế vào chỗ "w" được không thầy

                        Điện tử viễn thông - Hutech

                        Comment


                        • hihi loay hoay mai cuối cùng cũng xong thầy ơi, hơi rắc rối một chút nhưng chạy cũng tạm ổn, em cám ơn thầy nhiều

                          while(srcDataIdx < dataLen){
                          i = 0;
                          while(i<MAX_SEGMENT_SIZE){
                          tmpChr = pgm_read_byte(progdata + srcDataIdx++);
                          if(tmpChr == '%'){ //Truong hop ung voi dieu khien relay ("%RLx) hay gia tri AD ("%ADx")
                          if( (i + 9) > MAX_SEGMENT_SIZE){ //Neu khong con du cho trong tren buffer
                          srcDataIdx--;
                          break;
                          }
                          //Tiep tuc neu du cho trong tren buffer
                          tmpVar = pgm_read_byte(progdata + srcDataIdx + 3) - 0x30;
                          if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')&&(pgm_read_byte(progdata + srcDataIdx + 2) == '1'))
                          {
                          //if(GetRelayState(tmpVar))
                          if(R1 == 1)
                          {//checked
                          dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
                          dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';dataBuffer[i++] = ' ';
                          srcDataIdx += 5;
                          }
                          else
                          {
                          dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
                          dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'w';dataBuffer[i++] = ' ';
                          srcDataIdx += 5;
                          }
                          }
                          if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')&&(pgm_read_byte(progdata + srcDataIdx + 2) == '2'))
                          {
                          //if(GetRelayState(tmpVar))
                          if(R2 == 1)
                          {//checked
                          dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
                          dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';dataBuffer[i++] = ' ';
                          srcDataIdx += 5;
                          }
                          else
                          {
                          dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
                          dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'w';dataBuffer[i++] = ' ';
                          srcDataIdx += 5;
                          }
                          }

                          //else if((pgm_read_byte(progdata + srcDataIdx) == 'A') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'D')){
                          //tmpStr = (unsigned char*)uInt2StrLen(LM35_TYP_DECODE(GetADC(tmpVar)), 3);//(unsigned char*)uByte2Str(GetAD(tmpChr));
                          //tmpVar = 0;
                          //dataBuffer[i++] = tmpStr[tmpVar++];
                          //dataBuffer[i++] = tmpStr[tmpVar++];
                          //dataBuffer[i++] = '.';
                          //dataBuffer[i++] = tmpStr[tmpVar++];
                          //while(tmpStr[tmpChr] != 0){
                          // dataBuffer[i++] = tmpStr[tmpChr++];
                          //}
                          //srcDataIdx += 4;
                          //}

                          Điện tử viễn thông - Hutech

                          Comment


                          • Nguyên văn bởi chikichita Xem bài viết
                            thầy ơi sao em vao thì bị mất Relay 01, nhưng sao nó không check
                            À, sao lại là srcDataIdx += 8;
                            Vì đoạn mã html là: <p align="left"><input type="checkbox" name="RELAY1" value="ON"%RL1>Relay 01</p>
                            Như vậy khi đọc đến ký tự %, thì tiếp theo (sau khi thay "%RL1" bằng " check") thì srcDataIdx phải trỏ đến ký tự ">"
                            Nên phải là srcDataIdx += 4;
                            Coi lại thì hình như ở trên minh giải thích chưa chính xác chỗ này.

                            Comment


                            • Dạ thầy ngủ muộn vậy à thầy, em cũng loay hoay mãi chỗ này cuối cùng dùng mã nguồn trên google chome xem lại thì bị mất dấu ">" nên ở phần wedpage em có đẩy lên 2 ký tự và cuối cùng là srcDataIdx += 5;



                              Nguyên văn bởi nttam79 Xem bài viết
                              À, sao lại là srcDataIdx += 8;
                              Vì đoạn mã html là: <p align="left"><input type="checkbox" name="RELAY1" value="ON"%RL1>Relay 01</p>
                              Như vậy khi đọc đến ký tự %, thì tiếp theo (sau khi thay "%RL1" bằng " check") thì srcDataIdx phải trỏ đến ký tự ">"
                              Nên phải là srcDataIdx += 4;
                              Coi lại thì hình như ở trên minh giải thích chưa chính xác chỗ này.

                              Điện tử viễn thông - Hutech

                              Comment


                              • mà viết xong đoạn này bộ nhớ IC của em cũng vừa full 100% hixhix nên chỉ viết được 2 relay thôi, còn phần thay đổi IP chưa viết nữa mà full rồi nên thôi hihi, không biết mai lên bảo vệ như thế nào nữa.

                                Điện tử viễn thông - Hutech

                                Comment

                                Về tác giả

                                Collapse

                                nttam79 Tìm hiểu thêm về nttam79

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X