diff --git a/TC1/TC1.mk b/TC1/TC1.mk index 4ab25cc..76a17c4 100644 --- a/TC1/TC1.mk +++ b/TC1/TC1.mk @@ -34,7 +34,8 @@ $(NAME)_SOURCES := main.c\ user_power.c\ timed_task/timed_task.c\ http_server/web_log.c\ - http_server/app_httpd.c + http_server/app_httpd.c\ + udp_server/udp_server.c $(NAME)_COMPONENTS := protocols/SNTP\ protocols/mqtt\ diff --git a/TC1/main.c b/TC1/main.c index 00f88aa..30b3838 100644 --- a/TC1/main.c +++ b/TC1/main.c @@ -11,6 +11,7 @@ #include "time_server/user_rtc.h" #include "user_power.h" #include "http_server/app_httpd.h" +#include "udp_server/udp_server.h" #include "timed_task/timed_task.h" char rtc_init = 0; //sntp校时成功标志位 @@ -189,7 +190,7 @@ int application_start(void) { require_noerr(err, exit); PowerInit(); AppHttpdStart(); // start http server thread - + udp_server_start(); UserLedSet(user_config->power_led_enabled); err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "p_count", diff --git a/TC1/udp_server/udp_server.c b/TC1/udp_server/udp_server.c new file mode 100644 index 0000000..1207ee8 --- /dev/null +++ b/TC1/udp_server/udp_server.c @@ -0,0 +1,137 @@ +#include "mico.h" +#include "SocketUtils.h" +#include "json_c/json.h" +#include "mqtt_server/user_mqtt_client.h" +#include "user_power.h" +#include "main.h" +#include "user_gpio.h" +#include "user_wifi.h" +#include "http_server/app_httpd.h" + + +#define UDP_SERVER_IP "192.168.31.226" +#define UDP_SERVER_PORT 2738 +#define DEVICE_ID "plug01" +#define AUTH_KEY "test" + +static int udp_fd = -1; +static struct sockaddr_in server_addr; +static bool is_authenticated = false; + +void send_udp_json(json_object *json) { + if (udp_fd < 0) return; + + const char *msg = json_object_to_json_string(json); + sendto(udp_fd, msg, strlen(msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); +} + +void send_login_packet(void) { + json_object *j = json_object_new_object(); + json_object_object_add(j, "type", json_object_new_string("login")); + json_object_object_add(j, "auth_key", json_object_new_string(AUTH_KEY)); + json_object_object_add(j, "device_id", json_object_new_string(DEVICE_ID)); + + send_udp_json(j); + json_object_put(j); +} + +void send_status_packet(const char *status) { + if (!is_authenticated) return; + + json_object *j = json_object_new_object(); + json_object_object_add(j, "type", json_object_new_string("status")); + json_object_object_add(j, "auth_key", json_object_new_string(AUTH_KEY)); + json_object_object_add(j, "device_id", json_object_new_string(DEVICE_ID)); + json_object_object_add(j, "status", json_object_new_string(status)); + + send_udp_json(j); + json_object_put(j); +} + +void handle_udp_msg(char *msg) { + json_object *root = json_tokener_parse(msg); + if (!root) return; + + const char *type = json_object_get_string(json_object_object_get(root, "type")); + + if (strcmp(type, "login_ack") == 0) { + const char *result = json_object_get_string(json_object_object_get(root, "result")); + if (strcmp(result, "ok") == 0) { + is_authenticated = true; + } + } else if (strcmp(type, "control") == 0 && is_authenticated) { + const char *cmd = json_object_get_string(json_object_object_get(root, "command")); + // TODO: 控制插座硬件 + if (strcmp(cmd, "turn_on") == 0) { + // gpio_output_high(PLUG_PIN); + } else if (strcmp(cmd, "turn_off") == 0) { + // gpio_output_low(PLUG_PIN); + } + } + + json_object_put(root); +} + +void udp_recv_loop(void) { + char buf[256]; + while (1) { + if (udp_fd >= 0) { + int len = recvfrom(udp_fd, buf, sizeof(buf) - 1, 0, NULL, 0); + if (len > 0) { + buf[len] = '\0'; + handle_udp_msg(buf); + } + } + mico_thread_sleep(1); + } +} + +void udp_heartbeat_loop(void) { + while (1) { + if (udp_fd < 0) { + udp_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (udp_fd < 0) { + mico_thread_sleep(3); + continue; + } + + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(UDP_SERVER_PORT); + server_addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP); + } + + if (!is_authenticated) { + send_login_packet(); + } else { + char *sockets = GetSocketStatus(); + char *short_click_config = GetButtonClickConfig(); + char *tc1_status = malloc(1500); + char *socket_names = malloc(512); + sprintf(socket_names, "%s,%s,%s,%s,%s,%s", + user_config->socket_names[0], + user_config->socket_names[1], + user_config->socket_names[2], + user_config->socket_names[3], + user_config->socket_names[4], + user_config->socket_names[5]); + sprintf(tc1_status, TC1_STATUS_JSON, sockets, ip_status.mode, + sys_config->micoSystemConfig.ssid, sys_config->micoSystemConfig.user_key, + user_config->ap_name, user_config->ap_key, MQTT_SERVER, MQTT_SERVER_PORT, + MQTT_SERVER_USR, MQTT_SERVER_PWD, + VERSION, ip_status.ip, ip_status.mask, ip_status.gateway, user_config->mqtt_report_freq, + user_config->power_led_enabled, 0L, socket_names, childLockEnabled, + sys_config->micoSystemConfig.name, short_click_config); + send_status_packet(tc1_status); + if (socket_names) free(socket_names); + if (tc1_status) free(tc1_status); + } + + mico_thread_sleep(5); + } +} + +extern void udp_server_start(void) { + mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "udp_recv", udp_recv_loop, 0x800, NULL); + mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "udp_send", udp_heartbeat_loop, 0x800, NULL); +} \ No newline at end of file diff --git a/TC1/udp_server/udp_server.h b/TC1/udp_server/udp_server.h new file mode 100644 index 0000000..7294e21 --- /dev/null +++ b/TC1/udp_server/udp_server.h @@ -0,0 +1,6 @@ +#ifndef UDP_SERVER_H +#define UDP_SERVER_H + +extern void udp_server_start(void); + +#endif \ No newline at end of file diff --git a/mico-os/libraries/daemons/http_server/httpd.c b/mico-os/libraries/daemons/http_server/httpd.c index b1b02c9..4feb655 100644 --- a/mico-os/libraries/daemons/http_server/httpd.c +++ b/mico-os/libraries/daemons/http_server/httpd.c @@ -51,7 +51,7 @@ httpd_state_t httpd_state; static mico_thread_t httpd_main_thread; // 0x8000 不行 -#define http_server_thread_stack_size 0x6000 +#define http_server_thread_stack_size 0x5000 /* Why HTTPD_MAX_MESSAGE + 2? * Handlers are allowed to use HTTPD_MAX_MESSAGE bytes of this buffer.