1该实验将向用户演示两个CC2530模块进行简单的点到点无线通信。2一个传感器节点1发送数据给节点2节点2记录接收数据的次数并将数据发送给节点3。3节点3将收到的信息返回给节点1附加实现主要代码
以下是CC2530模块点到点无线通信的示例代码:
节点1代码:
#include "contiki.h" #include "dev/leds.h" #include "net/rime/rime.h" #include "dev/button-sensor.h" #include <stdio.h>
PROCESS(node1_process, "Node 1 process"); AUTOSTART_PROCESSES(&node1_process);
static struct broadcast_conn broadcast; static struct unicast_conn unicast;
static uint8_t message[] = "Hello, Node 2!";
static void broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from) { printf("Broadcast message received from %d.%d: '%s'\n", from->u8[0], from->u8[1], (char *)packetbuf_dataptr()); }
static void unicast_recv(struct unicast_conn *c, const linkaddr_t *from) { printf("Unicast message received from %d.%d: '%s'\n", from->u8[0], from->u8[1], (char *)packetbuf_dataptr()); }
static const struct broadcast_callbacks broadcast_call = {broadcast_recv}; static const struct unicast_callbacks unicast_call = {unicast_recv};
PROCESS_THREAD(node1_process, ev, data) { PROCESS_BEGIN();
broadcast_open(&broadcast, 129, &broadcast_call); unicast_open(&unicast, 146, &unicast_call);
while (1) { PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event && data == &button_sensor);
packetbuf_copyfrom(message, sizeof(message));
broadcast_send(&broadcast);
printf("Broadcast message sent\n");
leds_toggle(LEDS_RED);
}
broadcast_close(&broadcast); unicast_close(&unicast);
PROCESS_END(); }
节点2代码:
#include "contiki.h" #include "dev/leds.h" #include "net/rime/rime.h" #include <stdio.h>
PROCESS(node2_process, "Node 2 process"); AUTOSTART_PROCESSES(&node2_process);
static struct broadcast_conn broadcast; static struct unicast_conn unicast;
static uint8_t message[] = "Hello, Node 3!"; static uint8_t receive_count = 0;
static void broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from) { printf("Broadcast message received from %d.%d: '%s'\n", from->u8[0], from->u8[1], (char *)packetbuf_dataptr());
packetbuf_copyfrom(message, sizeof(message)); unicast_send(&unicast, from); printf("Unicast message sent to %d.%d\n", from->u8[0], from->u8[1]); }
static void unicast_recv(struct unicast_conn *c, const linkaddr_t *from) { receive_count++; printf("Unicast message received from %d.%d: '%s'\n", from->u8[0], from->u8[1], (char *)packetbuf_dataptr()); printf("Receive count: %d\n", receive_count); }
static const struct broadcast_callbacks broadcast_call = {broadcast_recv}; static const struct unicast_callbacks unicast_call = {unicast_recv};
PROCESS_THREAD(node2_process, ev, data) { PROCESS_BEGIN();
broadcast_open(&broadcast, 129, &broadcast_call); unicast_open(&unicast, 146, &unicast_call);
while (1) { PROCESS_WAIT_EVENT(); }
broadcast_close(&broadcast); unicast_close(&unicast);
PROCESS_END(); }
节点3代码:
#include "contiki.h" #include "dev/leds.h" #include "net/rime/rime.h" #include <stdio.h>
PROCESS(node3_process, "Node 3 process"); AUTOSTART_PROCESSES(&node3_process);
static struct unicast_conn unicast;
static void unicast_recv(struct unicast_conn *c, const linkaddr_t *from) { printf("Unicast message received from %d.%d: '%s'\n", from->u8[0], from->u8[1], (char *)packetbuf_dataptr());
packetbuf_copyfrom(packetbuf_dataptr(), packetbuf_datalen()); unicast_send(&unicast, from); printf("Unicast message sent to %d.%d\n", from->u8[0], from->u8[1]); }
static const struct unicast_callbacks unicast_call = {unicast_recv};
PROCESS_THREAD(node3_process, ev, data) { PROCESS_BEGIN();
unicast_open(&unicast, 146, &unicast_call);
while (1) { PROCESS_WAIT_EVENT(); }
unicast_close(&unicast);
PROCESS_END(); }
在这个示例中,节点1发送广播消息给节点2,节点2接收到消息后将消息发送给节点3,并记录接收到的消息次数。节点3接收到消息后将消息原样返回给节点2,节点2再将消息发送回给节点1。这个过程中,LED灯在节点1和节点2之间交替闪烁,表示通信已经建立
原文地址: https://www.cveoy.top/t/topic/gsFV 著作权归作者所有。请勿转载和采集!