<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 低成本WiFi在Linux工控主板上的編程方法

     2017-3-8     作者:陳昌龍         
    文章標簽:C/C++WiFi

      ETA6103是由串口WiFi模塊E103(esp8266ex芯片)+ USB轉串口芯片CH340T構成的低成本無線模塊,其對外接口是miniPCIe接口,可以適用于英創ESMARC V4.0以上的所有底板,也可以通過ETA303模塊轉成USB接口,用到所有的英創底板之上。


    低成本WIFI在Linux工控主板上的編程方法.gif

    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<MAX_LINK_NUM;i1++)

        {

            uartWifi.Close(i1);

        }

        uartWifi.DisconnectToAP();


      至此,完成了整個通信過程,如果用戶對此感興趣,可以聯系我們。我們將提供驅動和具體的參考例程等資料。


      另外,對于對硬件電路有特殊要求的用戶,可以直接使用物理串口連接獨立的E103模塊,此封裝類及以上編程方法同樣適用,只需要將/dev/ttyUSBx修改成/dev/ttySx即可。

    文章標簽:C/C++WiFi
    无码人妻精品一区二区三区久久| 精品人妻人人做人人爽| 国产成人精品免费视| 精品国产婷婷久久久| 亚洲欧美日韩国产精品一区| 国产区精品一区二区不卡中文 | 久久精品国产91久久综合麻豆自制 | 久久精品综合电影| 免费看一级毛片在线观看精品视频| 51精品视频免费国产专区| 久久中文精品无码中文字幕| 精品国产一区在线观看| 91精品全国免费观看含羞草 | 日韩精品国产另类专区| 久久这里有精品视频| 国产成人福利精品视频| 国产精品国产三级专区第1集| 久久精品九九亚洲精品天堂| 亚洲精品国产精品乱码不卡| 久久亚洲欧美国产精品| 182tv精品视频在线播放| 国产精品无码无需播放器| 亚洲国产精品一区二区九九| 精品日韩一区二区| 999久久久无码国产精品| 国产成人精品一区二区三区免费 | 真实国产乱子伦精品视频| 国产精品美女自在线观看免费| 精品国产aⅴ无码一区二区| 亚洲国产精品久久久久网站| 国内精品久久久久久久亚洲| 精品无码中出一区二区| 国产在线拍揄自揄视精品| 国产精品福利尤物youwu| 51精品视频免费国产专区| 91精品国产综合久| 小辣椒福利视频精品导航| 国内精品51视频在线观看| 久久亚洲中文字幕精品一区| 国产精品九九久久免费视频| 日韩在线精品一二三区|