/** * @file example.c * @brief 数据路由库使用示例 * * 展示: * - 发送能力和接收能力分开声明(sensor 只发送,rtcm 只接收) * - 端口独立设置 send_type 和 recv_type * - 一个端口可同时拥有发送和接收能力 */ #include "datarouter.h" #include #include /* ---- 外设发送 handler ---- */ 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); } /* ---- 接收回调实现 ---- */ void datarouter_on_recv_rtcm(uint32_t port_id, const void *data, size_t len) { printf("[RX:rtcm] port %u: %.*s\n", port_id, (int)len, (const char *)data); } void datarouter_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) { datarouter_init(); /* 查询能力 */ printf("Send capabilities: %d\n", datarouter_send_cap_count()); for (int i = 0; i < datarouter_send_cap_count(); i++) printf(" SEND [%d] %s - %s\n", i, datarouter_send_cap_name(i), datarouter_send_cap_desc(i)); printf("Recv capabilities: %d\n", datarouter_recv_cap_count()); for (int i = 0; i < datarouter_recv_cap_count(); i++) printf(" RECV [%d] %s - %s\n", i, datarouter_recv_cap_name(i), datarouter_recv_cap_desc(i)); /* * 端口 A:只有发送能力 —— 上报传感器数据 */ datarouter_port_t tx_port = datarouter_port_create(); datarouter_port_set_send_type(tx_port, DATAROUTER_SEND_sensor); datarouter_port_add_handler(tx_port, uart_send); datarouter_port_add_handler(tx_port, tcp_send); printf("\n--- send sensor (UART + TCP) ---\n"); datarouter_send_sensor(tx_port, "temperature:25.3", 16); /* 该端口没有 recv_type,不能接收任何报文 */ /* * 端口 B:只有接收能力 —— 接收 RTCM 修正 */ datarouter_port_t rtcm_port = datarouter_port_create(); datarouter_port_set_recv_type(rtcm_port, DATAROUTER_RECV_rtcm); /* 没有 send_type,也没有 handler —— 不能发送 */ printf("\n--- simulate receive RTCM ---\n"); datarouter_on_recv_rtcm(rtcm_port, "rtcm_data_v3.2", 14); /* * 端口 C:同时有收发能力 —— 接收命令 + 上报状态 */ datarouter_port_t bi_port = datarouter_port_create(); datarouter_port_set_send_type(bi_port, DATAROUTER_SEND_status); datarouter_port_set_recv_type(bi_port, DATAROUTER_RECV_command); datarouter_port_add_handler(bi_port, uart_send); printf("\n--- bidirectional port ---\n"); datarouter_send_status(bi_port, "status:OK", 9); datarouter_on_recv_command(bi_port, "reboot", 6); /* 清理 */ datarouter_port_delete(tx_port); datarouter_port_delete(rtcm_port); datarouter_port_delete(bi_port); return 0; }