【STM32 物联网】AT指令与TCP,发送与接收数据


前言

随着物联网(IoT)技术的迅速发展,越来越多的设备和系统开始连接到互联网,实现远程监控、数据采集和远程控制等功能。在物联网应用中,STM32微控制器以其强大的性能和丰富的外设功能成为了重要的选择之一。而在STM32与互联网通信中,AT指令与TCP/IP协议成为了两个重要的技术手段。


一、连接TCP服务器

1.1 配置Wifi模式

我们可以使用下面这个AT指令进行WIFI模式的设置:AT+CWMODE=3 // softAP+station mode。3的意思为softAP+station一起,即可以开热点也可以连接路由器,一般我们都是使用这个

1.2 连接路由器

我们可以使用下面这个AT指令连接我们的路由器或者热点:AT+CWJAP="SSID","password"我们的名称和密码都需要双引号,所以我们发送cmd时,字符串里面的名称和密码需要转义字符的帮助

1.3 查询ESP8266设备IP地址

我们可以使用下面这个AT指令来查询ESP8266的设置IP地址:AT+CIFSR
在这里插入图片描述

1.4 连接TCP服务器

我们可以使用下面这个AT指令来连接我们的TCP服务器:
AT+CIPSTART="TCP","TCPServerIP",8080,注意,前两个参数是需要加双引号的,后面的端口8080不需要

二、向服务器接收数据和发送数据

2.1 发送数据

首先我们需要发送AT指令告诉ESP8266说我等下要发数据了
AT+CIPSEND=你要发送的字节大小 // set date length which will be sent
然后我们等待一会:我们直接发送我们的需要发送的数据即可,这个可以不需要使用\r\n作为最后,如果你想换行也是可以使用的

2.2 接收数据

对于我们的接收数据,当我们服务端发送数据之后,esp8266会马上发给我们stm32的串口,然后我们的串口就会进入回调函数打印接收到的数据,但是这样我们就不能知道他什么时候发给我们数据了,那发送还有什么意义呢,所以我们需要自己实现函数,对esp8266的数据进行实时解析成tcp服务器发送的数据。

每次TCP服务端发送给ESP8266,ESP8266会这样显示出数据:+IPC,数据个数:数据
我们可以根据前面的+IPC来判断,这次的数据不是我们发送AT指令返回的数据,而是我们的服务端给我们发送的数据
所以我们可以写一个函数进行解析:

int checkADDIPD(void)
{
	int ret = 0;
	char temp[5] = {"+IPD"};
	int index = 0;
	for(int i = 0;i<strlen((char*)esp8266_rxbuf);i++)
	{
		if(esp8266_rxbuf[i] == temp[index])
		{
			ret++;
			index++;
			if(ret == 4)
			{
				break;
			}
		}
	}
	return ret == 4;
}

在我们的回调函数中就可以每次去check一下数据了。

由于这是串口接收,每次buf并不会被清空,这样会影响我们的判断,再每次执行完回调之后,我们应该清空buf,但是由于回调函数清空了的话,我们实际需要的也会被清空啊(因为回调函数高于任何普通的函数,所以我们无法及时拿到数据,导致数据的丢失),所以需要变量先记录buf,然后再清空buf。

uint8_t esp8266_rxbuf[1000] = {0};
uint8_t recvfrom[1000] = {0};

memcpy(recvfrom,esp8266_rxbuf,sizeof(esp8266_rxbuf));
memset(esp8266_rxbuf,0,sizeof(esp8266_rxbuf));

从我们的网络知识知道,recv他是一个阻塞的函数,所以我们也需要实现阻塞,我们只需要加一个变量即可,当没数据时,while循环,有数据时,读取到具体的数据,然后进行下面的其他代码。
那么何时有数据呢?当我们的回调函数执行checkADDIPD为1时,为有数据发过来了。所以在判断if checkADDIPD 时,把变量标记一下即可

if(checkADDIPD() == 1) RxData=1;

//read函数
while(RxData == 0)
{
	HAL_Delay(10);
}

不要忘记在while循环结束后标记变量为0

过了while循环,我们应该去解析+IPC,数据个数:数据他了。在这里,我并没有去进一步解析他的数据个数,这里仅仅是一个简单的演示。我们可以写一个函数去解析他,并且把解析之后的内容通过返回值返回给我们。

// 函数定义
char* parseStringAfterColon(const char* input) {
    // 查找冒号的位置
    const char* colonPtr = strchr(input, ':');

    // 如果找到了冒号
    if (colonPtr != NULL) {
        // 返回冒号后面的字符串(不包括冒号本身)
        size_t length = strlen(colonPtr + 1);
        char* result = (char*)malloc(length + 1); // 分配足够的内存来存储结果
        if (result != NULL) {
            strcpy(result, colonPtr + 1); // 复制字符串
            return result;
        } else {
            printf("内存分配失败\n");
            return NULL;
        }
    } else {
        printf("未找到冒号\n");
        return NULL;
    }
}

然后我们把我们存储到的数据recvData作为参数给这个函数:

char *data = parseStringAfterColon(recvfrom);

这个data就是我们解析出来服务端发给我们的数据了。
最后,我们不要忘记释放data


总结

AT指令是一种简单的命令集,常用于与通信设备进行串口通信。在STM32物联网应用中,通过串口与无线模块(如SIM800、SIM900等)通信时,常常使用AT指令来控制模块实现TCP/IP连接、数据传输等功能。AT指令的简洁易用使得STM32与无线模块之间的通信变得更加简单可靠。

与此同时,TCP/IP协议作为互联网通信的基础协议,也在STM32物联网应用中发挥着重要作用。通过TCP/IP协议,STM32可以与远程服务器建立稳定的连接,实现数据的可靠传输。TCP/IP协议提供了可靠的数据传输机制,保证了数据的完整性和可靠性,使得STM32在物联网应用中能够更好地与互联网进行通信。

综上所述,AT指令与TCP/IP协议在STM32物联网应用中发挥着重要的作用。通过使用AT指令控制无线模块,以及通过TCP/IP协议与远程服务器通信,STM32可以实现丰富的物联网功能,为各种物联网应用提供了强大的支持和保障。

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32是一种微控制器,可以用来控制各种电子设备。使用AT指令可以连接MQTT服务器。 MQTT是一种在物联网应用中非常流行的消息协议。MQTT服务器允许设备通过云端连接、通信和控制。 使用AT指令连接MQTT服务器需要一些步骤。首先需要确定所使用的设备是否支持AT指令,然后需要配置网络连接参数,并且为设备提供连接服务器的认证信息。 连接MQTT服务器需要使用TCP/IP协议。要连接MQTT服务器,需要使用服务器的IP地址和端口号。在发送MQTT消息之前,需要先进行身份验证。这可以通过使用用户名和密码来实现。 一旦设备成功连接到MQTT服务器,就可以使用MQTT协议发送接收消息。这样就可以建立一个功能强大的物联网系统,通过这个系统,可以控制各种设备,同时监测设备的状态和数据。 总之,STM32使用AT指令连接MQTT服务器需要一些技术,需要一定的经验和知识。但是,如果你能掌握这些技能,就可以在物联网应用的开发和部署中发挥重要的作用。 ### 回答2: STM32是一款功能强大的微控制器,在当前互联网大数据的时代,其可用于连接到MQTT服务器。MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅(pub/sub)模式的通信协议,被广泛应用于物联网领域。 在使用STM32连接MQTT服务器前,需要先学习AT指令并了解其使用方法。AT指令(AT Commands)是用来控制和配置通信模块的一种指令格式,若能正确使用AT指令STM32与MQTT服务器的连接就不在话下。 以下为连接MQTT服务器的步骤: 1. 进行网络连接,如Wi-Fi或以太网,确保STM32与网络相连。 2. 在STM32中使用AT指令建立与MQTT服务器的连接,包括连接到服务器、建立通信频道、登录服务器等操作。 3. 使用AT指令订阅MQTT主题,接收或发布消息。如此一来STM32就可以与MQTT服务器直接通讯。 注意: 1. 必须确保网络连接正常,否则MQTT服务器无法连接。 2. 可以通过在程序结构中添加异常处理来诊断连接问题。在连接的过程中,如果程序出现问题,可以在程序编写过程中添加日志记录来快速解决问题。 总而言之,STM32使用AT指令连接MQTT服务器需要提前学习AT指令,并能够正确使用。在连接MQTT服务器的过程中,要确保网络连接、日志记录以及异常处理的准确性,以确保稳定的通信。 ### 回答3: STM32是一种嵌入式系统芯片,通过使用AT指令可以连接MQTT服务器。MQTT是一种轻量级的消息传输协议,可以在低带宽和低计算能力环境下使用。 要使用STM32连接MQTT服务器,需要对设备进行初始化和配置,比如设置网络类型、配置IP地址和端口号、设置用户名和密码等,然后使用AT指令进行连接和通信。下面是一些常用的AT指令: 1. AT+CIPSTART:建立连接,并指定协议类型、服务器IP和端口号。 2. AT+CIPSEND:发送消息,指定消息长度和内容。 3. AT+CIPCLOSE:关闭连接。 4. AT+MQTTUSERDATA:设置用户名和密码。 5. AT+MQTTKEEPALIVE:设置保持连接时间。 使用这些AT指令,我们可以在STM32实现连接MQTT服务器,并实现双向数据传输。同时,需要注意的是,使用AT指令连接MQTT服务器时,需要考虑网络稳定性和连接安全性,确保数据的准确性和隐私安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值