shuichan_new/STM32F103_App1/HardWare/NETWORK/net_wifi.c

201 lines
6.7 KiB
C
Raw Normal View History

/* net_wifi.c - WiFi <20><><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ͨ<EFBFBD><CDA8>ʵ<EFBFBD><CAB5>֮һ<D6AE><D2BB>
*
* <EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>esp8266.c (ESP-01S AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/TCP͸<EFBFBD><EFBFBD>) + mqtt_client.c (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MQTT 3.1.1)<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>AP<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20s) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>SSID(60s) <EFBFBD><EFBFBD>
* Smart Config <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(60s) <EFBFBD><EFBFBD> ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD> network.c <EFBFBD>л<EFBFBD> 4G<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>н׶Σ<EFBFBD>mqttc_process <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD>ģ<EFBFBD>30s <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(CLOSED/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ) <EFBFBD><EFBFBD> ready<EFBFBD><EFBFBD><EFBFBD><EFBFBD> network.c <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD> 4G<EFBFBD><EFBFBD>
*/
#include "net_wifi.h"
#include "esp8266.h"
#include "mqtt_client.h"
#include "network.h"
#include "air780e.h" /* bg_delay */
#include "uart.h"
#include "log.h"
#include "reset_log.h"
#include "stdio.h"
#include "string.h"
volatile uint8_t g_wifi_mqtt_ready = 0;
volatile uint8_t g_wifi_first_publish_ok = 0;
/* WiFi ģ<><C4A3><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WIFIRESET <20><><EFBFBD><EFBFBD>(sys<79><73><EFBFBD><EFBFBD>)<29><>λ<EFBFBD><CEBB>
* net <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> net_wifi_process <EFBFBD><EFBFBD>ִ<EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UART4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>տ<EFBFBD><EFBFBD><EFBFBD> net <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4G <EFBFBD>л<EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ */
volatile uint8_t g_wifi_restore_req = 0;
static uint32_t s_ping_tick = 0;
/* <20><><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD> */
static char s_topic_up[48];
/*==== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD> g_wifi_mqtt_ready ====
* <EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EEPROM <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD>ϴγɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Ȳ<EFBFBD><EFBFBD>Ѵ<EFBFBD> AP <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(CIPSTATUS, 10s)
* Ȼ<EFBFBD><EFBFBD>ͳһ<EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> SSID(60s <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ) <EFBFBD><EFBFBD> SmartConfig(60s <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ)
* <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>ʹ<EFBFBD>õķ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EEPROM <EFBFBD><EFBFBD><EFBFBD>NET_SaveMode<EFBFBD><EFBFBD> */
int net_wifi_init(void)
{
log_info("> WiFi: <20><>ʼ<EFBFBD><CABC>...");
g_wifi_mqtt_ready = 0;
g_wifi_first_publish_ok = 0;
esp_gpio_init();
UART4_StartRx();
if (esp_reset() != 0) return -1;
if (esp_send_cmd("AT", "OK", 2000) != 0) return -1;
esp_send_cmd("ATE0", "OK", 1000); /* <20>ػ<EFBFBD><D8BB>ԣ<EFBFBD>ʧ<EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD> */
if (esp_send_cmd("AT+CWMODE=1", "OK", 2000) != 0) return -1;
int joined = 0;
uint8_t via_smart = 0; /* 1=<3D><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ㣨<C8B5>Ѵ<EFBFBD>AP<41><50>SmartConfig<69><67> */
/* <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD>ʽ(V1.7.1 <20><>): <20><><EFBFBD><EFBFBD>ģʽֻ<CABD><D6BB><EFBFBD>Ѵ<EFBFBD>AP+SmartConfig, <20>̶<EFBFBD>ģʽֻ<CABD><D6BB><EFBFBD>̶<EFBFBD><CCB6>ȵ<EFBFBD> */
uint8_t fmode = NET_GetForceMode();
/* <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD>Ȳ<EFBFBD><C8B2>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD> */
if (fmode == NET_MODE_WIFI_SMART) {
if (esp_saved_ap_connected(10) == 0) {
joined = 1;
via_smart = 1;
}
}
/* <20>̶<EFBFBD><CCB6>ȵ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>/EEPROM <20><><EFBFBD>õ<EFBFBD> SSID/PASS */
if (!joined && fmode == NET_MODE_WIFI_FIXED && esp_join_fixed_ap() == 0) {
joined = 1;
via_smart = 0;
}
/* <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>Ѵ<EFBFBD> AP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SmartConfig <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ESP-Touch APP <20><EFBFBD><E3B2A5><EFBFBD>룩 */
if (!joined && fmode == NET_MODE_WIFI_SMART) {
if (esp_smartconfig() == 0) {
joined = 1;
via_smart = 1;
} else {
log_warn("> WiFi: <20><><EFBFBD><EFBFBD> AP <20><><EFBFBD>ӷ<EFBFBD>ʽ<EFBFBD><CABD>ʧ<EFBFBD><CAA7>");
return -1;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ㣺<C8B5><E3A3BA>ӡ<EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȣ<EFBFBD>dBm<42><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD><D6B3>жϰڷ<CFB0>λ<EFBFBD><CEBB> */
esp_log_rssi();
/* TCP ͸<><CDB8><EFBFBD><EFBFBD> MQTT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (esp_enter_transparent(MqttInfoStr.ServerIP, MqttInfoStr.ServerPort) != 0) return -1;
/* <20><><EFBFBD><EFBFBD> MQTT <20><><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
mqttc_init(MqttInfoStr.ClientID, MqttInfoStr.Username, MqttInfoStr.Passward);
if (mqttc_connect() != 0) return -1;
{
char topic_down[48];
snprintf(topic_down, sizeof(topic_down), "%s%s", MqttInfoStr.Topic, MqttInfoStr.ClientID);
if (mqttc_subscribe(topic_down) != 0) return -1;
snprintf(s_topic_up, sizeof(s_topic_up), "/iot/data/up/%s", MqttInfoStr.ClientID);
}
g_wifi_mqtt_ready = 1;
s_ping_tick = HAL_GetTick();
log_info("> WiFi: Ready");
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><E4A3A8><EFBFBD>仯ʱд EEPROM<4F><4D> */
NET_SaveMode(via_smart ? NET_MODE_WIFI_SMART : NET_MODE_WIFI_FIXED);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4G <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>루ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>״η<D7B4><CEB7><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD> */
NET_publish_power(1);
return 0;
}
/*==== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>Ľ<EFBFBD><C4BD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ====*/
void net_wifi_process(void)
{
/* <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WIFIRESET<45><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD> net <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD>/<EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (g_wifi_restore_req) {
g_wifi_restore_req = 0;
log_warn("> WiFi: <20>յ<EFBFBD><D5B5>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> AT+RESTORE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
g_net_tx_busy = 1;
g_wifi_mqtt_ready = 0;
reset_log_mark(RSN_CMD_RECOVERY);
if (esp_factory_restore() != 0) {
log_warn("> WiFi: RESTORE ʧ<>ܣ<EFBFBD><DCA3><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
HAL_Delay(100);
NVIC_SystemReset();
}
if (!g_wifi_mqtt_ready) return;
int r;
while ((r = mqttc_process()) == 1) { }
if (r == -1) {
/* <20>յ<EFBFBD> CLOSED<45><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> TCP<43><50><EFBFBD><EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD>ֱ<EFBFBD>Ӹ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> */
log_error("> WiFi: <20><><EFBFBD>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رգ<D8B1><D5A3><EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD>ϵͳ<CFB5><CDB3>λ");
reset_log_mark(RSN_KICKED);
HAL_Delay(100);
NVIC_SystemReset();
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ο<EFBFBD> V3.0 <20><><EFBFBD><EFBFBD> TIM6 <20><><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 30s һ<EFBFBD><EFBFBD> PINGREQ<EFBFBD><EFBFBD>δ<EFBFBD>յ<EFBFBD> PINGRESP <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3s <EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>Լ 42s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>ػָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ TCP <EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD> CONNECT<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1~2s <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> WiFi <EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>ESP <EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>+͸<EFBFBD><EFBFBD>+MQTT<EFBFBD><EFBFBD> */
static uint8_t ping_miss = 0;
uint32_t interval = (ping_miss == 0) ? 30000u : 3000u;
if (HAL_GetTick() - s_ping_tick >= interval) {
if (g_mqttc_ping_outstanding) {
ping_miss++;
log_warn("> WiFi: PINGRESP <20><>ʱ (%d/5)", ping_miss);
if (ping_miss >= 5) {
ping_miss = 0;
log_error("> WiFi: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MQTT");
if (mqttc_connect() == 0) {
char topic_down[48];
snprintf(topic_down, sizeof(topic_down), "%s%s", MqttInfoStr.Topic, MqttInfoStr.ClientID);
if (mqttc_subscribe(topic_down) == 0) {
log_info("> WiFi: MQTT ԭ<><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>");
s_ping_tick = HAL_GetTick();
mqttc_ping();
return;
}
}
log_warn("> WiFi: ԭ<><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3>ؽ<EFBFBD><D8BD><EFBFBD>·");
g_wifi_mqtt_ready = 0;
if (net_wifi_init() == 0) {
log_info("> WiFi: <20><>·<EFBFBD>ؽ<EFBFBD><D8BD>ɹ<EFBFBD>");
} else {
log_warn("> WiFi: <20><>·<EFBFBD>ؽ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><> 4G");
}
}
} else {
if (ping_miss) log_info("> WiFi: <20><><EFBFBD><EFBFBD><EFBFBD>ѻָ<D1BB>");
ping_miss = 0;
}
s_ping_tick = HAL_GetTick();
mqttc_ping();
}
}
/*==== <20><><EFBFBD>з<EFBFBD><D0B7><EFBFBD> ====*/
/* QoS1 <20><><EFBFBD><EFBFBD>(<28><>ƽָ̨<CCA8><D6B8>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>): <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ʶ<EFBFBD><CAB6>, <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>е<EFBFBD> PUBACK */
int net_wifi_publish_qos1(const char *json, uint16_t pkt_id)
{
if (!g_wifi_mqtt_ready) return -1;
return mqttc_publish_qos1(s_topic_up, json, pkt_id);
}
void net_wifi_publish_up(const char *json)
{
if (!g_wifi_mqtt_ready) return;
if (mqttc_publish(s_topic_up, json) == 0 && !g_wifi_first_publish_ok) {
g_wifi_first_publish_ok = 1;
log_info("> WiFi: <20>״η<D7B4><CEB7><EFBFBD><EFBFBD>ɹ<EFBFBD>");
}
}