这边承接上文,用esp8266 sdk 开发tcp server, 对接收到的请求进行处理。
建立连接和回调函数什么的没啥好说的
接收回调函数里主要完成对接收到的消息的解包。
其实TCP Server完全可以做成和web server一样用http协议进行通信,然后在数据域内填充POST请求参数,或者json数据。这里我再造造轮子,让大家有更多的选择。我简单定义了个交互协议(格式),就是首先两个字节的固定帧头,定义在User_config.h
1 | #define COMM_PREFIX 0x417A // Az |
我这里为了调试方便,用了ascii码的Az做帧头,实际用的时候并不理想,因为内容部分很容易出现Az字样,存在一定的问题。第3、4字节是长度字段,unsigned short,高字节在前,低字节在后的编码。后面即是数据。数据部分我懒得做json解析了,只支持固定的几个命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | LOCAL void ICACHE_FLASH_ATTR TCPServRecvCB(void *arg, char *pDataRecv, unsigned short length) { struct espconn *pEspConn = arg; char respBuf[64]; os_memset(respBuf,0,sizeof(respBuf)); TRACE("recved:%02x%02x%02x%02x%s,len:%d\r\n",pDataRecv[0],pDataRecv[1],pDataRecv[2],pDataRecv[3],pDataRecv+4,length); if(length>=COMM_HEADLEN && (pDataRecv[0]==(COMM_PREFIX >> 8)) && (pDataRecv[1] == (COMM_PREFIX & 0xff )) ){ uint16 len; len = (pDataRecv[2]<<8) + pDataRecv[3]; if(length-COMM_HEADLEN == len){ if(os_strncmp(pDataRecv+COMM_HEADLEN,"relay-on",8)){ GPIO_OUTPUT_SET(GPIO_ID_PIN(RELAY_PIN), RELAY_ON); RelayStatus = RELAY_ON; } }else{ os_sprintf(respBuf,"unrecognized command"); goto EXIT_RESPONSE; } os_sprintf(respBuf,"ok"); }else{ os_sprintf(respBuf,"length check failed"); } }else{ os_sprintf(respBuf,"frame head check error"); } EXIT_RESPONSE: TCPResponse(pEspConn,respBuf,os_strlen(respBuf)); } |
响应函数里封装了响应头,也是固定帧头和长度信息+数据域:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | LOCAL void ICACHE_FLASH_ATTR TCPResponse(void *arg, const char *pData, uint16 length){ struct espconn * pEspConn = arg; char respBuf[64]; os_memset(respBuf,0,sizeof(respBuf)); os_printf("response:%s\r\n",pData); respBuf[0] = REPORT_PREFIX >> 8; respBuf[1] = REPORT_PREFIX & 0xff; respBuf[2] = length>>8; respBuf[3] = length & 0xff; os_memcpy(respBuf+4,pData,length); #ifdef TCP_SERV_SSL_ENABLE espconn_secure_sent(pEspConn, respBuf, length+4); #else espconn_sent(pEspConn,respBuf, length+4); #endif } |
这篇比较简单,继续插播我打的板,这回实物到了:
AC-DC继电器控制版(智能开关)
DC供电版
代码见:
原博客:
Starting with ESP8266(6)–Simple TCP command server – straka's blog