SDK 开发指南_0009

更新时间:2023-09-06 14:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

8266wifi sdk开发指南

应用场景:

A6501WIFI模块作为AP+SERVER,手机APP通过WIFI直连模块这个AP,然后APP作为CLIENT与模块建立TCP链接,通过HTTP+Json命令控制模块的GPIO。

开发步骤详解:

1)客户代码文件目录放在哪

第一步:新建工程,首先在app目录下拷一份demo文件,然后改名为test

放在同一级目录下如图第二步:新建客户的代码文件,在\app\test\user目录下建立文件gpio_test.c如图

注:图中的demo_main.c每个工程都包含的(demo_main.c文件名称可以更改)

,该文件里面包含工程的入口函数voidairm2m_cust_main(void)

2)用什么编辑工具

SourceInsight3.5或Notepad++,UltraEdit等等,客户用顺手哪个就用哪个。

3)头文件如何建立

在\app\test\user\include目录下建立文件gpio_test.h

如图

4)程序入口在哪里,初始化代码在哪里写。

程序的入口是\app\test\user\demo_main.c文件的voidairm2m_cust_main(void)函数。

注:demo_main.c可以改名字,但是airm2m_cust_main(void)不可以改名字。

以本应用场景为例,我们在gpio_test.c中做一些GPIO管脚的初始化led_init(void),tcp的监听

httpserver_init(void),然后将这些函数放在airm2m_cust_main(void)中执行。

5)应用场景案例

现在我们开始编写代码:

下面是gpio_test.c文件

#include"osapi.h"

8266wifi sdk开发指南

#include"mem.h"

#include"airm2m_common_api.h"

#include"ip_addr.h"

#include"espconn.h"

#include"gpio_test.h"

#defineLED_GPIO55

#defineLED_GPIO5_Htrue

#defineLED_GPIO5_Lfalse

#defineHTTP_PORT80

boolled_status=false;//宏为GPIO5的管脚号//宏为GOIO5的管脚状态为高//宏为GOIO5的管脚状态为低//宏为HTTP_SERVER的端口号//记录led_gpio5的状态默认为false

//第一步:为了测试能有log信息方便调试,添加一个串口UART的初始化

voidICACHE_FLASH_ATTR

uart_init(void)

{

T_AIRM2M_UART_PARAMuart0_param;

uart0_param.uartConfig.baud=115200;//设置波特率

uart0_param.uartConfig.dataBits=8;//设置数据位

uart0_param.uartConfig.flowControl=AIRM2M_UART_FLOWCONTROL_NONE;//设置流控

uart0_param.uartConfig.stopBits=AIRM2M_UART_STOP_ONE;//设置停止位

uart0_param.uartConfig.parity=AIRM2M_UART_NO_PARITY;//设置校验位

uart0_param.uartEventHandle=NULL;//设置中断

airm2m_uart_open(AIRM2M_UART_0,&uart0_param);//初始化uart0,使用UART0打印log

//UART0占用PIN1(RX)和PIN2(TX),UART1只有一个TX(占用PIN16)

os_printf("uart_initok");

}

//第二步进行管脚的初始化

//假设GPIO5控制着led灯

voidICACHE_FLASH_ATTR

led_init(void)

{

T_AIRM2M_GPIO_CFGled_gpio5_param={0};

led_gpio5_param.mode=AIRM2M_GPIO_OUTPUT;//配置管脚参数设置管脚为输出

airm2m_gpio_open(LED_GPIO5,&led_gpio5_param);//设置好参数后调用该接口初始化管脚

os_printf("led_initok");

}

//第三步设置管脚状态(假设高电平灯亮,低电平灯灭)

LOCALvoidICACHE_FLASH_ATTR

led_switch(boolgpio_status)

{

8266wifi sdk开发指南

switch(gpio_status)

{

caseLED_GPIO5_H://当为true,点灯,同时打印对应的log信息

airm2m_gpio_set(LED_GPIO5,LED_GPIO5_H);

led_status=LED_GPIO5_H;

os_printf("GPIOHlenon");

break;

caseLED_GPIO5_L://当为false,关灯,同时打印对应的log信息

airm2m_gpio_set(LED_GPIO5,LED_GPIO5_L);

led_status=LED_GPIO5_L;

os_printf("GPIOLlenoff");

break;

}

}

//第四步查询led状态

LOCALboolICACHE_FLASH_ATTR

led_state(void)

{

returnled_status;

}

//第五步建立http_server的监听

/*首先由于测试app的协议为http+json格式,编写接收协议命令地址解析函数parse_url*/

//然后写http_server连接、接收、发送、重连、断开的处理函数

//由于本场景测试发送接收,断开、重连回调处理函数暂且只做打印测试

/*

parse_url函数解析HTTP+JSON命令请求类型和地址

POST/config?command=switchHTTP/1.1

Host:192.168.4.1

................下面的信息暂时不写

*/

LOCALvoidICACHE_FLASH_ATTR

parse_url(char*precv,URL_Frame*purl_frame)

{

char*str=NULL;

uint8length=0;

char*pbuffer=NULL;

char*pbufer=NULL;

//判断purl_frame和precv不存在则返回

if(purl_frame==NULL||precv==NULL){

8266wifi sdk开发指南

return;

}

//返回查找Host位置的地址

pbuffer=(char*)os_strstr(precv,"Host:");

//判断若Host存在

if(pbuffer!=NULL){

length=pbuffer-precv;

pbufer=(char*)os_zalloc(length+1);

pbuffer=pbufer;

os_memcpy(pbuffer,precv,length);//获取命令地址的长度//建立命令存放的buf

//purl_frame解析地址的结构体分别存放POSTconfigswitch

os_memset(purl_frame->pSelect,0,URLSize);

os_memset(purl_frame->pCommand,0,URLSize);

os_memset(purl_frame->pFilename,0,URLSize);

//判断是否为GET

if(os_strncmp(pbuffer,"GET",4)==0){

purl_frame->Type=GET;

pbuffer+=4;

//判断是否为post

}elseif(os_strncmp(pbuffer,"POST",5)==0){

purl_frame->Type=POST;

pbuffer+=5;

}

pbuffer++;

//查找?位置

str=(char*)os_strstr(pbuffer,"?");

//存在解析出config

if(str!=NULL){

length=str-pbuffer;

os_memcpy(purl_frame->pSelect,pbuffer,length);

str++;

pbuffer=(char*)os_strstr(str,"=");//查找=号的位置

//若存在解析出command

if(pbuffer!=NULL){

length=pbuffer-str;

os_memcpy(purl_frame->pCommand,str,length);

8266wifi sdk开发指南

pbuffer++;

str=(char*)os_strstr(pbuffer,"&");//查找&位置

if(str!=NULL){//解析出switch

length=str-pbuffer;

os_memcpy(purl_frame->pFilename,pbuffer,length);

}else{

str=(char*)os_strstr(pbuffer,"HTTP");

if(str!=NULL){

length=str-pbuffer;

os_memcpy(purl_frame->pFilename,pbuffer,length);

}

}

}

}

os_free(pbufer);

}else{

return;

}

}

/*

httpserver_recv函数为http_server的接收回调处理函数

*/

LOCALvoidICACHE_FLASH_ATTR

httpserver_recv(void*arg,char*pusrdata,unsignedshortlength)

{

structespconn*ptrespconn=arg;

URL_Frame*pURL_Frame=NULL;

char*str=NULL;

pURL_Frame=(URL_Frame*)os_zalloc(sizeof(URL_Frame));

//获取命令的地址和请求类型(POST/GET)

parse_url(pusrdata,pURL_Frame);

switch(pURL_Frame->Type)

{

caseGET://判断请求为get

os_printf("WehaveaGETrequest.\n");

//根据cmd的地址到具体位置,处理相应的功能

8266wifi sdk开发指南

if(os_strcmp(pURL_Frame->pSelect,"config")==0&&

os_strcmp(pURL_Frame->pCommand,"command")==0){

if(os_strcmp(pURL_Frame->pFilename,"gpio")==0){

if(led_state()){

//构造返回信息

uint8buf1[]="HTTP/1.0200OKContent-Length:21Server:lwIP/1.4.0Content-type:

application/jsonExpires:Fri,10Apr200814:00:00GMTPragma:no-cache{\"gpio_get\":{\"gpio\":5,\"value\":1}}";

espconn_sent(ptrespconn,buf1,sizeof(buf1));//返回信息

}else{

//构造返回信息

uint8buf2[]="HTTP/1.0200OKContent-Length:21Server:lwIP/1.4.0Content-type:

application/json\Expires:Fri,10Apr200814:00:00GMTPragma:no-cache{\"gpio_get\":{\"gpio\":5,\"value\":0}}";

espconn_sent(ptrespconn,buf2,sizeof(buf2));//返回信息

}

}

}

char*str=NULL;

break;

casePOST://判断请求为post

os_printf("WehaveaPOSTrequest.\n");

//根据cmd的地址到具体位置,处理相应的功能

if(os_strcmp(pURL_Frame->pSelect,"config")==0&&

os_strcmp(pURL_Frame->pCommand,"command")==0){

if(os_strcmp(pURL_Frame->pFilename,"gpio")==0){

str=(char*)os_strstr(pusrdata,"value");

if(str!=NULL)

{

if(os_strstr(str,"0"))

{

led_switch(LED_GPIO5_L);

}else{

led_switch(LED_GPIO5_H);

}

//构造返回信息//设置管脚5位低电平//设置管脚5位高电平

8266wifi sdk开发指南

uint8buf3[]="HTTP/1.0200OKContent-Length:0Server:lwIP/1.4.0";

espconn_sent(ptrespconn,buf3,sizeof(buf3));//返回信息}

}

}

break;

default:

break;

}

}

/*

httpserver_recon函数为http_server的重连回调处理函数

*/

LOCALICACHE_FLASH_ATTR

voidhttpserver_recon(void*arg,sint8err)

{

os_printf("httpserver_reconok");

}

/*

httpserver_discon函数为http_server的断开回调处理函数

*/

LOCALICACHE_FLASH_ATTR

voidhttpserver_discon(void*arg)

{

os_printf("httpserver_disconok");

}

/*

httpserver_sent函数为http_server的发送回调处理函数

*/

LOCALvoidICACHE_FLASH_ATTR

httpserver_sent(void*arg)

{

os_printf("httpserver_sentok");

}

/*

httpserver_listen函数为http_server的连接回调处理函数

函数中注册了接收、重连、发送、断开回调处理函数

*/

LOCALvoidICACHE_FLASH_ATTR

httpserver_listen(void*arg)

{

8266wifi sdk开发指南

structespconn*pesp_conn=arg;

espconn_regist_recvcb(pesp_conn,httpserver_recv);

espconn_regist_reconcb(pesp_conn,httpserver_recon);

espconn_regist_disconcb(pesp_conn,httpserver_discon);

espconn_regist_sentcb(pesp_conn,httpserver_sent);

}

/*

httpserver_init函数为http_server的连接回调处理函数

函数中注册了接收、重连、发送、断开回调处理函数

*/

voidICACHE_FLASH_ATTR

httpserver_init(void)

{

LOCALstructespconnesp_conn={0};

LOCALesp_tcpesptcp;

esp_conn.type=ESPCONN_TCP;//设置连接为tcp协议

esp_conn.state=ESPCONN_NONE;//设置连接状态

esp_conn.proto.tcp=&esptcp;

esp_conn.proto.tcp->local_port=HTTP_PORT;//设置连接的端口号

espconn_regist_connectcb(&esp_conn,httpserver_listen);//注册httpserver连接回调函数

espconn_accept(&esp_conn);//tcp连接侦,听连接

os_printf("httpserver_initok");

}

下面是test_gpio.h文件

#ifndef__GPIO_TEST_H

#define__GPIO_TEST_H

#defineURLSize10//设置长度为10

//改结构体保存着GET和POST的值

typedefenumProtocolType{

GET=0,

POST,

}ProtocolType;

/*

该结构体用来保存http+json协议的请求类型(POST/GET)

和保存config?comand=switch的地址信息

*/

8266wifi sdk开发指南

typedefstructURL_Frame{

enumProtocolTypeType;

charpSelect[URLSize];

charpCommand[URLSize];

charpFilename[URLSize];

}URL_Frame;

voidICACHE_FLASH_ATTRhttpserver_init(void);

voidICACHE_FLASH_ATTRled_init(void);

voidICACHE_FLASH_ATTRuart_init(void);

#endif

/*

*第六步:在此场景中我们可以将模块设置为ap模式

*/

voidICACHE_FLASH_ATTR

AP_wifi_init()

{

structsoftap_configapConifg;

structstation_config

charmacaddr[6];

wifi_set_opmode(SOFTAP_MODE);//设置为ap模式

//读取模块的ap_mac地址

wifi_get_macaddr(SOFTAP_IF,macaddr);

os_memset(config.ssid,0,sizeof(config.ssid));staConfig;structsoftap_configconfig;

//设置ap_mode的相关属性

os_sprintf(config.ssid,"GPIO_TEST_%02X%02X",macaddr[4],macaddr[5]);//设置ap_mode的ssidconfig.ssid_len=os_strlen(config.ssid);

os_memset(config.password,0,sizeof(config.password));

config.authmode=AUTH_OPEN;

config.channel=1;

config.ssid_hidden=0;

config.max_connection=4;

config.beacon_interval=100;

wifi_softap_set_config(&config);//AP设置初始化

}

8266wifi sdk开发指南

/*第八步:到此为止代码已经编好了。现在将3个接口函数

*uart_initlen_inithttpserver_initAP_wifi_init

*放到gpio_test.h中

*然后在airm2m_cust_main(void)函数中调用3个接口(且包含头文件gpio_test.h)如下面:

voidICACHE_FLASH_ATTR

airm2m_cust_main(void)

{

uart_init();

AP_wifi_init();

led_init();

httpserver_init();

}

*/这样就将新代码加入工程中了

*/

第九步:编译,烧录,测试(具体编译请参考AirM2MSDK用户手册)

编译:在\app\test\project\DEMO目录下运行./build

附:编译环境的搭配具体操作请参考AirM2MSDK

用户手册等相关文档

烧录:

使用AirM2M_ESP8266_升级工具_V1.0.8工具下载选中bin目录下面的cfg.lua文件开始下载。具体请参考AirM2MSDK用户手册。

测试:

1.打开串口工具sscom,重启一下模块,有如下log

2.将电脑连上模块,打开TCP&UDP测试工具,模拟手机app发送,

建立客户端连接配置如下。

8266wifi sdk开发指南

3.在发送窗口发送http+json协议的数据包

A.发送post请求,设置管脚gpio5

为高电平如图

8266wifi sdk开发指南

B.发送get请求查询管脚gpio5

的状态如图

C.发送一个post请求设置管脚gpio5

位低电平如图

D.发送一个get请求查询管脚gpio5的状态

8266wifi sdk开发指南

附:测试所发的数据

POST/config?command=gpioHTTP/1.1User-Agent:LuaSocket2.0.2

Content-Length:34/*实际包体长度*/Content-Type:application/jsonHost:192.168.4.1

{"gpio_set":{"gpio":5,"value":1}}

GET/config?command=gpioHTTP/1.1User-Agent:LuaSocket2.0.2

Content-Length:34/*实际包体长度*/Content-Type:application/jsonHost:192.168.4.1

{"gpio_get":{"gpio":5}}

本文来源:https://www.bwwdw.com/article/ppyh.html

Top