資料介紹
一 實(shí)例背景最近一個(gè)做智能家居的朋友面臨這樣的一個(gè)煩惱,他想讓用戶通過智能手機(jī)在家里方便地控制家居設(shè)備,又想讓用戶免除下載安裝App的麻煩,通過瀏覽器直接打開設(shè)備內(nèi)嵌的網(wǎng)頁便可實(shí)現(xiàn)控制。但是設(shè)備的IP地址都是通過家里的路由器自動(dòng)獲得的,設(shè)備上又沒有屏幕來顯示其IP地址。問我有沒有辦法不輸入IP地址來實(shí)現(xiàn)瀏覽器訪問該設(shè)備網(wǎng)頁的辦法,就是類似DNS之類,但是無需連外網(wǎng),只在家庭網(wǎng)絡(luò)內(nèi)能訪問即可。這使我想起一個(gè)古老的協(xié)議,NetBIOS(Network Basic Input/Output System)。這個(gè)在上世紀(jì)80年代由IBM開發(fā)的協(xié)議,主要用于數(shù)十臺(tái)左右計(jì)算機(jī)組成的小型局域網(wǎng),該協(xié)議的主要用途之一就是把計(jì)算機(jī)名稱解析為相應(yīng)IP地址。如果每個(gè)設(shè)備有一個(gè)固定名字,在實(shí)現(xiàn)了NetBIOS的前提下,用戶在瀏覽器里輸入該設(shè)備的名字,然后通過NetBIOS解析,便可實(shí)現(xiàn)訪問該設(shè)備網(wǎng)頁的這個(gè)功能了。而且NetBIOS占用系統(tǒng)資源少,在單片機(jī)上運(yùn)行不成問題。于是推薦這個(gè)朋友在他的設(shè)備上實(shí)現(xiàn)了NetBIOS協(xié)議,解決了他的煩惱。除了智能家居,在當(dāng)下物聯(lián)網(wǎng)時(shí)代,想必還有其他應(yīng)用也會(huì)遇到類似問題,就拿手頭的WIZnet-W5500評(píng)估板實(shí)現(xiàn)了一下NetBIOS,希望能對(duì)做網(wǎng)絡(luò)設(shè)備開發(fā)的朋友有所幫助。在用W5500實(shí)現(xiàn)之前,我們還是先在PC上看一下NetBIOS到底是一個(gè)什么東西。二NetBIOS協(xié)議我們知道在DOS命令下可以通過PING主機(jī)名獲得另外一臺(tái)電腦的IP地址,實(shí)際上就是通過NETBIOS進(jìn)行的。在Windows操作系統(tǒng)中,默認(rèn)情況下在安裝TCP/IP協(xié)議后會(huì)自動(dòng)安裝NetBIOS。查看方法如下:本地連接屬性的中“高級(jí)TCP/IP設(shè)置”窗口中選擇“WINS”選項(xiàng)卡,在“NetBIOS設(shè)置”區(qū)域中就可以設(shè)置相應(yīng)的NetBIOS,如圖1:Ping主機(jī)名的第一個(gè)數(shù)據(jù)包就是NBNS(NetBIOS Name Server),協(xié)議包,它是TCP/IP上的NetBIOS (NetBT)協(xié)議族的一部分,它在基于NetBIOS名稱訪問的網(wǎng)絡(luò)上提供主機(jī)名和地址映射方法。NBNS是動(dòng)態(tài)DNS的一種,Microsoft的NBNS實(shí)現(xiàn)稱為WINS。NetBIOS的報(bào)文類型較多、結(jié)構(gòu)復(fù)雜,不同的網(wǎng)絡(luò)環(huán)境及不同的用途中,會(huì)使用不同報(bào)文,可用端口進(jìn)行區(qū)分,WINS協(xié)議中,NetBIOS名字報(bào)文、數(shù)據(jù)報(bào)報(bào)文及會(huì)話報(bào)文分別使用TCP 137、138和139端口。NetBIOS數(shù)據(jù)報(bào)有很多不同格式,主要取決于服務(wù)和信息類型,以及用以傳送NetBIOS數(shù)據(jù)報(bào)的傳輸協(xié)議。NetBIOS協(xié)議架構(gòu)可見圖2,其中包含三種基本服務(wù):NAME、SESSION和DATAGRAM,其中NAME所用協(xié)議就是NBNS協(xié)議。圖2:NetBIOS協(xié)議架構(gòu)下面看一下WINS協(xié)議使用的報(bào)文NETBIOS的名字報(bào)文(NAME)的總體格式如表1:表1 NetBIOS名字報(bào)文格式事物ID(2bytes) 通用標(biāo)志(2bytes) 問題記錄個(gè)數(shù)(2bytes) 回答記錄個(gè)數(shù)(2bytes) 權(quán)威記錄個(gè)數(shù)(2bytes) 附加記錄個(gè)數(shù)(2bytes) 問題記錄(若干字節(jié)) 回答記錄(若干字節(jié)) 權(quán)威記錄(若干字節(jié)) 附加記錄(若干字節(jié))報(bào)文的前12字節(jié)總稱為NETBIOS名字報(bào)文的首部,通過首部我們可以判斷出是否為名字查詢的報(bào)文。NETBIOS名字報(bào)文中最常見的是攜帶問題記錄的報(bào)文,問題記錄的格式如表2:表2 NetBIOS名字報(bào)文中問題記錄格式問題名稱(若干字節(jié))問題類型(2 bytes)問題類別(2bytes)通過攜帶問題記錄的報(bào)文,我們可以得到要查詢的名字字符,如果和本機(jī)名相符,就發(fā)送報(bào)文響應(yīng),響應(yīng)中帶有IP地址,發(fā)送廣播的主機(jī)就會(huì)得到該IP地址。三W5500EVB實(shí)現(xiàn)NETBIOS名字報(bào)文解析了解了NETBIOS協(xié)議之后,下面就讓我們通過W5500EVB做一個(gè)嵌入NetBIOS的簡單實(shí)驗(yàn)。實(shí)驗(yàn)?zāi)康模和ㄟ^在DOS下ping該設(shè)備名“WIZNRTW5500”,可以得到開發(fā)板的IP地址。 硬件環(huán)境 單片機(jī):STM32F103RC,256K字節(jié)Flash,48K字節(jié)SRAM,2K字節(jié)EEPROM 以太網(wǎng)控制器:W5500,SPI接口與單片機(jī)相連 電源:USB供電 硬件外設(shè):板載LED 開發(fā)工具: Keil 測(cè)試軟件:串口調(diào)試助手,網(wǎng)絡(luò)調(diào)試助手看代碼之前,我們還是先來了解一下整個(gè)的程序流程,如圖3所示整個(gè)程序采用查詢方式,通過DHCP子程序成功獲取IP后可執(zhí)行NBNS服務(wù)。同時(shí)W5500EVB設(shè)置成HTTP Server,可以接收,并處理TCP Client發(fā)來的數(shù)據(jù)圖3:主程序流程圖本文主要討論如何在單片機(jī)上實(shí)現(xiàn)NETBIOS名字解析服務(wù),DHCP和TCP Server相關(guān)部分子程序在此不再詳細(xì)介紹,根據(jù)NETBIOS名字解析服務(wù)子程序流程圖(如圖4示),我們可以得知當(dāng)查詢到137端口收到網(wǎng)絡(luò)的UDP數(shù)據(jù)包時(shí),讀取數(shù)據(jù)包并進(jìn)行判斷是否為NETBIOS名字報(bào)文,如果是就將解析出的名字與本機(jī)名比較,如果一致就回復(fù)報(bào)文。圖4:NBNS程序流程圖在此貼出NETBIOS部分代碼,要獲取完整代碼,請(qǐng)到http://pan.baidu.com/s/1nt9MQKh上進(jìn)行下載。void do_netbios(void){unsigned char state;unsigned int len;1state = getSn_SR(NETBIOS_SOCK);switch(state){case SOCK_UDP:2if((len=getSn_RX_RSR(NETBIOS_SOCK))>0){unsigned char rem_ip_addr[4];uint16 rem_udp_port;3char netbios_name[NETBIOS_NAME_LEN+1];4NETBIOS_HDR* netbios_hdr;5NETBIOS_NAME_HDR* netbios_name_hdr;6len=recvfrom(NETBIOS_SOCK,(unsignedchar*)&netbios_rx_buf,len,rem_ip_addr,&rem_udp_port);printf(“rem_ip_addr=%d.%d.%d.%d:%d\r\n”,rem_ip_addr[0],rem_ip_addr[1],rem_ip_addr[2],rem_ip_addr[3],rem_udp_port);7netbios_hdr = (NETBIOS_HDR*)netbios_rx_buf;8netbios_name_hdr = (NETBIOS_NAME_HDR*)(netbios_hdr+1);/* if the packet is a NetBIOS name query question */9if(((netbios_hdr->flags& ntohs(NETB_HFLAG_OPCODE)) == ntohs(NETB_HFLAG_OPCODE_NAME_QUERY)) &&((netbios_hdr->flags & ntohs(NETB_HFLAG_RESPONSE)) == 0) &&(netbios_hdr->questions == ntohs(1))){printf(“netbios name query question\r\n”);/* decode the NetBIOS name */10netbios_name_decoding( (char*)(netbios_name_hdr->encname), netbios_name, sizeof(netbios_name));printf(“name is %s\r\n”,netbios_name);/* if the packet is for us */11if (strcmp(netbios_name, NETBIOS_W5500_NAME) == 0){uint8 ip_addr[4];NETBIOS_RESP *resp = (NETBIOS_RESP*)netbios_tx_buf;/* prepare NetBIOS header response */12resp->resp_hdr.trans_id= netbios_hdr->trans_id;resp->resp_hdr.flags= htons(NETB_HFLAG_RESPONSE |NETB_HFLAG_OPCODE_NAME_QUERY |NETB_HFLAG_AUTHORATIVE |NETB_HFLAG_RECURS_DESIRED);resp->resp_hdr.questions= 0;resp->resp_hdr.answerRRs= htons(1);resp->resp_hdr.authorityRRs= 0;resp->resp_hdr.additionalRRs = 0;/* prepare NetBIOS header datas */memcpy( resp->resp_name.encname, netbios_name_hdr->encname, sizeof(netbios_name_hdr->encname));resp->resp_name.nametype= netbios_name_hdr->nametype;resp->resp_name.type= netbios_name_hdr->type;resp->resp_name.cls= netbios_name_hdr->cls;resp->resp_name.ttl= htonl(NETBIOS_NAME_TTL);resp->resp_name.datalen= htons(sizeof(resp->resp_name.flags)+sizeof(resp->resp_name.addr));resp->resp_name.flags= htons(NETB_NFLAG_NODETYPE_BNODE);getSIPR(ip_addr);memcpy(resp->resp_name.addr,ip_addr,4);/* send the NetBIOS response */13sendto(NETBIOS_SOCK, (unsigned char*)resp, sizeof(NETBIOS_RESP), rem_ip_addr, rem_udp_port);printf(“send response\r\n”);}}}break;14case SOCK_CLOSED:close(NETBIOS_SOCK);socket(NETBIOS_SOCK,Sn_MR_UDP,NETBIOS_PORT,0);break;default:break;}}主要代碼解釋:第1、2段程序功能為通過SPI接口讀取NBNS Socket寄存器狀態(tài),如果檢測(cè)建立了UDP連接,并且收到數(shù)據(jù)則進(jìn)行NBNS服務(wù)。第3段定義了NetBIOS name緩存區(qū),Netbios name長度為16。第4、5段定義了NetBIOS包頭和其name部分結(jié)構(gòu)體變量。第6段為讀取137端口的UDP數(shù)據(jù))netbios_rx_buf。接下來NBNS核心部分:第7、8兩段將接受緩存區(qū)數(shù)據(jù)對(duì)定義的包頭進(jìn)行賦值,第9,10段,判斷數(shù)據(jù)NetBIOS包頭是否為名字查詢,如果是名字查詢則進(jìn)行名字解析。第11行進(jìn)行NetBIOS名字進(jìn)一步比較。比較一致后,第12段程序準(zhǔn)備回復(fù)NetBIOS包頭和內(nèi)容。第13段,發(fā)送NetBIOS回復(fù)響應(yīng)。第14段為檢測(cè)到NBNS Socket為SOCK_CLOSED,則打開137端口的UDP Socket。四實(shí)驗(yàn)測(cè)試試驗(yàn)中,我們通過W5500EVB對(duì)NetBIOS的解析,并用瀏覽器直接訪問設(shè)備名稱,來實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程訪問,以達(dá)實(shí)驗(yàn)?zāi)康摹O旅婢蛠砜匆幌聦?shí)驗(yàn)測(cè)試全過程。首先,打開串口調(diào)試助手,運(yùn)行DHCP相關(guān)程序。可看到圖5中所示,W5500EVB成功通過DHCP獲得可用IP地址。2. 在DOS下,ping W5500EVB設(shè)備名:WIZNET5500,可看到如圖6中,獲取設(shè)備IP地址為:192.168.1.100。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- W5500 數(shù)據(jù)手冊(cè)(寄存器和內(nèi)存構(gòu)成) 21次下載
- W5500 數(shù)據(jù)手冊(cè)中文資料 17次下載
- W5500模塊與底板原理圖 13次下載
- RaspberryPi Pico Web服務(wù)器w5100S(W5500)
- 制作測(cè)試Wiznet模(W5500 io/W5100S io)的測(cè)試夾具
- W5500儀表板開源項(xiàng)目
- W5500模塊原理圖 128次下載
- 全硬件TCP/IP嵌入式以太網(wǎng)控制器w5500中文資料 22次下載
- W5500芯片數(shù)據(jù)手冊(cè) 65次下載
- W5500數(shù)據(jù)手冊(cè)免費(fèi)下載 28次下載
- W5500網(wǎng)絡(luò)通信模塊的電路原理圖免費(fèi)下載 175次下載
- 使用W5500設(shè)計(jì)一個(gè)智能家居監(jiān)控器的簡單說明
- W5500以太網(wǎng)主控器原理圖詳細(xì)資料免費(fèi)下載 69次下載
- W5500數(shù)據(jù)手冊(cè)(中文資料PDF版免費(fèi)下載) 0次下載
- W5500移植講解 120次下載
- AC7840x-W5500嵌入式以太網(wǎng)控制器方案簡介 1268次閱讀
- 使用SPI驅(qū)動(dòng)wiznet的網(wǎng)絡(luò)接口芯片W5xxx 1760次閱讀
- LPC5500_SDK例程:串口DMA發(fā)送+中斷接收 879次閱讀
- 基于W5500的Modbus TCP服務(wù)器設(shè)計(jì) 3143次閱讀
- W5500以太網(wǎng)控制器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn) 4341次閱讀
- Device Studio應(yīng)用實(shí)例之STEMS應(yīng)用實(shí)例 1876次閱讀
- Device Studio應(yīng)用實(shí)例之LAMMPS應(yīng)用實(shí)例 3317次閱讀
- dfrobotW5500以太網(wǎng)主控器簡介 1963次閱讀
- 凌壹科技UAV-5500主板規(guī)格 1711次閱讀
- 基于FPGA和嵌入式以太網(wǎng)W5500的TCP/IP協(xié)議棧實(shí)現(xiàn)設(shè)計(jì) 7917次閱讀
- 如何通過W5500開發(fā)板控制外接燈帶的亮度 2485次閱讀
- w5500原理圖_w5500電路圖 5.3w次閱讀
- w5500功能參數(shù)(交直流特性與功耗等) 1.8w次閱讀
- w5500引腳圖及引腳說明 1.5w次閱讀
- 以太網(wǎng)網(wǎng)關(guān)節(jié)點(diǎn)在節(jié)能計(jì)量系統(tǒng)中的設(shè)計(jì) 2821次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多