激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

低成本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
主站蜘蛛池模板: 在线观看成年人免费视频| 亚洲一区二区三区首页| 国产精在线| 操批视频| 国产精品久久一区| 欧美另类亚洲| 亚洲国产高清视频| 182午夜视频| 一级做a爱片久久毛片| 曰曰鲁夜夜免费播放视频| 色拍999| 亚洲人成在线精品| 一级美国片免费看| 日韩一级片免费| 亚洲国产日韩无在线播放| 男女爱爱免费高清| 欧美日韩在线观看一区二区| 国产免费高清国产在线视频| 香蕉依依精品视频在线播放| 操大逼视频| 999久久精品国产| 国产精品性视频免费播放| 久久996re热这里只有精品| 欧美一区二区久久精品| 午夜性视频| 亚洲精品小说一区二区三区| 中文字幕日韩理论在线| avtt加勒比手机版天堂网| 一级黄色片大全| 久久久久99| 久久a级片| 久久免费毛片| 久久曰| 久久九九国产| 久久亚洲精品中文字幕二区| 日本护士xxxxxwww| 日本黄大片免播放视播放器| 中文字幕日本一区久久| 中文国产日韩欧美视频| 手机黄色小视频| 中国毛片视频|