ESP8266 Smartconfig配网成功之后无法连接MQTT客户端。

Acutcat
Posts: 1
Joined: Tue Mar 20, 2018 8:54 pm

ESP8266 Smartconfig配网成功之后无法连接MQTT客户端。

Postby Acutcat » Wed Mar 21, 2018 9:16 pm

Code: Select all

/* main.c -- MQTT client example
*
* Copyright (c) 2014-2015, Tuan PM <tuanpm at live dot com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "ets_sys.h"
#include "driver/uart.h"
#include "osapi.h"
#include "mqtt.h"
#include "wifi.h"
#include "config.h"
#include "debug.h"
#include "gpio.h"
#include "user_interface.h"
#include "mem.h"
#include "driver/ir_tx_rx.h"
#include"driver/ringbuf.h"

#include "ip_addr.h"
#include "espconn.h"
#include "smartconfig.h"
#include "airkiss.h"

#define DEVICE_TYPE       "gh_e2728760afcf"//wechat public number
#define DEVICE_ID           "gh_e2728760afcf_bf51293fd4cd31a8"//,"qrticket" //model ID

#define DEFAULT_LAN_PORT    12476

os_timer_t ir_timer;
os_timer_t Send_temp_timer_t;
MQTT_Client mqttClient;

LOCAL esp_udp ssdp_udp;
LOCAL struct espconn pssdpudpconn;
LOCAL os_timer_t ssdp_time_serv;

uint8_t  lan_buf[200];
uint16_t lan_buf_len;
uint8     udp_sent_cnt = 0;

int mark=0;

const airkiss_config_t akconf =
{
   (airkiss_memset_fn)&memset,
   (airkiss_memcpy_fn)&memcpy,
   (airkiss_memcmp_fn)&memcmp,
   0,
};
void wifiConnectCb(uint8_t status)
{
   if(status == STATION_GOT_IP){
      MQTT_Connect(&mqttClient);
   } else {
      MQTT_Disconnect(&mqttClient);
   }
}
void mqttConnectedCb(uint32_t *args)
{
   MQTT_Client* client = (MQTT_Client*)args;
   INFO("MQTT: Connected\r\n");
   MQTT_Subscribe(client, "remote", 0);
}

void mqttDisconnectedCb(uint32_t *args)
{
   MQTT_Client* client = (MQTT_Client*)args;
   INFO("MQTT: Disconnected\r\n");
}

void mqttPublishedCb(uint32_t *args)
{
   MQTT_Client* client = (MQTT_Client*)args;
   INFO("MQTT: Published\r\n");
}



void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
   char *topicBuf = (char*)os_zalloc(topic_len+1),
       *dataBuf = (char*)os_zalloc(data_len+1);

   MQTT_Client* client = (MQTT_Client*)args;

   os_memcpy(topicBuf, topic, topic_len);
   topicBuf[topic_len] = 0;

   os_memcpy(dataBuf, data, data_len);
   dataBuf[data_len] = 0;
   INFO("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);
   os_free(topicBuf);
   os_free(dataBuf);
}



LOCAL void ICACHE_FLASH_ATTR
airkiss_wifilan_time_callback(void)
{
   uint16 i;
   airkiss_lan_ret_t ret;

   if ((udp_sent_cnt++) >30) {
      udp_sent_cnt = 0;
      os_timer_disarm(&ssdp_time_serv);//s
      //return;
   }

   ssdp_udp.remote_port = DEFAULT_LAN_PORT;
   ssdp_udp.remote_ip[0] = 255;
   ssdp_udp.remote_ip[1] = 255;
   ssdp_udp.remote_ip[2] = 255;
   ssdp_udp.remote_ip[3] = 255;
   lan_buf_len = sizeof(lan_buf);
   ret = airkiss_lan_pack(AIRKISS_LAN_SSDP_NOTIFY_CMD,
      DEVICE_TYPE, DEVICE_ID, 0, 0, lan_buf, &lan_buf_len, &akconf);
   if (ret != AIRKISS_LAN_PAKE_READY) {
      os_printf("Pack lan packet error!");
      return;
   }

   ret = espconn_sendto(&pssdpudpconn, lan_buf, lan_buf_len);
   if (ret != 0) {
      os_printf("UDP send error!");
   }
   os_printf("Finish send notify!\n");
}

LOCAL void ICACHE_FLASH_ATTR
airkiss_wifilan_recv_callbk(void *arg, char *pdata, unsigned short len)
{
   uint16 i;
   remot_info* pcon_info = NULL;

   airkiss_lan_ret_t ret = airkiss_lan_recv(pdata, len, &akconf);
   airkiss_lan_ret_t packret;

   switch (ret){
   case AIRKISS_LAN_SSDP_REQ:
      espconn_get_connection_info(&pssdpudpconn, &pcon_info, 0);
      os_printf("remote ip: %d.%d.%d.%d \r\n",pcon_info->remote_ip[0],pcon_info->remote_ip[1],
                                             pcon_info->remote_ip[2],pcon_info->remote_ip[3]);
      os_printf("remote port: %d \r\n",pcon_info->remote_port);

        pssdpudpconn.proto.udp->remote_port = pcon_info->remote_port;
      os_memcpy(pssdpudpconn.proto.udp->remote_ip,pcon_info->remote_ip,4);
      ssdp_udp.remote_port = DEFAULT_LAN_PORT;

      lan_buf_len = sizeof(lan_buf);
      packret = airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD,
         DEVICE_TYPE, DEVICE_ID, 0, 0, lan_buf, &lan_buf_len, &akconf);

      if (packret != AIRKISS_LAN_PAKE_READY) {
         os_printf("Pack lan packet error!");
         return;
      }

      os_printf("\r\n\r\n");
      for (i=0; i<lan_buf_len; i++)
         os_printf("%c",lan_buf[i]);
      os_printf("\r\n\r\n");

      packret = espconn_sendto(&pssdpudpconn, lan_buf, lan_buf_len);
      if (packret != 0) {
         os_printf("LAN UDP Send err!");
      }

      break;
   default:
      os_printf("Pack is not ssdq req!%d\r\n",ret);
      break;
   }
}
void ICACHE_FLASH_ATTR
Send_temp(int mark)
{

   struct station_config *stationConf;
   int s=mark;
   os_printf("mark=%d!",s);
   if(s==1)
   {
      smartconfig_stop();
      wifi_station_get_config(stationConf);
      wifi_station_disconnect();
      wifi_station_connect();
      os_printf("SC_OVER\n");
   }
   smartconfig_stop();
   wifi_station_get_config_default(stationConf);
   wifi_station_disconnect();
   wifi_station_connect();
    CFG_Load();

    MQTT_InitConnection(&mqttClient, sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.security);
             //MQTT_InitConnection(&mqttClient, "192.168.11.122", 1880, 0);
    MQTT_InitClient(&mqttClient, sysCfg.device_id, sysCfg.mqtt_user, sysCfg.mqtt_pass, sysCfg.mqtt_keepalive, 1);
             //MQTT_InitClient(&mqttClient, "client_id", "user", "pass", 120, 1);
    MQTT_InitLWT(&mqttClient, "/lwt", "offline", 0, 0);
    MQTT_OnConnected(&mqttClient, mqttConnectedCb);
    MQTT_OnDisconnected(&mqttClient, mqttDisconnectedCb);
    MQTT_OnPublished(&mqttClient, mqttPublishedCb);
    MQTT_OnData(&mqttClient, mqttDataCb);
}

void ICACHE_FLASH_ATTR
airkiss_start_discover(void)
{
   ssdp_udp.local_port = DEFAULT_LAN_PORT;
   pssdpudpconn.type = ESPCONN_UDP;
   pssdpudpconn.proto.udp = &(ssdp_udp);
   espconn_regist_recvcb(&pssdpudpconn, airkiss_wifilan_recv_callbk);
   espconn_create(&pssdpudpconn);
   
   os_timer_disarm(&ssdp_time_serv);
   os_timer_setfn(&ssdp_time_serv, (os_timer_func_t *)airkiss_wifilan_time_callback, NULL);
   os_timer_arm(&ssdp_time_serv, 1000, 1);//1s
}



void ICACHE_FLASH_ATTR
smartconfig_done(sc_status status, void *pdata)
{
    switch(status) {
        case SC_STATUS_WAIT:
            os_printf("SC_STATUS_WAIT\n");
            break;
        case SC_STATUS_FIND_CHANNEL:
            os_printf("SC_STATUS_FIND_CHANNEL\n");
            mark=1;
            os_printf("mark=%d!",mark);
            break;
        case SC_STATUS_GETTING_SSID_PSWD:
            os_printf("SC_STATUS_GETTING_SSID_PSWD\n");
         sc_type *type = pdata;
            if (*type == SC_TYPE_ESPTOUCH) {
                os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n");
            } else {
                os_printf("SC_TYPE:SC_TYPE_AIRKISS\n");
            }
            break;
        case SC_STATUS_LINK:
            os_printf("SC_STATUS_LINK\n");
            struct station_config *stationConf= pdata;
            wifi_station_set_config(stationConf);
            wifi_station_set_config_current(stationConf);
           wifi_station_disconnect();
           wifi_station_connect();
            break;
        case SC_STATUS_LINK_OVER:
            os_printf("SC_STATUS_LINK_OVER\n");
            mark=4;
            os_printf("mark=%d!",mark);
            if (pdata != NULL) {
            //SC_TYPE_ESPTOUCH
                uint8 phone_ip[4] = {0};

                os_memcpy(phone_ip, (uint8*)pdata, 4);
                os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]);
            } else {
               //SC_TYPE_AIRKISS - support airkiss v2.0
            airkiss_start_discover();
            }
            smartconfig_stop();
            break;

    }

}





/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
 *******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}


void user_init(void)
{

   uart_div_modify(0, 80000000 / 115200);
   os_printf("SDK version:%s\n", system_get_sdk_version());
   os_delay_us(60000);

    smartconfig_set_type(SC_TYPE_AIRKISS); //SC_TYPE_ESPTOUCH,SC_TYPE_AIRKISS,SC_TYPE_ESPTOUCH_AIRKISS
    wifi_set_opmode(STATION_MODE);
    smartconfig_start(smartconfig_done);
   INFO("\r\nSystem started ...\r\n");

   os_timer_disarm(&Send_temp_timer_t);
   os_timer_setfn(&Send_temp_timer_t, (os_timer_func_t *)Send_temp, NULL);
   os_timer_arm(&Send_temp_timer_t, 35000, 0);
}

Who is online

Users browsing this forum: No registered users and 8 guests