Просмотр исходного кода

update: mreport, 兼容多网卡,有些地方没有释放内存还可能存在泄漏,补充wifi信息

??? 6 месяцев назад
Родитель
Сommit
2576f32e1c
1 измененных файлов с 115 добавлено и 68 удалено
  1. 115 68
      components/mreport/src/luat_mreport.c

+ 115 - 68
components/mreport/src/luat_mreport.c

@@ -38,8 +38,40 @@ static inline uint16_t u162bcd(uint16_t src) {
     return dst;
 }
 
-// 模块的基础信息
-void luat_mreport_mobile(cJSON* mreport_data) {
+// 基础信息
+static void luat_mreport_sys_basic(cJSON* mreport_data) {
+    // 时间戳
+	time_t t;
+	time(&t);
+    cJSON_AddNumberToObject(mreport_data, "localtime", t);
+
+    // luatos项目信息
+    cJSON_AddStringToObject(mreport_data, "proj", project_name);
+    cJSON_AddStringToObject(mreport_data, "pver", project_version);
+    
+    // rndis
+    cJSON_AddNumberToObject(mreport_data, "rndis", 0);
+    // usb
+    cJSON_AddNumberToObject(mreport_data, "usb", 1);
+    // vbus
+    cJSON_AddNumberToObject(mreport_data, "vbus", 1);
+
+    // 开机原因
+    cJSON_AddNumberToObject(mreport_data, "powerreson", luat_pm_get_poweron_reason());
+
+    // 开机次数
+    cJSON_AddNumberToObject(mreport_data, "bootc", 1);
+
+    // 开机时长
+    uint64_t tick64 = luat_mcu_tick64();
+    uint64_t tmms = tick64 / 1000000;
+    uint64_t tms = tick64 % 1000000;
+    cJSON_AddNumberToObject(mreport_data, "tmms", tmms);
+    cJSON_AddNumberToObject(mreport_data, "tms", tms);
+}
+
+// 模块的信息
+static void luat_mreport_mobile(cJSON* mreport_data) {
     // IMEI
     char imei[16] = {0};
     luat_mobile_get_imei(0, imei, 16);                  
@@ -77,7 +109,7 @@ void luat_mreport_mobile(cJSON* mreport_data) {
 }
 
 // 网络信息
-void luat_mreport_sim_network(cJSON* mreport_data, struct netif* netif) {
+static void luat_mreport_sim_network(cJSON* mreport_data, struct netif* netif) {
     cJSON* cells = cJSON_CreateArray();
     // ICCID
     char iccid[24] = {0};
@@ -142,6 +174,9 @@ void luat_mreport_sim_network(cJSON* mreport_data, struct netif* netif) {
             }
         }
     }
+    if (cell_info != NULL) {
+        luat_heap_free(cell_info);
+    }
 
     // ip地址
     cJSON_AddStringToObject(mreport_data, "ipv4", ip4addr_ntoa(&netif->ip_addr));
@@ -161,7 +196,7 @@ void luat_mreport_sim_network(cJSON* mreport_data, struct netif* netif) {
 }
 
 // adc信息
-void luat_mreport_adc(cJSON* mreport_data) {
+static void luat_mreport_adc(cJSON* mreport_data) {
     // adc-vbat
     if (luat_adc_open(LUAT_ADC_CH_VBAT, NULL) == 0) {
         int val = 0xFF;
@@ -183,13 +218,63 @@ void luat_mreport_adc(cJSON* mreport_data) {
 }
 
 // wifi信息
-void luat_mreport_wifi(cJSON* mreport_data) {
+static void luat_mreport_wifi(cJSON* mreport_data) {
     // wifi版本
     uint32_t wifi_version = 0;
     if (g_airlink_ext_dev_info.tp == 0x01) {
         memcpy(&wifi_version, g_airlink_ext_dev_info.wifi.version, 4);
     }
-    cJSON_AddNumberToObject(mreport_data, "wifiver", wifi_version);
+    cJSON_AddNumberToObject(mreport_data, "wifi_ver", wifi_version);
+
+    // wifi mac
+    char mac[18] = {0};
+    sprintf_(mac, "%02x:%02x:%02x:%02x:%02x:%02x", g_airlink_ext_dev_info.wifi.sta_mac[0], g_airlink_ext_dev_info.wifi.sta_mac[1], g_airlink_ext_dev_info.wifi.sta_mac[2], g_airlink_ext_dev_info.wifi.sta_mac[3], g_airlink_ext_dev_info.wifi.sta_mac[4], g_airlink_ext_dev_info.wifi.sta_mac[5]);
+    cJSON_AddStringToObject(mreport_data, "wifi_sta_mac", mac);
+    sprintf_(mac, "%02x:%02x:%02x:%02x:%02x:%02x", g_airlink_ext_dev_info.wifi.ap_mac[0], g_airlink_ext_dev_info.wifi.ap_mac[1], g_airlink_ext_dev_info.wifi.ap_mac[2], g_airlink_ext_dev_info.wifi.ap_mac[3], g_airlink_ext_dev_info.wifi.ap_mac[4], g_airlink_ext_dev_info.wifi.ap_mac[5]);
+    cJSON_AddStringToObject(mreport_data, "wifi_ap_mac", mac);
+    sprintf_(mac, "%02x:%02x:%02x:%02x:%02x:%02x", g_airlink_ext_dev_info.wifi.bt_mac[0], g_airlink_ext_dev_info.wifi.bt_mac[1], g_airlink_ext_dev_info.wifi.bt_mac[2], g_airlink_ext_dev_info.wifi.bt_mac[3], g_airlink_ext_dev_info.wifi.bt_mac[4], g_airlink_ext_dev_info.wifi.bt_mac[5]);
+    cJSON_AddStringToObject(mreport_data, "wifi_bt_mac", mac);
+
+    // wifi状态
+    cJSON_AddNumberToObject(mreport_data, "wifi_sta_state", g_airlink_ext_dev_info.wifi.sta_state);
+    cJSON_AddNumberToObject(mreport_data, "wifi_ap_state", g_airlink_ext_dev_info.wifi.ap_state);
+
+    // wifi connect ap bssid/rssi/channel
+    if (g_airlink_ext_dev_info.wifi.sta_state == 1) {
+        sprintf_(mac, "%02x:%02x:%02x:%02x:%02x:%02x", g_airlink_ext_dev_info.wifi.sta_ap_bssid[0], g_airlink_ext_dev_info.wifi.sta_ap_bssid[1], g_airlink_ext_dev_info.wifi.sta_ap_bssid[2], g_airlink_ext_dev_info.wifi.sta_ap_bssid[3], g_airlink_ext_dev_info.wifi.sta_ap_bssid[4], g_airlink_ext_dev_info.wifi.sta_ap_bssid[5]);
+        cJSON_AddStringToObject(mreport_data, "wifi_bssid", mac);
+        cJSON_AddNumberToObject(mreport_data, "wifi_rssi", g_airlink_ext_dev_info.wifi.sta_ap_rssi);
+        cJSON_AddNumberToObject(mreport_data, "wifi_channel", g_airlink_ext_dev_info.wifi.sta_ap_channel);
+    }
+}
+
+// 内存信息
+static void luat_mreport_meminfo(cJSON* mreport_data) {
+    // 当前内存状态
+    size_t total = 0;
+    size_t used = 0;
+    size_t max_used = 0;
+    cJSON* meminfo_sram = cJSON_CreateArray();
+    luat_meminfo_opt_sys(LUAT_HEAP_SRAM, &total, &used, &max_used);
+    cJSON_AddItemToArray(meminfo_sram, cJSON_CreateNumber(total));
+    cJSON_AddItemToArray(meminfo_sram, cJSON_CreateNumber(used));
+    cJSON_AddItemToArray(meminfo_sram, cJSON_CreateNumber(max_used));
+    cJSON_AddItemToObject(mreport_data, "mem_sram", meminfo_sram);
+    
+    cJSON* meminfo_psram = cJSON_CreateArray();
+    luat_meminfo_opt_sys(LUAT_HEAP_PSRAM, &total, &used, &max_used);
+    cJSON_AddItemToArray(meminfo_psram, cJSON_CreateNumber(total));
+    cJSON_AddItemToArray(meminfo_psram, cJSON_CreateNumber(used));
+    cJSON_AddItemToArray(meminfo_psram, cJSON_CreateNumber(max_used));
+    cJSON_AddItemToObject(mreport_data, "mem_psram", meminfo_psram);
+
+    cJSON* meminfo_luavm = cJSON_CreateArray();
+    luat_meminfo_luavm(&total, &used, &max_used);
+    cJSON_AddItemToArray(meminfo_luavm, cJSON_CreateNumber(total));
+    cJSON_AddItemToArray(meminfo_luavm, cJSON_CreateNumber(used));
+    cJSON_AddItemToArray(meminfo_luavm, cJSON_CreateNumber(max_used));
+    cJSON_AddItemToObject(mreport_data, "mem_lua", meminfo_luavm);
+    cJSON_AddNumberToObject(mreport_data, "memfree", total - used);
 }
 
 void luat_mreport_send(void) {
@@ -198,21 +283,26 @@ void luat_mreport_send(void) {
     size_t olen = 0;
     cJSON* mreport_data = cJSON_CreateObject();
 
-    luat_netdrv_t* netdrv = luat_netdrv_get(NW_ADAPTER_INDEX_LWIP_GPRS);
+    int adapter_index = network_register_get_default();
+	if (adapter_index < 0 || adapter_index >= NW_ADAPTER_QTY){
+		LLOGE("尚无已注册的网络适配器");
+		return;
+	}
+    luat_netdrv_t* netdrv = luat_netdrv_get(adapter_index);
     if (netdrv == NULL || netdrv->netif == NULL) {
         return;
     }
 
     struct netif *netif = netdrv->netif;
-    if (netif == NULL || ip_addr_isany(&netif->ip_addr)) {
-        // LLOGD("还没联网");
+    if (ip_addr_isany(&netif->ip_addr)) {
+        LLOGD("还没联网");
         return;
     }
 
     if (mreport_pcb == NULL) {
         mreport_pcb = udp_new();
         if (mreport_pcb == NULL) {
-            LLOGE("创建udp pcb 失败, 内存不足?");
+            LLOGE("创建,mreport udp pcb 失败, 内存不足?");
             cJSON_Delete(mreport_data);
             return;
         }
@@ -226,83 +316,40 @@ void luat_mreport_send(void) {
         return;
     }
 
-    // 时间戳
-	time_t t;
-	time(&t);
-    cJSON_AddNumberToObject(mreport_data, "localtime", t);
-
-    // luatos项目信息
-    cJSON_AddStringToObject(mreport_data, "proj", project_name);
-    cJSON_AddStringToObject(mreport_data, "pver", project_version);
-
+    // 基础信息
+    luat_mreport_sys_basic(mreport_data);
     // 模组信息
     luat_mreport_mobile(mreport_data);
-
     // sim卡和网络相关
     luat_mreport_sim_network(mreport_data, netif);
-
     // adc信息
     luat_mreport_adc(mreport_data);
-
     // wifi信息
+#ifdef LUAT_USE_DRV_WLAN
     luat_mreport_wifi(mreport_data);
-
-    // rndis
-    cJSON_AddNumberToObject(mreport_data, "rndis", 0);
-    // usb
-    cJSON_AddNumberToObject(mreport_data, "usb", 1);
-    // vbus
-    cJSON_AddNumberToObject(mreport_data, "vbus", 1);
-
-    // 开机原因
-    cJSON_AddNumberToObject(mreport_data, "powerreson", luat_pm_get_poweron_reason());
-    // 当前内存状态
-    size_t total = 0;
-    size_t used = 0;
-    size_t max_used = 0;
-    cJSON* meminfo_sram = cJSON_CreateArray();
-    luat_meminfo_opt_sys(LUAT_HEAP_SRAM, &total, &used, &max_used);
-    cJSON_AddItemToArray(meminfo_sram, cJSON_CreateNumber(total));
-    cJSON_AddItemToArray(meminfo_sram, cJSON_CreateNumber(used));
-    cJSON_AddItemToArray(meminfo_sram, cJSON_CreateNumber(max_used));
-    cJSON_AddItemToObject(mreport_data, "mem_sram", meminfo_sram);
-    
-    cJSON* meminfo_psram = cJSON_CreateArray();
-    luat_meminfo_opt_sys(LUAT_HEAP_PSRAM, &total, &used, &max_used);
-    cJSON_AddItemToArray(meminfo_psram, cJSON_CreateNumber(total));
-    cJSON_AddItemToArray(meminfo_psram, cJSON_CreateNumber(used));
-    cJSON_AddItemToArray(meminfo_psram, cJSON_CreateNumber(max_used));
-    cJSON_AddItemToObject(mreport_data, "mem_sys", meminfo_psram);
-    cJSON_AddItemToObject(mreport_data, "mem_psram", meminfo_psram);
-
-    cJSON* meminfo_luavm = cJSON_CreateArray();
-    luat_meminfo_luavm(&total, &used, &max_used);
-    cJSON_AddItemToArray(meminfo_luavm, cJSON_CreateNumber(total));
-    cJSON_AddItemToArray(meminfo_luavm, cJSON_CreateNumber(used));
-    cJSON_AddItemToArray(meminfo_luavm, cJSON_CreateNumber(max_used));
-    cJSON_AddItemToObject(mreport_data, "mem_lua", meminfo_luavm);
-    cJSON_AddNumberToObject(mreport_data, "memfree", total - used);
-
-    // 开机次数
-    cJSON_AddNumberToObject(mreport_data, "bootc", 1);
-
-    // 开机时长
-    uint64_t tick64 = luat_mcu_tick64();
-    uint64_t tmms = tick64 / 1000000;
-    uint64_t tms = tick64 % 1000000;
-    cJSON_AddNumberToObject(mreport_data, "tmms", tmms);
-    cJSON_AddNumberToObject(mreport_data, "tms", tms);
+#endif
+    // 内存信息
+    luat_mreport_meminfo(mreport_data);
 
     // 结束 转换成json字符串
     char* json = cJSON_PrintUnformatted(mreport_data);
+    if (json == NULL) {
+        LLOGE("拼接转换为json数据格式, 失败");
+        cJSON_Delete(mreport_data);
+        return;
+    }
     LLOGE("mreport json --- len: %d\r\n%s", strlen(json), json);
 
     struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, strlen(json), PBUF_RAM);
     if (p == NULL) {
         LLOGE("获取pbuf失败 %d", strlen(json));
+        free(json);
+        cJSON_Delete(mreport_data);
         return;
     }
+
     pbuf_take(p, json, strlen(json));
+    memcpy(&mreport_pcb->local_ip, &netif->ip_addr, sizeof(ip_addr_t));
     ret = udp_sendto_if(mreport_pcb, p, &host, MREPORT_PORT, netif);
     pbuf_free(p);
     free(json);