Jelajahi Sumber

暂存udp开发

vothin 3 bulan lalu
induk
melakukan
0621be7634
42 mengubah file dengan 280 tambahan dan 216 penghapusan
  1. 1 1
      Manifest.xml
  2. TEMPAT SAMPAH
      Release/libzkgui.so
  3. TEMPAT SAMPAH
      Release/src/activity/callActivity.o
  4. TEMPAT SAMPAH
      Release/src/activity/countdownActivity.o
  5. TEMPAT SAMPAH
      Release/src/activity/customerAffairActivity.o
  6. TEMPAT SAMPAH
      Release/src/activity/deviceInfoActivity.o
  7. TEMPAT SAMPAH
      Release/src/activity/functionActivity.o
  8. TEMPAT SAMPAH
      Release/src/activity/interactionActivity.o
  9. TEMPAT SAMPAH
      Release/src/activity/mainActivity.o
  10. TEMPAT SAMPAH
      Release/src/activity/moreActivity.o
  11. TEMPAT SAMPAH
      Release/src/activity/navibar.o
  12. TEMPAT SAMPAH
      Release/src/activity/settingActivity.o
  13. TEMPAT SAMPAH
      Release/src/activity/sipTestActivity.o
  14. TEMPAT SAMPAH
      Release/src/activity/softapsettingActivity.o
  15. TEMPAT SAMPAH
      Release/src/activity/startActivity.o
  16. 3 0
      Release/src/activity/statusbar.d
  17. TEMPAT SAMPAH
      Release/src/activity/statusbar.o
  18. TEMPAT SAMPAH
      Release/src/activity/updateActivity.o
  19. TEMPAT SAMPAH
      Release/src/activity/wifisettingActivity.o
  20. TEMPAT SAMPAH
      Release/src/core/update_assistant.o
  21. TEMPAT SAMPAH
      Release/src/net/tcp_client.o
  22. TEMPAT SAMPAH
      Release/src/net/tcp_client5084.o
  23. TEMPAT SAMPAH
      Release/src/net/tcp_client5089.o
  24. TEMPAT SAMPAH
      Release/src/net/tcp_model.o
  25. TEMPAT SAMPAH
      Release/src/net/tcp_util.o
  26. 3 0
      Release/src/net/udp_client.d
  27. TEMPAT SAMPAH
      Release/src/net/udp_client.o
  28. TEMPAT SAMPAH
      Release/src/server/http_server.o
  29. TEMPAT SAMPAH
      Release/src/service/BusinessConfig.o
  30. TEMPAT SAMPAH
      Release/src/service/time.o
  31. TEMPAT SAMPAH
      Release/src/uart/ProtocolSender.o
  32. 27 27
      Release/src/uart/UartContext.d
  33. TEMPAT SAMPAH
      Release/src/uart/UartContext.o
  34. 7 6
      src/logic/deviceInfoLogic.cc
  35. 1 10
      src/logic/mainLogic.cc
  36. 2 2
      src/logic/startLogic.cc
  37. 23 5
      src/logic/statusbar.cc
  38. 179 139
      src/net/udp_client.cpp
  39. 2 1
      src/net/udp_client.h
  40. 3 3
      src/service/BusinessConfig.h
  41. 29 0
      src/utils/ByteUtil.h
  42. 0 22
      src/utils/JsonHelper.h

File diff ditekan karena terlalu besar
+ 1 - 1
Manifest.xml


TEMPAT SAMPAH
Release/libzkgui.so


TEMPAT SAMPAH
Release/src/activity/callActivity.o


TEMPAT SAMPAH
Release/src/activity/countdownActivity.o


TEMPAT SAMPAH
Release/src/activity/customerAffairActivity.o


TEMPAT SAMPAH
Release/src/activity/deviceInfoActivity.o


TEMPAT SAMPAH
Release/src/activity/functionActivity.o


TEMPAT SAMPAH
Release/src/activity/interactionActivity.o


TEMPAT SAMPAH
Release/src/activity/mainActivity.o


TEMPAT SAMPAH
Release/src/activity/moreActivity.o


TEMPAT SAMPAH
Release/src/activity/navibar.o


TEMPAT SAMPAH
Release/src/activity/settingActivity.o


TEMPAT SAMPAH
Release/src/activity/sipTestActivity.o


TEMPAT SAMPAH
Release/src/activity/softapsettingActivity.o


TEMPAT SAMPAH
Release/src/activity/startActivity.o


+ 3 - 0
Release/src/activity/statusbar.d

@@ -83,6 +83,7 @@ src/activity/statusbar.o: ../src/activity/statusbar.cpp \
  D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h \
  D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_util.h \
  D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/net/udp_client.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zknet\0.0.0\include/net/NetUtils.h
 
 ../src/activity/statusbar.h:
@@ -253,4 +254,6 @@ D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_util.h:
 
 D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h:
 
+D:\MyProgram\C++\linux_fenji_2.0\src/net/udp_client.h:
+
 D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zknet\0.0.0\include/net/NetUtils.h:

TEMPAT SAMPAH
Release/src/activity/statusbar.o


TEMPAT SAMPAH
Release/src/activity/updateActivity.o


TEMPAT SAMPAH
Release/src/activity/wifisettingActivity.o


TEMPAT SAMPAH
Release/src/core/update_assistant.o


TEMPAT SAMPAH
Release/src/net/tcp_client.o


TEMPAT SAMPAH
Release/src/net/tcp_client5084.o


TEMPAT SAMPAH
Release/src/net/tcp_client5089.o


TEMPAT SAMPAH
Release/src/net/tcp_model.o


TEMPAT SAMPAH
Release/src/net/tcp_util.o


+ 3 - 0
Release/src/net/udp_client.d

@@ -37,6 +37,7 @@ src/net/udp_client.o: ../src/net/udp_client.cpp ../src/net/udp_client.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/control/Common.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/system/Mutex.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/ime/IMEContext.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/utils/ByteUtil.h \
  D:\MyProgram\C++\linux_fenji_2.0\src/base/os.hpp \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/entry/EasyUIContext.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zknet\0.0.0\include/net/NetManager.h \
@@ -126,6 +127,8 @@ D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/system/Mutex.
 
 D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/ime/IMEContext.h:
 
+D:\MyProgram\C++\linux_fenji_2.0\src/utils/ByteUtil.h:
+
 D:\MyProgram\C++\linux_fenji_2.0\src/base/os.hpp:
 
 D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/entry/EasyUIContext.h:

TEMPAT SAMPAH
Release/src/net/udp_client.o


TEMPAT SAMPAH
Release/src/server/http_server.o


TEMPAT SAMPAH
Release/src/service/BusinessConfig.o


TEMPAT SAMPAH
Release/src/service/time.o


TEMPAT SAMPAH
Release/src/uart/ProtocolSender.o


+ 27 - 27
Release/src/uart/UartContext.d

@@ -7,15 +7,6 @@ src/uart/UartContext.o: ../src/uart/UartContext.cpp \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/utils/Log.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\log\0.0.0\include/android/log.h \
  D:\MyProgram\C++\linux_fenji_2.0\src/utils/ByteUtil.h \
- D:\MyProgram\C++\linux_fenji_2.0\src/base/strings.hpp \
- D:\MyProgram\C++\linux_fenji_2.0\src/service/BusinessConfig.h \
- D:\MyProgram\C++\linux_fenji_2.0\src/uart/CommDef.h \
- D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/storage/StoragePreferences.h \
- D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zkhardware\0.0.0\include/utils/BrightnessHelper.h \
- D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/utils/TimeHelper.h \
- D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_client.h \
- D:\MyProgram\C++\linux_fenji_2.0\src/net/net.h \
- D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/json.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/autolink.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/config.h \
@@ -25,6 +16,15 @@ src/uart/UartContext.o: ../src/uart/UartContext.cpp \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/reader.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/features.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/writer.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/base/strings.hpp \
+ D:\MyProgram\C++\linux_fenji_2.0\src/service/BusinessConfig.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/uart/CommDef.h \
+ D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/storage/StoragePreferences.h \
+ D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zkhardware\0.0.0\include/utils/BrightnessHelper.h \
+ D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/utils/TimeHelper.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_client.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/net/net.h \
+ D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h \
  D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_util.h \
  D:\MyProgram\C++\linux_fenji_2.0\src/core/utilities.h \
  D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\voip\4.0.2\include/telephone.h \
@@ -55,24 +55,6 @@ D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\log\0.0.0\include/android/log.h:
 
 D:\MyProgram\C++\linux_fenji_2.0\src/utils/ByteUtil.h:
 
-D:\MyProgram\C++\linux_fenji_2.0\src/base/strings.hpp:
-
-D:\MyProgram\C++\linux_fenji_2.0\src/service/BusinessConfig.h:
-
-D:\MyProgram\C++\linux_fenji_2.0\src/uart/CommDef.h:
-
-D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/storage/StoragePreferences.h:
-
-D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zkhardware\0.0.0\include/utils/BrightnessHelper.h:
-
-D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/utils/TimeHelper.h:
-
-D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_client.h:
-
-D:\MyProgram\C++\linux_fenji_2.0\src/net/net.h:
-
-D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h:
-
 D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/json.h:
 
 D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/autolink.h:
@@ -91,6 +73,24 @@ D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/features
 
 D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/json/writer.h:
 
+D:\MyProgram\C++\linux_fenji_2.0\src/base/strings.hpp:
+
+D:\MyProgram\C++\linux_fenji_2.0\src/service/BusinessConfig.h:
+
+D:\MyProgram\C++\linux_fenji_2.0\src/uart/CommDef.h:
+
+D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/storage/StoragePreferences.h:
+
+D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\zkhardware\0.0.0\include/utils/BrightnessHelper.h:
+
+D:\zkswe\FlyThingsPreview\bin\.dep\public\z21\easyui\0.0.0\include/utils/TimeHelper.h:
+
+D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_client.h:
+
+D:\MyProgram\C++\linux_fenji_2.0\src/net/net.h:
+
+D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_model.h:
+
 D:\MyProgram\C++\linux_fenji_2.0\src/net/tcp_util.h:
 
 D:\MyProgram\C++\linux_fenji_2.0\src/core/utilities.h:

TEMPAT SAMPAH
Release/src/uart/UartContext.o


+ 7 - 6
src/logic/deviceInfoLogic.cc

@@ -81,12 +81,13 @@ NetworkConfiguration GetNetworkConfiguration() {
 		}
 	}
 	else if (WIFIMANAGER->isConnected()) {
-		if (WIFIMANAGER->isAutoMode()) {
-			WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
-		}
-		else {
-			WIFIMANAGER->getStaticConfigureInfo(ip, mask, gateway, dns1, dns2);
-		}
+		WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
+//		if (WIFIMANAGER->isAutoMode()) {
+//			WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
+//		}
+//		else {
+//			WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
+//		}
 	}
 	return NetworkConfiguration{ip, mask, gateway};
 }

+ 1 - 10
src/logic/mainLogic.cc

@@ -211,6 +211,7 @@ public:
 		frameInfo["part_name"] = deviceInfo["part_name"].asString();
 		frameInfo["part_union_id"] = deviceInfo["part_union_id"].asString();
 
+		StoragePreferences::putString(STORE_FRAME_FULL_NAME, frameInfo["full_name"].asString());
 		getFrameInfo();
 	}
 
@@ -556,7 +557,6 @@ public:
 			}
 		}
 		return false;
-
 	}
 
 
@@ -846,15 +846,6 @@ void setFeeWin(bool result) {
 void setAdviceWin(bool result) {
 }
 
-std::string getFrameFullName() {
-	if (frameInfo.isMember("full_name")) {
-		return frameInfo["full_name"].asString();
-	}
-	else {
-		return "";
-	}
-}
-
 /**
  * 注册定时器
  * 填充数组用于注册定时器

+ 2 - 2
src/logic/startLogic.cc

@@ -1606,10 +1606,10 @@ static void onProtocolDataUpdate(const SProtocolData &data) {
 	}
 	else if (data.state == "4") {
 		if (data.cmd == "KEY6" && isConnectHandle) {
-			sendDataRemindOhter(getFrameFullName() + " " + LANGUAGEMANAGER->getValue("HandleDisconnected"));
+			sendDataRemindOhter(StoragePreferences::getString(STORE_FRAME_FULL_NAME, "") + " " + LANGUAGEMANAGER->getValue("HandleDisconnected"));
 		}
 		else if (data.cmd == "KEY7" && isConnectSos) {
-			sendDataRemindOhter(getFrameFullName() + " " + LANGUAGEMANAGER->getValue("SosDisconnected"));
+			sendDataRemindOhter(StoragePreferences::getString(STORE_FRAME_FULL_NAME, "") + " " + LANGUAGEMANAGER->getValue("SosDisconnected"));
 		}
 	}
 }

+ 23 - 5
src/logic/statusbar.cc

@@ -12,6 +12,7 @@
 #include "base/base.hpp"
 #include "service/BusinessConfig.h"
 #include "net/tcp_client.h"
+#include "net/udp_client.h"
 #include <net/NetUtils.h>
 #include <algorithm>
 
@@ -65,6 +66,8 @@ static std::string noCommonLight = "000F";
 static bool isStatusLightLock = false;
 static bool isDay = true;
 
+static bool isNetToUdp = false;
+
 bool isConnectServer() {
     if (ETHERNETMANAGER->isConnected() || WIFIMANAGER->isConnected()) {
         if (tcpConnect) {
@@ -174,7 +177,7 @@ static bool _start_wifi_dhcp_client() {
 	}
 
 	if (!WIFIMANAGER->isConnected()) {
-		LOGD("WIFI连接状态");
+		LOGD("WIFI连接状态");
 		return false;
 	}
 
@@ -199,7 +202,7 @@ static bool _start_eth_dhcp_client() {
 	}
 
 	if (!ETHERNETMANAGER->isConnected()) {
-		LOGD("以太网连接状态");
+		LOGD("以太网连接状态");
 		return false;
 	}
 
@@ -283,6 +286,11 @@ static void updateNetState(){
             	networkNowConnect = networkConnect;
             	statusLight();
             }
+
+            if (!isNetToUdp) {
+            	isNetToUdp = true;
+            	UdpClient::instance()->startUdp();
+            }
 		}
 		else {
 			mPainter1Ptr->setBackgroundColor(0xFF949494);
@@ -291,6 +299,10 @@ static void updateNetState(){
             	networkNowConnect = networkConnect;
             	statusLight();
             }
+
+            if (isNetToUdp) {
+            	isNetToUdp = false;
+            }
 		}
 		break;
 	case E_NET_CHANNEL_WIFI:
@@ -301,6 +313,11 @@ static void updateNetState(){
             	networkNowConnect = networkConnect;
             	statusLight();
             }
+
+            if (!isNetToUdp) {
+            	isNetToUdp = true;
+            	UdpClient::instance()->startUdp();
+            }
 		}
 		else {
 			mPainter1Ptr->setBackgroundColor(0xFF949494);
@@ -309,6 +326,10 @@ static void updateNetState(){
             	networkNowConnect = networkConnect;
             	statusLight();
             }
+
+            if (isNetToUdp) {
+            	isNetToUdp = false;
+            }
 		}
 		break;
 	case E_NET_CHANNEL_SOFTAP:
@@ -655,9 +676,6 @@ public:
 					setWifiOpen = false;
 				}
 			}
-
-			LOGD("触发udp广播");
-			UdpClient::instance()->startUdp();
 			break;
 		case E_ETH_DISCONNECTED:
 			LOGD("以太网断开");

+ 179 - 139
src/net/udp_client.cpp

@@ -7,12 +7,15 @@
 
 #include "udp_client.h"
 
+#include <system/Thread.h>
+#include <string>
+#include <chrono>
+
 #include "entry/EasyuiContext.h"
 #include "utils/Log.h"
+#include "utils/ByteUtil.h"
 #include "base/os.hpp"
 #include "base/strings.hpp"
-#include <system/Thread.h>
-#include <string>
 #include "net/NetManager.h"
 #include "service/BusinessConfig.h"
 #include "core/utilities.h"
@@ -20,9 +23,9 @@
 #define ETHERNETMANAGER		NETMANAGER->getEthernetManager()
 #define WIFIMANAGER			NETMANAGER->getWifiManager()
 
-#define DISCOVERY_PORT    8030
-#define DISCOVERY_TIMEOUT  5  // 广播探测超时5秒
-#define CONNECTION_TIMEOUT 10 // 连接超时10秒
+#define DISCOVERY_PORT    8031
+#define DISCOVERY_TIMEOUT  10
+#define CONNECTION_TIMEOUT 120
 
 void udpHandleMsg(byte* msg);
 
@@ -39,25 +42,28 @@ UdpClient* UdpClient::instance() {
 	return &singleton;
 }
 
+static net::Conn* discover_conn;
 static net::Conn* conn;
-static bool isUdpConnect = false;
 
 void UdpClient::sendMsg(const char* msg){
-	instance()->internalSendMsg(msg);
+	instance()->internalSendMsg(msg, conn);
+}
+
+void UdpClient::sendMsg(const char* msg, net::Conn* _conn){
+	instance()->internalSendMsg(msg, conn);
 }
 
-void UdpClient::internalSendMsg(const char* msg){
+void UdpClient::internalSendMsg(const char* msg, net::Conn* _conn) {
 	if (busy_) {
 		LOGD("udp client is busy");
 		return;
 	}
 	busy_ = true;
-	std::string msgStr = msg;
 	std::string endDelimiter = "#END#";
-	std::string finalMsg = msg + endDelimiter;
-	const char* sendMsg = finalMsg.c_str();
-	if (conn){
-		conn->Write((byte*)(sendMsg), strlen(sendMsg));
+	std::string msgStr = msg + endDelimiter;
+	const char* sendMsg = msgStr.c_str();
+	if (_conn){
+		_conn->Write((byte*)(sendMsg), strlen(sendMsg));
 		LOGD("udp sended msg : %s",sendMsg);
 	} else {
 		LOGD("udp disconnect");
@@ -97,12 +103,13 @@ std::string getBoasrAddress() {
 		}
 	}
 	else if (WIFIMANAGER->isConnected()) {
-		if (WIFIMANAGER->isAutoMode()) {
-			WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
-		}
-		else {
-			WIFIMANAGER->getStaticConfigureInfo(ip, mask, gateway, dns1, dns2);
-		}
+		WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
+//		if (WIFIMANAGER->isAutoMode()) {
+//			WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
+//		}
+//		else {
+//			WIFIMANAGER->getConfigureInfo(ip, mask, gateway, dns1, dns2);
+//		}
 	}
 
 	unsigned int ipAdd[4];
@@ -122,82 +129,112 @@ std::string getBoasrAddress() {
 		endIpAdd[i] = startIpAdd[i] + wilMask[i];
 	}
 
-	std::string boasrAddress =  std::to_string(endIpAdd[0]) + "." +  std::to_string(endIpAdd[1]) + "." +  std::to_string(endIpAdd[2]) + "." +  std::to_string(endIpAdd[3]) + ":8030";
+	std::string boasrAddress =  std::to_string(endIpAdd[0]) + "." +  std::to_string(endIpAdd[1]) + "." +  std::to_string(endIpAdd[2]) + "." +  std::to_string(endIpAdd[3]) + ":" + std::to_string(DISCOVERY_PORT);
 	return boasrAddress;
 }
 
-
-
 class UdpClientThread: public Thread {
 private:
 	enum State {
         STATE_DISCOVERING,  // 正在广播探测
         STATE_CONNECTED,    // 已连接服务器
-		STATE_DISCIONNECT,	// 服务器断开
+		STATE_DISCONNECT,	// 服务器断开
 	};
 
 	inline static std::string REQUEST = "REQUEST";
+	inline static std::string RESPONSE = "RESPONSE";
 	inline static std::string CONNECT = "CONNECT";
+	inline static std::string DISCONNECT = "DISCONNECT";
+	inline static std::string RECONNECT = "RECONNECT";
 
-    State current_state_;
-    std::string server_addr_;	// 服务器地址缓存
+	std::atomic<State> current_state_{STATE_DISCOVERING};
+    std::string server_ip_;	// 服务器地址缓存
     std::string server_port_;	// 服务器端口
-    int udpHeartbeatTime = 0;
 
-    static void requestUdpServerIp() {
+	bool send(net::Conn* _conn, const std::string msg) {
+		// 构造消息字符串
+		std::string endDelimiter = "#END#";
+		std::string msgStr = msg + endDelimiter;
+		const char* sendMsg = msgStr.data();
+
+		if (_conn){
+			_conn->Write((byte*)(sendMsg), strlen(sendMsg));
+			LOGD("向udp服务器发送消息 : %s", sendMsg);
+			return true;
+		}
+		LOGD("udp disconnect");
+		return false;
+	}
+
+    void requestUdpServerIp(net::Conn* _conn) {
     	Json::Value reqJson;
-    	reqJson["Action"] = REQUEST;
+    	reqJson["action"] = REQUEST;
 
 		Json::FastWriter writer;
 		const std::string req = writer.write(reqJson);
-		UdpClient::instance()->sendMsg(req.c_str());
+		send(_conn, req);
     }
 
-    static void getUdpServerIp(byte* inBytes) {
-
-    }
-
-    static void sendDeviceMsg() {
+    void sendDeviceMsg(net::Conn* _conn) {
 		Json::Value reqJson;
-		reqJson["Action"] = CONNECT;
-		reqJson["IPaddress"] = ip;
-		reqJson["mac-address"] = StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0");
-		reqJson["Gateway"] = gateway;
-		reqJson["SubnetMask"] = mask;
-		reqJson["sw-version"] = versionCode;
-		reqJson["Hardware"] = "";
-		reqJson["Id"] = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
+		reqJson["action"] = CONNECT;
+		reqJson["ip"] = ip;
+		reqJson["mac"] = StoragePreferences::getString(STORE_MAC_ADDR, "0.0.0.0");
+		reqJson["gateway"] = gateway;
+		reqJson["mask"] = mask;
+		reqJson["version"] = versionCode + "_" + std::to_string(versionNo);
+		reqJson["id"] = StoragePreferences::getInt(STORE_DEVICE_ID, 0);
+		reqJson["partId"] = StoragePreferences::getString(STORE_PARTID, "");
+		reqJson["partName"] = StoragePreferences::getString(STORE_PARTNAME, "");
+		reqJson["frameName"] = StoragePreferences::getString(STORE_FRAME_FULL_NAME, "");
 
 		Json::FastWriter writer;
 		const std::string req = writer.write(reqJson);
-		UdpClient::instance()->sendMsg(req.c_str());
+		send(_conn, req);
     }
 
-    static void handleDiscoveryState() {
+    void handleDiscoveryState() {
         LOGD("进入广播探测状态");
-        time_t start_time = time(nullptr);
+        using Clock = std::chrono::steady_clock;
+		constexpr auto TIMEOUT = std::chrono::seconds(60);
+		auto start_time = Clock::now();
 
 		// 设置一个默认地址
-		std::string boasrAddress = "172.28.100.100:8030";
+		std::string boasrAddress = "172.28.100.100:" + std::to_string(DISCOVERY_PORT);
 		if (ETHERNETMANAGER->isConnected() || WIFIMANAGER->isConnected()) {
 			boasrAddress = getBoasrAddress();
 		}
 		LOGD("UDP广播地址 ===> %s", boasrAddress.c_str());
 
-		net::Conn* discover_conn = net::Dial("udp", boasrAddress);
+		discover_conn = net::Dial("udp", boasrAddress);
 		if (!discover_conn) {
+            current_state_ = STATE_DISCONNECT;
+            LOGD("UDP广播连接失败,udp断开");
 			return;
 		}
 
-		requestUdpServerIp();
+		requestUdpServerIp(discover_conn);
 
 		byte buf[2048] = {0};
-		while (time(nullptr) - start_time < DISCOVERY_TIMEOUT) {
+        bool server_found = false;
+		while (true) {
+			auto elapsed = Clock::now() - start_time;
+			if (elapsed >= TIMEOUT) break;
+
 			//读取,超时1000毫秒
 			int n = discover_conn->Read(buf, sizeof(buf) - 1, 1000);
-
 			if (n > 0) {
-				getUdpServerIp(buf);
+				Json::Value jsonData = ByteUtil::byteArrayToJson(buf, n);
+				if (!jsonData.isNull() && jsonData.isMember("action")) {
+					if (jsonData["action"] == RESPONSE) {
+						server_ip_ = jsonData["ip"].asString();
+						server_port_ = jsonData["port"].asString();
+
+						LOGD("udp广播服务器的地址  ===> %s:%s", server_ip_.c_str(), server_port_.c_str());
+						server_found = true;
+						break;
+					}
+				}
 			}
 		}
 
@@ -205,54 +242,108 @@ private:
 		discover_conn->Close();
 		//释放内存
 		delete discover_conn;
+		discover_conn = NULL;
+
+		if (server_found) {
+			current_state_ = STATE_CONNECTED;
+			LOGD("收到udp服务器地址消息,切换到udp服务连接");
+		}
+		else {
+			current_state_ = STATE_DISCONNECT;
+			LOGD("未收到udp服务器地址消息,断开udp");
+		}
 	}
 
-    static void handleConnectedState() {
+    void handleConnectedState() {
         LOGD("进入连接状态");
-        char server_addr_str[64];
-        sprintf(server_addr_str, "%s:%d",
-                inet_ntoa(server_addr_.sin_addr),
-                ntohs(server_addr_.sin_port));
 
+        using namespace std::chrono;
+        using Clock = steady_clock;
+
+        std::string serverAddr = server_ip_ + ":" + server_port_;
+        LOGD("定向连接udp服务器  ===> %s", serverAddr.c_str());
         // 创建定向连接
-        net::Conn* conn = net::Dial("udp", server_addr_str);
+        conn = net::Dial("udp", serverAddr);
         if (!conn) {
-            current_state_ = STATE_DISCOVERING;
+            current_state_ = STATE_DISCONNECT;
+            LOGD("UDP定向连接失败,udp断开");
             return;
         }
 
-        // 发送设备注册信息(原有逻辑)
-        Json::Value reqJson;
-        // ... 填充注册信息 ...
-        std::string msg = Json::FastWriter().write(reqJson);
-        conn->Write((byte*)msg.c_str(), msg.size());
+        sendDeviceMsg(conn);
+
+		constexpr auto TIMEOUT = std::chrono::seconds(120);
+		constexpr auto HEARTBEAT = std::chrono::seconds(60);
+        auto last_recv_time = Clock::now();
+        auto last_heartbeat = Clock::now();
+        auto connection_start = Clock::now();
 
         // 通信循环
         byte buffer[2048];
-        last_recv_time_ = time(nullptr);
-        while (!exitPending()) {
-            // 接收数据
-            int n = conn->Read(buffer, sizeof(buffer)-1, 1000);
+        bool should_disconnect = false;
 
-            // 处理超时
-            if (time(nullptr) - last_recv_time_ > CONNECTION_TIMEOUT) {
-                LOGD("连接超时,返回探测状态");
+        while (!exitPending() && !should_disconnect) {
+            auto time_since_last = steady_clock::now() - last_recv_time;
+            if (time_since_last > TIMEOUT) {
+                LOGD("连接超时(已等待%lld秒)", time_since_last.count());
+                should_disconnect = true;
                 break;
             }
 
+			auto time_since_heartbeat = steady_clock::now() - last_heartbeat;
+			if (time_since_heartbeat >= HEARTBEAT) {
+				const std::string msg = "0";
+				send(conn, msg);
+			}
+
+            // 动态计算本次读操作的超时时间(毫秒)
+			auto remaining = duration_cast<milliseconds>(
+					TIMEOUT - time_since_last
+			);
+
+            // 接收数据
+            int n = conn->Read(buffer, sizeof(buffer)-1, 1000);
             if (n > 0) {
-                last_recv_time_ = time(nullptr); // 重置超时计时
-                buffer[n] = '\0';
-                handleServerMessage(buffer);     // 处理业务消息
+                last_recv_time = Clock::now(); // 更新最后有效接收时间
+
+                const char* cstr = reinterpret_cast<const char*>(buffer);
+				std::string str = cstr;
+				if (str == "1#END#"){
+					last_heartbeat = Clock::now();
+					continue;
+				}
+
+			    LOGD("收到定向udp服务返回消息  ===> %s", cstr);
+		    	Json::Value jsonData = ByteUtil::byteArrayToJson(buffer, n);
+		    	if (!jsonData.isNull() && jsonData.isMember("action")) {
+		    		if (jsonData["action"] == DISCONNECT) {
+		    			// 退出线程
+		                should_disconnect = true;
+		    	        current_state_ = STATE_DISCONNECT;
+		    	        break;
+		    		}
+		    		else if (jsonData["action"] == RECONNECT) {
+		    			sendDeviceMsg(conn);
+		    		}
+		    	}
+
+//                handleServerMessage(buffer);     // 处理业务消息
             } else if (n < 0 && n != net::E_TIMEOUT) {
+                should_disconnect = true;
+    	        current_state_ = STATE_DISCONNECT;
                 break; // 发生错误
             }
         }
 
+        // 计算总连接时长
+        auto total_duration = steady_clock::now() - connection_start;
+        LOGD("连接持续时间: %lld 秒", total_duration.count());
+
         // 清理连接
         conn->Close();
         delete conn;
-        current_state_ = STATE_DISCOVERING;
+        conn = NULL;
+        current_state_ = STATE_DISCONNECT;
     }
 
 public:
@@ -282,70 +373,17 @@ public:
 			return false;
 		}
 
-		// 设置一个默认地址
-		std::string boasrAddress = "172.28.100.100:8030";
-		if (ETHERNETMANAGER->isConnected() || WIFIMANAGER->isConnected()) {
-			boasrAddress = getBoasrAddress();
-		}
-		LOGD("UDP广播地址 ===> %s", boasrAddress.c_str());
-
-
-		conn = net::Dial("udp", boasrAddress);
-		if (conn) {
-			byte buf[2048] = {0};
-
-			sendDeviceMsg();
-
-			while (true && !exitPending()) {
-				//读取,超时1000毫秒
-                int n = conn->Read(buf, sizeof(buf) - 1, 1000);
-
-                udpHeartbeatTime += 1;
-                if (udpHeartbeatTime >= 10) {
-                	isUdpConnect = false;
-                    udpHeartbeatTime = 0;
-                    LOGD("心跳超时断开");
-                    break;
-                }
-				if (n > 0) {
-					isUdpConnect = true;
-					buf[n] = 0;
-
-					const char* cstr = reinterpret_cast<const char*>(buf);
-				    std::string str = cstr;
-				    if (str == "1"){
-				    	udpHeartbeatTime = 0;
-						continue;
-					}
-					LOGD("TCP received: %s", buf);
-//					handleMsg(buf);
-				}
-				else if (n == 0) {
-					isUdpConnect = false;
-					LOGD("连接正常断开");
-					break;
-				}
-				else if (n == net::E_TIMEOUT) {
-//					LOGD("读取超时");
-				}
-				else {
-					isUdpConnect = false;
-					LOGD("出错");
-					break;
-				}
-			}
-
-			//关闭连接
-			conn->Close();
-			//释放内存
-			delete conn;
-			conn = NULL;
+		switch (current_state_) {
+		case STATE_DISCOVERING:
+			handleDiscoveryState();
+			break;
+		case STATE_CONNECTED:
+			handleConnectedState();
+			break;
+		case STATE_DISCONNECT:
+			return false;
+			break;
 		}
-
-		//休眠5s
-		usleep(5000 * 1000);
-		LOGD("暂停5秒重新尝试连接TCP");
-		//返回真,继续下次线程循环
 		return true;
 	}
 };
@@ -355,7 +393,9 @@ static UdpClientThread udp_thread;
 void UdpClient::startUdp(){
 	LOGD("运行Udp线程");
 	//调用线程类的run函数启动线程, 参数为线程名,可以任意指定。
-	udp_thread.run("udp thread");
+	if (!udp_thread.isRunning()) {
+		udp_thread.run("udp thread");
+	}
 }
 
 void UdpClient::closeUdp() {
@@ -372,7 +412,7 @@ bool UdpClient::busy() {
 }
 
 bool UdpClient::connected() {
-	return conn != NULL;
+	return conn != NULL || discover_conn != NULL;
 }
 
 

+ 2 - 1
src/net/udp_client.h

@@ -23,12 +23,13 @@ public:
   void startUdp();
   void closeUdp();
   void sendMsg(const char* msg);
+  void sendMsg(const char* msg, net::Conn* _conn);
 
   static bool connected();
   static bool busy();
 private:
   UdpClient();
-  void internalSendMsg(const char* msg);
+  void internalSendMsg(const char* msg, net::Conn* _conn);
 private:
   std::atomic<bool> busy_;
 };

+ 3 - 3
src/service/BusinessConfig.h

@@ -30,6 +30,7 @@
 #define STORE_PARTNAME "part_name"
 #define STORE_CUSTOMER_ID "customer_id"
 #define STORE_MEMBER_ID "member_id"
+#define STORE_FRAME_FULL_NAME "frame_full_name"
 #define STORE_GATEWAY "gateway"
 #define STORE_HTTP_PORT "http_port"
 #define STORE_TCP_LOCAL_IP "tcp_local_ip"
@@ -97,8 +98,8 @@ static uint32_t defaultYellow = 0xFFE68024;
 static uint32_t defaultBlack = 0xFF000000;
 static uint32_t defaultWhite = 0xFFFFFFFF;
 
-static std::string versionCode = "v2.0.35";
-static int versionNo = 143;
+static std::string versionCode = "v2.0.36";
+static int versionNo = 144;
 static std::string versionType = "fenji";
 static std::unordered_set<std::string> versionTypePool = {
     "fenji",
@@ -291,7 +292,6 @@ void doCutsomerAffair(int execute);
 
 Json::Value getEventList();
 std::string getEventMap(std::string key);
-std::string getFrameFullName();
 
 void clearDeviceButtonFunction();
 void setDeviceButtonFunction(std::string deviceButtonFunctionStr);

+ 29 - 0
src/utils/ByteUtil.h

@@ -6,6 +6,8 @@
 #include <string>
 #include <iostream>
 #include <sstream>
+#include <memory>
+#include "json/json.h"
 
 
 /**
@@ -64,6 +66,33 @@ public:
 	    return ss.str();
 	}
 
+	static Json::Value byteArrayToJson(const unsigned char* data, size_t length) {
+	    // 1. 将字节数组转换为字符串
+	    const char* charData = reinterpret_cast<const char*>(data);
+	    std::string jsonStr(charData, length); // 使用指定长度的构造函数
+
+	    // 2. 创建JSON解析器
+	    Json::Value root;
+	    Json::CharReaderBuilder readerBuilder;
+	    std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
+
+	    // 3. 解析JSON数据
+	    JSONCPP_STRING err;
+	    const bool parseSuccess = reader->parse(
+	        jsonStr.c_str(),
+	        jsonStr.c_str() + jsonStr.size(),
+	        &root,
+	        &err
+	    );
+
+	    if (!parseSuccess) {
+	        LOGD("JSON 解析失败: %s", err.c_str());
+	        return Json::Value::null; // 返回空值表示错误
+	    }
+
+	    return root;
+	}
+
 };
 
 #endif /* _UTILS_TIME_BYTE_UTIL_H_ */

+ 0 - 22
src/utils/JsonHelper.h

@@ -1,22 +0,0 @@
-/*
- * JsonHelper.h
- *
- *  Created on: Aug 19, 2017
- *      Author: guoxs
- */
-
-#ifndef _UTILS_JSON_HELPER_H_
-#define _UTILS_JSON_HELPER_H_
-
-#include "json/json.h"
-
-using namespace std;
-
-class JsonHelper {
-public:
-	static bool readJsonFile(const char *pJsonFile, Json::Value &json);
-	static bool readJsonData(const char *pData, int len, Json::Value &json);
-	static bool writeJsonFile(const char *pJsonFile, const Json::Value &json);
-};
-
-#endif /* _UTILS_JSON_HELPER_H_ */