网络方面不是很懂,可能描述有一点不准确。

主要是通过ESP8266,在NONOS-SDK环境下,用URL地址,发出HTTP请求,接收并处理信息。

假设已经大致了解厂家提供的SDK,以及Eclipse开发环境如何使用,现在大致要做的是以下几步:

1、连上WiFi(连上网络)

2、与URL地址的服务器建立TCP连接

3、发出HTTP请求

4、接收并处理信息

现在就开始一步步地讲:

一、连上WiFi

连上WiFi这里我采用比较笨的方式,就是固定的WiFi和密码,直接连上就是了

需要用到几个函数:

  1234567891011
bool wifi_set_opmode (uint8 opmode); //设置ESP8266模式,选择station模式
wifi_station_set_config(&stationConf); //设置连接WiFi的参数
//有结构体:
struct station_config {
uint8 ssid[32]; //ssid
uint8 password[64]; //密码
uint8 bssid_set;
uint8 bssid[6];
};
bool wifi_station_connect (void); //连接WiFi
uint8 wifi_station_get_connect_status (void); //获取连接状态

来自CODE的代码片
wifi_func

1)设置ESP8266 的工作模式;

2)设置好WiFi的SSID和密码;

3)开始连接WiFi;

4)检查WiFi连接状态,若为5则连接成功。

  1234567891011121314151617181920212223242526272829303132333435363738394041
void init_CollectWifi()
{
uint8 wifistatus;
struct station_config stationConf;
os_memcpy(&stationConf.ssid,WIFI_SSID,32); //输入路由器账号
os_memcpy(&stationConf.password,WIFI_PWD,64); //输入路由器密码
//stationConf.bssid_set = 0;
wifi_station_set_config(&stationConf);//设置wifi_station的接口,并保存到flash。
#ifdef DEBUG
os_printf("\r\n call connect_wifi\n");
os_printf("wifi name: %s\n",stationConf.ssid);
os_printf("wifi pw:%s\n",stationConf.password);
os_printf("wifi connecting..\n");
#endif
if (wifi_station_connect())
{
#ifdef DEBUG
os_printf("wifi_station_connect = true\n");
#endif
}
else
{
#ifdef DEBUG
os_printf("wifi_station_connect = flase\n");
#endif
}
//os_delay_us(2000000);
wifistatus = wifi_station_get_connect_status();
#ifdef DEBUG
os_printf("wifi connect status = %d\n",wifistatus);
os_printf("wifi status = %s\n", Word_Status[wifistatus]);
#endif
}

来自CODE的代码片
init_collectwifi.c

在开始初始化的时候应该还要有一句 wifi_set_opmode(STATION_MODE);

二、建立TCP连接

这里又分为几步:

1)解析URL,获取域名

要建立TCP连接,首先应该获取服务器的域名。

举个例子:https://code.csdn.net/snippets_manage

那么域名就应该是code.csdn.net,我们要建立连接也是与这个服务器建立连接,所以我们需要把URL地址拆开

  123456789101112131415161718192021222324252627282930
void ICACHE_FLASH_ATTR http_parse_request_url(char *URL,char *host,char *filename,unsigned short *port){
char *PA;
char *PB;
memset(host,0,sizeof(host));
memset(filename,0,sizeof(filename));
*port=0;
if(!(*URL)) return;
PA=URL;
if(!strncmp(PA,"http://",strlen("http://")))
PA=URL+strlen("http://");
if(!strncmp(PA,"https://",strlen("https://")))
PA=URL+strlen("https://");
PB=strchr(PA,'/');
if(PB){
memcpy(host,PA,strlen(PA)-strlen(PB));
if(PB+1){
memcpy(filename,PB+1,strlen(PB-1));
filename[strlen(PB)-1]=0;
}
host[strlen(PA)-strlen(PB)]=0;
}else{
memcpy(host,PA,strlen(PA));
host[strlen(PA)]=0;
}
PA=strchr(host,':');
if(PA)
*port=atoi(PA+1);
else
*port=80;
}

来自CODE的代码片
http_parse_request_url.c

2)解析域名,转换成IP地址

这里,当它找到对应的IP地址后,会有调用回调函数,我们可以在回调函数中进行TCP连接

我是这样调用这个函数的:espconn_gethostbyname(&user_tcp_conn,host, &addr,user_esp_dns_found);

3)TCP连接

 123456
//DNS回调函数
void ICACHE_FLASH_ATTR user_esp_dns_found(const char *name, ip_addr_t *ipaddr, void *arg){
struct ip_info info;
wifi_get_ip_info(STATION_IF,&info);
iot_station_init(ipaddr,&info.ip,port);
}

来自CODE的代码片
dns_cb.c

获得了IP地址后就可以连接了
  12345678910111213141516171819202122232425262728293031
/*
* 函数名: iot_station_init
* 描述: 以ESP8266为客户端,建立tcp连接
* 输入: remote_ip:服务器IP
* local_ip:本地IP
* remote_port:服务器端口
* 返回: true:成功
* 调用: 无
*/
bool ICACHE_FLASH_ATTR iot_station_init(struct ip_addr *remote_ip ,struct ip_addr *local_ip ,int remote_port )
{
#ifdef DEBUG
os_printf("\r\ncall iot_station_init\n");
#endif
user_tcp_conn.type = ESPCONN_TCP;
user_tcp_conn.state = ESPCONN_NONE;
user_tcp_conn.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));
os_memcpy(user_tcp_conn.proto.tcp->local_ip ,local_ip,4);
os_memcpy(user_tcp_conn.proto.tcp->remote_ip ,remote_ip,4);
user_tcp_conn.proto.tcp->local_port = espconn_port();
user_tcp_conn.proto.tcp->remote_port = remote_port;
espconn_regist_connectcb(&user_tcp_conn ,user_tcp_connect_cb);
espconn_regist_reconcb(&user_tcp_conn ,user_tcp_recon_cb);
#ifdef DEBUG
os_printf("espconn_connect\n");
#endif
espconn_connect(&user_tcp_conn);
return true;
}

来自CODE的代码片
iot_station_init

三、发送HTTP请求

在(二)中的函数应该是在要发出命令时一气呵成的,所以这里我们应该封装好一个接口函数,

只要用户给出URL和发送的命令时,系统就能自动完成功能。

  123456789101112131415161718
void ICACHE_FLASH_ATTR HttpReadFile(char *URL,char *method,char *postdata)
{
struct ip_addr addr;
memset(buffer,0,1024);
#ifdef DEBUG
os_printf("\r\nThe URL request:\n%s\n", URL);
#endif
http_parse_request_url(URL,host,filename,&port);
if(strcmp(method,"GET")==0)
{
os_sprintf(buffer,GET,filename,host);
}
else
{
os_sprintf(buffer,POST,filename,strlen(postdata),host,postdata);
}
espconn_gethostbyname(&user_tcp_conn,host, &addr,user_esp_dns_found);
}

来自CODE的代码片
HttpReadFile

这里有包含头文件 my_client.h ,里面定义了GET和POST的格式

  12345678910111213141516171819202122
#ifndef APP_INCLUDE_MY_CLIENT_H_
#define APP_INCLUDE_MY_CLIENT_H_
#include "user_main.h"
#include "espconn.h"
#include "mem.h"
char buffer[1024];
#define GET "GET /%s HTTP/1.1\r\nAccept: */*\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n"
#define POST "POST /%s HTTP/1.1\r\nAccept: */*\r\nContent-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n%s"
struct espconn user_tcp_conn;
//工作模式初始化,传三个参:远端IP,本地IP,远端端口。
bool iot_station_init(struct ip_addr *remote_ip ,struct ip_addr *local_ip ,int remote_port );
void user_tcp_connect_cb(void *arg);
void user_tcp_reconnect_cb(void *arg ,sint8 err); //连接失败时会执行这个函数,可以在本回调函数中进行重连。
void user_tcp_recv_cb(void *arg ,char *pdata ,unsigned short len); //注册成功接收网络数据的回调函数
void user_tcp_sent_cb(void *arg); //注册网络数据发送成功的回调函数
void user_tcp_discon_cb(void *arg); //注册 TCP 连接正常断开成功的回调函数
#endif /* APP_INCLUDE_MY_CLIENT_H_ */

来自CODE的代码片
my_client.h

四、接收信息

在之前一直没有讲,在建立了TCP连接后有四个很重要的回调函数要声明。

就是上面my_client.h中的四个回调函数

  1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
/*
* 函数名: user_tcp_sent_cb
* 描述: tcp发送成功后的回调函数
* 输入: arg:tcp连接句柄
* 返回: 无
* 调用: 无
*/
void ICACHE_FLASH_ATTR user_tcp_sent_cb(void *arg)
{
#ifdef DEBUG
os_printf("\r\nsend success!");
#endif
}
/*
* 函数名: user_tcp_discon_cb
* 描述: tcp连接断开后的回调函数
* 输入: arg:tcp连接句柄
* 返回: 无
* 调用: 无
*/
void ICACHE_FLASH_ATTR user_tcp_discon_cb(void *arg)
{
#ifdef DEBUG
os_printf("\r\ndisconnect success!");
#endif
}
/*
* 函数名: user_tcp_recv_cb
* 描述: tcp接收成功后的回调函数
* 输入: arg:tcp连接句柄
* pdata:收到数据
* len:收到数据长度
* 返回: 无
* 调用: 无
*/
void ICACHE_FLASH_ATTR user_tcp_recv_cb(void *arg, char *pdata, unsigned short len)
{
}
/*
* 函数名: user_tcp_recon_cb
* 描述: tcp重连成功后的回调函数
* 输入: arg:tcp连接句柄
* err:错误码
* 返回: 无
* 调用: 无
*/
void ICACHE_FLASH_ATTR user_tcp_recon_cb(void *arg, sint8 err)
{
#ifdef DEBUG
os_printf("connect err,errno:%d\r\n",err);
#endif
espconn_connect((struct espconn *)arg);
}
/*
* 函数名: user_tcp_connect_cb
* 描述: tcp连接成功后的回调函数,需要再注册一些回调函数
* 输入: arg:tcp连接句柄
* 返回: 无
* 调用: 无
*/
void ICACHE_FLASH_ATTR user_tcp_connect_cb(void *arg)
{
struct espconn *pespconn=arg;
#ifdef DEBUG
os_printf("\r\nconnect success!");
#endif
}

来自CODE的代码片
tcp_cb

收到信号后的处理,我们就写在recv_cb里面就可以了
但是有一点要注意的是:我们使用的这个NONOS_SDK,它是有看门狗的,当回调函数执行时间过长是会导致重启的!
参考资料:
HTTP和URL介绍 http://www.cnblogs.com/LDSmallCat/p/4942039.html
ESP8266 SDK 编程手册.pdf

【ESP8266】NONOS SDK开发,发送HTTP请求相关推荐

  1. ESP8266 Non-OS SDK开发探坑之四-用户非易失参数安全存储到flash

    ESP8266 Non-OS SDK开发探坑之四-用户非易失参数安全存储到flash [Starting with ESP8266 - Light a LED] [Starting with ESP8 ...

  2. ESP8266 Non-OS SDK 开发之旅 基础篇① 初识 Non-OS SDK,史上超级详细手把手教小白20分钟快速搭建SDK软件开发环境,完成第一个例子Hello World!

    文章目录 1.前言 2. SDK概述 2.1 SDK使用流程 2.2 ESP8266 HDK -- 硬件开发工具 2.3 ESP8266 SDK -- 软件开发工具包 2.3.1 Non-OS SDK ...

  3. 【ESP8266】NONOS SDK开发,串口发送、接收与中断

    ESP8266感觉要成现在物联网的黑马了,集成WiFi功能.能编程,还便宜,确实挺6的. 就是能提供的资料太少,感觉官网上的远远不够用,这个串口收发与中断折腾了我是在太久,在这里小的就分享一下自己的经 ...

  4. 【ESP8266】使用ESP8266 NONOS SDK的JSON API

    2016年9月30日更新:本人移植了cJSON到ESP8266的NONOS SDK,详情可以查看这篇文章: http://blog.csdn.net/yannanxiu/article/details ...

  5. ESP8266 RTOS SDK 开发环境搭建

    一.工具链的设置 参考乐鑫官网文档 Get Started - ESP8266 RTOS SDK Programming Guide documentation 二.获取ESP8266_RTOS_SD ...

  6. ESP8266固件SDK开发之微信配网(AIRKISS)原理(一)

    一.ESP8266开发可以有两种方式: 1.AT指令编程开发 2.基于SDK编程开发 二.ESP8266配网方式有三种: 1.网页配网 2.APP配网 3.微信配网 AIRKISS 这里,微信配网是最 ...

  7. esp8266的SDK开发pwm有感:解决LED灯不能熄灭,微微亮问题。

    引言 为什么要写这个,是因为自己在使用esp8266的pwm调节灯光亮度时遇到一个问题.最后终于解决. 所用器材和平台: 1.一个nodemcu开发板 2.一个LED灯(为了接线方便,我把usb小LE ...

  8. esp8266时钟_ESP8266(Non-OS SDK) 驱动 waveshare 2.9 寸墨水屏(二)- 程序移植、修改与测试

    开始移植 上一篇文章简单介绍了了墨水屏原理.例程代码以及移植工作的可行性.这一步的目的是把前面在 STM32 跑的程序,完整地搬到 esp8266 上,达到相同的运行显示效果,Let's get st ...

  9. Esp8266 进阶之路36【外设篇】乐鑫esp8266芯片SDK编程驱动时间芯片 ds1302,同步网络时间到本地,再也不怕掉电断网也可以同步时间了!(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

最新文章

  1. python argsort排序结果_numpy.argsort()可以对元组或列表进行排序
  2. 初学者如何开发出一个高质量的J2EE系统
  3. C/C++中传值和传地址(引用)
  4. jsp页面提示“Multiple annotations found at this line: - The superclass javax.servlet.http.HttpServlet w
  5. 微信公众平台开发(76) 获取用户基本信息
  6. sqlite数据类型、关键词及创建、修改、删除数据表
  7. 一维信号双边滤波器_定义图上的各向异性、动态、频谱和多尺度滤波器
  8. 【转载】别了,摩托罗拉(十):“战争部落”和“独立王国”
  9. 开发人员最佳配色主题
  10. flink其他可选api
  11. An App ID with Identifier 'com.XXX.XXX’ is not available. Please enter a different string.报错
  12. android版git中国只有,GitHub - ynztlxdeai/android-app: 本项目已经迁移到 git.oschina.net ,此处不再更新!...
  13. 一篇教你随意下载网易云音乐歌曲的博客!
  14. android浏览器对比评测,11款手机浏览器性能横向评测
  15. CMD指令-连接局域网主机
  16. 学习-Java循环while之求非负数之和
  17. SAP BASIS ADM100 中文版 Unit 2(1)
  18. 眼底图像血管增强与分割--(5)基于Hessian矩阵的Frangi滤波算法
  19. No module named gi解决方案
  20. 赛门铁克通配型SSL证书

热门文章

  1. 一篇文章带你详解 TCP/IP 协议(下)
  2. 26.智能指针和动态内存
  3. 平安科技:传入一个只包含1-9的数字字符串,输出的是包含所有数字的最小整数
  4. Python 实现猜年龄小游戏
  5. aix 5.3 安装oracle 10g r2,AIX 5.3 安装 Oracle 10g R2(64)
  6. mysql 定时器停止_java-MySQL语句取消计时器无法停止
  7. 数据中心运维人的半衰期危机
  8. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)
  9. CSDN:荣幸获得国内第一大技术社区CSDN 2018博客之星名额!感谢!
  10. BlockChain:BlockChain周边概念详解+个人理解