当前位置:工控会员企业> 首页 >技术文章>低成本WiFi在Linux工控主板上的编程方法
联系我们

名称:成都英创信息技术有限公司

地址:成都市高新区高朋大道5号博士创业园B407

邮编:610041

电话:86-28-86180660

传真:86-28-85141028

网址:http://www.emtronix.com

Email:marketing@emtronix.com

在线反馈

本网站信息涉及广告内容!

低成本WiFi在Linux工控主板上的编程方法

  • 关键词:Linux,工控主板
  • 作者:emtronix
  • 摘要:ETA6103是由串口WiFi模块E103(esp8266ex芯片)+ USB转串口芯片CH340T构成的低成本无线模块,其对外接口是miniPCIe接口,可以适用于英创ESMARC V4.0以上的所有底板,也可以通过ETA303模块转成USB接口,用到所有的英创底板之上。

  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

  CUartWifi uartWifi(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服务端

  char server[] = "*";

   ret = uartWifi.Open(server,6002,TCP_TRANS_TYPE,0);

   int totalConno = 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状态,每收到一个连接,就为这个新连接开启一个线程。建立新线程时传递参数要用到下面的结构体:

  struct ThreadFuncParam

  {

      CUartWifi * pUartWifi;

      int conno;

      int *pTotalConno;

      pthread_mutex_t *pTotalConnoMutex;

  };


  在此线程中调用WaitEvent等待此连接的数据或连接中断的事件,并做对应的处理。这里对接收到的数据进行回发,使用do{}while循环是保证对应conn的接收数据缓存中的数据能全部读出。在退出此线程时,使用指针对主程序中的TotalConno做了“减一”处理,表示conn连接关闭。


  int ConnThreadFunc1( void* lparam )

  {

      CUartWifi * pUartWifi = ((struct ThreadFuncParam * )lparam)->pUartWifi;

      int conn = ((struct ThreadFuncParam * )lparam)->conno;

      int* pTotalConno = ((struct ThreadFuncParam * )lparam)->pTotalConno;

      int connClose = 0;

      ...具体声明见例程

      while(connClose != 1)

      {

          event = pUartWifi->WaitEvent(conn,2000);

          switch(event)

          {

          case CONN_EVENT_TIMEOUT:

              break;

          case CONN_EVENT_DATAIN:

              do{

                  readNum = pUartWifi->Recv(conn,buf,1024);

                  ...

                  pUartWifi->Send(conn,buf,readNum);

              }while(readNum == 1024);//不一定是1024,

              break;

          case CONN_EVENT_CLOSE:

              connClose = 1;

              break;

          case CONN_EVENT_ERROR:

              connClose = 1;

              break;

          default:

              break;

          }

      }

      pthread_mutex_lock(((struct ThreadFuncParam * )lparam)->pTotalConnoMutex);

      if(*pTotalConno > 0)

          *pTotalConno = *pTotalConno - 1;

      pthread_mutex_unlock(((struct ThreadFuncParam * )lparam)->pTotalConnoMutex);

      return 0;

  }


  4、建立TCP客户端连接

  客户端也使用Open建立,第一个参数为IP地址,得到新连接后使用WaitEvent监听处理此连接的事件,与服务端程序相似。


  ret = uartWifi.Open(remoteIP,remotePort,TCP_TRANS_TYPE,0);

   if(ret >= 0 && ret < 5)

   {

       int connClose = 0;

       ...具体声明见例程

       while(connClose != 1)

       {

           event = uartWifi.WaitEvent(conn,2000);

           switch(event)

           {

           case CONN_EVENT_TIMEOUT:

               break;

           case CONN_EVENT_DATAIN:

               do{

                   readNum = uartWifi.Recv(conn,buf,1024);

               }while(readNum == 1024);//不一定是1024,

               break;

           case CONN_EVENT_CLOSE:

               connClose = 1;

               break;

           case CONN_EVENT_ERROR:

               connClose = 1;

               break;

           default:

               break;

           }

       }

   }


  5、关闭连接,断开网络

  for(i1=0;i1

   {

       uartWifi.Close(i1);

   }

   uartWifi.DisconnectToAP();


  至此,完成了整个通信过程,如果用户对此感兴趣,可以联系我们。我们将提供驱动和具体的参考例程等资料。


  另外,对于对硬件电路有特殊要求的用户,可以直接使用物理串口连接独立的E103模块,此封装类及以上编程方法同样适用,只需要将/dev/ttyUSBx修改成/dev/ttySx即可。

发布时间:2017年3月9日 9:51  人气:   审核编辑(王静)
更多内容请访问(成都英创信息技术有限公司
相关链接

我来评价

评价:
一般