On Thursday 14 June 2007 08:48:07 Pedro Almeida wrote: > Hello, Steve; > > I am using an application that came with the MicaZ CD, called "Terminal > v1.9b by Bray++". I can use it to read/write to the serial port. > If I indeed read it with the java Listen, I dont get those encapsulation > bytes. But the purpose of this app is to be read in a Windows environment, > where the USB ports are converted into virtual serial ports, and in my app > I do get the encapsulation bytes when reading from the "serial" port.
Ah. Then you should look at the C SDK @ $TOSROOT/support/sdk/c. It can handle the the serial protocol for you; you get to read and write serial active messages and dispense with the framing/ack/crc stuff. Highly recommended; I use it in a couple of systems. The sdk also provides tools to get/set header fields and arbitrary payload fields that are defined by your application. There's been a couple of discussions about the C SDK on this list in the last few months. You might also want to look at the MultiHopOscilloscope app, included in TinyOS-2.0.1, which uses the Collection interface. The PC side code uses the Java SDK, but I'd imagine it's a good source of information. All the best, Steve > > Thanks, > > Pedro > > On 6/14/07, R. Steve McKown <[EMAIL PROTECTED]> wrote: > > HI Pedro, > > > > How did you generate your original hex string? TestNetwork appears to be > > set > > up to use the C serial forwarder sf, so if I program some motes, start sf > > on > > the serial port and tn-listener on the port opened by sf, I get active > > message frames output without the serial frame encapsulation. Are you > > connecting to the serial port directly? > > > > On Wednesday 13 June 2007 19:39:21 Pedro Almeida wrote: > > > Hello all; > > > > > > After reading the TEP provided by David, it greatly helped, yet some > > > > things > > > > > still don't match. It is said that: > > > > > > typedef nx_struct SerialAMHeader { > > > nx_am_addr_t addr; > > > nx_uint8_t length; > > > nx_am_group_t group; > > > nx_am_id_t type; > > > } SerialAMHeader; > > > > > > and the frame like > > > > > > ____________________________________________ > > > > > > |_|_|_|_|_______________________________|__|_| > > > > > > F P S D Payload CR F > > > F = Framing byte, denoting start of packet: HdlcTranslateC > > > P = Protocol byte: SerialP > > > S = Sequence number byte: SerialP > > > D = Packet format dispatch byte: SerialDispatcherC > > > Payload = Data payload (stored in SerialDispatcherC): SerialDispatcherC > > > CR = Two-byte CRC over S to end of Payload: SerialP > > > F = Framing byte denoting end of packet: HdlcTranslateC > > > > > > would give something like > > > 7e 40 09 00 be ef 05 7d 5d 06 01 02 03 04 05 7e > > > (explanation: For example, a platform independent AM packet of type 6, > > > group 0x7d, and length 5 to destination 0xbeef with a payload of 1 2 3 > > > 4 > > > > 5. > > > > > Note that the group 0x7d is escaped to 0x7d 0x5d. The protocol field > > > (P) > > > > is > > > > > 0x40 (64), corresponding to SERIAL_PROTO_ACK (in Serial.h).) > > > > > > yet what i read is (mind only the beggining and end now) > > > 7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 00 00 > > > > 00 > > > > > 00 20 00 00 53 63 7E > > > > > > so there's some bytes missing, and the start has more similarities with > > > this struct than the SerialAMHeader: > > > > > > typedef nx_struct serial_header { > > > nx_am_addr_t dest; > > > nx_am_addr_t src; > > > nx_uint8_t length; > > > nx_am_group_t group; > > > nx_am_id_t type; > > > } serial_header_t; > > > > > > So if i disregard the > > > > > > D = Packet format dispatch byte: SerialDispatcherC > > > > > > it actually starts out nicely. Still do decide if the last 2 bytes > > > > before > > > > > the 0x7E are the 2 byte CRC (which are not even showing up in the > > > > example > > > > > sequence from the TEP) or the rssi+fcsCheck. > > > > > > So, doing it all again and completing with new information: > > > > > > 7E : Framing byte, denoting start of packet > > > 45 : Protocol Byte (0x45 = SERIAL_PROTO_PACKET_NOACK = 69 from > > > Serial.h) 00 : Sequence Number Byte (from the #define NO_TX_SEQNO in > > > SerialP.nc) > > > > ?? > > > > > FF FF : destination address (from UART) > > > 00 00 : source address (root node) > > > 13 : length ? > > > 00 EE : Collection ID (from CTP) ?? / Type ?? / Destination PAN > > > > Identifier > > > > > (from MAC Header) ?? > > > 00 : ???? > > > 01 : hopcount (seems out of place, but sure looks like it) ???? > > > 00 00 : Destination Address (root ID=0) (from MAC Header) ??? > > > 00 07 : Source Address (from the MAC Header) ???? > > > 80 : sendCount ??? (this field increments like the seqno below) > > > EE : Collection ID (from CTP) ?? / Type ?? > > > 00 07 : source > > > 00 80 : seqno > > > 00 00 : parent > > > 00 00 : metric > > > 20 00 : data > > > 00 : ??? > > > 53 63: rssi+fcsCheck / CRC ?? > > > 7E : Framing byte, denoting end of packet > > > > > > Thanks everyone for helping with this "research"! > > > > > > Pedro > > > > > > On 6/13/07, David Moss <[EMAIL PROTECTED]> wrote: > > > > I haven't been following this discussion much, but if you haven't > > > > done > > > > so > > > > > > already, take a look at TEP 113, second 3.6: > > > > > > > > > > > > > > > > http://www.tinyos.net/tinyos-2.x/doc/html/tep113.html > > > > > > > > > > > > > > > > Some of your unknown bytes are explained there in the serial HDLC > > > > header, > > > > > > which I don't believe is documented explicitly in a struct. > > > > > > > > > > > > > > > > [HDLC header][Serial Header][Payload][HDLC Footer] > > > > > > > > > > > > > > > > The length byte in the serial header is the length of only the > > > > message payload I believe. There should be no radio message_t > > > > metadata information transmitted by default as part of the serial > > > > payload. > > > > > > > > > > > > > > > > http://en.wikipedia.org/wiki/High-Level_Data_Link_Control > > > > > > > > > > > > > > > > -David > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------ > > > > > > > > *From:* [EMAIL PROTECTED] [mailto: > > > > [EMAIL PROTECTED] *On Behalf Of *Pedro > > > > Almeida > > > > > > *Sent:* Wednesday, June 13, 2007 2:50 PM > > > > *To:* R. Steve McKown > > > > *Cc:* tinyos-help@Millennium.Berkeley.EDU > > > > *Subject:* Re: [Tinyos-help] Documentation regarding exact contents > > > > of the MACProtocol Data Unit frame > > > > > > > > > > > > > > > > Hello, Steve! > > > > > > > > Things are starting to look less blurry now. Some still sound > > > > strange, though. > > > > If the 13 (19 in decimal) was the length, then the payload would end > > > > (unless it doesn't start counting in the byte immediately after the > > > > 13) > > > > > > right after the byte with "20", which is a 2 byte field. > > > > > > > > > > > > Here's the line again: > > > > > > > > 7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 00 > > > > 00 > > > > > > 00 00 20 00 00 53 63 7E > > > > > > > > About that 20 and the "0xCAFE", it's because I have changed the > > > > struct for my app, and now the 2 byte field "data" in the struct is > > > > now split > > > > in > > > > > > 2, datah and datal, each with 1 byte (datah is the "20", datal is the > > > > "00"). So the 19 count cannot (unless i'm wrong) end in the "20". > > > > > > > > The payload struct looks like this: > > > > > > > > typedef nx_struct TestNetworkMsg { > > > > nx_am_addr_t source; > > > > nx_uint16_t seqno; > > > > nx_am_addr_t parent; > > > > nx_uint16_t metric; > > > > nx_uint8_t datah; > > > > nx_uint8_t datal; > > > > nx_uint8_t hopcount; > > > > nx_uint16_t sendCount; > > > > nx_uint16_t sendSuccessCount; > > > > } TestNetworkMsg; > > > > > > > > How about the "+4" in > > > > call UARTSend.send(0xFFFF, recvPtr, call Receive.payloadLength(msg) + > > > > 4) > > > > > > == SUCCESS), can it influence anything? It does add more bytes to > > > > what > > > > I > > > > > > get. > > > > > > > > typedef nx_struct serial_header { > > > > nx_am_addr_t dest; > > > > nx_am_addr_t src; > > > > nx_uint8_t length; > > > > nx_am_group_t group; > > > > nx_am_id_t type; > > > > } serial_header_t; > > > > > > > > So far, i've ran more tests to try and figure the fields out. Here's > > > > how > > > > > > I understand it so far, with your help and using the structs above: > > > > > > > > 7E : Sync > > > > 45 00 : ???? > > > > FF FF : destination address > > > > 00 00 : source address (root node) > > > > 13 : length ? > > > > 00 EE : Collection ID (from CTP) ?? / Type ?? / Destination PAN > > > > Identifier (from MAC Header) ?? > > > > 00 : ???? > > > > 01 : hopcount (seems out of place, but sure looks like it) ???? > > > > 00 00 : Destination Address (root ID=0) (from MAC Header) ??? > > > > 00 07 : Source Address (from the MAC Header) ???? > > > > 80 : sendCount ??? (this field increments like the seqno below) > > > > EE : Collection ID (from CTP) ?? / Type ?? > > > > 00 07 : source > > > > 00 80 : seqno > > > > 00 00 : parent > > > > 00 00 : metric > > > > 20 00 : data > > > > 00 : ??? > > > > 53 : rssi ? > > > > 63 : fcs check ? > > > > 7E : Sync > > > > > > > > Almost there, but still unclear. How does it look? > > > > > > > > Many thanks for all the help so far on this, > > > > > > > > Pedro > > > > > > > > On 6/13/07, *R. Steve McKown* <[EMAIL PROTECTED] > wrote: > > > > > > > > On Tuesday 12 June 2007 18:22:41 Pedro Almeida wrote: > > > > > Thank you, Steve McKown and Alexander Becher for your replies. > > > > > > > > > > Thanks to your help I more or less figured out how many bytes there > > > > > were from the Address Information to be included in the MAC Header. > > > > > > > > > > According to: > > > > > > > > > > typedef nx_struct cc2420_header_t { > > > > > nxle_uint8_t length; > > > > > nxle_uint16_t fcf; > > > > > nxle_uint8_t dsn; > > > > > nxle_uint16_t destpan; > > > > > nxle_uint16_t dest; > > > > > nxle_uint16_t src; > > > > > /** I-Frame 6LowPAN interoperability byte */ > > > > > #ifdef CC2420_IFRAME_TYPE > > > > > nxle_uint8_t network; > > > > > #endif > > > > > nxle_uint8_t type; > > > > > } cc2420_header_t; > > > > > > > > > > I then have 9 bytes from the MHR, adding to 1 from length (PHR) and > > > > > the 5 from the Synchronization Header > > > > > (SHR), assuming (I don't think I'm mistaken here) the I-frame is > > > > > not > > > > in > > > > > > > use, giving a total of 15 bytes. The type byte is include in the > > > > > payload > > > > > > > > > > (according to Steve). > > > > > > > > In terms of the 802.15.4 frame format, section 14.2 of the CC2420 > > > > data sheet > > > > shows that the data received into software from the radio. The SHR > > > > are > > > > > > never > > > > received by software, so it can't be part of the data you are trying > > > > to > > > > > > decode. The data returned is a length byte, the MPDU bytes, an RSSI > > > > byte > > > > > > and > > > > an FCScheck/corr byte (note the 2-byte FCS is replaced by RSSI and > > > > FCScheck/coor on receive). Also, if you look at CC2420.h and > > > > CC2420ActiveMessageP.nc , you'll see that the last 2 bytes > > > > (MAC_FOOTER_SIZE) > > > > are not calculated as part of the length field returned to the upper > > > > layers > > > > of software on a receive. Instead, the data in the last two bytes > > > > are placed > > > > in the metadata structure. > > > > > > > > So, I don't think SHR and FCS can be part of the packet format you > > > > are trying > > > > to decode. > > > > > > > > > The payload, from the TestNetwork application, is > > > > > > > > > > typedef nx_struct TestNetworkMsg { > > > > > nx_am_addr_t source; > > > > > nx_uint16_t seqno; > > > > > nx_am_addr_t parent; > > > > > nx_uint16_t metric; > > > > > nx_uint16_t data; > > > > > nx_uint8_t hopcount; > > > > > nx_uint16_t sendCount; > > > > > nx_uint16_t sendSuccessCount; > > > > > } TestNetworkMsg; > > > > > > > > > > since nx_am_addr_t is 2 bytes, this struct is 15 bytes. Adding the > > > > > 1 > > > > > > > > from > > > > > > > > > the type (as seen above), there's 16 bytes in payload. > > > > > Since > > > > > > > > > > typedef nx_struct cc2420_footer_t { > > > > > } cc2420_footer_t; > > > > > > > > > > and according to Steve, "The current radio stack has the cc2420 > > > > > generate the FCS (crc) automatically", so I presume it's not > > > > included. > > > > > > > This totals 31 bytes, and I read 32! If FCS was indeed included (2 > > > > > > > > bytes), > > > > > > > > > i'd get 33 bytes!! > > > > > > > > > > Please notice i'm using a representation such as this > > > > http://www.eng.yale.edu/enalab/courses/eeng460a/homeworks/hw1_results/d > > > > > > >ataf > > > > > > > > > >rame.gifto try and figure it out. > > > > > > > > > > This application uses CTP. Can it have anything to do with it? > > > > > According > > > > > > > > to > > > > > > > > > TEP-123 (http://www.tinyos.net/tinyos-2.x/doc/html/tep123.html ), > > > > > > > > > > The CTP data frame format is as follows (check the URL for correct > > > > > formatting): > > > > > 1 > > > > > 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 > > > > > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > > > > > > > > > > |P|C| reserved | THL | > > > > > > > > > > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > > > > > > > > > > | ETX | > > > > > > > > > > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > > > > > > > > > > | origin | > > > > > > > > > > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > > > > > > > > > > | seqno | collect_id | > > > > > > > > > > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > > > > > > > > > > | data ... > > > > > > > > > > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ > > > > > > > > > > But I don't know how to understand that, so it doesnt help me much. > > > > > Also, I don't understand why the frame starts and ends with 0x7E. > > > > > Is > > > > 7E > > > > > > > both preamble and last byte in payload? > > > > > > > > > > Here's one example sequence again: > > > > > > > > > > 7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 > > > > > 00 > > > > 00 > > > > > > 00 > > > > > > > > > 00 20 00 00 53 63 7E > > > > > > > > This is output from tn-listener, right? 0x7E is the serial sync > > > > byte. I'm > > > > not sure about the next 2 bytes, but the serial header starts at the > > > > fourth > > > > byte. Look at $TOSDIR/lib/serial/Serial.h and they'll match up: > > > > > > > > typedef nx_struct serial_header { > > > > nx_am_addr_t dest; > > > > nx_am_addr_t src; > > > > nx_uint8_t length; > > > > nx_am_group_t group; > > > > nx_am_id_t type; > > > > } serial_header_t; > > > > > > > > dest: FFFF - the dest addr as set by UARTSend.send(), as you note > > > > below. > > > > src: 0000 - the src addr of the sending mote. May be the PC > > > > connected mote itself. > > > > length: 13 (decimal 19) > > > > > > > > The next 19 bytes are CTP data, and I don't know the format so > > > > well. It > > > > > > looks > > > > like there's an initial byte, 2 8-byte entries, and a 2-byte footer, > > > > but > > > > > > I'm > > > > guessing. > > > > > > > > Note that tn-listener.c seems to have some problems. For example, it > > > > accesses > > > > packet after it has been freed. The data you are seeing could be > > > > corrupt, > > > > > > > > since there's a malloc() after packet is freed and the space could > > > > have > > > > > > been > > > > reused. The safe thing to do would be to move the free(packet) to > > > > just > > > > > > under > > > > the free(myPacket). I'm thinking there may be corruption because the > > > > second > > > > CTP unit is supposed to have a 16-bit constant value that should read > > > > "ca > > > > > > fe" > > > > in the raw data stream (see TestNetworkC.nc). > > > > > > > > Because the link to the PC is a serial link, the mote is sending a > > > > serial > > > > > > active message to the PC, which is the payload wrapped in the serial > > > > frame. > > > > This is why you don't see any of the CC2420/802.15.4 frame formatting > > > > in > > > > > > the > > > > data you are trying to match. > > > > > > > > Cheers, > > > > Steve > > > > > > > > > I believe the EE is the Collection ID, as seen from TestNetworkC.h, > > > > > which might relate to the CTP frame > > > > > ( > > > > http://www.tinyos.net/tinyos-2.x/apps/tests/TestNetwork/TestNetworkC.h > > > > > > ), > > > > > > > > > but I'm not sure that helps. The FF FF could also be from, but I > > > > can't > > > > > > be > > > > > > > > > sure: > > > > > > > > > > call UARTSend.send(0xFFFF, recvPtr, call Receive.payloadLength(msg) > > > > + > > > > > > > 4) > > > > > > > > == > > > > > > > > > SUCCESS) > > > > > > > > > > Many thanks and sorry for the confusing posts! > > > > > Hope you help me figure this out byte by byte and make sense out of > > > > it. > > > > > > > Very best regards, > > > > > > > > > > Pedro > > > > > > > > > > > > > > > > > > > > /** > > > > > * CC2420 Packet Footer > > > > > */ > > > > > typedef nx_struct cc2420_footer_t { > > > > > } cc2420_footer_t; > > > > > > > > > > On 6/11/07, Steve McKown <[EMAIL PROTECTED] > wrote: > > > > > > On Friday 08 June 2007 13:21, Pedro Almeida wrote: > > > > > > > Hello; > > > > > > > > > > > > > > I'm trying to look for documentation where I can understand the > > > > > > > > exact > > > > > > > > > > > contents, byte by byte, of the MPDU. I've looked into the TEPs > > > > and > > > > > > the > > > > > > > > > > > source files themselves, butI wasn't completely clear. > > > > > > > > > > > > > > I'm using now the TestNetwork demo, where I receive 32 bytes > > > > > > > per > > > > > > > > > > > > message, > > > > > > > > > > > > > of which I know little about, except for the contents of the > > > > > > > > message_t > > > > > > > > > > > itself: > > > > > > > > > > > > > > typedef nx_struct TestNetworkMsg { > > > > > > > nx_am_addr_t source; > > > > > > > nx_uint16_t seqno; > > > > > > > nx_am_addr_t parent; > > > > > > > nx_uint16_t metric; > > > > > > > nx_uint16_t data; > > > > > > > nx_uint8_t hopcount; > > > > > > > nx_uint16_t sendCount; > > > > > > > nx_uint16_t sendSuccessCount; > > > > > > > } TestNetworkMsg; > > > > > > > > > > > > > > That are not, by far, 32 bytes. > > > > > > > So far I understood the MPDU is made of > > > > > > > > > > > > > > 2 bytes - Frame Control > > > > > > > 1 byte - Data Sequence Number > > > > > > > 4 to 20 bytes - Address Information > > > > > > > n bytes - Data Payload > > > > > > > 2 bytes - Frame Check Sequence > > > > > > > > > > > > > > which adds 5 bytes of the SHR and 1 byte of the PHR. So what > > > > > > > exactly are those 32 bytes??? Which ones are the payload (MSDU) > > > > and > > > > > > > > > which > > > > > > > > ones > > > > > > > > > > > are > > > > > > > > > > > > not > > > > > > > > > > > > > (and what are they?)? > > > > > > > > > > > > > > An example of the 32 bytes is as follows: > > > > > > > > > > > > > > 7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 > > > > 80 > > > > > > > > > 00 > > > > > > > > 00 > > > > > > > > > > 00 > > > > > > > > > > > > > 00 20 00 00 53 63 7E > > > > > > > > > > > > The data above looks like an active message (AM) delivered via a > > > > > > > > serial > > > > > > > > > > physical layer. The hint are the 0x7E bytes, which are sync > > > > > > > > bytes. If > > > > > > > > > > this > > > > > > output came from the PC, then you should be able to map it to the > > > > > > serial_packet_t in $TOSDIR/lib/serial/Serial.h. The payload are > > > > > > delivered within the frame appropriate for the link on which the > > > > data > > > > > > is > > > > > > > > > > sent. Hence, > > > > > > one sees the serial headers and not the radio headers. > > > > > > > > > > > > I haven't played with Collection or the TestNetwork app, so I > > > > can't > > > > > > help > > > > > > > > > > out > > > > > > there. But I can provide some info on how the CC2420 component > > > > > > > > populates > > > > > > > > > > the > > > > > > 802.15.4 compatible frame. You can see the mapping in the > > > > > > cc2420_header_t structure in $TOSDIR/chips/cc2420/CC2420.h. The > > > > > > > > physical > > > > > > > > > > radio frame looks > > > > > > like this: > > > > > > > > > > > > preamble + sfd + cc2420_header_t + app_data + FCS (crc) > > > > > > > > > > > > In terms of 802.15.4, the second field of cc2420_header_t, fcf, > > > > > > is the > > > > > > > > > > > > first > > > > > > field of the MAC header. The last field of cc2420_header_t, > > > > > > type, > > > > is > > > > > > > > actually part of the MAC payload. The current radio stack has > > > > > > the > > > > > > > > cc2420 > > > > > > > > > > generate the FCS (crc) automatically. > > > > > > > > > > > > In terms of addressing, short addresses with the 802.15.4 PAN ID > > > > > > Compression > > > > > > is set, so the address info consists of pan_id + dest_addr + > > > > > > > > source_addr. > > > > > > > > > > You can see these fields in the cc2420_header_t structure. The > > > > fcf > > > > > > > > is > > > > > > > > > > > > set in > > > > > > CC2420CsmaP.nc's Send.send() implementation, where length, dsn > > > > > > and > > > > > > > > source > > > > > > > > > > are > > > > > > also set (destination has already been set in the header by this > > > > > > > > time). > > > > > > > > > > All the best, > > > > > > Steve > > > > > > > > > > > > > Help! > > > > > > > > > > > > > > Thank you!!! > > > > > > > > > > > > > > Pedro > > !DSPAM:4671561a153541336712104! _______________________________________________ Tinyos-help mailing list Tinyos-help@Millennium.Berkeley.EDU https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help