164 lines
5.0 KiB
C
164 lines
5.0 KiB
C
|
|
/* 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>");
|
|||
|
|
}
|
|||
|
|
}
|