ESP8266 Non-OS SDK开发探坑之六-简单的TCP控制服务

10 篇文章 0 订阅
8 篇文章 1 订阅

这边承接上文,用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继电器控制版(智能开关)AC-relay-1024x768.jpg

DC供电版

DC-relay-e1536425929685.jpg

代码见:

原博客:

Starting with ESP8266(6)–Simple TCP command server – straka's blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值