关于如何建立一个HTTP的虚拟测试桩的方法如下,通过SoapUI建立一个HTTP测试桩,用来模拟远端HTTP服务器。

https://blog.csdn.net/russ44/article/details/52230355

ESP8266进入透传的配置:(以串口115200波特率为例)

(1)设置WIFI模式

AT+CWMODE=3 //设置为ap+sta共存

响应OK

(2)重启

AT+RST

重启后我们看到,这里出现乱码,乱码的原因是因为模块刚上电的时候,波特率并不是我们所设置的115200,而是会稍微偏大一点。后面就恢复为115200了。

(3)连接路由器

AT+CWJAP="ssid","password" //传入路由的ssid和password

响应OK

(4)查询设备IP

AT+CIFSR

响应设备的ip地址以及其它

(5)连接服务器(TCP)

AT+CIPSTART="TCP","server ip",server port //传入远端服务器的ip以及端口号

响应:OK

(6)开启ESP8266的透传模式

AT+CIPMODE=1

响应OK

(7)开始透传

AT+CIPSEND

响应: > //从此时开始,串口输入的字符会透传到服务器端

将数据通过HTTP发送到远端服务器:

POST /test/upload/messages HTTP/1.1
Host: 192.168.12.68:8999
Content-Type: application/json
Content-Length:17
cache-control: no-cache{"text1" : "123"}

其中/test/upload/messages为URL的一部分

Host字段添加服务器IP和端口号,这里的服务器IP是192.168.12.68,端口号是8999

所以URL为:http://192.168.12.68:8999/test/upload/messages

Content-Type字段代表当前要使用数据的格式,这里使用的是application/json

Content-Length字段代表当前json数据的长度,也就是后面{"text1","123"}这串数据的长度。通过下面这个工具可知

http://www.bejson.com/convert/ox2str/

当前的数据长度为17:

接下来是一个空格,这个空格一定要有,否则HTTP服务器会解析出错

后面的{"text1":"123"}就是我们要发送的json数据,通过串口调试助手将带http协议的json数据发到http测试服务器:

测试结果没有问题,开始写程序,本例程基于stm32f103zet6野火开发板

首先我们把指令用宏定义对指令进行封装:

#define AT_TEST_OK        "AT"                                   //测试wifi是否已经正常上电
#define AT_SET_MODE       "AT+CWMODE=%d"       //设置模式
#define AT_CONNECT_ROUTER "AT+CWJAP="%s","%s""  //连接路由器
#define AT_CONNECT_SERVER "AT+CIPSTART="%s","%s",%d"  //连接服务器
#define AT_SET_CIP_MODE   "AT+CIPMODE=1"   //设置透传模式
#define AT_ENTER_CIP_MODE "AT+CIPSEND"    //进入透传模式

下面用具体的子函数实现Wifi操作接口:

//测试wifi模块是否存在
int Wifi_Test_Exist(void)
{int Err_Count = 0 ;//给模块上电macESP8266_CH_ENABLE();Delay_ms(1000);macESP8266_RST_HIGH_LEVEL();Delay_ms(1000);while(0 == ESP8266_Cmd(AT_TEST_OK, "OK",NULL, 200)) //检查WIFI模块是否在线{printf("未检测到模块....rn");if(Err_Count > 10){Err_Count = 0 ;return -1 ;}++Err_Count ;}Err_Count = 0 ;return 0 ;
}//设置wifi模式
int Wifi_Set_Mode(int Mode)
{int Err_Count = 0 ;char buffer[20] = {0};sprintf(buffer,AT_SET_MODE,Mode);while(0 == ESP8266_Cmd(buffer,"OK",NULL, 200)) {printf("设置模式失败....rn");if(Err_Count > 10){Err_Count = 0 ;return -1 ;}++Err_Count ;}Err_Count = 0 ;return 0 ;
}//连接路由器
int Wifi_Connect_Router(const char *ssid, const char *password)
{int Err_Count = 0 ;char buffer[50] = {0};sprintf(buffer,AT_CONNECT_ROUTER,ssid,password);while(0 == ESP8266_Cmd(buffer, "OK",NULL, 3000)) {printf("连接路由器失败,正在尝试重新连接....rn");if(Err_Count > 5){Err_Count = 0 ;return -1 ;}++Err_Count ;}Err_Count = 0 ;return 0 ;
}//连接服务器
int Wifi_Connect_Server(const char *tcp_or_udp,const char *server_ip, int port_number)
{int Err_Count = 0 ;char buffer[50] = {0};sprintf(buffer,AT_CONNECT_SERVER,tcp_or_udp,server_ip,port_number);while(0 == ESP8266_Cmd(buffer, "CONNECT", NULL,3000)) {printf("连接服务器失败,正在尝试重新连接....rn");if(Err_Count > 10){Err_Count = 0 ;return -1 ;}++Err_Count ;}Err_Count = 0 ;return 0 ;
}//设置透传模式
int Wifi_Set_Cip_Mode(void)
{if(false == ESP8266_UnvarnishSend())return -1 ;return 0 ;
}

接下来编写WIFI初始化流程:

int Wifi_Module_Init(const char *ssid, const char *password , const char *server_ip , int port_number)
{int ret = 0 ;//wifi模块检查Wifi_Exist:    //检测wifi模块是否存在ret = Wifi_Test_Exist();if(0 != ret){printf("wifi初始化失败,请检查硬件是否连接!rn");return -1 ;}printf("wifi初始化成功!n");//设置wifi模式ret = Wifi_Set_Mode(3);if(0 != ret){printf("wifi设置模式失败rn");goto Wifi_Exist ;}printf("wifi设置ap+sta模式成功!n");//路由器连接检查Router_Detect:ret = Wifi_Connect_Router(ssid,password);if(0 != ret){printf("wifi连接路由器失败,请检查硬件是否连接或者网络是否正确连接rn");//wifi断电macESP8266_CH_DISABLE();macESP8266_RST_LOW_LEVEL();goto Wifi_Exist ;}printf("wifi连接路由器成功n");ret = Wifi_Connect_Server("TCP",server_ip,port_number);if(0 != ret){printf("wifi连接服务器失败,请检查网络连接rn");goto Router_Detect ;}printf("wifi连接服务器成功n");ret = Wifi_Set_Cip_Mode();if(0 != ret){printf("进入透传模式失败rn");goto Wifi_Exist ;}printf("进入透传模式成功!n");return 0 ;
}

由于我们要将数据透传到自己的HTTP服务器,所以要封装一个HTTP头部和HTTP数据,数据在服务端以JSON格式进行接收,了解需求后我们需要定义好头部和数据部分。

JSON数据包的协议格式如下:

devicetype:设备类型

time:日期和时间

idno:设备号

type:当前检测的类型

当数据包发送到服务端后,服务端要回200 OK的字符串给串口,这样才算是数据上传成功。

#define HTTP_HEAD    "POST /api/"DEVICE_TYPE"/messages HTTP/1.1rn" "Host: 120.78.136.134:9003rn"  "Content-Type: application/jsonrn" "content-length: %drnrn"   #define HTTP_DATA_UPLOAD_PARA "{"devicetype":"%s","time":"%s","idno":"%s","type":"%s"}"

这里的content-length是如何计算的呢?其实就是HTTP_DATA_UPLOAD_PARA整体的长度。接下来我们实现一个对头部和数据包封装并且将整个数据上传的函数:

//返回1即发送成功
int Http_NEW_Data_Upload(char *time , char *idno)
{int ContentLength = 0 ;char *up_data = NULL ;char *up_head = NULL ;char *http_data = NULL ;int Send_Data_ok_flag = 0 ;up_data = malloc(150);if(NULL == up_data)return -1 ;up_head = malloc(150);if(NULL == up_head)return -2 ;http_data = malloc(300);if(NULL == http_data)return -3 ;snprintf(up_data, 150, HTTP_DATA_UPLOAD_PARA, DEVICE_TYPE, time, idno, "baozhawu");ContentLength = strlen(up_data);snprintf(up_head, 150, HTTP_HEAD, ContentLength);sprintf(http_data,"%s%s",up_head,up_data);while(0 == ESP8266_Cmd ( http_data, "HTTP/1.1 200 OK", NULL, 3000 )){Send_Data_ok_flag = 0 ;break ;}Send_Data_ok_flag = 1 ; free(up_data);free(up_head);free(http_data);return Send_Data_ok_flag ;
}

万事具备,只欠东风,下面就可以调用API来完成工作啦:

int main ( void )
{int ret = 0 ;USART_Config ();                                                              //初始化串口1SysTick_Init ();                                                               //配置 SysTick 为 1ms 中断一次 ESP8266_Init ();                                                               //初始化WiFi模块使用的接口和外设printf ( "rn野火 WF-ESP8266 WiFi模块测试例程rn" );                          //打印测试例程提示信息WIFI_INIT:ret = Wifi_Module_Init("7745","1552139769344554",SERVER_IP,SERVER_PORT);if(0 == ret){printf("wifi连接成功!rn");Connect_ok_flag = 1 ;}while(1){memset(strEsp8266_Fram_Record .Data_RX_BUF,0,1024);ret = Http_NEW_Data_Upload("2019-03-19 01:32", "10100217420060");if(1 != ret){//wifi断电macESP8266_CH_DISABLE();macESP8266_RST_LOW_LEVEL();goto WIFI_INIT ;}Delay_ms ( 1000 );}
}

执行程序:

可以看到串口已经收到了回复。

完整源码获取:

微信关注:嵌入式云IOT技术圈

发送ESP8266即可获取。

server接收dtu透传代码_ESP8266 STM32 HTTP json透传实验相关推荐

  1. server接收dtu透传代码_Swoole学习笔记二:初探server与client(Client同步)

    1.搭建server.php代码 <?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0.1 ...

  2. php批量上传代码,文件批量上传_php文件上传代码(支持文件批量上传)

    摘要 腾兴网为您分享:php文件上传代码(支持文件批量上传),雨课堂版,洋游码头,学堂里,小度等软件知识,以及电脑硬件温度检测软件,日事清app,lol韩服语音包,绝地求生无后座力设置,金山u盘卫士, ...

  3. git上传代码简单方法 简单git上传代码工具

    简单git上传代码工具 肯定有很多人和我一样,git上传时候搞不懂拉取,合并等一系列的代码冲突问题,往往可能覆盖掉自己今天写的代码,或者覆盖掉别人的代码. 下面给大家简单介绍一款操作比较简单的上传代码 ...

  4. server接收dtu透传代码_Gopher2020大会干货总结:代码技巧篇

    Gopher2020大会已经结束了几天,圈内大牛的分享可谓干货满满,分享内容涉及到诸多的业务.框架.理念等,本文系会后粗略整理,主要是将一些干货内容总结.分类:本文内容不涉及业务.框架以及设计理念,整 ...

  5. server接收dtu透传代码_深入ASP.NET Core源代码之 - Web Server Kestrel

    测试代码运行环境: OS:Ubuntu 18.04 64bit .NET Core SDK Version: 3.1.101 源代码版本:release/3.1 Kestrel的本质 - Web Se ...

  6. php文件上传代码_PHP实现文件分片上传的实例代码

    PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...

  7. 菜逼如何优雅的上传代码到github(这次一定能传上!)

    上一次的尝试以一种极其尴尬惨烈的姿势结束了...换一种方式继续!看见了原教程下面有个评论这么写,我决定放弃小黑框重新尝试. 虽然代码写的不咋滴,但我不怕打脸-- 换方法后的另一个教程 前面的大致一样, ...

  8. php用什么上传代码,php常用文件怎么上传_PHP常用文件上传代码_一聚教程网

    在PHP的使用中,它有着非常方便的操作设计,这次文章就给大家介绍下怎么使用PHP实现常用文件上传,相信这也是大多数人会遇到的问题,下面我们具体看看上传方法. _path = $path; $this- ...

  9. 在Windows Server 2008上部署SVN代码管理总结

    这段时间在公司开发Flex程序,所以使用TortoiseSVN作为团队代码管理器,今天在公司服务器上部署SVN服务器,并实验成功,总结如下: 服务器环境: 操作系统:Windows Server 20 ...

最新文章

  1. 3D目标检测论文阅读多角度解析
  2. 【MM模块】Material Planning - 物料计划
  3. 用matlab相关分析,基于matlab的逐像元偏相关分析
  4. apue 2013-03-16
  5. Docker volume使用
  6. hdu 2531 Catch him
  7. Java编程之反射中的注解详解
  8. LeetCode 481. 神奇字符串(找规律)
  9. MYSQL的随机查询的实现方法
  10. Jetty入门(1-1)Jetty入门教程
  11. (转)LuaPlus C++ 函数互调
  12. 自然语言处理在金融实时事件监测和财务快讯中的应用
  13. 利用npm命令创建一个Vue项目并安装依赖
  14. vfp中写入文本文件_VFP文件操作函数用法.doc
  15. 数据分析36计(27):分析师与用户研究员,玩转定量研究和定性研究,落地研究结论...
  16. 易到实际控制人温晓东成老赖:与贾跃亭曾是盟友 如今反目
  17. conda安装编译好了的caffe, ImportError: cannot import name ‘_validate_lengths‘
  18. -1 转换成二进制数是多少,负数左移右移。
  19. Nginx 监控模块
  20. VMware--局域网访问电脑中VMware虚拟机

热门文章

  1. 无废话ADO.NET 第三章 进行查询
  2. PAT乙级(1004 成绩排名)
  3. 数据库-MySQL-数据库设计-主键与索引
  4. 网易云深度学习第一课第二周编程作业
  5. 层间距离对ct图像的影响_CT专业知识掌握基础、了解原理
  6. 7070mt安装ubuntu dell_【手把手AI项目】一、安装win10+linux-Ubuntu16.04的双系统(超细致)...
  7. 案例解读:Oracle目录由于TFA触发bug导致jdb文件未自动清理引起空间不足
  8. 4场直播丨站撸Oracle、MySQL、医疗、航空
  9. Oracle 20c 新特性:数据泵 expdp / impdp 的EXCLUDE和CHECKSUM增强
  10. 故障诊断:12cR2 Flex ASM 环境中节点启动失败的诊断和分析