连接服务器

This commit is contained in:
yueming
2021-09-06 00:02:30 +08:00
parent a8bc50f67c
commit d9c4185983
36 changed files with 2748 additions and 4249 deletions

View File

@@ -1,7 +1,6 @@
#include "dev_work.h"
void Dev_ScanExtIndicate(void)
{
void Dev_ScanExtIndicate(void) {
/*开机检测*/
if(DevParam.RunPhase==0)
{

View File

@@ -1,8 +1,7 @@
#include "esp8266_uart2.h"
//检测应答命令
static uint8_t* ESP8266_CheckCmd(uint8_t *str)
{
static uint8_t* ESP8266_CheckCMD(uint8_t *str){
char *strx = 0;
if(UART2ReadFlag&0x8000)
{
@@ -15,19 +14,19 @@ static uint8_t* ESP8266_CheckCmd(uint8_t *str)
//cmd:发送的命令字符串
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//返回值:0,发送成功 1,发送失败
static uint8_t ESP8266_SendCmd(uint8_t *cmd,uint8_t *ack,uint16_t waittime) {
uint8_t ESP8266_SendCMD(uint8_t *cmd,uint8_t *ack,uint16_t waittime) {
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
Dev_UART2SendStr("%s\r\n", cmd);//发送命令
if(ack&&waittime) //需要等待应答
Dev_UART2SendStr(cmd, 0, 0);
if(ack&&waittime)
{
while(--waittime) //等待倒计时
while(--waittime)
{
Delay_ms(10);
if(UART2ReadFlag&0x8000)
{
if(ESP8266_CheckCmd(ack))
if(ESP8266_CheckCMD(ack))
{
UART2ReadFlag = 0;
return 0;
@@ -46,9 +45,8 @@ static uint8_t ESP8266_SendCmd(uint8_t *cmd,uint8_t *ack,uint16_t waittime) {
}
return 1;
}
uint8_t ESP8266_SendStr(char* fmt,...)
{
uint8_t tbuf[200] = {0};
uint8_t ESP8266_SendStr(char* fmt,...){
uint8_t tbuf[300] = {0};
uint16_t i = 0,j = 0;
va_list ap;
@@ -67,8 +65,7 @@ uint8_t ESP8266_SendStr(char* fmt,...)
return 0;
}
uint8_t ESP8266_SendData(uint8_t *tbuf, uint16_t len)
{
uint8_t ESP8266_SendData(uint8_t *tbuf, uint16_t len){
uint16_t i = 0;
for( i = 0; i < len; i++)
{
@@ -82,13 +79,13 @@ uint8_t ESP8266_SendData(uint8_t *tbuf, uint16_t len)
void ESP8266_GetLocalIP(uint8_t* ipbuf){
uint8_t *p,*p1;
if(ESP8266_SendCmd( (uint8_t *)"AT+CIFSR", (uint8_t *)"OK", 50))
if(ESP8266_SendCMD( (uint8_t *)"AT+CIFSR\r\n", (uint8_t *)"OK", 50))
{
ipbuf[0] = 0;
return;
}
p = ESP8266_CheckCmd((uint8_t *)"\"");
p = ESP8266_CheckCMD((uint8_t *)"\"");
p1 = (uint8_t *)strstr((const char*)(p+1),"\"");
*p1=0;
sprintf((char*)ipbuf,"%s",p+1);
@@ -105,12 +102,12 @@ uint8_t ESP8266_QuitTrans(void){
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET){};
USART_SendData(USART2, '+');
Delay_ms(500); //等待500ms
return ESP8266_SendCmd((uint8_t *)"AT",(uint8_t *)"OK",20);//退出透传判断
return ESP8266_SendCMD((uint8_t *)"AT\r\n",(uint8_t *)"OK",20);//退出透传判断
}
//获取连接状态 0,未连接;1,连接成功.
uint8_t ESP8266_ConstaCheck(void){
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTATUS",(uint8_t *)"OK",50));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSTATUS\r\n",(uint8_t *)"OK",50));
return 0;
}
@@ -123,26 +120,26 @@ uint8_t ESP8266_APInit(char *name, char *password){
Delay_ms(1000);
Delay_ms(1000);
while(ESP8266_SendCmd((uint8_t *)"AT",(uint8_t *)"OK",200))
while(ESP8266_SendCMD((uint8_t *)"AT\r\n",(uint8_t *)"OK",200))
{//退出透传
ESP8266_QuitTrans();
//关闭透传模式
ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=0",(uint8_t *)"OK",200);
ESP8266_SendCMD((uint8_t *)"AT+CIPMODE=0\r\n",(uint8_t *)"OK",200);
Delay_ms(1000);
}
// 关闭回显
while(ESP8266_SendCmd((uint8_t *)"ATE0",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"ATE0\r\n",(uint8_t *)"OK",200));
// 设置波特率
while(ESP8266_SendCmd((uint8_t *)"AT+UART=115200,8,1,0,0",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+UART=115200,8,1,0,0\r\n",(uint8_t *)"OK",200));
Delay_ms(10);
// 设置WIFI AP模式
while(ESP8266_SendCmd((uint8_t *)"AT+CWMODE=2",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+RST",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CWMODE=2\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+RST\r\n",(uint8_t *)"OK",200));
// 延时4秒等待重启成功
Delay_ms(1000);
@@ -151,17 +148,17 @@ uint8_t ESP8266_APInit(char *name, char *password){
Delay_ms(1000);
memset(Sbuf, 0 , sizeof(Sbuf));
sprintf((char*)Sbuf, "AT+CWSAP=\"%s\",\"%s\",1,4", name, password);
while(ESP8266_SendCmd(Sbuf, (uint8_t *)"OK", 1000));
sprintf((char*)Sbuf, "AT+CWSAP=\"%s\",\"%s\",1,4\r\n", name, password);
while(ESP8266_SendCMD(Sbuf, (uint8_t *)"OK", 1000));
#ifdef TCP_Mode
#endif
#ifdef UDP_Mode
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMUX=0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTART=\"UDP\",\"255.255.255.255\",60156,42254,0",(uint8_t *)"OK",500));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=1",(uint8_t *)"OK",300));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSEND",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMUX=0\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSTART=\"UDP\",\"255.255.255.255\",60156,42254,0\r\n",(uint8_t *)"OK",500));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMODE=1\r\n",(uint8_t *)"OK",300));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSEND\r\n",(uint8_t *)"OK",200));
#endif
UART2ReadFlag = 0;
@@ -172,24 +169,33 @@ uint8_t ESP8266_STAConnect(char *name, char *password){
uint8_t Sbuf[60] ={0};
memset(Sbuf, 0 , sizeof(Sbuf));
sprintf((char*)Sbuf,"AT+CWJAP=\"%s\",\"%s\"", name, password);
if(ESP8266_SendCmd( Sbuf, (uint8_t *)"WIFI GOT IP", 100)){
sprintf((char*)Sbuf,"AT+CWJAP=\"%s\",\"%s\"\r\n", name, password);
if(ESP8266_SendCMD( Sbuf, (uint8_t *)"WIFI GOT IP", 100)){
return 1;
}
else {
#ifdef TCP_Mode
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMUX=0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTART=\"TCP\",\"192.168.0.102\",8086",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=1",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSEND",(uint8_t *)"OK",20));
#endif
#ifdef UDP_Mode
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMUX=0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSTART=\"UDP\",\"192.168.1.6\",8086,8086,0",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=1",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+CIPSEND",(uint8_t *)"OK",20));
#endif
else
{
#ifdef MQTT_AT
#elif MQTT_SCode
#elif TCP_Mode
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMUX=0\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSTART=\"TCP\",\"192.168.0.102\",8086\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMODE=1\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSEND\r\n",(uint8_t *)"OK",20));
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
return 0;
#elif UDP_Mode
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMUX=0\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSTART=\"UDP\",\"192.168.1.6\",8086,8086,0\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMODE=1\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSEND\r\n",(uint8_t *)"OK",20));
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
return 0;
#endif
UART2ReadFlag = 0;
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
return 0;
@@ -202,33 +208,30 @@ uint8_t ESP8266_STAInit(void){
// 延时2秒等待串口初始化完成
Delay_ms(1000);
Delay_ms(1000);
while(ESP8266_SendCmd((uint8_t *)"AT",(uint8_t *)"OK",200))
while(ESP8266_SendCMD((uint8_t *)"AT\r\n",(uint8_t *)"OK",200))
{
//退出透传
ESP8266_QuitTrans();
//关闭透传模式
ESP8266_SendCmd((uint8_t *)"AT+CIPMODE=0",(uint8_t *)"OK",200);
ESP8266_SendCMD((uint8_t *)"AT+CIPMODE=0\r\n",(uint8_t *)"OK",200);
Delay_ms(800);
}
// 关闭回显
while(ESP8266_SendCmd((uint8_t *)"ATE0",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"ATE0\r\n",(uint8_t *)"OK",200));
// 设置波特率
while(ESP8266_SendCmd((uint8_t *)"AT+UART=115200,8,1,0,0",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+UART=115200,8,1,0,0\r\n",(uint8_t *)"OK",200));
Delay_ms(10);
// 设置WIFI STA模式
while(ESP8266_SendCmd((uint8_t *)"AT+CWMODE=1",(uint8_t *)"OK",200));
while(ESP8266_SendCmd((uint8_t *)"AT+RST",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CWMODE=1\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+RST\r\n",(uint8_t *)"OK",200));
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
return 1;
}

View File

@@ -13,6 +13,7 @@
#define UDP_Mode 1
uint8_t ESP8266_SendStr(char* fmt,...);
uint8_t ESP8266_SendCMD(uint8_t *cmd,uint8_t *ack,uint16_t waittime);
uint8_t ESP8266_SendData(uint8_t *tbuf, uint16_t len);
uint8_t ESP8266_APInit(char *name, char *password);
uint8_t ESP8266_STAInit(void);

View File

@@ -1,109 +1,42 @@
#include "esp8266_work.h"
/****************************
/*************************************************************
配网流程
1、将无线设备初始化为AP模式默认设置为
2、
// 配置 MQTT 用户属性
// AT+MQTTUSERCFG=0,1,"8bf209cd00704760b7a60b2f71be9d8c","test","123456",0,0,""\r\n
// 配置 MQTT 连接属性
// AT+MQTTCONNCFG=0,120,0,"","",0,0\r\n
// 连接/查询 MQTT Broker
// AT+MQTTCONN=0,"106.12.9.213",1883,0\r\n
// 发布主题
// {"deviceNum":"7CDFA1049ADA","categoryId":2,"firmwareVersion":"1.0","ownerId":"1"}
// AT+MQTTPUB=0,"device_info","{"deviceNum":"E8DB84933050","categoryId":1,"firmwareVersion":"1.0","ownerId":"1"}",0,0\r\n
// 订阅/查询主题
// AT+MQTTSUB=0,"status/set/E8DB84933050",1\r\n
// 取消订阅主题
// AT+MQTTUNSUB=0,"status/set/E8DB84933050"
// 关闭连接, 释放资源
// AT+MQTTCLEAN=0
****************************/
static uint8_t NetWorkFlow = 1;
static uint32_t Nport = 0;
static uint8_t Nssid[20] = {0};
static uint8_t Npassword[20] = {0};
2、AT+CWJAP="CMCC-LI","092413131li"
// 配置 MQTT 用户属性
// AT+MQTTUSERCFG=0,1,"8bf209cd00704760b7a60b2f71be9d8c","test","12345678",0,0,""
// 配置 MQTT 连接属性
// AT+MQTTCONNCFG=0,120,0,"","",0,0
// 连接/查询 MQTT Broker
// AT+MQTTCONN=0,"106.12.9.213",1883,0
// 发布主题
// {"deviceNum":"E8DB84933056","categoryId":2,"firmwareVersion":"1.0","ownerId":"1"}
// AT+MQTTPUB=0,"device_info","{\"deviceNum\":\"E8DB8493312\"\\,\"categoryId\":1\\,\"firmwareVersion\":\"1.0\"\\,\"ownerId\":\"1\"}",0,0
// AT+MQTTPUB=0,"device_info","{\"deviceNum\":\"E8DB8493312\"\\,\"categoryId\":1\\,\"firmwareVersion\":\"1.0\"\\,\"ownerId\":\"1\"}",0,0\r\n
// 订阅/查询主题
// AT+MQTTSUB=0,"status/set/E8DB84933056",0
// 取消订阅
// AT+MQTTUNSUB=0,"status/set/E8DB84933050"
// 关闭连接, 释放资源
// AT+MQTTCLEAN=0
************************************************************/
uint8_t NetWorkFlow = 1;
#ifdef MQTT_SCode
MQTTPacket_connectData MQTT_ConnectData = MQTTPacket_connectData_initializer;
char MQTT_ClientId[150] = {0};
char MQTT_Username[65] = {0};
char MQTT_Password[65] = {0};
volatile uint16_t MQTT_ReadBufLen = 0;
#endif
uint8_t Wssid[20] = "";
uint8_t Wpassword[20] = "";
int ESP8266_WaitData(unsigned char* buf, int count)
{
while(1)
{
if(UART2ReadFlag&0x8000)
{
memcpy(buf, (void*)&UART2ReadBuf[MQTT_ReadBufLen], count);
MQTT_ReadBufLen += count;
return count;
}
Delay_ms(10);
}
}
#ifdef MQTT_SCode
uint8_t MQTT_UserSubscribe(char *pSubTopic) {
uint8_t buf[200] = {0};
uint32_t buflen = sizeof(buf);
int32_t msgid = 1;
int32_t req_qos = 0; // 服务质量
char MQTT_ServerIP[20] = "106.12.9.213";
uint32_t MQTT_ServerPort = 1883;
MQTTString topicString = MQTTString_initializer;
topicString.cstring = pSubTopic;
// 订阅格式化
MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);
// 发送订阅
UART2ReadFlag = 0;
ESP8266_SendStr((char *)buf);
if (MQTTPacket_read(buf, buflen, ESP8266_WaitData)==SUBACK) /* wait for suback */
{
unsigned short submsgid;
int subcount;
int granted_qos;
static char MQTT_DeviceID[20] = "E8DB84933299";
static char MQTT_ClientID[100] = "user";
static char MQTT_Username[20] = "test";
static char MQTT_Password[20] = "123456";
MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);
if (granted_qos != 0)
{
//Sys_SendLog("granted qos != 0, %d\n", granted_qos);
return 0;
}
else
{
//Sys_SendLog("granted qos = 0\n");
return 1;
}
}
else
{
//Sys_SendLog("no suback received!\r\n");
return 0;
}
}
#endif
#ifdef MQTT_SCode
// MQTT_Publish("/mqtt/topic/0", "hello0");
void MQTT_UserPublish(char *pPubTopic, char *payload, int payloadlen) {
uint8_t buf[400] = {0};
int buflen = sizeof(buf);
MQTTString topicString = MQTTString_initializer;
int len = 0;
topicString.cstring = pPubTopic;
len += MQTTSerialize_publish((unsigned char *)(buf + len), buflen - len, 0, 0, 0, 0, topicString, (unsigned char *)payload, payloadlen);
ESP8266_SendStr((char *)buf);
}
#endif
uint8_t buf[400] = {0};
int buflen = 0;
void ESP8266_NetWorkFlow(void)
{
uint8_t PublishData[500] = {0};
int len = 0;
void ESP8266_NetWorkFlow(void) {
// 第一步初始化为AP
if(NetWorkFlow == 1) {
ESP8266_APInit("XiaoYi_IOT_AirBox", "asdqwe9867");
@@ -113,114 +46,181 @@ void ESP8266_NetWorkFlow(void)
else if(NetWorkFlow == 2) {
if(DevParam.ESP8266SendTime >= 2000)
{
ESP8266_SendStr("{\"code\":\"0\",\"msg\":\"start connect\"}");
ESP8266_SendStr("{\"code\":0,\"msg\":\"start connect\"}");
DevParam.ESP8266SendTime = 0;
}
}
// 第三步,返回接受成功信息
else if(NetWorkFlow == 3) {
ESP8266_SendStr("{\"code\":\"1\",\"msg\":\"getWifiInfo:success\"}");
ESP8266_SendStr("{\"code\":1,\"msg\":\"getWifiInfo:success\"}");
NetWorkFlow = 4;
}
// 第四步,连接家庭无线
else if(NetWorkFlow == 4) {
ESP8266_STAInit();
while(ESP8266_STAConnect((char *)Nssid, (char *)Npassword));
while(ESP8266_STAConnect((char *)Wssid, (char *)Wpassword));
NetWorkFlow = 5;
}
// 第五步配置MQTT
else if(NetWorkFlow == 5) {
/*********模拟MQTT指令**************/
#ifdef MQTT_SCode
// MQTT_ConnectData.MQTTVersion = 4; // 3.1.1
// MQTT_ConnectData.keepAliveInterval = 60; // 设置心跳包间隔时间
// MQTT_ConnectData.clientID.cstring = (char *)MQTT_ClientId;// 客户端ID
// MQTT_ConnectData.username.cstring = (char *)MQTT_Username;// 用户名
// MQTT_ConnectData.password.cstring = (char *)MQTT_Password;// 密码
// MQTT_ConnectData.cleansession = 0; // 清除会话
MQTT_ConnectData.keepAlive = 120; // 心跳包,单位秒
strcpy( MQTT_ConnectData.clientID, MQTT_ClientID);// 客户端ID
strcpy( MQTT_ConnectData.username, MQTT_Username);// 用户名
strcpy( MQTT_ConnectData.password, MQTT_Password);// 密码
//rc = aiotMqttSign(product_key, device_name, device_secret, \
//MQTT_ConnectData.clientID.cstring, MQTT_ConnectData.username.cstring, MQTT_ConnectData.password.cstring);
//if (rc < 0) {
//Sys_SendLog("aiotMqttSign -%0x4x\n", -rc);
//return -1;
//}
/***连接服务器***/
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMUX=0\r\n",(uint8_t *)"OK",200));
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", MQTT_ServerIP, MQTT_ServerPort);
while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 500));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPMODE=1\r\n",(uint8_t *)"OK",200));
while(ESP8266_SendCMD((uint8_t *)"AT+CIPSEND\r\n",(uint8_t *)"OK",200));
/***登录服务器***/
while(MQTTSCode_Connect());
// 网络连接
//char *host = "a1ykSq0uPgd.iot-as-mqtt.cn-shanghai.aliyuncs.com";
//int port = 1883;
//transport_open( host, port);
// 发送 登录数据
// 将连接字符串格式化一下,现在还没有发送
// memset(buf, 0 ,sizeof(buf));
// buflen = sizeof(buf);
//
// MQTTSerialize_connect( buf, buflen, &MQTT_ConnectData);
// UART2ReadFlag = 0;
// ESP8266_SendStr((char *)buf);
// 等待connack
// if (MQTTPacket_read(buf, buflen, ESP8266_WaitData) == CONNACK){
// unsigned char sessionPresent, connack_rc;
// if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)
// {
// //Sys_SendLog("Unable to connect,return code %d\r\n", connack_rc);
// //return -1;
// }
// }
/*订阅*/
// MQTT_UserSubscribe("status/set/7CDFA1049ADA"); //更新设备状态
// MQTT_UserSubscribe("status/get/7CDFA1049ADA"); //获取设备状态
// MQTT_UserSubscribe("setting/set/7CDFA1049ADA");//更新设备配置
// MQTT_UserSubscribe("setting/get/7CDFA1049ADA");//获取设备配置
/***订阅服务器对状态设置***/
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"status/set/%s", MQTT_DeviceID);
while(MQTTSCode_Subscribe((char *)PublishData, 0, 12));
#endif
/********************************/
/*********AT指令*****************/
#ifdef MQTT_AT
// 1配置 MQTT 用户属性
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"\r\n",\
MQTT_ClientID, MQTT_Username, MQTT_Password);
while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 500));
// 2配置 MQTT 连接属性
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+MQTTCONNCFG=0,120,0,\"\",\"\",0,0\r\n");
while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 500));
// 3连接/查询服务器
//memset((void *)PublishData, 0, sizeof(PublishData));
//sprintf((char *)PublishData,"AT+MQTTCONN=0,\"%s\",1883,0\r\n",\
// MQTT_ServerIP);
//while(ESP8266_SendCMD((uint8_t *)"AT+MQTTCONN?\r\n", (uint8_t *)"OK", 500));
while(ESP8266_SendCMD((uint8_t *)"AT+MQTTCONN=0,\"106.12.9.213\",1883,0\r\n", (uint8_t *)"OK", 300));
// 4发布注册设备信息Publish
//memset((void *)PublishData, 0, sizeof(PublishData));
//sprintf((char *)PublishData,"AT+MQTTPUB=0,\"%s\",\"{\\\"deviceNum\\\":\\\"%s\\\"\\,\\\"categoryId\\\":1\\,\\\"firmwareVersion\\\":\\\"1.0\\\"\\,\\\"ownerId\\\":\\\"1\\\"}\",0,0\r\n",\
// "device_info" ,MQTT_DeviceID);
//while(ESP8266_SendCMD(PublishData, (uint8_t *)"OK", 500));
// 发布设备上线(设备状态)
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+MQTTPUB=0,\"%s\",\"{\\\"deviceNum\\\":\\\"%s\\\"\\,\\\"isOnline\\\":1\\,\\\"rssi\\\":-73\\,\\\"airTemperature\\\":%d\\,\\\"remark\\\":\\\"\\\"}\",0,0\r\n",\
"status" ,MQTT_DeviceID, DevParam.BatSOC);
while(ESP8266_SendCMD(PublishData, (uint8_t *)"OK", 500));
// 发布设备遗嘱
// memset((void *)PublishData, 0, sizeof(PublishData));
// sprintf((char *)PublishData,"AT+MQTTPUB=0,\"offline\",\"{\\\"deviceNum\\\":\\\"%s\\\"\\,\\\"isOnline\\\":0\\,\\\"remark\\\":\\\"\\\"}\",0,0\r\n",\
// MQTT_DeviceID);
// while(ESP8266_SendCMD(PublishData, (uint8_t *)"OK", 500));
// 发布设备配置
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+MQTTPUB=0,\"status\",\"{\\\"deviceNum\\\":\\\"%s\\\"\\,\\\"isReset\\\":0\\,\\\"remark\\\":\\\"\\\"}\",0,0\r\n",\
MQTT_DeviceID);
while(ESP8266_SendCMD(PublishData, (uint8_t *)"OK", 500));
// 5订阅
// // 更新设备设置状态
// memset((void *)PublishData, 0, sizeof(PublishData));
// sprintf((char *)PublishData,"AT+MQTTSUB=0,\"status\\\/set\\\/%s\", MQTT_DeviceID);
// while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 500));
// 订阅获取设备状态
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+MQTTSUB=0,\"status\\/set\\/%s\",0\r\n", MQTT_DeviceID);
while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 500));
// // 更新设备配置
// memset((void *)PublishData, 0, sizeof(PublishData));
// sprintf((char *)PublishData,"AT+MQTTSUB=0,\"setting/set/%s\",\"\",0,0\r\n", MQTT_DeviceID);
// while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 500));
// // 获取设备配置
// memset((void *)PublishData, 0, sizeof(PublishData));
// sprintf((char *)PublishData,"AT+MQTTSUB=0,\"setting/get/%s\",\"\",0,0\r\n", MQTT_DeviceID);
// while(ESP8266_SendCMD((uint8_t *)PublishData, (uint8_t *)"OK", 200));
#endif
NetWorkFlow = 10;
/********************************/
}
else if(NetWorkFlow == 10)
{
// 第十步,发布消息
else if(NetWorkFlow == 10) {
/********************************/
#ifdef MQTT_SCode
// if(DevParam.ESP8266SendTime >= 2000)
// {
// MQTTSerialize_pingreq(buf, buflen);// 发送心跳
// ESP8266_SendStr((char *)buf);
// DevParam.ESP8266SendTime = 0;
// }
// 发布设备状态
// else if(DevParam.ESP8266SendTime>=1500){
// // /a1ykSq0uPgd/qmvH76OCy2FeGp9DDMPx/user/update
// // 0x00 00000001 0032 0100 001223
// char txBuf[30] = {0};
// char txLen = 0;
// //txBuf[txLen++] = COMMAND_REPORT;// 属性上报
// txBuf[txLen++] = 0x00;txBuf[txLen++] = 0x00;txBuf[txLen++] = 0x00;txBuf[txLen++] = 0x01;// ID
// //txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 8);txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 0); // INT16
// //txBuf[txLen++] = DeviceData.prop_bool; // BOOL
// //txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 8);txBuf[txLen++] = (uint8_t)(DeviceData.prop_int16 >> 0);// FLOAT
// MQTT_UserPublish("device_info", txBuf, txLen);
// DevParam.ESP8266SendTime = 0;
// }
#endif
if(DevParam.MQTTSendTime >= 2000)
{
// 定时发布设备状态
memset((void *)PublishData, 0, sizeof(PublishData));
len = sprintf((char *)PublishData,"{\"deviceNum\":\"%s\",\"isOnline\":1,\"airTemperature\":%d,\"remark\":\"\"}",\
MQTT_DeviceID, DevParam.tes);
if(len > 0)
{
while(MQTTSCode_Publish("status", (char *)PublishData, len, 0, 1, 10));
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
}
DevParam.MQTTSendTime = 0;
}
#endif
/********************************/
/********************************/
#ifdef MQTT_AT
if(DevParam.MQTTSendTime >= 5000)
{
// 定时发布设备状态
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"AT+MQTTPUB=0,\"%s\",\"{\\\"deviceNum\\\":\\\"%s\\\"\\,\\\"isOnline\\\":1\\,\\\"rssi\\\":-73\\,\\\"airTemperature\\\":%d\\,\\\"remark\\\":\\\"\\\"}\",0,0\r\n",\
"status" ,MQTT_DeviceID, DevParam.BatSOC);
while(ESP8266_SendCMD(PublishData, (uint8_t *)"OK", 500));
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
DevParam.MQTTSendTime = 0;
}
#endif
/********************************/
}
}
char mystrstr(char *haystack, char *needle) {
uint16_t i = 0,j = 0;
for(i = 0;;i++)
{
if(haystack[i]==needle[0])
{
for(j = 0;;j++)
{
if(haystack[i+j]==needle[j])
{
if(needle[j+1] == '\0')
return 1;
}
else
break;
}
}
if((haystack[i]=='\r') && (haystack[i+1]=='\n'))
{
return 0;
}
}
}
cJSON *root = NULL;
char JsonString[100] = {0};
uint16_t init = 0;
uint16_t i = 0;
uint8_t rbuf[256] = {0};
uint8_t rlen = 0;
char JsonString[500] = {0};
uint16_t i = 0,j = 0,slen = 0;
void ESP8266_NetReceiveInfor(void) {
if(UART2ReadFlag&0x8000)
{
// 配网解析
if(NetWorkFlow == 2) {
// {"port":"60156","ssid":"xxx","password":"xxxx"}
if(UART2ReadBuf[0] == '{')
{
// {"port":60156,"ssid":"xxx","password":"xxxx"}
if(UART2ReadBuf[0] == '{') {
memset(JsonString, 0, sizeof(JsonString));
for(i = 0;;i++)
{
JsonString[i] = UART2ReadBuf[i];
@@ -234,50 +234,105 @@ void ESP8266_NetReceiveInfor(void) {
UART3ReadFlag = 0;
return;
}
Nport = cJSON_GetObjectItem(root, "port")->valuedouble;
if(Nport==60156)
{
sprintf((char *)Nssid, "%s",cJSON_GetObjectItem(root, "ssid")->valuestring);
sprintf((char *)Npassword,"%s",cJSON_GetObjectItem(root, "password")->valuestring);
// Nport = cJSON_GetObjectItem(root, "port")->valuedouble;
// if(Nport==60156)
// {
sprintf((char *)Wssid, "%s",cJSON_GetObjectItem(root, "ssid")->valuestring);
sprintf((char *)Wpassword,"%s",cJSON_GetObjectItem(root, "password")->valuestring);
// 进入无线第三步
NetWorkFlow = 3;
}
cJSON_Delete(root);
memset(JsonString, 0, sizeof(JsonString));
// }
cJSON_Delete(root);
break;
}
}
}
}
if(NetWorkFlow == 10)
{
#ifdef MQTT_SCode
rlen = UART2ReadFlag&(~(1<<15));
memcpy(rbuf, (void*)&UART2ReadBuf, rlen);
memset(UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART2ReadFlag = 0;
if (strstr((char *)rbuf, "CLOSED"))
{
}
else
{
if (0xD0 == *rbuf)
// 服务器解析
if(NetWorkFlow == 10) {
#ifdef MQTT_SCode
slen = UART2ReadFlag&(~(1 << 15));
UART2ReadBuf[slen] = 0x0D;
UART2ReadBuf[slen+1] = 0x0A;
/**********设置状态*********/
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"status/set/%s", MQTT_DeviceID);
if(mystrstr((char *)UART2ReadBuf, (char *)PublishData)==1) {
memset(JsonString, 0, sizeof(JsonString));
for(i = 0;;i++)
{
//Sys_SendLog("MQTT Heart Beat \r\n");
}
else
if(UART2ReadBuf[i]=='{')
{
for(j = 0;;j++)
{
JsonString[j] = UART2ReadBuf[j+i];
if( (UART2ReadBuf[j+i]=='}') && (UART2ReadBuf[j+i+1]==0x0D) && (UART2ReadBuf[j+i+2]==0x0A))
{
// 解析数据
root = cJSON_Parse((char *)JsonString);
if(root == NULL)
{
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART3ReadFlag = 0;
return;
}
DevParam.ServerRelay= cJSON_GetObjectItem(root, "relayStatus")->valuedouble;
DevParam.ServerRed = cJSON_GetObjectItem(root, "red")->valuedouble;
cJSON_Delete(root);
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART3ReadFlag = 0;
return;
}
}
}
}
}
#endif
#ifdef MQTT_AT
// 首先判断
if(strstr((const char*)UART2ReadBuf,(const char*)"+MQTTSUBRECV")) {
memset((void *)PublishData, 0, sizeof(PublishData));
sprintf((char *)PublishData,"status/set/%s", MQTT_DeviceID);
if(strstr((const char*)UART2ReadBuf,(const char*)PublishData))
{
// strncpy(Topic, (void*)(rbuf+4), rbuf[3]);
// printf("Topic: %s\r\n", Topic);
// strncpy(message,(void*)(rbuf+4+rbuf[3]),rbuf[1]-rbuf[3]-2);
// printf("Message: %s\r\n", message);
// memset(rbuf, 0, sizeof(rbuf));
memset(JsonString, 0, sizeof(JsonString));
for(i = 0;;i++)
{
if(UART2ReadBuf[i]=='{')
{
for(j = 0;;j++)
{
JsonString[j] = UART2ReadBuf[j+i];
if( (UART2ReadBuf[j+i]=='}') && (UART2ReadBuf[j+i+1]==0x0D) && (UART2ReadBuf[j+i+2]==0x0A))
{
// 解析数据
root = cJSON_Parse((char *)JsonString);
if(root == NULL)
{
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART3ReadFlag = 0;
return;
}
DevParam.ServerRelay= cJSON_GetObjectItem(root, "relayStatus")->valuedouble;
DevParam.ServerRed = cJSON_GetObjectItem(root, "red")->valuedouble;
cJSON_Delete(root);
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART3ReadFlag = 0;
return;
}
}
}
}
}
}
#endif
}
}
#endif
}
memset((void *)UART2ReadBuf, 0, sizeof(UART2ReadBuf));
UART2ReadFlag = 0;
}
}

View File

@@ -5,11 +5,15 @@
#include "esp8266_uart2.h"
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
#include "cJSON.h"
#include "MQTTPacket.h"
#include "MQTTConnect.h"
#include "mqtt.h"
void ESP8266_NetWorkFlow(void);
void ESP8266_NetReceiveInfor(void);