Nguyên văn bởi wind-gon
Xem bài viết
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 } } //--------------------------------------------------------------------------------------
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