<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>
  • 低成本W(wǎng)iFi在Linux工控主板上的編程方法

     2017-3-8     作者:陳昌龍         
    文章標(biāo)簽:C/C++WiFi

      ETA6103是由串口WiFi模塊E103(esp8266ex芯片)+ USB轉(zhuǎn)串口芯片CH340T構(gòu)成的低成本無(wú)線模塊,其對(duì)外接口是miniPCIe接口,可以適用于英創(chuàng)ESMARC V4.0以上的所有底板,也可以通過(guò)ETA303模塊轉(zhuǎn)成USB接口,用到所有的英創(chuàng)底板之上。


    低成本W(wǎng)IFI在Linux工控主板上的編程方法.gif

    ESMARC底板、ETA6103和ETA303模塊


      工作的時(shí)候,ETA6103被虛擬成串口設(shè)備,比如/dev/ttyUSB0。對(duì)軟件來(lái)說(shuō),按串口的方式讀寫(xiě),發(fā)送AT指令即可建立互聯(lián)網(wǎng)連接。值得注意的是ETA6103最大能支持5個(gè)網(wǎng)絡(luò)連接,包括所有的TCP和UDP連接。并且,所有的配置信息、網(wǎng)絡(luò)數(shù)據(jù)都通過(guò)同一個(gè)串口傳輸。為方便用戶(hù)編程,適應(yīng)網(wǎng)絡(luò)編程的習(xí)慣,增加程序的可讀性,英創(chuàng)公司封裝了一個(gè)CUartWifi類(lèi),提供了配置無(wú)線網(wǎng)絡(luò)和建立TCP/UDP傳輸?shù)墓埠瘮?shù),用戶(hù)不用關(guān)心具體的AT指令。


      1、加載CH340T驅(qū)動(dòng)

      insmod /lib/modules/(Linux versions)/usbserial.ko

      insmod /lib/modules/(Linux versions)/ch340.ko


      成功后會(huì)在/dev目錄下增加一個(gè)串口設(shè)備ttyUSBx,通過(guò)此串口發(fā)送AT指令,接收信息。


      2、連接WiFi

      CUartWifi uartWifi(devname);

        ret = uartWifi.ConnectToAP("Emtronix\\.20","0987654321");//需要對(duì)特殊字符進(jìn)行轉(zhuǎn)義

        ret = uartWifi.SetIPInfo("192.168.201.93","192.168.201.20", "255.255.255.0");


      需要注意的是ETA6103的AT指令中ssid需要對(duì)特殊字符做轉(zhuǎn)義,假如無(wú)線網(wǎng)絡(luò)賬號(hào)是"Emtronix.20",ETA6103的AT指令中ssid應(yīng)該輸入"Emtronix\.20",而通過(guò)CUARTWifi類(lèi)發(fā)送的ssid參數(shù)就應(yīng)該是"Emtronix\\.20"。連接上無(wú)線網(wǎng)絡(luò)后,可以調(diào)用SetIPInfo設(shè)置IP地址、網(wǎng)關(guān)、子網(wǎng)掩碼,還可以使用Ping工具檢查連接狀況。


      3、建立TCP服務(wù)端

      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支持的最大網(wǎng)絡(luò)連接數(shù)是5個(gè),包括所有的客戶(hù)端連接和服務(wù)端連接。在建立服務(wù)端連接時(shí),首先使用Open函數(shù)開(kāi)啟服務(wù)端功能,然后馬上進(jìn)入Accept狀態(tài),每收到一個(gè)連接,就為這個(gè)新連接開(kāi)啟一個(gè)線程。建立新線程時(shí)傳遞參數(shù)要用到下面的結(jié)構(gòu)體:

      struct ThreadFuncParam

      {

          CUartWifi * pUartWifi;

          int conno;

          int *pTotalConno;

          pthread_mutex_t *pTotalConnoMutex;

      };


      在此線程中調(diào)用WaitEvent等待此連接的數(shù)據(jù)或連接中斷的事件,并做對(duì)應(yīng)的處理。這里對(duì)接收到的數(shù)據(jù)進(jìn)行回發(fā),使用do{}while循環(huán)是保證對(duì)應(yīng)conn的接收數(shù)據(jù)緩存中的數(shù)據(jù)能全部讀出。在退出此線程時(shí),使用指針對(duì)主程序中的TotalConno做了“減一”處理,表示conn連接關(guān)閉。


      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;

          ...具體聲明見(jiàn)例程

          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客戶(hù)端連接

      客戶(hù)端也使用Open建立,第一個(gè)參數(shù)為IP地址,得到新連接后使用WaitEvent監(jiān)聽(tīng)處理此連接的事件,與服務(wù)端程序相似。


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

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

        {

            int connClose = 0;

            ...具體聲明見(jiàn)例程

            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、關(guān)閉連接,斷開(kāi)網(wǎng)絡(luò)

      for(i1=0;i1<MAX_LINK_NUM;i1++)

        {

            uartWifi.Close(i1);

        }

        uartWifi.DisconnectToAP();


      至此,完成了整個(gè)通信過(guò)程,如果用戶(hù)對(duì)此感興趣,可以聯(lián)系我們。我們將提供驅(qū)動(dòng)和具體的參考例程等資料。


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

    文章標(biāo)簽:C/C++WiFi
    久久99精品久久久久久清纯| 真实国产精品vr专区| 99国产精品久久| 四虎亚洲国产成人久久精品| 精品免费国产一区二区| 99在线精品国自产拍中文字幕 | 国产嫩草影院精品免费网址| 中文无码精品A∨在线观看不卡| 人妻少妇精品无码专区二区| 国产精品VA在线观看无码不卡 | 久久久久九九精品影院| 伊人精品久久久久7777| 国产精品亚洲二区在线| 日韩亚洲综合精品国产| 国产精品嫩草影院在线| 国产精品国产AV片国产| 天堂一区二区三区精品| 精品无码久久久久久久久水蜜桃 | 国产69精品久久久久久人妻精品| 国产精品狼人久久久久影院| japanese乱人伦精品| 国产成人精品久久| 久久久久国产日韩精品网站| 成人区人妻精品一区二区不卡视频| 精品久久久久久国产牛牛app| 精品国产青草久久久久福利| 精品精品国产高清a毛片| 精品亚洲视频在线观看| 色妞www精品视频| 奇米影视7777久久精品人人爽| 国产日韩精品中文字无码| 精品一区二区三区免费| 亚洲AV无码成人精品区在线观看 | 久久久国产成人精品| 久久在精品线影院精品国产| 99精品国产高清一区二区| 久久亚洲AV无码精品色午夜| 97久久精品无码一区二区| 国产精品无码一区二区在线观| 尤物在线观看精品国产福利片| 精品无码黑人又粗又大又长|