1212#define NET_ID 0x01
1313#define CHANNEL 6
1414#define TX_POWER 52
15+ #define AUTO_SCAN_MS 5000
16+ #define AUTO_ELECTION_MS 3000
17+ #define BOOT_JITTER_MAX_MS 800
1518
1619static const uint8_t MASTER_KEY[16 ] = {
1720 0x2B , 0x7E , 0x15 , 0x16 , 0x28 , 0xAE , 0xD2 , 0xA6 ,
@@ -22,24 +25,61 @@ static volatile bool s_send_pong = false;
2225static volatile uint8_t s_pong_dst = 0 ;
2326static char s_cmd_buf[16 ];
2427static uint8_t s_cmd_len = 0 ;
28+ static uint32_t s_last_ping_ms = 0 ;
29+ static const uint32_t HEARTBEAT_MS = 3000 ;
30+
31+ static const char * role_str (umesh_role_t role) {
32+ switch (role) {
33+ case UMESH_ROLE_COORDINATOR: return " coordinator" ;
34+ case UMESH_ROLE_ROUTER: return " router" ;
35+ case UMESH_ROLE_END_NODE: return " end_node" ;
36+ case UMESH_ROLE_AUTO: return " auto" ;
37+ default : return " unknown" ;
38+ }
39+ }
40+
41+ static const char * state_str (umesh_state_t state) {
42+ switch (state) {
43+ case UMESH_STATE_UNINIT: return " uninit" ;
44+ case UMESH_STATE_SCANNING: return " scanning" ;
45+ case UMESH_STATE_ELECTION: return " election" ;
46+ case UMESH_STATE_JOINING: return " joining" ;
47+ case UMESH_STATE_CONNECTED: return " connected" ;
48+ case UMESH_STATE_DISCONNECTED: return " disconnected" ;
49+ default : return " unknown" ;
50+ }
51+ }
2552
2653static void json_ready (void ) {
54+ umesh_info_t info = umesh_get_info ();
2755 Serial.printf (" {\" event\" :\" ready\" ,"
28- " \" data\" :{\" mode\" :\" auto\" ,\" state\" :\" connected \" ,"
56+ " \" data\" :{\" mode\" :\" auto\" ,\" role \" : \" %s \" , \" state\" :\" %s \" ,"
2957 " \" node_id\" :%u,\" channel\" :%u,\" net_id\" :%u}}\n " ,
30- umesh_get_info ().node_id ,
31- umesh_get_info ().channel ,
32- umesh_get_info ().net_id );
58+ role_str (info.role ), state_str (info.state ),
59+ info.node_id , info.channel , info.net_id );
3360}
3461
3562static void json_status (void ) {
3663 umesh_info_t info = umesh_get_info ();
3764 Serial.printf (" {\" event\" :\" status\" ,"
38- " \" data\" :{\" mode\" :\" auto\" ,\" state\" :\" connected \" ,"
65+ " \" data\" :{\" mode\" :\" auto\" ,\" role \" : \" %s \" , \" state\" :\" %s \" ,"
3966 " \" node_id\" :%u,\" channel\" :%u,\" net_id\" :%u}}\n " ,
67+ role_str (info.role ), state_str (info.state ),
4068 info.node_id , info.channel , info.net_id );
4169}
4270
71+ static void json_tx (uint8_t dst, uint8_t cmd, uint8_t size) {
72+ Serial.printf (" {\" event\" :\" tx\" ,"
73+ " \" data\" :{\" dst\" :%u,\" cmd\" :\" 0x%02X\" ,\" size\" :%u}}\n " ,
74+ dst, cmd, size);
75+ }
76+
77+ static void json_rx (uint8_t src, uint8_t cmd, int8_t rssi) {
78+ Serial.printf (" {\" event\" :\" rx\" ,"
79+ " \" data\" :{\" src\" :%u,\" cmd\" :\" 0x%02X\" ,\" rssi\" :%d}}\n " ,
80+ src, cmd, rssi);
81+ }
82+
4383static void json_elected (umesh_role_t role) {
4484 const char *name = " router" ;
4585 if (role == UMESH_ROLE_COORDINATOR) name = " coordinator" ;
@@ -59,6 +99,7 @@ static void on_role_elected(umesh_role_t role) {
5999
60100static void on_receive (umesh_pkt_t *pkt) {
61101 if (!pkt) return ;
102+ json_rx (pkt->src , pkt->cmd , pkt->rssi );
62103 if (pkt->cmd == UMESH_CMD_PING) {
63104 s_pong_dst = pkt->src ;
64105 s_send_pong = true ;
@@ -68,6 +109,7 @@ static void on_receive(umesh_pkt_t *pkt) {
68109void setup (void ) {
69110 Serial.begin (115200 );
70111 delay (200 );
112+ randomSeed ((uint32_t )micros ());
71113
72114 umesh_cfg_t cfg = {
73115 .net_id = NET_ID,
@@ -77,8 +119,8 @@ void setup(void) {
77119 .security = UMESH_SEC_FULL,
78120 .channel = CHANNEL,
79121 .tx_power = TX_POWER,
80- .scan_ms = 2000 ,
81- .election_ms = 1000 ,
122+ .scan_ms = AUTO_SCAN_MS ,
123+ .election_ms = AUTO_ELECTION_MS ,
82124 .on_role_elected = on_role_elected,
83125 };
84126
@@ -87,13 +129,17 @@ void setup(void) {
87129
88130 umesh_on_receive (on_receive);
89131
132+ delay ((uint32_t )random (0 , BOOT_JITTER_MAX_MS + 1 ));
133+
90134 r = umesh_start ();
91135 if (r != UMESH_OK) { json_error (r); return ; }
92136
93137 json_ready ();
94138}
95139
96140void loop (void ) {
141+ umesh_info_t info;
142+
97143 while (Serial.available () > 0 ) {
98144 char c = (char )Serial.read ();
99145 if (c == ' \n ' || c == ' \r ' ) {
@@ -114,12 +160,26 @@ void loop(void) {
114160 }
115161
116162 umesh_tick (millis ());
163+ info = umesh_get_info ();
117164
118165 if (s_send_pong) {
119166 s_send_pong = false ;
167+ json_tx (s_pong_dst, UMESH_CMD_PONG, 0 );
120168 umesh_result_t r = umesh_send_cmd (s_pong_dst, UMESH_CMD_PONG, 0 );
121169 if (r != UMESH_OK) json_error (r);
122170 }
123171
172+ if (info.state == UMESH_STATE_CONNECTED &&
173+ info.role != UMESH_ROLE_COORDINATOR &&
174+ (millis () - s_last_ping_ms) >= HEARTBEAT_MS) {
175+ s_last_ping_ms = millis ();
176+ json_tx (UMESH_ADDR_COORDINATOR, UMESH_CMD_PING, 0 );
177+ {
178+ umesh_result_t r = umesh_send_cmd (UMESH_ADDR_COORDINATOR,
179+ UMESH_CMD_PING, 0 );
180+ if (r != UMESH_OK) json_error (r);
181+ }
182+ }
183+
124184 delay (5 );
125185}
0 commit comments