📄 http.lst
字号:
194 2 conxn[nr].my_sequence = conxn[nr].old_sequence;
195 2 }
196 1
197 1 // Start off with no request
198 1 request = NONE;
199 1
200 1 // TODO: Calling strstr() on a large buffer takes a lot of time
201 1 // so perhaps we could speed things up by limiting the search
202 1 // range to the portion of the buffer where the item is expected
203 1 // to be found
204 1
205 1 // If it is a POST, then set a flag to start looking for the post
206 1 // data of interest, which is the string "switch=". It may arrive
207 1 // in a later segment (Netscape seems to split up the POST message)
208 1 if (strstr(tcp_data, "POST") != NULL) post_flg = TRUE;
209 1
210 1 // See if this is a GET message
211 1 else if (strstr(tcp_data, "GET") != NULL)
212 1 {
213 2 post_flg = FALSE;
214 2 if (strstr(tcp_data, "photo1") != NULL) request = GET_JPEG;
215 2 else if (strstr(tcp_data, "index") != NULL) request = GET_PAGE;
216 2 else if (strstr(tcp_data, "/ ") != NULL) request = GET_PAGE;
217 2 }
218 1
219 1 // If POST flag is "armed" then look for the "switch=" string
220 1 // and if found, turn the LED on or off according to whether
221 1 // the browser is sending a 1 or a 0.
222 1 if (post_flg)
223 1 {
224 2 ptr = strstr(tcp_data, "switch=");
225 2 if (ptr != NULL)
226 2 {
227 3 // Move to space after equals sign
228 3 // Set control indicator accordingly
229 3 post_flg = FALSE;
230 3 request = POST_PAGE;
231 3 ptr += 7;
232 3 if (*ptr == '1') {CONTROL_LED=0x0;}
233 3 else if (*ptr == '0') {CONTROL_LED=0x1;}
234 3 LightONOFF(CONTROL_LED);
235 3 }
236 2 }
237 1
238 1 if ((request == GET_PAGE) || (request == POST_PAGE))
239 1 {
240 2 // Figure out sizes
241 2 hhdr_len = strlen(html_header);
C51 COMPILER V7.10 HTTP 07/24/2008 16:32:06 PAGE 5
242 2 page_len = strlen(web_page);
243 2 body_len = hhdr_len + page_len;
244 2
245 2 // Free memory holding received message. The message from the
246 2 // browser can be 500+ bytes long so this is a significant
247 2 // chunk out of the available malloc space of 1500 bytes
248 2 if (!resend) {free(inbuf); rcve_buf_allocated = FALSE;}
249 2
250 2 // Allocate memory for entire outgoing message including
251 2 // 14 byte Ethernet + 20 byte IP + 20 byte TCP headers
252 2 // Allow 1 byte for NULL char at the end
253 2 outbuf = (UCHAR xdata *)malloc(54 + body_len + 1);
254 2 if (outbuf == NULL)
255 2 {
256 3 if (debug) serial_send("TCP: Oops, out of memory\r");
257 3 return 0;
258 3 }
259 2
260 2 // Copy page data. This moves data from flash into RAM. It is
261 2 // an undesirable process, but must get data into RAM to replace
262 2 // tags
263 2 memcpy(outbuf + 54, html_header, hhdr_len);
264 2 memcpy(outbuf + 54 + hhdr_len, web_page, page_len);
265 2
266 2 outbuf[54 + body_len] = 0; // Append NULL
267 2
268 2 // Replace length tag with actual value
269 2 itoa(page_len, text, 10);
270 2 replace_tag(outbuf + 54, "TAG:LEN1", text);
271 2
272 2 // Replace CPU temperature tag with actual value
273 2 itoa(cpu_temperature/100, text, 10);
274 2 i=strlen(text);
275 2 text[i]='.';
276 2 i++;
277 2 itoa(cpu_temperature%100, text+i, 10);
278 2 replace_tag(outbuf + 54, "TAG:TMP1", text);
279 2
280 2 itoa(air_temperature/1000, text, 10);
281 2 i=strlen(text);
282 2 text[i]='.';
283 2 i++;
284 2 itoa(air_temperature%1000, text+i, 10);
285 2 replace_tag(outbuf + 54, "TAG:TMP2", text);
286 2
287 2 // Replace CPU voltage tag with actual value X 100
288 2 // Insert decimal point between first and second digits
289 2 itoa(cpu_voltage/1000, text, 10);
290 2 i=strlen(text);
291 2 text[i]='.';
292 2 i++;
293 2 itoa(cpu_voltage%1000, text+i, 10);
294 2 replace_tag(outbuf + 54, "TAG:VOL1", text);
295 2
296 2 // Insert the word CHECKED into the html so the browser will
297 2 // check the correct LED state indicator box
298 2 if (CONTROL_LED == OFF) replace_tag(outbuf + 54, "TAG:CHK1", "CHECKED");
299 2 else replace_tag(outbuf + 54, "TAG:CHK2", "CHECKED");
300 2
301 2 // Segment length = body_len + 20
302 2 http_send(outbuf, body_len + 20, nr);
303 2 conxn[nr].my_sequence += body_len;
C51 COMPILER V7.10 HTTP 07/24/2008 16:32:06 PAGE 6
304 2 }
305 1 else if (request == GET_JPEG)
306 1 {
307 2 // Ths browser has requested the jpeg image. First figure out
308 2 // sizes - cannot use sizeof() for jpeg here because it is in
309 2 // another module. Just directly specify length of it
310 2 jhdr_len = strlen(jpeg_header);
311 2 jpeg_len = 5705;//6194;
312 2 body_len = jhdr_len + jpeg_len;
313 2
314 2 // Free memory holding received message. The message from the
315 2 // browser can be 500+ bytes long so this is a significant
316 2 // chunk out of the available malloc space of 1500 bytes
317 2 if (!resend) {free(inbuf); rcve_buf_allocated = FALSE;}
318 2
319 2 // First send the header and enough of the jpeg to make 1000 bytes.
320 2 // The value of 1000 is arbitrary, but must be stay under 1500.
321 2 if (body_len < 1000) remaining = body_len; else remaining = 1000;
322 2 outbuf = (UCHAR xdata *)malloc(54 + remaining + 1);
323 2 if (outbuf == NULL)
324 2 {
325 3 if (debug) serial_send("TCP: Oops, out of memory\r");
326 3 return 0;
327 3 }
328 2
329 2 memcpy(outbuf + 54, jpeg_header, jhdr_len);
330 2 memcpy(outbuf + 54 + jhdr_len, photo1_jpeg, remaining - jhdr_len);
331 2
332 2 outbuf[54 + remaining] = 0; // Append NULL
333 2
334 2 // Replace jpeg length tag with actual value
335 2 itoa(jpeg_len, text, 10);
336 2 replace_tag(outbuf + 54, "TAG:LEN2", text);
337 2
338 2 http_send(outbuf, remaining + 20, nr);
339 2 sent = remaining - jhdr_len;
340 2 conxn[nr].my_sequence += remaining;
341 2
342 2 // Send the rest of the jpeg file in 1000 byte chunks. This sends about
343 2 // 6 segments of 1000 bytes back to back, but we should actually process
344 2 // acks from the other end to make sure we are not sending more than the
345 2 // other end can receive. Most systems can handle 6K
346 2 while (sent < jpeg_len)
347 2 {
348 3 remaining = jpeg_len - sent;
349 3 if (remaining > 1000) remaining = 1000;
350 3 outbuf = (UCHAR xdata *)malloc(54 + remaining + 1);
351 3 if (outbuf == NULL)
352 3 {
353 4 if (debug) serial_send("TCP: Oops, out of memory\r");
354 4 return 0;
355 4 }
356 3
357 3 memcpy(outbuf + 54, photo1_jpeg + sent, remaining);
358 3
359 3 outbuf[54 + remaining] = 0; // Append NULL
360 3 http_send(outbuf, remaining + 20, nr);
361 3 sent += remaining;
362 3 conxn[nr].my_sequence += remaining;
363 3 }
364 2 }
365 1 else
C51 COMPILER V7.10 HTTP 07/24/2008 16:32:06 PAGE 7
366 1 {
367 2 // The incoming HTTP message did not warrant a response
368 2 if (debug) serial_send("HTTP: No response sent\r");
369 2 return 0;
370 2 }
371 1
372 1 // Return number of bytes sent, not including TCP header
373 1 return(body_len);
374 1 }
375
376
377
378
379
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2032 ----
CONSTANT SIZE = 184 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 39
IDATA SIZE = 1 23
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -