Explorar o código

refactor: 简化平台定义

RyanCW hai 6 meses
pai
achega
1d076834db

+ 10 - 1
.vscode/settings.json

@@ -35,6 +35,15 @@
         "utility": "c",
         "pthread.h": "c",
         "ryanmqtttest.h": "c",
-        "core_mqtt_config_defaults.h": "c"
+        "core_mqtt_config_defaults.h": "c",
+        "ryanmqttplatform.h": "c",
+        "ryanmqttclient.h": "c",
+        "ryanmqttlog.h": "c",
+        "valloc.h": "c",
+        "platformsystem.h": "c",
+        "ryanmqttpublic.h": "c",
+        "ryanmqttlist.h": "c",
+        "platformnetwork.h": "c",
+        "inttypes.h": "c"
     },
 }

+ 1 - 1
common/RyanMqttLog.c

@@ -1,5 +1,5 @@
 #include "RyanMqttLog.h"
-#include "platformSystem.h"
+#include "RyanMqttPlatform.h"
 #include <inttypes.h>
 
 void RyanMqttLogOutPut(char *lvl, uint8_t color, char *fileStr, uint32_t lineNum, char *const fmt, ...)

+ 1 - 1
coreMqtt/core_mqtt_config_defaults.h

@@ -44,7 +44,7 @@ extern "C"
 #endif
 /* *INDENT-ON* */
 
-#include "platformSystem.h"
+#include "RyanMqttPlatform.h"
 
 /* The macro definition for MQTT_DO_NOT_USE_CUSTOM_CONFIG is for Doxygen
  * documentation only. */

+ 1 - 1
mqttclient/RyanMqttClient.c

@@ -372,7 +372,7 @@ __exit:
 
 	for (int32_t i = 0; i < count; i++)
 	{
-		// 创建msg包,允许服务端在发送 SUBACK 报文之前就开始发送与订阅匹配的 PUBLISH 报文。
+		// ?创建msg包,3.8.4响应,允许服务端在发送 SUBACK 报文之前就开始发送与订阅匹配的 PUBLISH 报文。
 		result = RyanMqttMsgHandlerCreate(client, subscriptionList[i].pTopicFilter,
 						  subscriptionList[i].topicFilterLength, packetId,
 						  (RyanMqttQos_e)subscriptionList[i].qos, NULL, &msgToListHandler);

+ 2 - 1
mqttclient/RyanMqttThreadProcessPacket.c

@@ -282,7 +282,7 @@ static RyanMqttError_e RyanMqttSubackHandler(RyanMqttClient_t *client, MQTTPacke
 		}
 		platformMutexUnLock(client->config.userData, &client->msgHandleLock);
 
-		// 服务回复的ack数和记录的ack数不一致就清除所有ack
+		// 服务回复的ack数和记录的ack数不一致就清除所有ack
 		RyanMqttCheckCode(ackMsgCount == statusCount, RyanMqttNoRescourceError, RyanMqttLog_d, {
 			RyanMqttClearAckSession(client, MQTT_PACKET_TYPE_SUBACK, packetId);
 			platformMutexLock(client->config.userData, &client->msgHandleLock);
@@ -300,6 +300,7 @@ static RyanMqttError_e RyanMqttSubackHandler(RyanMqttClient_t *client, MQTTPacke
 		});
 	}
 
+	// 到这里说明ackCount和msgCount是一致的
 	RyanMqttQos_e subscriptionQos;
 	uint32_t ackMsgIndex = 0;
 	const uint8_t *pStatusStart = &pIncomingPacket->pRemainingData[sizeof(uint16_t)];

+ 10 - 11
mqttclient/include/RyanMqttClient.h

@@ -5,10 +5,9 @@
 extern "C" {
 #endif
 
-#include "platformSystem.h"
-#include "platformNetwork.h"
 #include "RyanMqttLog.h"
 #include "RyanMqttList.h"
+#include "RyanMqttPlatform.h"
 #include "RyanMqttPublic.h"
 
 // 接收到订阅消息回调函数类型,eventData用户不要进行修改否则mqtt客户端可能崩溃
@@ -31,12 +30,12 @@ typedef struct
 
 typedef struct
 {
-	uint16_t packetId; // 关联的packetId
-	uint16_t topicLen; // 主题长度
-	RyanMqttQos_e qos; // qos等级
-	RyanMqttList_t list;   // 链表节点,用户勿动
-	char *topic;       // 主题
-	void *userData;    // 用户自定义数据
+	uint16_t packetId;   // 关联的packetId
+	uint16_t topicLen;   // 主题长度
+	RyanMqttQos_e qos;   // qos等级
+	RyanMqttList_t list; // 链表节点,用户勿动
+	char *topic;         // 主题
+	void *userData;      // 用户自定义数据
 } RyanMqttMsgHandler_t;
 
 typedef struct
@@ -46,7 +45,7 @@ typedef struct
 	uint16_t packetId;                   // 报文标识符 系统生成,用户勿动
 	RyanMqttBool_e isPreallocatedPacket; // 是否是预分配的内存
 	uint32_t packetLen;                  // 报文长度
-	RyanMqttList_t list;                     // 链表节点,用户勿动
+	RyanMqttList_t list;                 // 链表节点,用户勿动
 	RyanMqttTimer_t timer;               // ack超时定时器,用户勿动
 	RyanMqttMsgHandler_t *msgHandler;    // msg信息
 	uint8_t *packet;                     // 没有收到期望ack,重新发送的原始报文
@@ -117,8 +116,8 @@ typedef struct
 
 	// 维护消息处理列表,这是mqtt协议必须实现的内容,所有来自服务器的publish报文都会被处理(前提是订阅了对应的消息,或者设置了拦截器)
 	RyanMqttList_t msgHandlerList;
-	RyanMqttList_t ackHandlerList;              // 维护ack链表
-	RyanMqttList_t userAckHandlerList;          // 用户接口的ack链表,会由mqtt线程移动到ack链表
+	RyanMqttList_t ackHandlerList;          // 维护ack链表
+	RyanMqttList_t userAckHandlerList;      // 用户接口的ack链表,会由mqtt线程移动到ack链表
 	RyanMqttTimer_t ackScanThrottleTimer;   // ack链表检查节流定时器
 	RyanMqttTimer_t keepaliveTimer;         // 保活定时器
 	RyanMqttTimer_t keepaliveThrottleTimer; // 保活检查节流定时器

+ 87 - 0
mqttclient/include/RyanMqttPlatform.h

@@ -0,0 +1,87 @@
+#ifndef __RyanMqttPlatform__
+#define __RyanMqttPlatform__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "platformSystem.h"
+#include "platformNetwork.h"
+#include "RyanMqttPublic.h"
+
+#ifndef RyanMqttMemset
+#define RyanMqttMemset memset
+#endif
+
+#ifndef RyanMqttMemset
+#define RyanMqttStrlen strlen
+#endif
+
+#ifndef RyanMqttMemset
+#define RyanMqttMemcpy memcpy
+#endif
+
+#ifndef RyanMqttMemset
+#define RyanMqttStrcmp strcmp
+#endif
+
+#ifndef platformAssert
+#define platformAssert assert
+#endif
+
+// RyanMqttT内部imer接口
+typedef struct
+{
+	uint32_t time;
+	uint32_t timeOut;
+} RyanMqttTimer_t;
+
+extern void RyanMqttTimerInit(RyanMqttTimer_t *platformTimer);
+extern void RyanMqttTimerCutdown(RyanMqttTimer_t *platformTimer, uint32_t timeout);
+extern uint32_t RyanMqttTimerGetConfigTimeout(RyanMqttTimer_t *platformTimer);
+extern uint32_t RyanMqttTimerRemain(RyanMqttTimer_t *platformTimer);
+
+// 需用户实现的网络接口
+extern RyanMqttError_e platformNetworkInit(void *userData, platformNetwork_t *platformNetwork);
+extern RyanMqttError_e platformNetworkDestroy(void *userData, platformNetwork_t *platformNetwork);
+extern RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platformNetwork, const char *host,
+					      uint16_t port);
+extern int32_t platformNetworkRecvAsync(void *userData, platformNetwork_t *platformNetwork, char *recvBuf,
+					size_t recvLen, int32_t timeout);
+extern int32_t platformNetworkSendAsync(void *userData, platformNetwork_t *platformNetwork, char *sendBuf,
+					size_t sendLen, int32_t timeout);
+extern RyanMqttError_e platformNetworkClose(void *userData, platformNetwork_t *platformNetwork);
+
+// 需用户实现的内存接口
+extern void *platformMemoryMalloc(size_t size);
+extern void platformMemoryFree(void *ptr);
+
+// 需用户实现的打印接口
+extern void platformPrint(char *str, uint16_t strLen);
+// 需用户实现的ms延时接口
+extern void platformDelay(uint32_t ms);
+// 需用户实现的获取开机ms时间戳接口
+extern uint32_t platformUptimeMs(void);
+
+// 需用户实现的 RTOS 接口
+extern RyanMqttError_e platformThreadInit(void *userData, platformThread_t *platformThread, const char *name,
+					  void (*entry)(void *), void *const param, uint32_t stackSize,
+					  uint32_t priority);
+extern RyanMqttError_e platformThreadDestroy(void *userData, platformThread_t *platformThread);
+extern RyanMqttError_e platformThreadStart(void *userData, platformThread_t *platformThread);
+extern RyanMqttError_e platformThreadStop(void *userData, platformThread_t *platformThread);
+
+extern RyanMqttError_e platformMutexInit(void *userData, platformMutex_t *platformMutex);
+extern RyanMqttError_e platformMutexDestroy(void *userData, platformMutex_t *platformMutex);
+extern RyanMqttError_e platformMutexLock(void *userData, platformMutex_t *platformMutex);
+extern RyanMqttError_e platformMutexUnLock(void *userData, platformMutex_t *platformMutex);
+
+extern RyanMqttError_e platformCriticalInit(void *userData, platformCritical_t *platformCritical);
+extern RyanMqttError_e platformCriticalDestroy(void *userData, platformCritical_t *platformCritical);
+extern RyanMqttError_e platformCriticalEnter(void *userData, platformCritical_t *platformCritical);
+extern RyanMqttError_e platformCriticalExit(void *userData, platformCritical_t *platformCritical);
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 0 - 11
mqttclient/include/RyanMqttPublic.h

@@ -249,17 +249,6 @@ extern const char *RyanMqttStrError(int32_t state);
 
 /* extern variables-----------------------------------------------------------*/
 
-typedef struct
-{
-	uint32_t time;
-	uint32_t timeOut;
-} RyanMqttTimer_t;
-
-extern void RyanMqttTimerInit(RyanMqttTimer_t *platformTimer);
-extern void RyanMqttTimerCutdown(RyanMqttTimer_t *platformTimer, uint32_t timeout);
-extern uint32_t RyanMqttTimerGetConfigTimeout(RyanMqttTimer_t *platformTimer);
-extern uint32_t RyanMqttTimerRemain(RyanMqttTimer_t *platformTimer);
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 1
platform/linux/platformNetwork.c

@@ -1,6 +1,6 @@
 #define RyanMqttLogLevel (RyanMqttLogLevelDebug) // 日志打印等级
 
-#include "platformNetwork.h"
+#include "RyanMqttPlatform.h"
 #include "RyanMqttLog.h"
 
 /**

+ 0 - 13
platform/linux/platformNetwork.h

@@ -24,24 +24,11 @@ extern "C" {
 #include <fcntl.h>
 #include <signal.h>
 
-#include "RyanMqttPublic.h"
-#include "platformSystem.h"
-
 typedef struct
 {
 	int socket;
 } platformNetwork_t;
 
-extern RyanMqttError_e platformNetworkInit(void *userData, platformNetwork_t *platformNetwork);
-extern RyanMqttError_e platformNetworkDestroy(void *userData, platformNetwork_t *platformNetwork);
-extern RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platformNetwork, const char *host,
-					      uint16_t port);
-extern int32_t platformNetworkRecvAsync(void *userData, platformNetwork_t *platformNetwork, char *recvBuf,
-					size_t recvLen, int32_t timeout);
-extern int32_t platformNetworkSendAsync(void *userData, platformNetwork_t *platformNetwork, char *sendBuf,
-					size_t sendLen, int32_t timeout);
-extern RyanMqttError_e platformNetworkClose(void *userData, platformNetwork_t *platformNetwork);
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 0
platform/linux/platformSystem.c

@@ -1,5 +1,6 @@
 
 #include "platformSystem.h"
+#include "RyanMqttPlatform.h"
 
 /**
  * @brief 申请内存

+ 0 - 25
platform/linux/platformSystem.h

@@ -13,7 +13,6 @@ extern "C" {
 #include <unistd.h>
 #include <stdlib.h>
 #include <time.h>
-#include "RyanMqttPublic.h"
 #include "valloc.h"
 
 #define platformAssert(EX) assert(EX)
@@ -39,30 +38,6 @@ typedef struct
 	pthread_spinlock_t spin;
 } platformCritical_t;
 
-extern void *platformMemoryMalloc(size_t size);
-extern void platformMemoryFree(void *ptr);
-
-extern void platformPrint(char *str, uint16_t strLen);
-extern void platformDelay(uint32_t ms);
-extern uint32_t platformUptimeMs(void);
-
-extern RyanMqttError_e platformThreadInit(void *userData, platformThread_t *platformThread, const char *name,
-					  void (*entry)(void *), void *const param, uint32_t stackSize,
-					  uint32_t priority);
-extern RyanMqttError_e platformThreadDestroy(void *userData, platformThread_t *platformThread);
-extern RyanMqttError_e platformThreadStart(void *userData, platformThread_t *platformThread);
-extern RyanMqttError_e platformThreadStop(void *userData, platformThread_t *platformThread);
-
-extern RyanMqttError_e platformMutexInit(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexDestroy(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexLock(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexUnLock(void *userData, platformMutex_t *platformMutex);
-
-extern RyanMqttError_e platformCriticalInit(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalDestroy(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalEnter(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalExit(void *userData, platformCritical_t *platformCritical);
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 1
platform/openLuat/platformNetwork.c

@@ -1,6 +1,6 @@
 #define RyanMqttLogLevel (RyanMqttLogLevelDebug) // 日志打印等级
 
-#include "platformNetwork.h"
+#include "RyanMqttPlatform.h"
 #include "RyanMqttLog.h"
 
 /**

+ 0 - 13
platform/openLuat/platformNetwork.h

@@ -18,24 +18,11 @@ extern "C" {
 #include "lwip/sockets.h"
 #include "lwip/netdb.h"
 
-#include "RyanMqttPublic.h"
-#include "platformSystem.h"
-
 typedef struct
 {
 	int socket;
 } platformNetwork_t;
 
-extern RyanMqttError_e platformNetworkInit(void *userData, platformNetwork_t *platformNetwork);
-extern RyanMqttError_e platformNetworkDestroy(void *userData, platformNetwork_t *platformNetwork);
-extern RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platformNetwork, const char *host,
-					      uint16_t port);
-extern int32_t platformNetworkRecvAsync(void *userData, platformNetwork_t *platformNetwork, char *recvBuf,
-					size_t recvLen, int32_t timeout);
-extern int32_t platformNetworkSendAsync(void *userData, platformNetwork_t *platformNetwork, char *sendBuf,
-					size_t sendLen, int32_t timeout);
-extern RyanMqttError_e platformNetworkClose(void *userData, platformNetwork_t *platformNetwork);
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 1
platform/openLuat/platformSystem.c

@@ -1,5 +1,5 @@
-
 #include "platformSystem.h"
+#include "RyanMqttPlatform.h"
 
 /**
  * @brief 申请内存

+ 0 - 25
platform/openLuat/platformSystem.h

@@ -8,7 +8,6 @@ extern "C" {
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
-#include "RyanMqttPublic.h"
 #include "luat_debug.h"
 #include "luat_malloc.h"
 #include "luat_rtos.h"
@@ -35,30 +34,6 @@ typedef struct
 	uint32_t level;
 } platformCritical_t;
 
-extern void *platformMemoryMalloc(size_t size);
-extern void platformMemoryFree(void *ptr);
-
-extern void platformPrint(char *str, uint16_t strLen);
-extern void platformDelay(uint32_t ms);
-extern uint32_t platformUptimeMs(void);
-
-extern RyanMqttError_e platformThreadInit(void *userData, platformThread_t *platformThread, const char *name,
-					  void (*entry)(void *), void *const param, uint32_t stackSize,
-					  uint32_t priority);
-extern RyanMqttError_e platformThreadDestroy(void *userData, platformThread_t *platformThread);
-extern RyanMqttError_e platformThreadStart(void *userData, platformThread_t *platformThread);
-extern RyanMqttError_e platformThreadStop(void *userData, platformThread_t *platformThread);
-
-extern RyanMqttError_e platformMutexInit(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexDestroy(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexLock(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexUnLock(void *userData, platformMutex_t *platformMutex);
-
-extern RyanMqttError_e platformCriticalInit(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalDestroy(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalEnter(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalExit(void *userData, platformCritical_t *platformCritical);
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 1
platform/rtthread/platformNetwork.c

@@ -1,6 +1,6 @@
 #define RyanMqttLogLevel (RyanMqttLogLevelDebug) // 日志打印等级
 
-#include "platformNetwork.h"
+#include "RyanMqttPlatform.h"
 #include "RyanMqttLog.h"
 
 /**

+ 0 - 14
platform/rtthread/platformNetwork.h

@@ -7,31 +7,17 @@ extern "C" {
 
 #include <stdio.h>
 #include <stdint.h>
-
 #include <rtthread.h>
 #include <sys/socket.h>
 #include <sys/errno.h>
 #include <sys/time.h>
 #include <netdb.h>
 
-#include "RyanMqttPublic.h"
-#include "platformSystem.h"
-
 typedef struct
 {
 	int socket;
 } platformNetwork_t;
 
-extern RyanMqttError_e platformNetworkInit(void *userData, platformNetwork_t *platformNetwork);
-extern RyanMqttError_e platformNetworkDestroy(void *userData, platformNetwork_t *platformNetwork);
-extern RyanMqttError_e platformNetworkConnect(void *userData, platformNetwork_t *platformNetwork, const char *host,
-					      uint16_t port);
-extern int32_t platformNetworkRecvAsync(void *userData, platformNetwork_t *platformNetwork, char *recvBuf,
-					size_t recvLen, int32_t timeout);
-extern int32_t platformNetworkSendAsync(void *userData, platformNetwork_t *platformNetwork, char *sendBuf,
-					size_t sendLen, int32_t timeout);
-extern RyanMqttError_e platformNetworkClose(void *userData, platformNetwork_t *platformNetwork);
-
 #ifdef __cplusplus
 }
 #endif

+ 1 - 0
platform/rtthread/platformSystem.c

@@ -1,4 +1,5 @@
 #include "platformSystem.h"
+#include "RyanMqttPlatform.h"
 
 /**
  * @brief 申请内存

+ 0 - 25
platform/rtthread/platformSystem.h

@@ -8,7 +8,6 @@ extern "C" {
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
-#include "RyanMqttPublic.h"
 #include <rtthread.h>
 
 #define platformAssert(EX) RT_ASSERT(EX)
@@ -32,30 +31,6 @@ typedef struct
 	rt_base_t level;
 } platformCritical_t;
 
-extern void *platformMemoryMalloc(size_t size);
-extern void platformMemoryFree(void *ptr);
-
-extern void platformPrint(char *str, uint16_t strLen);
-extern void platformDelay(uint32_t ms);
-extern uint32_t platformUptimeMs(void);
-
-extern RyanMqttError_e platformThreadInit(void *userData, platformThread_t *platformThread, const char *name,
-					  void (*entry)(void *), void *const param, uint32_t stackSize,
-					  uint32_t priority);
-extern RyanMqttError_e platformThreadDestroy(void *userData, platformThread_t *platformThread);
-extern RyanMqttError_e platformThreadStart(void *userData, platformThread_t *platformThread);
-extern RyanMqttError_e platformThreadStop(void *userData, platformThread_t *platformThread);
-
-extern RyanMqttError_e platformMutexInit(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexDestroy(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexLock(void *userData, platformMutex_t *platformMutex);
-extern RyanMqttError_e platformMutexUnLock(void *userData, platformMutex_t *platformMutex);
-
-extern RyanMqttError_e platformCriticalInit(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalDestroy(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalEnter(void *userData, platformCritical_t *platformCritical);
-extern RyanMqttError_e platformCriticalExit(void *userData, platformCritical_t *platformCritical);
-
 #ifdef __cplusplus
 }
 #endif

+ 22 - 21
test/RyanMqttPubTest.c

@@ -87,27 +87,28 @@ static RyanMqttError_e RyanMqttPublishTest(RyanMqttQos_e qos, int32_t count, uin
 	// 等待订阅主题成功
 	result = RyanMqttSubscribe(client, RyanMqttPubTestSubTopic, qos);
 	RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e, { goto __exit; });
-	for (int32_t i = 0;; i++)
-	{
-		int32_t subscribeTotal = 0;
-
-		result = RyanMqttGetSubscribeTotalCount(client, &subscribeTotal);
-		RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e,
-					  { goto __exit; });
-		if (1 == subscribeTotal)
-		{
-			break;
-		}
-
-		if (i > 3000)
-		{
-			RyanMqttLog_e("订阅主题失败");
-			result = RyanMqttFailedError;
-			goto __exit;
-		}
-
-		delay(1);
-	}
+    // !不等待topic订阅成功,检查是否正常接收消息
+	// for (int32_t i = 0;; i++)
+	// {
+	// 	int32_t subscribeTotal = 0;
+
+	// 	result = RyanMqttGetSubscribeTotalCount(client, &subscribeTotal);
+	// 	RyanMqttCheckCodeNoReturn(RyanMqttSuccessError == result, RyanMqttFailedError, RyanMqttLog_e,
+	// 				  { goto __exit; });
+	// 	if (1 == subscribeTotal)
+	// 	{
+	// 		break;
+	// 	}
+
+	// 	if (i > 3000)
+	// 	{
+	// 		RyanMqttLog_e("订阅主题失败");
+	// 		result = RyanMqttFailedError;
+	// 		goto __exit;
+	// 	}
+
+	// 	delay(1);
+	// }
 
 	// 生成随机的数据包大小
 	{