feat(vd960DBN): TCP JSON协议服务 — 端口5960, 鉴权+15条命令

- net_config.h: TCP_LISTEN=0→1, TCP=2 支持 JSON 监听
- 新增 tcp_json_srv.h/c: 行分隔 JSON, pwd_verify鉴权, 命令分发
- 实现15条协议命令: dev_info/ssc_net/iot_net/iot_topic/pwd_set/factory_reset等
- loop_param_set/query 接受命令返回stub(Loop MCU中继待实现)
- net_srv.c: 集成 JSON 中断路由 + init
- peripheral_main.c: 主循环 tcp_json_poll()
This commit is contained in:
wangfq
2026-06-30 14:53:53 +08:00
parent ece82be6dd
commit af997a79fe
5 changed files with 843 additions and 23 deletions

View File

@@ -17,6 +17,7 @@
#include <stdlib.h>
#include "cmcng.h"
#include "simple_json.h"
#include "tcp_json_srv.h"
uint32_t slen;
@@ -50,7 +51,7 @@ Net_State g_net_state = {0,0, 0};
uint16_t srcport = 6000;
//UINT8 UDPDESIP[4] = {255,255,255,255}; /* ????????????????????,?????????·???????????????????? */
//UINT8 UDPDESIP[4] = {255,255,255,255}; /* ????????????????????,?????????<EFBFBD><EFBFBD>???????????????????? */
//UINT16 aport=1000; /* CH579?????????? */
uint32_t g_wdg_counter = 0;
@@ -103,7 +104,7 @@ void mqtt_connect(void)
int len = 0;
mqttData.username.cstring = iot_net_info.username;
mqttData.password.cstring = iot_net_info.password;
mqttData.clientID.cstring = g_dev_number_str; //TODO: ?§????????????????????
mqttData.clientID.cstring = g_dev_number_str; //TODO: ?<EFBFBD><EFBFBD>????????????????????
mqttData.keepAliveInterval = MQTT_KEEPALIVE_INTERVAL;
PRINT("username:%s\r\n", mqttData.username.cstring);
@@ -480,6 +481,17 @@ void WCHNET_HandleSockInt(uint8_t socketid, uint8_t intstat)
{
uint8_t i;
// Route JSON protocol socket events
if (socketid == g_json_socket_listen || socketid == g_json_socket_client) {
tcp_json_handle_sock_int(socketid, intstat);
return;
}
// Also catch newly accepted TCP connections that might be JSON clients
if (intstat & SINT_STAT_CONNECT && g_json_socket_client == 0xFF && socketid != g_json_socket_listen) {
tcp_json_handle_sock_int(socketid, intstat);
return;
}
g_net_state.intstat = intstat;
if (intstat & SINT_STAT_RECV) //receive data
@@ -532,7 +544,7 @@ void WCHNET_HandleSockInt(uint8_t socketid, uint8_t intstat)
void dbn_net_ssc_srv(void)
{
uint8_t _flag_timestamp = 0;
static uint32_t _report_counter = 0; //上报时间计数器
static uint32_t _report_counter = 0; //<EFBFBD>ϱ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Check net if connect
if(g_net_state.flag < 3)
@@ -592,8 +604,8 @@ void poll_mqtt(void)
/*******************************************************************************
* Function Name : GetMacAddr
* Description : 系统获取MAC地址
* Input : pMAC:指向用来存储Mac地址的缓冲
* Description : ϵͳ<EFBFBD><EFBFBD>ȡMAC<EFBFBD><EFBFBD>ַ
* Input : pMAC:ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢Mac<EFBFBD><EFBFBD>ַ<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>
* Output : None
* Return : None
*******************************************************************************/
@@ -610,50 +622,50 @@ void GetMacAddr(unsigned char *pMAC)
}
// IPv4地址字符串转换为4字节的uint8_t数组并进行严格的错误检查
// <EFBFBD><EFBFBD>IPv4<EFBFBD><EFBFBD>ַ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊ4<EFBFBD>ֽڵ<EFBFBD>uint8_t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int get_ipstr_to_array(char *src, uint8_t *dst) {
if (src == NULL || dst == NULL) {
return -1; // 无效指针
return -1; // <EFBFBD><EFBFBD>Чָ<EFBFBD><EFBFBD>
}
int part_count = 0;
char *token = NULL;
char *saveptr = NULL;
const char *delim = ".";
// 输入字符串应采用可修改的内存如数组或堆内存因为strtok_r会修改字符串
// 需处理不可修改的字符串,可先进行拷贝
// <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>Ϊstrtok_r<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>
char src_copy[16];
strncpy(src_copy, src, sizeof(src_copy));
src_copy[15] = '\0';
// 首次分割
// <EFBFBD>״ηָ<EFBFBD>
token = strtok_r(src_copy, delim, &saveptr);
while (token != NULL && part_count < 4) {
char *endptr = NULL;
long val = strtol(token, &endptr, 10);
// 检查转换有效性
// <EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>
if (*endptr != '\0' || val < 0 || val > 255) {
return -2; // 非数字或超出范围
return -2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ򳬳<EFBFBD><EFBFBD><EFBFBD>Χ
}
dst[part_count++] = (uint8_t)val;
// 后续分割
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
token = strtok_r(NULL, delim, &saveptr);
}
// 检查是否正好有4部分
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (part_count != 4) {
return -3; // 部分数量错误
return -3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
// 检查是否有额外字符
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
if (token != NULL || (saveptr != NULL && *saveptr != '\0')) {
return -4; // 存在额外分隔符或字符
return -4; // <EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
}
return 0; // 成功
return 0; // <EFBFBD>ɹ<EFBFBD>
}
@@ -757,7 +769,7 @@ void unpack_ssc_count_off(uint8_t socket,uint8_t count_mode, uint8_t *ip, uint16
void unpack_ssc_device_reset(uint8_t socket, uint8_t *ip, uint16_t port, uint8_t *buf, uint32_t len)
{
// 复位设备
// <EFBFBD><EFBFBD>λ<EFBFBD>
uint16_t tmplen = 0;
char *p = (char *)buf;
char *mBuff = (char *)malloc(512);
@@ -1108,6 +1120,7 @@ void net_srv_init(void)
if(g_net_state.flag == 1)
{
WCHNET_CreateUdpSocket();
tcp_json_srv_init(); // Start JSON protocol TCP listener on port 5960
}