您的位置首页>企业动态>

英创信息技术低成本WiFi在Linux工控主板上的编程方法

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解英创信息技术低成本WiFi在Linux工控主板上的编程方法问题。ETA6103是由串行WiFi模块

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解英创信息技术低成本WiFi在Linux工控主板上的编程方法问题。

ETA6103是由串行WiFi模块E103(esp8266ex芯片)USB转串口芯片CH340T组成的低成本无线模块,其外部接口为miniPCIe接口,可适用于ESMARC V4.0以上的所有板卡,也可通过ETA303模块转换为USB接口,在Innolux的所有板卡上使用。

ESMARC背板、ETA6103和ETA303模块。

在工作中,ETA6103被虚拟化为串行端口设备,例如/dev/ttyub0。对于软件,通过串口读写,发送AT命令,即可建立互联网连接。值得注意的是,ETA6103最多可以支持5个网络连接,包括所有的TCP和UDP连接。此外,所有配置信息和网络数据都通过同一个串行端口传输。为了方便用户编程,适应网络编程的习惯,提高程序的可读性,Innolux封装了一个CUartWifi类,为配置无线网络和建立TCP/UDP传输提供公共功能,让用户无需在意具体的at指令。

1.加载CH340T驱动器。

insmod /lib/modules/(Linux版本)/usbserial.ko

insmod /lib/modules/(Linux版本)/ch340.ko

成功后,将在/dev目录中添加一个串行端口设备ttyUSBx,通过它发送AT命令并接收信息。

2.连接WiFi。

cuartifuartwifi(dev name);

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服务器。

char server[]=' * ';

ret=uartWifi。打开(服务器,6002,TCP_TRANS_TYPE,0);

int totalConno=0;

pthread _ mutex _ t total conno _ mutex;

pthread _ mutex _ init(TotalConno _ mutex,NULL);

而(1)

{

ret=uartWifi。接受(0);

.

threadfunparam . puartifi=uartWifi;

threadFuncParam.conno=ret

threadfunparam . ptotalconno=total conno;

threadFuncParam . ptotalConnmutex=TotalConno _ mutex;

C

onnThreadCreate(&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即可。

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即可。

.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content:"广告"; } .dfma img { display: block; }
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。