#include "mbedtls/md5.h"
#include <stdio.h>
#include <string.h>
+#include <ctype.h>
#include "mbedtls/aes.h"
#include "mbedtls/cipher.h"
#include "dev_authentication.h"
{
time_t timestamp;
timestamp = time(NULL);
- if(aut_login_time==0 || timestamp - aut_login_time > 60 * 60 )
+ if(aut_login_time==0 || timestamp - aut_login_time > 60 * 60 || strlen(data_token)<10)
{
return false;
}
+ printf("dmp_read_dev_token %s\r\n",data_token);
memcpy(outdata,data_token,strlen(data_token));
return true;
}
unsigned char deviceId[6] = {0};
unsigned int len = 6;
- char deviceId_temp[20] = {0};
+ char deviceId_temp[50] = {0};
#if DMP_DEVICE_ID_SOURCE == 0
// 使用蓝牙地址
#elif DMP_DEVICE_ID_SOURCE == 1
// 使用 IMEI
char *imei = cat1_api_runtime_get_cat1_imei();
+
if (imei != NULL && strlen(imei) > 0) {
- strncpy(deviceId_temp, imei, sizeof(deviceId_temp) - 1);
- deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+ strncpy(deviceId_temp, imei, strlen(imei));
} else {
sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
}
// 使用 ICCID
char *iccid = cat1_api_runtime_get_cat1_iccid();
if (iccid != NULL && strlen(iccid) > 0) {
- strncpy(deviceId_temp, iccid, sizeof(deviceId_temp) - 1);
- deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+ strncpy(deviceId_temp, iccid, strlen(iccid));
} else {
sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
}
// 默认使用固定值
sprintf(deviceId_temp, "%s", "898604B719259031337");
#endif
+ for (size_t i = 0; i < sizeof(deviceId_temp) && deviceId_temp[i] != '\0'; ++i) {
+ deviceId_temp[i] = (char)toupper((unsigned char)deviceId_temp[i]);
+ }
time_t timestamp;
}
}
memcpy(dev_pass, data_pass, strlen(data_pass));
- printf("dev_sign_in 2");
+ printf("dev_sign_in 2 %s\r\n",dev_pass);
int count = 5;
char *encrypt_data = NULL;
char *response_data =NULL;
// 登录数据
unsigned char deviceId[6] = {0};
- char deviceId_temp[20] = {0};
+ char deviceId_temp[50] = {0};
#if DMP_DEVICE_ID_SOURCE == 0
// 使用蓝牙地址
#elif DMP_DEVICE_ID_SOURCE == 1
// 使用 IMEI
char *imei = cat1_api_runtime_get_cat1_imei();
+
if (imei != NULL && strlen(imei) > 0) {
- strncpy(deviceId_temp, imei, sizeof(deviceId_temp) - 1);
- deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+ strncpy(deviceId_temp, imei, strlen(imei));
} else {
sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
}
// 使用 ICCID
char *iccid = cat1_api_runtime_get_cat1_iccid();
if (iccid != NULL && strlen(iccid) > 0) {
- strncpy(deviceId_temp, iccid, sizeof(deviceId_temp) - 1);
- deviceId_temp[sizeof(deviceId_temp) - 1] = '\0';
+ strncpy(deviceId_temp, iccid, strlen(iccid));
} else {
sprintf(deviceId_temp, "%s", "898604B719259031337"); // 默认值
}
sprintf(deviceId_temp, "%s", "898604B719259031337");
#endif
+ for (size_t i = 0; i < sizeof(deviceId_temp) && deviceId_temp[i] != '\0'; ++i) {
+ deviceId_temp[i] = (char)toupper((unsigned char)deviceId_temp[i]);
+ }
+
+
printf("2时间戳: %ld\n", (long)timestamp);
long long timestamp_ms = (long long)timestamp * 1000;
if(strlen(token_str)>=0 && data_token!=NULL )
{
+ printf("dmp_read_dev_token_save %s\r\n",token_str);
memcpy(data_token,token_str,strlen(token_str));
cJSON_Delete(data);
return true;
--- /dev/null
+//==========================================================================\r
+// transport.h - 传输层抽象接口\r
+//==========================================================================\r
+#ifndef TRANSPORT_H\r
+#define TRANSPORT_H\r
+\r
+// #include "http_config.h"\r
+#include <stdint.h>\r
+#include <stddef.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+// 传输层错误码\r
+typedef enum {\r
+ TRANSPORT_OK = 0,\r
+ TRANSPORT_ERROR_INIT = -1,\r
+ TRANSPORT_ERROR_CONNECT = -2,\r
+ TRANSPORT_ERROR_SEND = -3,\r
+ TRANSPORT_ERROR_RECV = -4,\r
+ TRANSPORT_ERROR_TIMEOUT = -5,\r
+ TRANSPORT_ERROR_DISCONNECTED = -6,\r
+ TRANSPORT_ERROR_INVALID_PARAM = -7\r
+} transport_error_t;\r
+\r
+// 传输层接口结构体\r
+typedef struct {\r
+ // 初始化传输层\r
+ int (*init)(void);\r
+ \r
+ // 连接到指定主机和端口\r
+ int (*connect)(const char* host, uint16_t port);\r
+ \r
+ // 发送数据\r
+ int (*send)(const uint8_t* data, uint16_t len);\r
+ \r
+ // 接收数据,返回实际接收的字节数\r
+ int (*recv)(uint8_t* buffer, uint16_t max_len);\r
+ \r
+ // 断开连接\r
+ int (*disconnect)(void);\r
+ \r
+ // 检查连接状态\r
+ int (*is_connected)(void);\r
+ \r
+ // 获取系统时间戳(毫秒)\r
+ uint32_t (*get_tick)(void);\r
+ \r
+ // 延时函数(毫秒)\r
+ void (*delay)(uint32_t ms);\r
+ \r
+} transport_interface_t;\r
+\r
+// 全局传输接口指针\r
+extern transport_interface_t* g_transport;\r
+\r
+// 注册传输接口\r
+void transport_register(transport_interface_t* transport);\r
+\r
+#endif // TRANSPORT_H
\ No newline at end of file
* @copyright Copyright (c) 2023-2023. All rights reserved.
*/
-#include <stddef.h>
-#include <stdlib.h>
+#include <time.h>
+
+#include "lwip/sockets.h"
+#include "lwip/netdb.h"
+#include "lwip/inet.h"
+#include "imsl_vad.h"
+#include "transport.h"
+
+// #include "cmsis_os2.h"
+
+#ifndef htons
+static inline u16_t htons(u16_t n)
+{
+ return ((n & 0xFF) << 8) | ((n & 0xFF00) >> 8);
+}
+#endif
+
+// #include <sys/time.h>
/**
* @brief 初始化系统堆内存
{
free(ptr);
}
+
+
+#define HTTP_DEBUG(...) printf(__VA_ARGS__)
+
+// 临时定义缺失的宏和类型(替代transport.h)
+// #define TRANSPORT_OK 0
+// #define TRANSPORT_ERROR_CONNECT -1
+// #define TRANSPORT_ERROR_SEND -2
+// #define TRANSPORT_ERROR_RECV -3
+// #define TRANSPORT_ERROR_NOT_CONNECTED -4
+// #define TRANSPORT_ERROR_DISCONNECTED -5
+
+// 传输层接口结构体定义
+// typedef struct {
+// int (*init)(void);
+// int (*connect)(const char* host, uint16_t port);
+// int (*send)(const uint8_t* data, uint16_t len);
+// int (*recv)(uint8_t* buffer, uint16_t max_len);
+// int (*disconnect)(void);
+// int (*is_connected)(void);
+// uint32_t (*get_tick)(void);
+// void (*delay)(uint32_t delay_ms);
+// } transport_interface_t;
+
+static int sock = -1;
+static int is_connected_flag = 0;
+
+static void imp_delay(uint32_t delay_ms) {
+ msleep(delay_ms);
+}
+
+static int imp_init(void) {
+ return TRANSPORT_OK;
+}
+
+static int imp_disconnect() {
+ if (sock >= 0) {
+ HTTP_DEBUG("sock close, sock : %d", sock);
+ lwip_close(sock);
+ sock = -1;
+ }
+ is_connected_flag = 0;
+
+ return TRANSPORT_OK;
+}
+
+static int imp_connect(const char* host, uint16_t port) {
+ // 检查是否已连接,避免重复连接
+ if (is_connected_flag) {
+ HTTP_DEBUG("Already connected, disconnecting first");
+ imp_disconnect();
+ }
+
+ // 提取纯主机名(处理带协议前缀的情况)
+ const char* host_start = host;
+ if (strncmp(host, "http://", 7) == 0) {
+ host_start = host + 7;
+ } else if (strncmp(host, "https://", 8) == 0) {
+ host_start = host + 8;
+ // 对于HTTPS,这里仅处理非加密连接,实际项目中需使用TLS
+ port = 80;
+ HTTP_DEBUG("Warning: HTTPS specified but using port 80 for non-encrypted connection");
+ }
+
+ // 提取主机名和端口(如果存在)
+ char clean_host[256] = {0};
+ uint16_t resolved_port = port;
+
+ const char* colon_pos = strchr(host_start, ':');
+ const char* slash_pos = strchr(host_start, '/');
+
+ if (colon_pos && (!slash_pos || colon_pos < slash_pos)) {
+ // 提取主机部分
+ strncpy(clean_host, host_start, colon_pos - host_start);
+
+ // 提取端口部分
+ const char* port_start = colon_pos + 1;
+ const char* port_end = slash_pos ? slash_pos : (host_start + strlen(host_start));
+ char port_str[16] = {0};
+ strncpy(port_str, port_start, port_end - port_start);
+ resolved_port = atoi(port_str);
+
+ if (resolved_port <= 0 || resolved_port > 65535) {
+ HTTP_DEBUG("Invalid port specified: %s, using default: %d", port_str, port);
+ resolved_port = port;
+ }
+ } else if (slash_pos) {
+ // 有路径但无端口号
+ strncpy(clean_host, host_start, slash_pos - host_start);
+ } else {
+ // 无端口和路径
+ strncpy(clean_host, host_start, strlen(host_start));
+ }
+
+ HTTP_DEBUG("Connecting to: %s:%d", clean_host, resolved_port);
+
+ // 创建套接字
+ sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ if (sock < 0) {
+ HTTP_DEBUG("Socket creation failed: %d", errno);
+ return TRANSPORT_ERROR_CONNECT;
+ }
+
+ // 解析地址(优先使用inet_pton,失败时使用gethostbyname)
+ struct sockaddr_in server_addr;
+ memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(resolved_port);
+
+ // 尝试直接解析IP地址
+ if (inet_pton(AF_INET, clean_host, &server_addr.sin_addr) <= 0) {
+ // 解析失败,尝试域名解析
+ HTTP_DEBUG("Hostname resolution: %s", clean_host);
+ struct hostent* he = gethostbyname(clean_host);
+ if (!he) {
+ HTTP_DEBUG("Hostname resolution failed: %s", clean_host);
+ close(sock);
+ sock = -1;
+ return TRANSPORT_ERROR_CONNECT;
+ }
+ // memcpy(&server_addr.sin_addr, he->h_addr, he->h_length);
+ server_addr.sin_addr = *(struct in_addr*)he->h_addr;
+ HTTP_DEBUG("clean_host: %s,ip: %s\n", clean_host,inet_ntoa(server_addr.sin_addr));
+ }
+
+ // 连接服务器
+ if (lwip_connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
+ HTTP_DEBUG("Connection failed: %d", errno);
+ close(sock);
+ sock = -1;
+ return TRANSPORT_ERROR_CONNECT;
+ }
+
+ // 连接成功
+ is_connected_flag = 1;
+ HTTP_DEBUG("Connected to %s:%d (socket: %d)", clean_host, resolved_port, sock);
+ return TRANSPORT_OK;
+}
+
+
+static int imp_send(const uint8_t* data, uint16_t len) {
+ int send_len = lwip_send(sock, data, len, 0);
+ return send_len;
+
+}
+
+static int imp_recv(uint8_t* buffer, uint16_t max_len) {
+ int recv_len = lwip_recv(sock, buffer, max_len, 0);//默认0是阻塞接收 //MSG_DONTWAIT 无阻塞
+ // int recv_len = recvfrom(sock, buffer, max_len, 0, NULL, NULL);
+ HTTP_DEBUG("recv_len=%d,%s\n",recv_len,buffer);
+ return recv_len;
+}
+
+
+static int imp_is_connected() {
+ if (sock < 0 || !is_connected_flag) {
+ return 0;
+ }
+
+ int error = 0;
+ socklen_t len = sizeof(error);
+ if (lwip_getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
+ is_connected_flag = 0;
+ return 0;
+ }
+
+ if (error != 0) {
+ is_connected_flag = 0;
+ imp_disconnect();
+ return 0;
+ }
+
+ return 1;
+}
+
+uint32_t get_system_time_ms(void) {
+ struct timespec ts;
+ // 获取系统实时时间(CLOCK_REALTIME对应UTC时间,自1970-01-01起)
+ if (clock_gettime(CLOCK_REALTIME, &ts) != 0) {
+ return 0; // 出错时返回0(可根据需求调整错误处理)
+ }
+ // 转换为毫秒:秒数*1000 + 纳秒数/1000000
+ return (uint32_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
+}
+
+
+static uint32_t imp_get_tick()
+{
+ return get_system_time_ms();
+ // return aos_get_tickcount();
+}
+
+ transport_interface_t imp_transport= {
+ .init = imp_init,
+ .connect = imp_connect,
+ .send = imp_send,
+ .recv = imp_recv,
+ .disconnect = imp_disconnect,
+ .is_connected = imp_is_connected,
+ .get_tick = imp_get_tick,
+ .delay = imp_delay
+ };
+
+
+
+int test_func(void)
+{
+ // transport_interface_t imp_transport_test= {
+ // .init = imp_init,
+ // .connect = imp_connect,
+ // .send = imp_send,
+ // .recv = imp_recv,
+ // .disconnect = imp_disconnect,
+ // .is_connected = imp_is_connected,
+ // .get_tick = imp_get_tick,
+ // .delay = imp_delay
+ // };
+
+ // transport_register(&imp_transport_test);
+
+
+
+
+ return 0;
+}