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:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user