久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3833|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

HTTP+mini-SD網(wǎng)頁(yè)上溫度的顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99624 發(fā)表于 2015-12-22 23:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
 git一個(gè)HTTP sever的代碼,移植完畢,修改了一些變量和宏之后編譯通過,看了一下效果,基本的網(wǎng)頁(yè)可以顯示,但是他是基于FLASH data的,需要把html文件編譯進(jìn)ROM中,而我不想這樣,這樣會(huì)占用大量的RO-data段。于是乎之前的文件系統(tǒng)用上了,要是讓他自動(dòng)的加載TF卡上的文件和圖片就可以解放ROM了,這樣的話需要看一下作者的實(shí)現(xiàn)框架,然后根據(jù)框架對(duì)源碼進(jìn)行修改。最后加入文件系統(tǒng)。完成組合。


1、websever 程序框架
就我拿到的源碼分析,可以分為這么幾部分:
1、accept -TCP 
2、獲取HTTP  GET/POST請(qǐng)求,并取得URL。
3、HTTP 分析URL并對(duì)HTTP做響應(yīng)。數(shù)據(jù)交換
4、文件傳輸完畢結(jié)束。
5、fin -TCP

2、虛擬文件系統(tǒng)
源碼沒有文件系統(tǒng),但是作者虛擬了一套簡(jiǎn)易的文件系統(tǒng),說白了就是對(duì)存在FLASH的HTML文件進(jìn)行讀取管理。虛擬了ROOT根目錄,然后在ROOT目錄下使用鏈表連接了幾個(gè)簡(jiǎn)單的HTML文件。然后在HTTP請(qǐng)求的時(shí)候使用文件open/close。還好做的很接近于比較完整的文件系統(tǒng)。
err = fs_open(&hs->file_handle, g_psDefaultFilenames[loop].name);
uri = g_psDefaultFilenames[loop].name;
for (f =FS_ROOT; f != NULL; f = f->next) {
    if (!strcmp(name, (const char *)f->name)) {
      file->data = (const char *)f->data;
      file->len = f->len;
      file->index = f->len;
      file->pextension = NULL;
      file->http_header_included = f->http_header_included;
 
3、重寫
只要看按照他的這個(gè)殼子,把內(nèi)容換成SD卡上的文件就可以完成移植了。
3.1這就需要首先重寫這個(gè)函數(shù)--http_find_file(struct http_state *hs, const char *uri)
#ifdef HTTP_GET_USED_FILE_SYSTEM
/* 使用SD卡上的文件系統(tǒng)執(zhí)行*/
static err_t
http_find_file(struct http_state *hs, const char *uri)
 if (file_fopen(&Httpfile_CR, &myefs3.myFs, "index.txt", 'r') != 0)
 {
   return 0;
 }
 err=ERR_OK;
       hs->file_handle->data=NULL;//這個(gè)不重要了,因?yàn)楹竺嬉褂肦EAD 讀取SD卡 需要改變指針。
      hs->file_handle.len = Httpfile_CR.FileSize;// //寫入文件長(zhǎng)度相當(dāng)相當(dāng)?shù)闹匾。。。。。。。。。。。。。。。。。。。。。。。。?/span>
      hs->file_handle.index = hs->file_handle.len; //index相同
      hs->file_handle.pextension = NULL; //保持即可
      hs->file_handle.http_header_included = hs->file_handle.http_header_included; //保持即可  
     uri="/index.html";//強(qiáng)制構(gòu)造或者不該,還讓他保持這個(gè)名

 3.2這樣可以完成文件句柄被指向SD卡中的實(shí)際文件-如果有,但是光這樣還是不夠的,無法把SD卡的文件偏移指針給HTTP自動(dòng)控制發(fā)送。所以這就需要重寫另一個(gè)函數(shù)。
http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) 

#ifdef HTTP_GET_USED_FILE_SYSTEM
static err_t
http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) 
max_len = tcp_sndbuf(pcb);
if(max_len%512!=0) 
{
 max_len=((int)max_len/512)*512; //注意...*512并非廢物哦。。!
}
  HTTPbuf = (char*)mem_malloc((mem_size_t)max_len);
if(HTTPbuf==0)
{
  return ERR_MEM;
}   
  len= file_read(&Httpfile_CR,max_len, (unsigned char*)HTTPbuf);
  ptr= HTTPbuf;//改變文件指針,取得buf的地址。準(zhǔn)備發(fā)送隊(duì)列中去
  apiflags=1;//允許copy. 

完成這2步之后就可以完成了HTTP 流了。HTTPSENT會(huì)自動(dòng)的使用TCP的發(fā)送隊(duì)列把數(shù)據(jù)從SD卡中取出來發(fā)送出去了。

4、制作HTLM和logo文件
使用dreamweaver 做一個(gè)表格,logo使用PNG圖片,可以直接截圖一個(gè)圖片然后另存為放到/logo 文件夾下。起一個(gè)名字就好了。(/logo/btlogo.png")完成之后拷貝進(jìn)SD卡中。程序就可以自動(dòng)的讀取他們了。
把HTML文件拿出來讓他和HTTP解析GET的時(shí)候的ROOT默認(rèn)路徑文件名一只即可。-index.html(txt)文本也可。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>測(cè)試室溫度頁(yè)面</title>
</head>

<body>
<p><img src="http://c.51hei.com/a/a/c/5122215255950875.jpg" width="101" height="79" /></p>
<table width="1219" border="1">
  <tr>
    <th width="404" height="32" bgcolor="#CC0000" scope="col">名稱</th>
    <th width="402" bgcolor="#CC0000" scope="col">溫度值</th>
    <th width="391" bgcolor="#CC0000" scope="col">時(shí)間</th>
  </tr>
  <tr>
    <td height="108" bgcolor="#996666"><div align="center"><strong>DS18B20傳感器A</strong></div></td>
    <td bgcolor="#99CC99"><div align="center">xxx.xx<a id="cgqa"></a></div>
    </td>
    <td bgcolor="#CCCC99"><div align="center">
        <!-- #BeginDate format:Ch1m -->15/11/16   19:39<!-- #EndDate -->
    </div></td>
  </tr>
  <tr>
    <td height="128" bgcolor="#996666"><div align="center"><strong>DS18B20傳感器B</strong></div></td>
    <td bgcolor="#99CC99"><div align="center">yyy.yy<a id="cgqb"></a></div></td>
    <td bgcolor="#CCCC99"><div align="center">
        <!-- #BeginDate format:Ch1m -->15/11/16   19:39<!-- #EndDate -->
    </div></td>
  </tr>
</table>
<p>&nbsp;</p>
</body>
</html>
logo

 5、溫度傳感器數(shù)據(jù)記錄到HTML上的方法
溫度傳感器作為系統(tǒng)的一個(gè)任務(wù)自動(dòng)2秒采集一次測(cè)試室的溫度存入一個(gè)固定的緩存中,并且已經(jīng)完成了ascii轉(zhuǎn)碼。只要在實(shí)現(xiàn)一個(gè)自動(dòng)找到HTML(txt)文件中的特定的溫度顯示位置的字符串就可以替換掉原來的字符,這樣等HTML再次請(qǐng)求的時(shí)候就可以記載上當(dāng)前的溫度數(shù)據(jù)到網(wǎng)頁(yè)上了。于是先開始寫這個(gè)方法。
unsigned int FindFileString(char *str)
{
int len=0,index=0;
char *p;
//  FILE *streamA=(FILE *)&myfile_CR;
do
{
  len = file_read(&myfile_CR,512,(unsigned char*)filebuf);

if(strstr(filebuf,str)!=0)
{
  p= strstr(filebuf,str);
len=(int)p-(int)filebuf;
return len+(index*512);
}
 index++;
}while(len==512);//文件結(jié)束????結(jié)束必定小于512字節(jié)

return 0;//沒有找到匹配字符
}

這樣一來就可以寫出來尋找這個(gè)文件中的字符串的函數(shù)了提前使用DW中的錨記住ID號(hào)。配對(duì)這個(gè)ID號(hào)即可。
#ifdef TEMP_WRITE_HTML  
#include <stdio.h>
#include "file.h"
//溫度3位整數(shù)+2小數(shù)+小數(shù)點(diǎn)=6 
#define STRINGLENTH 6
unsigned int FindFileString(char *str);
char filebuf[512];
/*
>xxx.xx<a id="cgqa"></a></div>
>yyy.yy<a id="cgqb"></a></div>
*/
char strA[]="<a name=\"cgqa\"";//匹配字符A 前面的6個(gè)字符處就是xxx.xx只要用溫度數(shù)據(jù)替換就好
char strB[]="<a name=\"cgqb\"";//匹配字符B 前面的6個(gè)字符處就是yyy.yy只要用溫度數(shù)據(jù)替換就好
char  FS_Writehtml(char *p, unsigned int size) 
static unsigned int deepsizeA=0,deepsizeB=0;//標(biāo)志字符在文件中的位置
  static char tempt[14]; 
  if((deepsizeB==0)
{
 if (file_fopen(&myfile_CR, &myefs2.myFs, "index.txt", 'r') != 0)
 {
   return 0;
 }
  deepsizeB= FindFileString(strB);//查找A字符和A的位置
   
// write the received data to the file
//datalen = file_write(&myfile_CR,size,p);
file_fread(&myfile_CR,deepsizeB-STRINGLENTH,STRINGLENTH,filebuf);
FileSystemClose(&myfile_CR,&myefs2.myFs);
  }
  if (file_fopen(&myfile_CR, &myefs2.myFs, "index.txt", 'w') != 0)
 {
   return 0;
 }
 file_fwrite(&myfile_CR,deepsizeB-STRINGLENTH,STRINGLENTH,tempt);
 FileSystemClose(&myfile_CR,&myefs2.myFs);

在操作中發(fā)現(xiàn)文件系統(tǒng)竟然沒有實(shí)現(xiàn)'w',只能自己建立一個(gè)空文件并填充文件。而不能寫拷貝進(jìn)SD卡的文件,于是還得修改文件系統(tǒng)中的W實(shí)現(xiàn)。
源文件為:
case MODE_WRITE:
            if(fs_findFile(fs,filename,&loc,&sec)) /* File may NOT exist, but parent HAS to exist */
{
                 return -2;
} 

最后改成如下這樣就OK了
case MODE_WRITE:
            if(fs_findFile(fs,filename,&loc,&sec)==1) /* File may NOT exist, but parent HAS to exist */
{
dir_getFileStructure(fs,&(file->DirEntry), &loc);
                                file_initFile(file,fs,&loc);
file_setAttr(file,FILE_STATUS_OPEN,1);
file_setAttr(file,FILE_STATUS_WRITE,1);
                                 return (0);
} 
 
不知道為什么原作者好像并不想讓人使用這個(gè)open-W 的函數(shù)呢。不 過經(jīng)過我的測(cè)試和比對(duì)之后確定是安全的。這個(gè)地方真不知道作者他老人家是怎么想的,找了最新的源代碼看了一下,同樣是這樣寫的。類似的'r'的實(shí)現(xiàn)是這樣的,那個(gè)接口是被開放出來的 。


 6、頁(yè)面和抓包分析
網(wǎng)頁(yè)中的溫度就可以顯示出來了。
 

HTTP抓包


先是GET請(qǐng)求然后是加載了HTML文件的文本,之后網(wǎng)頁(yè)會(huì)把里面的logo再次使用GET的方法從服務(wù)器拿到這張圖了。 
TCP包的話每一步都可以看的清的了。












laowang
bt



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线看av的网址 | 日日干日日射 | 日韩欧美高清dvd碟片 | 在线免费观看日本视频 | 天堂在线免费视频 | 久久精品免费 | 国产一级视频免费播放 | 亚洲高清视频在线观看 | 久久精彩| 免费一级欧美在线观看视频 | 一级做a爰片性色毛片16 | 97超级碰碰 | 久久久精品视 | 亚洲国产精品福利 | 国产激情一区二区三区 | 日韩欧美大片在线观看 | 久久成人国产 | av手机在线| 久草.com| 久久99精品久久久久久秒播九色 | 久久国内 | 国产乱码精品一区二区三区忘忧草 | 久久天堂网| 午夜手机在线 | 一级毛片视频在线观看 | 九色 在线 | 久久不射电影网 | 久久国产精品91 | 国产一区二区中文字幕 | 麻豆亚洲 | 黄色片大全在线观看 | 国产精品久久久久久久久图文区 | 91精品国产综合久久久久久 | 天天干狠狠干 | 久久草在线视频 | www.久 | 亚洲最大看片网站 | 2一3sex性hd | 国产精品亚洲视频 | 国产一区二区三区在线视频 | 国产在线观看一区二区三区 |