esp8266 RTOS3.1的SDK移植了socket,相对于RTOS2.0的sdk,可谓是完全变了模样,在看这个例程实验时,大家最好先看一下socket相关的api,下面开始了
以下是本程序中使用的宏定义
#define HOST_IP_ADDR "xxx.xxx.xxx.xxx" //TCP服务端的IP地址,如果你用的tcp调试助手,就是你的电脑IP
#define PORT xxxx //TCP服务端的端口号
首先是连接wifi,这里就不介绍了,有什么不懂的直接传送这里wifi配置
然后再主函数中创建任务
xTaskCreate(tcp_client_task, "tcp_client", 4096, NULL, 5, NULL);
接下来直接进入TCP_client任务吧
static void tcp_client_task(void *pvParameters)
{
char rx_buffer[128];
char addr_str[128];
int addr_family;
int ip_protocol;
while (1) {
struct sockaddr_in destAddr; //目标地址结构体,即服务端
destAddr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR); //将点分十进制的IP转成长整型
destAddr.sin_family = AF_INET; //IPV4 TCP/IP协议族
destAddr.sin_port = htons(PORT); //将主机字节顺序转换为网络字节顺序
addr_family = AF_INET; //IPV4 TCP/IP协议族
ip_protocol = IPPROTO_IP; //IP协议字段,IPV4一般为保留
inet_ntoa_r(destAddr.sin_addr, addr_str, sizeof(addr_str) - 1); //将IP转成长整型转换成点分十进制字符串
int sock = socket(addr_family, SOCK_STREAM, ip_protocol); //根据参数建立socket的文件描述符,这里是IPV4,TCP协议
if (sock < 0) {
break;
}
int err = connect(sock, (struct sockaddr *)&destAddr, sizeof(destAddr));//连接至服务端
printf("\n\rconnect\n\r");
if (err != 0)
{
break;
}
while (1) {
int err = send(sock, payload, strlen(payload), 0);//发送消息至服务端
if (err < 0) {
break;
}
int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);//接受消息,当未接受到消息时,程序停留在这里,接受后,程序继续执行
if (len < 0) {
break;
}
else {
rx_buffer[len] ='\0';//在字符串末尾加上'\0',防止字符串数组空参数,乱码
ESP_LOGI(TAG, "Received %d bytes from %s:", len, addr_str);
printf("\n\r%s\n\r",rx_buffer);
}
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
if (sock != -1) {
shutdown(sock, 0);//程序如果运行到这,说明异常,则禁止在一个套接口上进行数据的接收与发送。
close(sock);关闭socket
}
}
vTaskDelete(NULL);
}
好了,完成了,源代码我就放这了我的github