今天终于把双机通信的简单方案做完了,
之所以简单,是没使用平台,而且是短距离的通信,
使用的方法是:其中一个esp8266设置为ap模式并作为服务端,
另一个esp8266作为客户端,在同一端口号下进行数据交互,
可能相比起pushdata来说,我是多此一举了,
但是我还是觉得很有意义的。
好了,不废话了,来看看代码,
服务端:
UsartPrintf(USART_DEBUG, "STA Tips: AT+CWMODE=1\r\n");
if(!NET_DEVICE_SendCmd("AT+CWMODE=2\r\n", "OK")) //ap模式
UsartPrintf(USART_DEBUG, "模式完成1 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips:AT+CWSAP=\"AA\",\"123456789\"\r\n");
if(!NET_DEVICE_SendCmd("AT+CWSAP=\"AA\",\"123456789\",4,4\r\n", "OK")) //open wifi :ssid"AA","123456789"
UsartPrintf(USART_DEBUG, "模式完成2 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPMODE=0\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPMODE=0\r\n", "OK")) //本模块做 server 的连接
UsartPrintf(USART_DEBUG, "模式完成3 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPMUX=1\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPMUX=1\r\n", "OK")) //建立 TCP 连接
UsartPrintf(USART_DEBUG, "模式完成4 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPAP=\"192.168.4.1\"\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPAP=\"192.168.4.1\"\r\n", "OK")) //设置IP地址
UsartPrintf(USART_DEBUG, "模式完成5 :Ok\r\n");
UsartPrintf(USART_DEBUG, "AT+CIPSERVER=1,8899\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPSERVER=1,8899\r\n", "OK")) //设置端口号
UsartPrintf(USART_DEBUG, "模式完成6 :Ok\r\n");
ESP8266_EnterTrans(); //进入透传模式
UsartPrintf(USART_DEBUG, "Tips: EnterTrans\r\n");
UsartPrintf(USART_DEBUG, "Tips: ESP8266 STA_Mode OK\r\n");
UsartPrintf(USART_DEBUG, "模式完成7 :Ok\r\n");
客户端:
UsartPrintf(USART_DEBUG, "STA Tips: AT+CWMODE=1\r\n");
if(!NET_DEVICE_SendCmd("AT+CWMODE=1\r\n", "OK")) //station模式
UsartPrintf(USART_DEBUG, "模式完成1 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPMODE=1\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPMODE=1\r\n", "OK")) //透传模式
UsartPrintf(USART_DEBUG, "模式完成2 :Ok\r\n");
memset(cfgBuffer, 0, sizeof(cfgBuffer));
strcpy(cfgBuffer, "AT+CWJAP=\""); //填写ssid、pswd
strcat(cfgBuffer, netDeviceInfo.staName);
strcat(cfgBuffer, "\",\"");
strcat(cfgBuffer, netDeviceInfo.staPass);
strcat(cfgBuffer, "\"\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: %s", cfgBuffer);
while(!(NET_DEVICE_SendCmd(cfgBuffer, "GOT IP")||NET_DEVICE_SendCmd(cfgBuffer, "OK"))) //连接无线,检索“GOT IP”,如果失败会进入循环体
{
if(++errCount >= 5) //如果连续5次没有连上,需要检测网络状态或者ssid、pswd
{
UsartPrintf(USART_DEBUG, "WARN: AT+CWJAP Err\r\n");
errType = 1; //wifi信息错误
break;
}
}
Delay_ms(500);
Delay_ms(500);
if(!errType)
UsartPrintf(USART_DEBUG, "模式完成3 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPMUX=0\r\n");
Delay_ms(500);
if(!NET_DEVICE_SendCmd("AT+CIPMUX=0\r\n", "OK")) //单路连接模式
UsartPrintf(USART_DEBUG, "模式完成4 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPSTART=\"TCP\",\"192.168.4.1\",8899\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8899\r\n", "OK")) //单路连接
UsartPrintf(USART_DEBUG, "模式完成5 :Ok\r\n");
UsartPrintf(USART_DEBUG, "STA Tips: AT+CIPSEND\r\n");
if(!NET_DEVICE_SendCmd("AT+CIPSEND\r\n", "OK")) //发送数据
UsartPrintf(USART_DEBUG, "模式完成6 :Ok\r\n");
ESP8266_EnterTrans();
UsartPrintf(USART_DEBUG, "Tips: EnterTrans\r\n");
UsartPrintf(USART_DEBUG, "Tips: ESP8266 STA_Mode OK\r\n");
UsartPrintf(USART_DEBUG, "模式完成7 :Ok\r\n");
最主要的就是设置模式,让wifi模块按照指令工作在具体状态。
效果图:如图1
代码如下:https://open.iot.10086.cn/bbs/thread-16109-1-1.html
|