ETA6103工作時(shí),對(duì)軟件來說,完全當(dāng)作串口來操作,發(fā)送AT指令建立互聯(lián)網(wǎng)連接。配置信息、網(wǎng)絡(luò)數(shù)據(jù)傳輸均通過一個(gè)串口傳輸。為方便用戶編程,英創(chuàng)公司封裝了一個(gè)CUartWifi類,提供了配置無線網(wǎng)絡(luò)和建立TCP/UDP傳輸?shù)墓埠瘮?shù),用戶不用關(guān)心具體的AT指令即可進(jìn)行開發(fā)。
使用說明
參考例程uart_wifi,工程中添加Serial.h , Serial.cpp, ETA6103.h, ETA6103.cpp共4個(gè)文件。
添加引用#include "ETA6103.h"
即可創(chuàng)建類并使用CUartWifi myWifi;
WiFi連接管理
參考例程APConnect,該例程簡(jiǎn)單展示如何進(jìn)行AP連接的管理
調(diào)用Open,AutoCfg方法初始化模塊
調(diào)用GetAPList方法查詢附近的AP
調(diào)用ConnectAP方法連接AP
調(diào)用SetDefAP設(shè)置上電后默認(rèn)連接的AP(不能在該AP無法連接時(shí)設(shè)置)
調(diào)用DisconnectAP方法斷開AP連接
調(diào)用GetCurIP查詢AP分配到的IP地址
UDP通信
參考例程Udp。
調(diào)用Open,AutoCfg方法初始化模塊
CUartWifi m_ETA6103;
m_ETA6103.Open();
m_ETA6103.AutoCfg();
調(diào)用ConnectUdp打開UDP連接,并創(chuàng)建線程用來等待消息接收
ip = “192.168.201.248”;
rport = 6000;
lport = 5000;
bRet = m_ETA6103.ConnectUdp(0, ip, rport, lport);
m_hRecvThread = CreateThread(0, 0, RecvTread, this, 0, NULL);
向遠(yuǎn)端發(fā)送數(shù)據(jù)
char str[32] = “test udp”;
len = strlen(str);
bRet = m_ETA6103.SendMsg(0, str, len);
接收線程處理
DWORD CUdpDlg::RecvTread(LPVOID lparam)
{
CUdpDlg *pDlg = (CUdpDlg*)lparam;
DWORD dwLen;
char recvBuf[1024];
while(!pDlg->m_bThreadStop)
{
pDlg->m_ETA6103.WaitMsg(); //等待消息
if (dwRet == WAIT_OBJECT_0)
{
pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1023, &dwLen);
//讀數(shù)據(jù)
while(dwLen>0)
{
//處理代碼
pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1024, &dwLen);
//循環(huán)讀直到讀完buffer
}
}
}//while(!pDlg->m_bThreadStop)
return 0;
};
TCP客戶端通信
參考例程TcpClient。
調(diào)用Open,AutoCfg方法初始化模塊
CUartWifi m_ETA6103;
m_ETA6103.Open();
m_ETA6103.AutoCfg();
調(diào)用ConnectUdp打開UDP連接,并創(chuàng)建線程用來等待消息接收
ip = “192.168.201.248”;
port = 6000;
bRet = m_ETA6103. ConnectTcpServer (0, ip, port);
m_hRecvThread = CreateThread(0, 0, RecvTread, this, 0, NULL);
向遠(yuǎn)端發(fā)送數(shù)據(jù)
char str[32] = “test tcpclient”;
len = strlen(str);
bRet = m_ETA6103.SendMsg(0, str, len);
接收線程處理
DWORD CUdpDlg::RecvTread(LPVOID lparam)
{
CUdpDlg *pDlg = (CUdpDlg*)lparam;
DWORD dwLen;
char recvBuf[1024];
while(!pDlg->m_bThreadStop)
{
pDlg->m_ETA6103.WaitMsg(); //等待消息
if (dwRet == WAIT_OBJECT_0)
{
pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1023, &dwLen);
//讀數(shù)據(jù)
while(dwLen>0)
{
//處理代碼
pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1024, &dwLen);
//循環(huán)讀直到讀完buffer
}
}
}//while(!pDlg->m_bThreadStop)
return 0;
};
可以看到,TCP客戶端的使用和UDP幾乎一樣,只是連接時(shí)調(diào)用的函數(shù)不一樣
TCP服務(wù)端通信
參考例程TcpClient。
調(diào)用Open,AutoCfg方法初始化模塊
CUartWifi m_ETA6103;
m_ETA6103.Open();
m_ETA6103.AutoCfg();
調(diào)用CreateTcpServer打開服務(wù)端連接,并創(chuàng)建線程用來偵聽客戶端連接和數(shù)據(jù)接收
port = 6000;
bRet = m_ETA6103. CreateTcpServer(port);
m_hRecvThread = CreateThread(0, 0, RecvTread, this, 0, NULL);
向?qū)?yīng)的客戶端發(fā)送數(shù)據(jù)
char str[32] = “test tcpserver”;
int id = 1; //向鏈接號(hào)為1的客戶端發(fā)送信息
len = strlen(str);
bRet = m_ETA6103.SendMsg(id, str, len);
接收線程處理
在例程中,將客戶端連接和消息接收,封裝到同一個(gè)事件中,然后通過標(biāo)記位判斷事件的類型,客戶可以根據(jù)需要,修改封裝代碼,改為各自事件分別處理,或者修改為多個(gè)線程來處理連接事件,和消息接收事件。
DWORD CTcpServerDlg::RecvTread(LPVOID lparam)
{
CTcpServerDlg *pDlg = (CTcpServerDlg*)lparam;
DWORD dwLen;
char recvBuf[1024];
DWORD dwRet;
int len;
int i;
int n;
while(!pDlg->m_bThreadStop)
{
dwRet = pDlg->m_ETA6103.WaitMsg();
if (dwRet == WAIT_OBJECT_0)
{
for(i=0; i<5; i++)
{
if(pDlg->m_ETA6103.m_link[i].eventFlag & EVT_STAT) //狀態(tài)變化
{
if(pDlg->m_ETA6103.m_link[i].stat == 0)//close
{
//用戶斷開代碼處理
}
else//connected
{
//用戶連接代碼處理
}
}
if(pDlg->m_ETA6103.m_link[i].eventFlag & EVT_RECV) //數(shù)據(jù)接收
{
pDlg->m_ETA6103.ReadMsg(i, recvBuf, 1020, &dwLen);
while(dwLen>0)
{
//數(shù)據(jù)接收代碼處理
pDlg->m_ETA6103.ReadMsg(0, recvBuf, 1024, &dwLen);
}
}
if(pDlg->m_ETA6103.m_link[i].eventFlag & EVT_ERR) //錯(cuò)誤事件
{
//錯(cuò)誤事件代碼處理
}
pDlg->m_ETA6103.m_link[i].eventFlag = 0;
}
}
}//while(!pDlg->m_bThreadStop)
return 0;
}
速度測(cè)試?yán)?/strong>
例程TestSpeed用于測(cè)試文件接收速度。通過SetCurUart可以設(shè)置波特率(最大460800,建議默認(rèn)115200),用戶可以選定最適合自己應(yīng)用的配置。
注意,在高速傳輸過程中,如果接收BUFFER收滿來不及處理,將發(fā)生數(shù)據(jù)丟包。建議參考例程,在對(duì)應(yīng)位置添加處理代碼。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660