簡(jiǎn)介
英創(chuàng)公司ESMARC系列工控主板支持8位數(shù)據(jù)/地址復(fù)用的精簡(jiǎn)ISA總線,通過精簡(jiǎn)ISA總線可以擴(kuò)展更多網(wǎng)口,如ETA728和ETA528,本文將介紹如何使用經(jīng)過擴(kuò)展的多路網(wǎng)口。
ETA528:8路串口+2路網(wǎng)口擴(kuò)展模塊 | ETA728:2路網(wǎng)口擴(kuò)展模塊 |
加載驅(qū)動(dòng)
ESMARC WinCE系統(tǒng)中已經(jīng)集成了擴(kuò)展模塊的驅(qū)動(dòng)程序,在使用擴(kuò)展模塊之前需要通過系統(tǒng)自帶的命令使能相應(yīng)的驅(qū)動(dòng)程序。具體操作方法是通過telnet命令登陸WinCE主板(或打開WinCE系統(tǒng)的命令提示行)后執(zhí)行相應(yīng)的命令,例如:
>ETA728Set 2 ; 使能ETA728 兩路網(wǎng)口擴(kuò)展模塊驅(qū)動(dòng)
>ETA728Set 1 ; 使能ETA728 一路網(wǎng)口擴(kuò)展模塊驅(qū)動(dòng)
>ETA728Set 0 ; 禁止ETA728驅(qū)動(dòng)程序加載
重啟板子后生效。
新增網(wǎng)絡(luò)查看及配置
以ESM335X為例, 連接模塊ETA728,并執(zhí)行命令ETA728Set 2加載模塊驅(qū)動(dòng)后。進(jìn)入控制面板->網(wǎng)絡(luò)連接,可以看到板子多出了兩個(gè)網(wǎng)絡(luò),DM9K3和DM9K4。可以查看及配置其網(wǎng)絡(luò)IP,網(wǎng)關(guān)等參數(shù)。
通過telnet或打開WINCE系統(tǒng)命令提示行,使用ipconfig也可以查看新增網(wǎng)絡(luò)的參數(shù)(未插網(wǎng)線時(shí)IP為0.0.0.0)。
注意:在系統(tǒng)中有多個(gè)網(wǎng)絡(luò)時(shí),一定要注意各個(gè)網(wǎng)絡(luò)不應(yīng)同時(shí)設(shè)置到一個(gè)網(wǎng)段內(nèi),會(huì)影響系統(tǒng)路由。
代碼控制
查詢網(wǎng)絡(luò)
#include <iphlpapi.h> IP_ADAPTER_INFO AdapterInfo[8]; ULONG OutBufLen = sizeof(IP_ADAPTER_INFO); GetAdaptersInfo(AdapterInfo, &OutBufLen); GetAdaptersInfo(AdapterInfo, &OutBufLen); //調(diào)兩次,可以百度下這個(gè)API
板子所有網(wǎng)絡(luò)的信息就存儲(chǔ)在AdapterInfo結(jié)構(gòu)體數(shù)組中了,其中包括,網(wǎng)絡(luò)名,如:判斷是否為ETA728擴(kuò)展的第一個(gè)網(wǎng)絡(luò)
if (strcmp(AdapterInfo[0].AdapterName, “DM9K3”) == 0) { //第一個(gè)網(wǎng)絡(luò)網(wǎng)口名為”DM9K3” }
獲得第二個(gè)網(wǎng)絡(luò)的MAC
BYTE *mac = AdapterInfo[1].Address;
獲得第三個(gè)網(wǎng)絡(luò)的IP
BYTE *mac = AdapterInfo[2].IpAddressList;
修改IP
參考光盤中提供的例程,以設(shè)置網(wǎng)絡(luò)名為”DM9K3”的網(wǎng)口參數(shù)為例,代碼如下。
#include "netip_api.h" #include <iphlpapi.h> NETWORK_ADPTS_NAME AdaptersName; NETWORK_ADPT_INFO AdptInfo; DWORD NewIPAddr; DWORD NewMask; DWORD NewGateWay; DWORD dwType; int i1; StringToIPAddr(L"192.168.1.248", &NewIPAddr ); StringToIPAddr(L"255.255.255.0", &NewMask); StringToIPAddr(L"192.168.1.1", &NewGateWay); bRes = GetNetWorkAdaptersName( &AdaptersName ); memset ((char *)&AdptInfo, 0, sizeof(AdptInfo)); for(int i1=0; i1<AdaptersName.NumOfAdapters; i1++ ) { if (wcscmp(AdaptersName.szAdapterName[i1],L"DM9K3") == 0) { bRes = GetNetWorkAdapterInfo( AdaptersName.szAdapterName[i1], &AdptInfo ); AdptInfo.IPAddr = NewIPAddr; AdptInfo.SubnetMask = NewMask; AdptInfo.Gateway = NewGateWay; SetNetWorkAdapterInfo( AdaptersName.szAdapterName[i1], &AdptInfo ); break; } }
Socket調(diào)用
參考光盤中網(wǎng)絡(luò)例程,當(dāng)系統(tǒng)只有一個(gè)網(wǎng)絡(luò)時(shí),可以設(shè)置socket的IP為0.0.0.0,即默認(rèn)的網(wǎng)口進(jìn)行通信。當(dāng)系統(tǒng)中有多個(gè)網(wǎng)絡(luò)時(shí),需要指定的網(wǎng)口進(jìn)行通信時(shí),綁定端口時(shí)就需要設(shè)置該網(wǎng)口的IP,參考例程第3步。
比如希望使用ETA728的第一個(gè)網(wǎng)口進(jìn)行通信時(shí),則需要先獲得網(wǎng)口名為”DM9K3”的網(wǎng)絡(luò)IP,綁定時(shí)綁定該IP。
WSADATA wsa; //1.初始化socket資源 if (WSAStartup(MAKEWORD(1,1),&wsa) != 0) { return -1;//代表失敗 } //2.創(chuàng)建套接字 if ((m_socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0) { return -2; } //3.綁定端口 SOCKADDR_IN serverAddr; ZeroMemory((char *)&serverAddr,sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(m_dwPort); //serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //單網(wǎng)絡(luò)時(shí) serverAddr.sin_addr.s_addr = htonl(m_dwIP); //綁定指定網(wǎng)口IP if (bind(m_socketServer, (struct sockaddr *)&serverAddr, sizeof(serverAddr))<0) { return -3 ; } //4.設(shè)置為偵聽套接字 if (listen(m_socketServer, 8)!=0) { return -4; } //4.設(shè)置監(jiān)聽套接字通訊模式 //DWORD ul= 1; //ioctlsocket(m_socketServer,FIONBIO,&ul); //5.創(chuàng)建偵聽通訊線程,在線程里,等待客戶端連接請(qǐng)求 m_bListenThreadStop = FALSE; m_hListenThread = CreateThread(NULL , 0, SocketListenThread, this, 0, NULL); if (m_hListenThread == NULL) { closesocket(m_socketServer); return -5; }
通過綁定socket,可以實(shí)現(xiàn)應(yīng)用程序同時(shí)在多個(gè)網(wǎng)絡(luò)中進(jìn)行通信的目的。
路由設(shè)置
在一個(gè)系統(tǒng)中有多個(gè)網(wǎng)絡(luò)時(shí),系統(tǒng)通過路由表決定網(wǎng)絡(luò)數(shù)據(jù)經(jīng)哪個(gè)網(wǎng)絡(luò)的網(wǎng)口進(jìn)行通信。當(dāng)代碼無(wú)法連通網(wǎng)絡(luò)時(shí),可以檢查下是否是路由設(shè)置的問題。
通過route print命令可以查看系統(tǒng)路由表。
使用route help查看其它指令的使用說(shuō)明。
可以增加路由,減少路由,修改路由優(yōu)先級(jí)等。
英創(chuàng)提供了文章內(nèi)所述程序及源代碼,有需要的客戶可以聯(lián)系英創(chuàng)工程師獲得。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660