我必须在IEEE 802.15.4设备上运行。问题是关于XBee-PRO。
Firmware: XBEE PRO 802.15.4 (Version: 10e6)
Hardware: XBEE (Version: 1744)
两个单元都配置为相同的通道 (15) 和相同的 PAN id (0x1234)。它连接到我的机器COM 端口,当我将picocom连接到它时,它实际上可以传输数据。(它可以正确响应 AT 命令,并且可以通过 moltosenso 网络管理器完全配置 - 我在Mac上)。除串行波特率外,所有其他寄存器均为默认值。
XBee 端源地址为 0x1,目的地址为 0x2。现在,当我在 picocom 中输入一个ASCII字符时,这是我在另一台设备上看到的,以混杂模式运行:
-- Typing "a"
E 61 88 7E 34 12 2 0 1 0 2B 0 61 E1
E 61 88 7E 34 12 2 0 1 0 2B 0 61 E1
E 61 88 7E 34 12 2 0 1 0 2B 0 61 E1
E 61 88 7E 34 12 2 0 1 0 2B 0 61 E1
-- Typing "b"
E 61 88 7F 34 12 2 0 1 0 2C 0 62 58
E 61 88 7F 34 12 2 0 1 0 2C 0 62 58
E 61 88 7F 34 12 2 0 1 0 2C 0 62 58
E 61 88 7F 34 12 2 0 1 0 2C 0 62 58
--- Typing "a" again
E 61 88 80 34 12 2 0 1 0 2D 0 61 A9
E 61 88 80 34 12 2 0 1 0 2D 0 61 A9
...
ln pc pan da sa ct pl ck
因此,对于发送的每个数据有效负载,我看到发送了四个帧(当然没有人接收它们)。我想其中三个是 802.15.4 重试,XBee 添加另一个用于踢球(尽管 RR 寄存器显然为零......)。
这里的数据包格式是什么,在哪里指定?
我查看了 XBee API 数据包,这看起来确实有点相似,但我在这里看不到 0x7e 分隔符或类似的东西。
我想我看到的是:
ln = length
61 = ??
88 = ??
pc = some sort of packet counter
pan = 16 bits of PAN ID
da = 16 bits of destination address
sa = 16 bits of source address
ct = another counter?
0 = ??
pl = my ASCII character payload
ck = probably a checksum
我尝试将 PAN 设置为 0xFFFF 并将目标地址设置为 0xFF 或广播,结果几乎相同。这些 0x61 和 0x88 似乎与 XBee 文档中的任何内容都不对应......
它也不直接看起来像 802.15.4 MAC 级数据帧 - 或者如果是,那么缺少哪些字段以及它们在哪里指定?指针?
编辑:实际上,嗯。将十六进制格式的转储导入Wireshark后,它准确地告诉我这是一个 802.15.4 MAC 帧以及如何读取它。
IEEE 802.15.4 Data, Dst: 0x0002, Src: 0x0001, Bad FCS
Frame Control Field: Data (0x8861)
.... .... .... .001 = Frame Type: Data (0x0001)
.... .... .... 0... = Security Enabled: False
.... .... ...0 .... = Frame Pending: False
.... .... ..1. .... = Acknowledge Request: True
.... .... .1.. .... = Intra-PAN: True
.... 10.. .... .... = Destination Addressing Mode: Short/16-bit (0x0002)
..00 .... .... .... = Frame Version: 0
10.. .... .... .... = Source Addressing Mode: Short/16-bit (0x0002)
Sequence Number: 126
Destination PAN: 0x1234
Destination: 0x0002
Source: 0x0001
我仍然不知道实际数据字节前面的第二个 16 位计数器来自哪里,以及为什么 FCS 被搞砸了(我不得不剥离开头的 len 字段以让 Wireshark 读取它 - 可能就是这样。)