/** * @file example.c * * 调用 dr_send_sensor(data, len) 无需指定端口, * 库自动广播到所有 send_type=sensor 的端口。 */ #include "datarouter.h" #include static void uart_send(uint32_t port_id, const void *data, size_t len) { printf("[UART port %u] %.*s\n", port_id, (int)len, (const char *)data); } static void tcp_send(uint32_t port_id, const void *data, size_t len) { printf("[TCP port %u] %.*s\n", port_id, (int)len, (const char *)data); } static void can_send(uint32_t port_id, const void *data, size_t len) { printf("[CAN port %u] %.*s\n", port_id, (int)len, (const char *)data); } void dr_on_recv_command(uint32_t port_id, const void *data, size_t len) { printf("[RX:cmd port %u] %.*s\n", port_id, (int)len, (const char *)data); } int main(void) { dr_init(); printf("Capabilities:\n"); for (int i = 0; i < dr_send_cap_count(); i++) printf(" SEND [%d] %s - %s\n", i, dr_send_cap_name(i), dr_send_cap_desc(i)); /* * 创建两个端口,都设 send_type=sensor,各绑不同外设。 * 调用 dr_send_sensor() 时两个端口同时触发。 */ dr_port_t p1 = dr_port_create(); dr_port_set_send_type(p1, DR_SEND_sensor); dr_port_add_handler(p1, uart_send); dr_port_add_handler(p1, tcp_send); dr_port_t p2 = dr_port_create(); dr_port_set_send_type(p2, DR_SEND_sensor); dr_port_add_handler(p2, can_send); /* 不指定端口,自动广播到所有 sensor 端口 */ printf("\n--- send_sensor (auto-route to ALL sensor ports) ---\n"); dr_send_sensor("temperature:25.3", 16); /* 运行时移除一个 handler,下次发送不再触发它 */ printf("\n--- remove TCP handler from p1, resend ---\n"); dr_port_remove_handler(p1, tcp_send); dr_send_sensor("temperature:26.1", 16); /* 接收侧:用户自行调用回调 */ printf("\n--- recv command ---\n"); dr_on_recv_command(0, "reboot", 6); /* 删除一个端口,触发时不再走它 */ printf("\n--- delete p2 (CAN), resend ---\n"); dr_port_delete(p2); dr_send_sensor("temperature:27.0", 16); dr_port_delete(p1); return 0; }