[开源硬件] 【ESP8266 Non-OS SDK开发探坑之六】-简单的TCP控制服务器编程

[复制链接]
152|2
 楼主 | 2018-9-11 08:54 | 显示全部楼层 |阅读模式
本帖最后由 straka 于 2018-9-11 08:57 编辑

Starting with ESP8266 — Light a LED
Starting with ESP8266 (2)–Touch to control relay status-circuit design & electronic components selection
Starting with ESP8266(3) — Touch to control Relay-Programming & PCB design
Starting with ESP8266(4)–User parameters securely save & load on flash
Starting with ESP8266(5)–Simple HTTP configure server
Starting with ESP8266(6)–Simple TCP command server
原博客格式友好有代码高亮:
http://www.straka.cn/blog/esp8266-6-tcp-command-server/
这边承接上文,用esp8266 sdk 开发tcp server, 对接收到的请求进行处理。
建立连接和回调函数什么的没啥好说的
接收回调函数里主要完成对接收到的消息的解包。
其实TCP Server完全可以做成和web server一样用http协议进行通信,然后在数据域内填充POST请求参数,或者json数据。这里我再造造轮子,让大家有更多的选择。我简单定义了个交互协议(格式),就是首先两个字节的固定帧头,定义在User_config.h

1


[color=rgb(184, 92, 0) !important]#define COMM_PREFIX                        0x417A        // Az




我这里为了调试方便,用了ascii码的Az做帧头,实际用的时候并不理想,因为内容部分很容易出现Az字样,存在一定的问题。第3、4字节是长度字段,unsigned short,高字节在前,低字节在后的编码。后面即是数据。数据部分我懒得做json解析了,只支持固定的几个命令。
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));
}
响应函数里封装了响应头,也是固定帧头和长度信息+数据域:
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
}
这篇比较简单,继续插播我打的板,这回实物到了:
PS: 话说有木有人愿意帮我平摊下打板费,买板和配套散件,也当做是鼓励我继续分享哈。。。不喜勿喷哈
AC-DC继电器控制版(智能开关)
  AC供电版散件
DC供电版
DC供电版散件
代码见:
ESP8266_NONOS_SDK-2.2.1-WebServer
https://github.com/atp798/BlogStraka/
原博客:
http://www.straka.cn/blog/esp8266-6-tcp-command-server/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-9-12 20:17 | 显示全部楼层
好熟悉的220转5模块   哈哈   我买过好多
 楼主 | 2018-9-12 21:31 | 显示全部楼层
小小电子爱好者 发表于 2018-9-12 20:17
好熟悉的220转5模块   哈哈   我买过好多

三敏的这款性价比很高哈
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /4 下一条

快速回复 返回顶部 返回列表