nongye/STM32F103_App1/HardWare/NETWORK/net_wifi.c

164 lines
5.0 KiB
C
Raw Permalink 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 "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> RECOVERY <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><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5>ɹ<EFBFBD><C9B9>ģ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD>Ȳ<EFBFBD><C8B2>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD> */
if (NET_GetLastMode() == NET_MODE_WIFI_SMART) {
if (esp_saved_ap_connected(10) == 0) {
joined = 1;
via_smart = 1;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> SSID/PASS */
if (!joined && esp_join_fixed_ap() == 0) {
joined = 1;
via_smart = 0;
}
/* <20>̶<EFBFBD><CCB6>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD> SmartConfig <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ESP-Touch APP <20><EFBFBD><E3B2A5><EFBFBD>룩 */
if (!joined) {
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;
}
}
/* 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> RECOVERY<52><59><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;
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>λ");
HAL_Delay(100);
NVIC_SystemReset();
}
/* 30s һ<><D2BB> PINGREQ<45><51><EFBFBD><EFBFBD>С<EFBFBD><D0A1> MQTT keepalive 60s<30><73><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 ֡<EFBFBD><EFBFBD> PINGRESP<EFBFBD><EFBFBD>Լ 60s <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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ */
static uint8_t ping_miss = 0;
if (HAL_GetTick() - s_ping_tick >= 30000) {
if (g_mqttc_ping_outstanding) {
ping_miss++;
if (ping_miss >= 2) {
log_error("> WiFi: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ 60s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>λ");
HAL_Delay(100);
NVIC_SystemReset();
}
} else {
ping_miss = 0;
}
s_ping_tick = HAL_GetTick();
mqttc_ping();
}
}
/*==== <20><><EFBFBD>з<EFBFBD><D0B7><EFBFBD> ====*/
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>");
}
}