Blame view

RIOT/examples/gnrc_networking_mac/README.md 4.71 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  # gnrc_networking_mac example
  
  This example shows you how to try out communications between RIOT instances with LWMAC as the MAC layer ptotocol for IEEE 802.15.4 devices.
  This example is generally based on `gnrc_networking` but embeds LWMAC to support low duty-cycle operation to conserve power. Also, it intends to show that the duty-cycled LWMAC can support popular upper layer protocols like UDP and RPL.
  Currently, it seems that you can only use the samr21-xpro board to test this MAC, since some certain features of the protocol are only available on that platform. Also, the current implementation of LWMAC uses RTT as the underlying timer source. So, currently, LWMAC cannot run on nodes that don't have RTT. But, as a long-term plan, we will replace RTT by a general timer API as the underlying timer to make LWMAC available for more devices, when the related implementations are ready.
  
  
  ## Usage
  
  Build, flash and start the application:
  ```
  export BOARD=your_board
  make
  make flash
  make term
  ```
  
  ## Print out the achieved duty-cyle of LWMAC
  
  You can print out the radio duty-cyle (a roughly one) of LWMAC by setting the `LWMAC_ENABLE_DUTYCYLE_RECORD` flag in `sys/include/net/gnrc/lwmac/types.h` to "1". By doing so, each time when a device sends or receives a packet, it will print out its radio duty-cycle value.
  Also, by further enabling the debug flag in `sys/net/gnrc/link_layer/lwmac/tx_state_machine.c`, you will get the printout of how many preamble (WR) and time (sending delay) cost for sending this packet in the TX procedure of LWMAC.
  
  
  ## Try UDP transmissions with LWMAC
  
  In the RIOT shell, get to know the IP address of one node:
  
  2017-06-06 15:05:48,279 - INFO # ifconfig
  2017-06-06 15:05:48,284 - INFO # Iface  7   HWaddr: 79:f6  Channel: 26  Page: 0  NID: 0x23
  2017-06-06 15:05:48,288 - INFO #            Long HWaddr: 79:67:35:7e:54:3a:79:f6
  2017-06-06 15:05:48,297 - INFO #            TX-Power: 0dBm  State: SLEEP  max. Retrans.: 3  CSMA Retries: 4
  2017-06-06 15:05:48,303 - INFO #            CSMA  MTU:1280  HL:64  6LO  RTR  IPHC
  2017-06-06 15:05:48,306 - INFO #            Source address length: 8
  2017-06-06 15:05:48,309 - INFO #            Link type: wireless
  2017-06-06 15:05:48,314 - INFO #            inet6 addr: ff02::1/128  scope: local [multicast]
  2017-06-06 15:05:48,320 - INFO #            inet6 addr: fe80::7b67:357e:543a:79f6/64  scope: local
  2017-06-06 15:05:48,326 - INFO #            inet6 addr: ff02::1:ff3a:79f6/128  scope: local [multicast]
  2017-06-06 15:05:48,331 - INFO #            inet6 addr: ff02::1a/128  scope: local [multicast]
  
  and start a UDP server.
  
      > udp server start 8808
  
  This node is now ready to receive data on port `8808`.
  
  In a second terminal, start a second RIOT instance, in the RIOT shell, you can now send a message to the first RIOT instance:
  
      > udp send fe80::7b67:357e:543a:79f6 8808 testmessage
  
  In your first terminal (the receiver side), you should now see output that looks like this:
  
  2017-06-06 15:00:06,894 - INFO # [LWMAC]: achieved duty-cycle: 10 %
  2017-06-06 15:00:06,896 - INFO # PKTDUMP: data received:
  2017-06-06 15:00:06,901 - INFO # ~~ SNIP  0 - size:  11 byte, type: NETTYPE_UNDEF (0)
  2017-06-06 15:00:06,907 - INFO # 00000000  74  65  73  74  6D  65  73  73  61  67  65
  2017-06-06 15:00:06,911 - INFO # ~~ SNIP  1 - size:   8 byte, type: NETTYPE_UDP (5)
  2017-06-06 15:00:06,914 - INFO #    src-port:  8808  dst-port:  8808
  2017-06-06 15:00:06,917 - INFO #    length: 19  cksum: 0xf729
  2017-06-06 15:00:06,921 - INFO # ~~ SNIP  2 - size:  40 byte, type: NETTYPE_IPV6 (3)
  2017-06-06 15:00:06,925 - INFO # traffic class: 0x00 (ECN: 0x0, DSCP: 0x00)
  2017-06-06 15:00:06,927 - INFO # flow label: 0x00000
  2017-06-06 15:00:06,930 - INFO # length: 19  next header: 17  hop limit: 64
  2017-06-06 15:00:06,934 - INFO # source address: fe80::7b67:877:19f:331e
  2017-06-06 15:00:06,938 - INFO # destination address: fe80::7b67:357e:543a:79f6
  2017-06-06 15:00:06,943 - INFO # ~~ SNIP  3 - size:  24 byte, type: NETTYPE_NETIF (-1)
  2017-06-06 15:00:06,945 - INFO # if_pid: 7  rssi: 51  lqi: 255
  2017-06-06 15:00:06,946 - INFO # flags: 0x0
  2017-06-06 15:00:06,949 - INFO # src_l2addr: 79:67:08:77:01:9f:33:1e
  2017-06-06 15:00:06,952 - INFO # dst_l2addr: 79:67:35:7e:54:3a:79:f6
  2017-06-06 15:00:06,956 - INFO # ~~ PKT    -  4 snips, total size:  83 byte
  
  
  In your second terminal (the sender side), you should now see output that looks like this:
  
  2017-06-06 15:00:06,871 - INFO # udp send fe80::7b67:357e:543a:79f6 8808 testmessage
  2017-06-06 15:00:06,877 - INFO # Success: sent 11 byte(s) to [fe80::7b67:357e:543a:79f6]:8808
  2017-06-06 15:00:06,890 - INFO # [LWMAC-tx]: spent 1 WR in TX
  2017-06-06 15:00:06,894 - INFO # [LWMAC-tx]: pkt sending delay in TX: 8422 us
  2017-06-06 15:00:06,898 - INFO # [LWMAC]: achieved duty-cycle: 10 %