在这篇文章中我将从头教大家如何自己做一个物联网的demo出来。这个demo对于初学者来说如果是一步步去探索的话真的挺费时间的,期间也会遇到各种各样的问题,这里呢我就把我自己探索的路子分享给大家(demo基于TCP/IP协议,只要配置正确不存在连不上网的问题,因为所有的网络都是支持TCP/IP的)
1.材料准备工作:
购买一块STM32开发板,一个ESP8266模块,杜邦线若干,租用一台阿里云服务器。
2.硬件连接:
ESP8266的VCC接3.3v(5v也还凑合,不至于烧坏)
ESP8266的GND接GND
ESP8266的TXD接板子USART的RXD引脚
ESP8266的RXD接板子USART的TXD引脚
RST引脚与IO_0引脚不需要控制,悬空即可
3.服务器准备
第一步:登陆阿里云官网租用一台服务器,我选用的是学生轻量应用服务器(9.5元每月),操作系统windows server2012R2
第二步:购买完成后会跳转轻量应用服务器的控制台页面,设置远程桌面:
我选用的是win10自带的远程连接工具:
通过账号密码连接桌面。
第三步:端口设置
如图,点击防火墙,为了方便我把TCP和UDP的所有端口都开放了。点击添加规则即可开放端口。
第四步:服务器端安装软件
我把我电脑的D盘通过映射网络驱动器的方式映射到服务器(配置很简单,百度一下你就知道),在服务器内可以直接把D盘的软件复制过去。这里我们需要JDK,eclips,如果后期想运行java web项目的话建议再安装一个tomcat,然后再安装一个MySQL数据库,安装的时候要勾上允许远程访问,端口默认3306就OK了。关于java环境的配置以及软件安装我就不写了,网上到处都是这方面的文章。
4.硬件端的代码编写
基本的原理参见我的上一篇博客(https://blog.youkuaiyun.com/naruhina/article/details/104211705),今天的代码与上篇博客的代码略有不同,加入了防TCP自己断掉的心跳包机制,每隔十秒发送一次,由定时器驱动。代码与说明详见上传的资源,这里只放主要代码.
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "usart3.h"
#include "common.h"
#include "StaConfig.h"
#include "timer3.h"
/************************************************
第一次测试完成日期:2020/2/7
第一次描述:通过USART3连接ESP8266的TX与RX。相关AT指令以及数据发送均通过USART3进行
主函数调用setClient设置为STAClient透传模式与阿里云服务器取得通信,通过在电脑上使用
串口助手发送字符串到串口1并在串口1中断服务函数内通过调用发送数据函数通过串口3发送给
ESP8266,然后再经由路由器发送到云服务器。云服务器端通过网络调试助手创建一个TCP SERVER
然后就可以向STM32发送数据了,接收到的数据由相应函数处理回显到串口调试助手内。
备注:发送成功后atk_8266_send_data函数返回了失败,但实际上发送成功,应该是第二个参数不对应
导致的,但无关紧要。并且程序内并没有调用退出透传的函数,重新烧录程序完成后掉一次电恢复一下。
心跳包机制尚未加入
************************************************/
/************************************************
第二次测试完成日期:2020/2/9
本次主要修改了发送数据受缓存影响的bug,以及与向服务器发送的时候没有0x0a,0x0d的bug。新增防止因长时间无操作的定时发送心跳包的功能,以及确定
后atk_8266_send_data函数无误,在透传模式下的返回值1是第二个参数不对应的误报,实际没任何错误。新增TCP Client 非透传模式
************************************************/
int main(void)
{
u8 ipbuf[50];
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
usart3_init(115200); //初始化串口3
TIM3_Int_Init(49999,14399);//5Khz的计数频率,计数到5000为1s
setClient(ipbuf);//TCP Client 透传模式
//setClientNonPierce(ipbuf);
while(1)
{
atk_8266_at_response(1);
delay_ms(100);
}
}
#include "StaConfig.h"
#include "common.h"
/***********************************************************/
//第一次测试完工日期:2020/2/7
//作者:lht
//2020/2/9 新增TCP Client 非透传模式
/***********************************************************/
void setClient(u8 *ipbuf)//设置ESP8266工作在STA模式的CLIENT设置并开启透传
{
//printf("AT恢复出厂设置:%d\n",atk_8266_send_cmd("AT+RESTORE","OK",1000));
printf("AT测试:%d\n",atk_8266_send_cmd("AT","OK",500));
printf("设置为STA模式:%d\n",atk_8266_send_cmd("AT+CWMODE=1","OK",500));//设置为STA模式
printf("重启:%d\n",atk_8266_send_cmd("AT+RST","OK",500));//重启生效
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
printf("连接到路由器:%d\n",atk_8266_send_cmd("AT+CWJAP=\"FAST666\",\"你的密码\"","OK",1000));//连接路由器
printf("设置单链接:%d\n",atk_8266_send_cmd("AT+CIPMUX=0","OK",3500));
atk_8266_get_wanip(ipbuf);
printf("IP:%s\n",ipbuf); //端口号不要带引号,否则会有意想不到的错误。
printf("连接到服务器:%d\n",atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"服务器公网IP\",8086","OK",3000));//连接到SERVER
printf("开启透传模式:%d\n",atk_8266_send_cmd("AT+CIPMODE=1","OK",3500));//开启透传模式
printf("开始透传:%d\n",atk_8266_send_cmd("AT+CIPSEND","OK"</