Selaa lähdekoodia

url start work ,but the post struct is not defined

flower_mr 2 kuukautta sitten
vanhempi
commit
590888c8aa

+ 22 - 24
app/build.gradle.kts

@@ -40,42 +40,40 @@ android {
 }
 
 dependencies {
-
+    // 基础依赖
     implementation(libs.androidx.core.ktx)
     implementation(libs.androidx.lifecycle.runtime.ktx)
     implementation(libs.androidx.activity.compose)
-    implementation(platform(libs.androidx.compose.bom))
-    implementation(libs.androidx.ui)
-    implementation(libs.androidx.ui.graphics)
-    implementation(libs.androidx.ui.tooling.preview)
-    implementation(libs.androidx.material3)
+
+    // Compose BOM(确保版本 ≥ 2023.08.00)
+    implementation(platform("androidx.compose:compose-bom:2023.10.01")) // 关键改动:直接指定最新 BOM
+    implementation("androidx.compose.ui:ui")
+    implementation("androidx.compose.ui:ui-graphics")
+    implementation("androidx.compose.ui:ui-tooling-preview")
+    implementation("androidx.compose.material3:material3") // 关键改动:通过 BOM 自动匹配版本
+
+    // 移除重复的 material3 声明(避免版本冲突)
+    // implementation ("androidx.compose.material3:material3:1.2.2") // ⚠️ 注释掉这行
+
+    // 其他依赖...
     implementation(files("libs\\platform_sdk_v3.0.0514.jar"))
-    // 添加导航组件
     implementation("androidx.navigation:navigation-compose:2.7.7")
-    // 添加动画支持(可选)
     implementation("com.google.accompanist:accompanist-navigation-animation:0.28.0")
 
     // Retrofit
-    implementation ("com.squareup.retrofit2:retrofit:2.9.0")
-    implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
+    implementation("com.squareup.retrofit2:retrofit:2.9.0")
+    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
 
     // OkHttp
-    implementation ("com.squareup.okhttp3:okhttp:4.10.0")
-    implementation ("com.squareup.okhttp3:logging-interceptor:4.10.0")
+    implementation("com.squareup.okhttp3:okhttp:4.10.0")
+    implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
 
     // Coroutines
-    implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
-    implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4")
+    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") // 关键改动:升级协程版本
+    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
 
-    implementation ("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
-    implementation ("androidx.compose.material3:material3:1.1.2")
-    implementation ("androidx.compose.material:material:1.4.0" )
+    // ViewModel
+    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2")
 
-    testImplementation(libs.junit)
-    androidTestImplementation(libs.androidx.junit)
-    androidTestImplementation(libs.androidx.espresso.core)
-    androidTestImplementation(platform(libs.androidx.compose.bom))
-    androidTestImplementation(libs.androidx.ui.test.junit4)
-    debugImplementation(libs.androidx.ui.tooling)
-    debugImplementation(libs.androidx.ui.test.manifest)
+    // 测试依赖...
 }

+ 8 - 0
app/src/main/java/com/example/pda/navigation/NavGraph.kt

@@ -9,6 +9,7 @@ import androidx.navigation.navigation
 import com.example.pda.ui.DetailsScreen
 import com.example.pda.ui.MainScreen
 import com.example.pda.ui.ScanScreen
+import com.example.pda.ui.PingScreen
 
 // 定义应用程序的导航图
 fun NavGraphBuilder.appNavGraph(navController: NavController) {
@@ -19,6 +20,13 @@ fun NavGraphBuilder.appNavGraph(navController: NavController) {
             MainScreen(
                 onInventoryScan = { navController.navigate("scan") }, // 点击扫描按钮时导航到 "scan" 路由
                 onShelfScan = { navController.navigate("scan") }, // 点击扫描按钮时导航到 "scan" 路由
+                onPingScreen = { navController.navigate("ping") }, // 点击扫描按钮时导航到 "scan" 路由
+
+            )
+        }
+        composable("ping") {
+            PingScreen(
+                onMainScreen = {navController.navigate("main")}, // 点击返回按钮时导航到 "main" 路由
             )
         }
         // 定义 "scan" 路由,显示扫描屏幕

+ 2 - 2
app/src/main/java/com/example/pda/network/ApiService.kt

@@ -11,13 +11,13 @@ import retrofit2.http.QueryMap
 // 定义了一个接口 ApiService,用于与服务器进行库存相关的网络请求
 interface ApiService {
     // 提交库存数据到服务器的接口
-    @POST("inventory/submit")
+    @POST("asn/list")
     suspend fun submitInventory(
         @Body data: List<InventoryItem>
     ): Response<BaseResponse<Unit>>
 
     // 从服务器获取库存列表的接口
-    @GET("inventory/list")
+    @GET("asn/list")
     suspend fun getInventoryList(
         @QueryMap params: Map<String, String>
     ): Response<BaseResponse<List<InventoryItem>>>

+ 130 - 18
app/src/main/java/com/example/pda/network/NetworkPinger.kt

@@ -1,26 +1,138 @@
 package com.example.pda.network
 
-object NetworkPinger
-{
+import android.util.Log
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+//// 网络检测对象,用于执行网络可达性检查
+//object NetworkPinger {
+//    private const val TAG = "NetworkPinger"
+//    private val repository = PingRepository()
+//
+//    /**
+//     * 执行网络可达性检查
+//     * @param url 需要检测的完整地址(必须包含协议头)
+//     * @param onSuccess 检测成功的回调(响应码在200-299之间)
+//     * @param onError 检测失败的回调,携带错误信息
+//     */
+//    fun ping(
+//        url: String,
+//        onSuccess: () -> Unit,
+//        onError: (String) -> Unit
+//    ) {
+////        // 前置条件检查
+////        if (!url.startsWith("http://") && !url.startsWith("https://")) {
+////            onError("Invalid URL protocol")
+////            return
+////        }
+//
+//        CoroutineScope(Dispatchers.IO).launch {
+//            try {
+//                Log.d(TAG, "Starting ping to $url")
+//                val result = repository.ping(url)
+//
+//                withContext(Dispatchers.Main) {
+//                    if (result) {
+//                        Log.d(TAG, "Ping to $url succeeded")
+//                        onSuccess()
+//                    } else {
+//                        Log.w(TAG, "Ping to $url failed")
+//                        onError("Request completed but not successful")
+//                    }
+//                }
+//            } catch (e: Exception) {
+//                withContext(Dispatchers.Main) {
+//                    val errorMsg = when (e) {
+//                        is IllegalArgumentException -> "Invalid URL format"
+//                        else -> "Network error: ${e.localizedMessage}"
+//                    }
+//                    Log.e(TAG, "Ping to $url failed: ${e.javaClass.simpleName}")
+//                    onError(errorMsg)
+//                }
+//            }
+//        }
+//    }
+//
+//    // 内部仓库类处理具体请求逻辑
+//    private class PingRepository {
+//        /**
+//         * 执行实际的ping操作
+//         * @return Boolean 是否收到成功响应
+//         * @throws IllegalArgumentException 当URL格式无效时
+//         */
+//        suspend fun ping(url: String): Boolean {
+//            validateUrl(url)
+//            return try {
+//                val response = RetrofitPing.pingService.ping(url)
+//                response.isSuccessful
+//            } catch (e: Exception) {
+//                Log.e(TAG, "Ping request failed", e)
+//                false
+//            }
+//        }
+//
+//        /**
+//         * 验证URL格式有效性
+//         * @throws IllegalArgumentException 如果URL格式无效
+//         */
+//        private fun validateUrl(url: String) {
+//            if (!url.matches(Regex("^https?://.*"))) {
+//                throw IllegalArgumentException("Invalid URL format")
+//            }
+//        }
+//    }
+//}
+object NetworkPinger {
     private const val TAG = "NetworkPinger"
+    private const val TIMEOUT = 1000 // 超时时间(毫秒)
+    private const val PING_COUNT = 1 // 发送包数量
+
+    fun ping(
+        host: String, // 直接接收IP或主机名
+        onSuccess: () -> Unit,
+        onError: (String) -> Unit
+    ) {
+        CoroutineScope(Dispatchers.IO).launch {
+            try {
+                val process = ProcessBuilder().command(
+                    "/system/bin/ping",
+                    "-c", PING_COUNT.toString(),
+                    "-W", (TIMEOUT / 1000).toString(),
+                    host
+                ).redirectErrorStream(true).start()
+
+                val exitCode = withContext(Dispatchers.IO) {
+                    process.waitFor() // 等待进程结束
+                }
 
-    // 使用示例
-    class PingRepository {
-        /**
-         * 执行 HTTP Ping 操作
-         * @param url 需要 ping 的完整地址(需包含协议头,如 http:// 或 https://)
-         * @return Boolean 表示是否 ping 成功(响应码在 200-299 之间视为成功)
-         */
-        suspend fun ping(url: String): Boolean {
-            return try {
-                val response = RetrofitPing.pingService.ping(url)
-                response.isSuccessful
+                val output = process.inputStream.bufferedReader().use { it.readText() }
+
+                withContext(Dispatchers.Main) {
+                    if (exitCode == 0 && output.contains("ttl=", true)) {
+                        Log.d(TAG, "Ping to $host succeeded")
+                        onSuccess()
+                    } else {
+                        val errorMsg = when {
+                            output.contains("Network is unreachable") -> "网络不可达"
+                            output.contains("unknown host") -> "无效的主机地址"
+                            else -> "请求超时(${TIMEOUT}ms)"
+                        }
+                        Log.w(TAG, "Ping failed: $errorMsg")
+                        onError(errorMsg)
+                    }
+                }
             } catch (e: Exception) {
-                // 处理网络异常、无效 URL 等情况
-                false
+                withContext(Dispatchers.Main) {
+                    val errorMsg = when (e) {
+                        is SecurityException -> "缺少网络权限"
+                        else -> "系统错误: ${e.localizedMessage}"
+                    }
+                    Log.e(TAG, "Ping execution failed", e)
+                    onError(errorMsg)
+                }
             }
         }
     }
-}
-
-
+}

+ 1 - 1
app/src/main/java/com/example/pda/network/RetrofitClient.kt

@@ -6,7 +6,7 @@ import retrofit2.converter.gson.GsonConverterFactory
 // RetrofitClient 对象用于创建和管理 Retrofit 实例
 object RetrofitClient {
     // 私有常量 BASE_URL 定义了 API 的基础 URL
-    private const val BASE_URL = "https://your-api-domain.com/api/v1/"
+    private const val BASE_URL = "http://192.168.196.51:8008/"
 
     // val instance 通过 lazy 委托实现懒加载,创建 ApiService 的单例实例
     val instance: ApiService by lazy {

+ 54 - 29
app/src/main/java/com/example/pda/ui/DetailsScreen.kt

@@ -4,20 +4,21 @@ import androidx.compose.foundation.layout.*
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.itemsIndexed
 import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material.ScaffoldState
+import androidx.compose.material3.SnackbarHost
+import androidx.compose.material3.SnackbarHostState
+
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.ArrowBack
 import androidx.compose.material.icons.filled.Home
-import androidx.compose.material.rememberScaffoldState
-import androidx.compose.material3.Scaffold
-
 
+import androidx.compose.material3.Scaffold
 import androidx.compose.material3.*
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.painterResource
@@ -30,18 +31,23 @@ import com.example.pda.R
 import com.example.pda.function.ResultCount
 import com.example.pda.function.ResultCounter
 import com.example.pda.ui.viewmodel.InventoryViewModel
-
+import com.example.pda.model.InventoryItem
+import com.example.pda.ui.viewmodel.PingViewmodel
+import kotlinx.coroutines.launch
 
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
+
 fun DetailsScreen(
     result: String,
     onBack: () -> Unit,
     onMainScreen: () -> Unit,
     onShelfScan: () -> Unit,
-    scaffoldState: ScaffoldState = rememberScaffoldState() // 添加 ScaffoldState
+
 ) {
+    val snackbarHostState = remember { SnackbarHostState() }
+    val scope = rememberCoroutineScope()
     val resultCounter = ResultCounter()
     val viewModel: InventoryViewModel = viewModel()
     val editableResults = remember {
@@ -49,6 +55,7 @@ fun DetailsScreen(
             addAll(resultCounter.getStatistics())
         }
     }
+    val  Inventoryitems: MutableList<InventoryItem> = mutableListOf()
     // 初始化数据
     LaunchedEffect(Unit) {
         result.split(",").forEach {
@@ -58,25 +65,29 @@ fun DetailsScreen(
         editableResults.addAll(resultCounter.getStatistics())
     }
     val uiState = viewModel.uiState.collectAsState()
-    LaunchedEffect(uiState) {
-        when (uiState) {
+
+    LaunchedEffect(uiState.value) {
+        when (val currentState = uiState.value) {
             is InventoryViewModel.UiState.Success -> {
-                val message = (uiState as InventoryViewModel.UiState.Success).message
-                scaffoldState.snackbarHostState.showSnackbar(message)
+                scope.launch {
+                    snackbarHostState.showSnackbar(currentState.message)
+                    viewModel.resetState()
+                }
                 resultCounter.clear()
                 editableResults.clear()
-                viewModel.resetState()
             }
             is InventoryViewModel.UiState.Error -> {
-                val error = (uiState as InventoryViewModel.UiState.Error).message
-                scaffoldState.snackbarHostState.showSnackbar("错误:$error")
-                viewModel.resetState()
+                scope.launch {
+                    snackbarHostState.showSnackbar("错误:${currentState.message}")
+                    viewModel.resetState()
+                }
             }
             else -> {}
         }
     }
+
     Scaffold(
-//        scaffoldState = scaffoldState,
+        snackbarHost = { SnackbarHost(snackbarHostState) },
         topBar = {
             TopAppBar(
                 title = { Text("扫描结果详情") },
@@ -94,14 +105,14 @@ fun DetailsScreen(
             Box(
                  modifier = Modifier.fillMaxWidth(),
                  contentAlignment = Alignment.Center
-            
+
             ) {
             Row(
             modifier = Modifier
                 .fillMaxWidth().padding(20.dp) ,
             verticalAlignment = Alignment.CenterVertically,
-            horizontalArrangement = Arrangement.SpaceEvenly,  
-                
+            horizontalArrangement = Arrangement.SpaceEvenly,
+
             ) {
                 ExtendedFloatingActionButton(
                     modifier = Modifier.weight(1f),
@@ -114,7 +125,7 @@ fun DetailsScreen(
                        },
                     text = { Text("主页") }
                 )
-       
+
                 Spacer(Modifier.width(8.dp)) // 添加间距
 
                 ExtendedFloatingActionButton(
@@ -132,7 +143,7 @@ fun DetailsScreen(
 
                 ExtendedFloatingActionButton(
                     modifier = Modifier.weight(1f),
-                    onClick ={onsubmit(resultCounter,editableResults)} ,
+                    onClick ={onsubmit(resultCounter,editableResults,Inventoryitems)} ,
                     icon = {
                         Icon(
                             painter = painterResource(id = R.drawable.ic_scan),
@@ -142,14 +153,18 @@ fun DetailsScreen(
                     text = { Text("确认入库") }
                 )
 
-//                ExtendedFloatingActionButton(
-//                    onClick = {
-//                        val submitData = editableResults.map {
-//                            InventoryItem(it.normalizedResult, it.occurrences)
-//                        }
-//                        viewModel.submitData(submitData)
-//                    }
-//                )
+                ExtendedFloatingActionButton(
+                    modifier = Modifier.weight(1f),
+                    onClick ={viewModel.submitData(Inventoryitems)} ,
+                    icon = {
+                        Icon(
+                            painter = painterResource(id = R.drawable.ic_scan),
+                            contentDescription = "ping"
+                        )
+                    },
+                    text = { Text("ping") }
+                )
+
 
             }
             }
@@ -240,7 +255,17 @@ fun DetailsScreen(
     }
 }
 
-private fun onsubmit( resultCounter: ResultCounter, editableResults: MutableList<ResultCount>){
+private fun onsubmit(resultCounter: ResultCounter, editableResults: MutableList<ResultCount>, items: MutableList<InventoryItem>) {
+
+
+    // 使用 map 进行转换,并更新 items
+    items.clear()
+    items.addAll(editableResults.map { result ->
+        InventoryItem(
+            normalizedResult = result.normalizedResult, // 将对应字段映射到 InventoryItem 中
+            occurrences = result.occurrences // 将对应字段映射到 InventoryItem 中
+        )
+    })
     resultCounter.clear()
     editableResults.clear()
 }

+ 4 - 3
app/src/main/java/com/example/pda/ui/MainScreen.kt

@@ -17,7 +17,8 @@ import com.example.pda.R
 @Composable
 fun MainScreen(
     onInventoryScan: () -> Unit,
-    onShelfScan: () -> Unit
+    onShelfScan: () -> Unit,
+    onPingScreen: () -> Unit
 ) {
     Scaffold(
         topBar = {
@@ -58,14 +59,14 @@ fun MainScreen(
                     text = { Text("入库扫描") }
                 )
                 ExtendedFloatingActionButton(
-                    onClick = onShelfScan,
+                    onClick = onPingScreen,
                     icon = {
                         Icon(
                             painter = painterResource(id = R.drawable.ic_scan),
                             contentDescription = "货架扫描"
                         )
                     },
-                    text = { Text("货架扫描") }
+                    text = { Text("ping") }
                 )
             }
             }

+ 101 - 0
app/src/main/java/com/example/pda/ui/PingScreen.kt

@@ -0,0 +1,101 @@
+package com.example.pda.ui
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.SnackbarHostState
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.*
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.Alignment
+
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.example.pda.ui.viewmodel.PingViewmodel
+import kotlinx.coroutines.launch
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun PingScreen(onMainScreen: () -> Unit) {
+    val viewModel: PingViewmodel = viewModel()
+    val uiState = viewModel.uiState.collectAsState()
+    val snackbarHostState = remember { SnackbarHostState() }
+    val coroutineScope = rememberCoroutineScope()
+    // 新增输入状态
+    val inputIp = remember { mutableStateOf("192.168.1.1") }
+
+    LaunchedEffect(uiState.value) {
+        when (val currentState = uiState.value) {
+            is PingViewmodel.UiState.Success -> {
+                coroutineScope.launch {
+                    snackbarHostState.showSnackbar(currentState.message)
+                    viewModel.resetState()
+                }
+            }
+            is PingViewmodel.UiState.Error -> {
+                coroutineScope.launch {
+                    snackbarHostState.showSnackbar("错误:${currentState.message}")
+                    viewModel.resetState()
+                }
+            }
+            else -> {}
+        }
+    }
+
+    Scaffold(
+        snackbarHost = { SnackbarHost(snackbarHostState) },
+        topBar = {
+            TopAppBar(
+                title = { Text("扫描结果详情") },
+                navigationIcon = {
+                    IconButton(onClick = onMainScreen) {
+                        Icon(Icons.Default.ArrowBack, "主页")
+                    }
+                }
+            )
+        }
+    ) { innerPadding ->
+        Column(
+            modifier = Modifier
+                .padding(innerPadding)
+                .fillMaxSize()
+                .padding(24.dp)
+        ) {
+            // 新增输入框
+            TextField(
+                value = inputIp.value,
+                onValueChange = { inputIp.value = it },
+                label = { Text("输入IP地址") },
+                modifier = Modifier.fillMaxWidth()
+            )
+
+            Spacer(Modifier.height(16.dp))
+
+            Text("扫描结果:", style = MaterialTheme.typography.titleLarge)
+            Spacer(Modifier.height(16.dp))
+            Card(Modifier.fillMaxWidth()) {
+                Text(
+                    text = "正在检测:${inputIp.value}",  // 显示输入内容
+                    modifier = Modifier.padding(16.dp),
+                    style = MaterialTheme.typography.bodyLarge,
+                    overflow = TextOverflow.Ellipsis,
+                    maxLines = 5
+                )
+            }
+            ExtendedFloatingActionButton(
+                modifier = Modifier
+                    .align(Alignment.CenterHorizontally) // 修正对齐方式
+                    .padding(top = 16.dp),
+                
+                onClick = { viewModel.ping(inputIp.value) } // 使用输入值
+            ) { Text("Ping测试") }
+        }
+    }
+}

+ 5 - 0
app/src/main/java/com/example/pda/ui/viewmodel/InventoryViewModel.kt

@@ -1,5 +1,6 @@
 package com.example.pda.ui.viewmodel
 
+import android.util.Log
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.example.pda.model.InventoryItem
@@ -39,10 +40,14 @@ class InventoryViewModel : ViewModel() {
                 // 成功回调,设置UI状态为 Success 并包含成功消息
                 onSuccess = {
                     _uiState.value = UiState.Success("提交成功")
+                    // 打印成功日志
+                    Log.d("InventoryViewModel", "提交成功")
                 },
                 // 错误回调,设置UI状态为 Error 并包含错误消息
                 onError = { error ->
                     _uiState.value = UiState.Error(error)
+                    // 打印错误日志
+                    Log.e("InventoryViewModel", error)
                 }
             )
         }

+ 10 - 10
app/src/main/java/com/example/pda/ui/viewmodel/Pingviewmodel.kt

@@ -1,15 +1,15 @@
 package com.example.pda.ui.viewmodel
 
+import android.util.Log
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
-
+import com.example.pda.network.NetworkPinger
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.launch
-import com.example.pda.network.PingRepository
 
 // ViewModel 类用于管理库存相关的UI状态和数据操作
-class Pingviewmodel : ViewModel() {
+class PingViewmodel : ViewModel() {
     // 私有 MutableStateFlow 用于存储UI状态,初始状态为 Idle
     private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
     // 公开的 StateFlow 提供给UI层观察当前UI状态
@@ -30,27 +30,27 @@ class Pingviewmodel : ViewModel() {
     // 提交库存数据的方法
     // 使用方式示例
     fun ping(targetUrl : String) {
-        val repository = PingRepository()
-
-        val result = repository.ping(targetUrl)
-        println("Ping result: ${if (result) "Success" else "Failed"}")
 
         // 在 viewModelScope 中启动协程以提交数据
         viewModelScope.launch {
             // 设置UI状态为 Loading 表示正在加载
             _uiState.value = UiState.Loading
             // 调用 NetworkHelper 提交数据
-            NetworkHelper.submitData(
-                data = data,
+            NetworkPinger.ping (
+                host = targetUrl,
                 // 成功回调,设置UI状态为 Success 并包含成功消息
                 onSuccess = {
-                    _uiState.value = UiState.Success("提交成功")
+                    _uiState.value = UiState.Success("成功链接")
                 },
                 // 错误回调,设置UI状态为 Error 并包含错误消息
                 onError = { error ->
                     _uiState.value = UiState.Error(error)
+                    Log.e("PingViewmodel", error.toString())
                 }
             )
+            Log.e(_uiState.value.toString(),"ping")
+
+           
         }
     }