ETA6103是由串口WiFi模塊E103(esp8266ex芯片)+ USB轉串口芯片CH340T構成的低成本無線模塊,其對外接口是miniPCIe接口,可以適用于英創ESMARC V4.0以上的所有底板,也可以通過ETA303模塊轉成USB接口,用到所有的英創底板之上。
ESMARC底板、ETA6103和ETA303模塊
工作的時候,ETA6103被虛擬成串口設備,比如/dev/ttyUSB0。對軟件來說,按串口的方式讀寫,發送AT指令即可建立互聯網連接。值得注意的是ETA6103最大能支持5個網絡連接,包括所有的TCP和UDP連接。并且,所有的配置信息、網絡數據都通過同一個串口傳輸。為方便用戶編程,適應網絡編程的習慣,增加程序的可讀性,英創公司封裝了一個CUartWifi類,提供了配置無線網絡和建立TCP/UDP傳輸的公共函數,用戶不用關心具體的AT指令。
1、加載CH340T驅動
insmod /lib/modules/(Linux versions)/usbserial.ko
insmod /lib/modules/(Linux versions)/ch340.ko
成功后會在/dev目錄下增加一個串口設備ttyUSBx,通過此串口發送AT指令,接收信息。
2、連接WiFi
CUartWifiuartWifi(devname);
ret = uartWifi.ConnectToAP("Emtronix\\.20","0987654321");//需要對特殊字符進行轉義
ret = uartWifi.SetIPInfo("192.168.201.93","192.168.201.20", "255.255.255.0");
需要注意的是ETA6103的AT指令中ssid需要對特殊字符做轉義,假如無線網絡賬號是"Emtronix.20",ETA6103的AT指令中ssid應該輸入"Emtronix\.20",而通過CUARTWifi類發送的ssid參數就應該是"Emtronix\\.20"。連接上無線網絡后,可以調用SetIPInfo設置IP地址、網關、子網掩碼,還可以使用Ping工具檢查連接狀況。
3、建立TCP服務端
charserver[] = "*";
ret = uartWifi.Open(server,6002,TCP_TRANS_TYPE,0);
inttotalConno = 0;
pthread_mutex_t totalConno_mutex;
pthread_mutex_init(&totalConno_mutex,NULL);
while(1)
{
ret = uartWifi.Accept(0);
......
threadFuncParam.pUartWifi = &uartWifi;
threadFuncParam.conno = ret;
threadFuncParam.pTotalConno = &totalConno;
threadFuncParam.pTotalConnoMutex = &totalConno_mutex;
ConnThreadCreate(&connThread[ret],(void* (*)(void*))&ConnThreadFunc1,&threadFuncParam) ;
}
ETA6103支持的最大網絡連接數是5個,包括所有的客戶端連接和服務端連接。在建立服務端連接時,首先使用Open函數開啟服務端功能,然后馬上進入Accept狀態,每收到一個連接,就為這個新連接開啟一個線程。建立新線程時傳遞參數要用到下面的結構體:
structThreadFuncParam
{
CUartWifi * pUartWifi;
intconno;
int*pTotalConno;
pthread_mutex_t *pTotalConnoMutex;
};
在此線程中調用WaitEvent等待此連接的數據或連接中斷的事件,并做對應的處理。這里對接收到的數據進行回發,使用do{}while循環是保證對應conn的接收數據緩存中的數據能全部讀出。在退出此線程時,使用指針對主程序中的TotalConno做了“減一”處理,表示conn連接關閉。
intConnThreadFunc1(void* lparam )
{
CUartWifi * pUartWifi = ((structThreadFuncParam * )lparam)->pUartWifi;
intconn = ((structThreadFuncParam * )lparam)->conno;
int* pTotalConno = ((structThreadFuncParam * )lparam)->pTotalConno;
intconnClose = 0;
...具體聲明見例程
while(connClose != 1)
{
event = pUartWifi->WaitEvent(conn,2000);
switch(event)
{
caseCONN_EVENT_TIMEOUT:
break;
caseCONN_EVENT_DATAIN:
do{
readNum = pUartWifi->Recv(conn,buf,1024);
...
pUartWifi->Send(conn,buf,readNum);
}while(readNum == 1024);//不一定是1024,
break;
caseCONN_EVENT_CLOSE:
connClose = 1;
break;
caseCONN_EVENT_ERROR:
connClose = 1;
break;
default:
break;
}
}
pthread_mutex_lock(((structThreadFuncParam * )lparam)->pTotalConnoMutex);
if(*pTotalConno > 0)
*pTotalConno = *pTotalConno - 1;
pthread_mutex_unlock(((structThreadFuncParam * )lparam)->pTotalConnoMutex);
return0;
}
4、建立TCP客戶端連接
客戶端也使用Open建立,第一個參數為IP地址,得到新連接后使用WaitEvent監聽處理此連接的事件,與服務端程序相似。
ret = uartWifi.Open(remoteIP,remotePort,TCP_TRANS_TYPE,0);
if(ret >= 0 && ret < 5)
{
intconnClose = 0;
...具體聲明見例程
while(connClose != 1)
{
event = uartWifi.WaitEvent(conn,2000);
switch(event)
{
caseCONN_EVENT_TIMEOUT:
break;
caseCONN_EVENT_DATAIN:
do{
readNum = uartWifi.Recv(conn,buf,1024);
}while(readNum == 1024);//不一定是1024,
break;
caseCONN_EVENT_CLOSE:
connClose = 1;
break;
caseCONN_EVENT_ERROR:
connClose = 1;
break;
default:
break;
}
}
}
5、關閉連接,斷開網絡
for(i1=0;i1
{
uartWifi.Close(i1);
}
uartWifi.DisconnectToAP();
至此,完成了整個通信過程,如果用戶對此感興趣,可以聯系我們。我們將提供驅動和具體的參考例程等資料。
另外,對于對硬件電路有特殊要求的用戶,可以直接使用物理串口連接獨立的E103模塊,此封裝類及以上編程方法同樣適用,只需要將/dev/ttyUSBx修改成/dev/ttySx即可。
-
Linux
+關注
關注
87文章
11465瀏覽量
212818 -
嵌入式主板
+關注
關注
7文章
6097瀏覽量
36141
發布評論請先 登錄
信息安全管理必備!Linux系統使用SSH登錄root賬號的方法

評論