z-wave第一篇,我们用COMMAND_CLASS_BASIC - BASIC_SET控制智能开关。但是智能开关上有两个执行器,我们只能控制其中一路,那么我们如何控制另一路的开关的。在z-wave第二篇,我们分析了智能开关两个按键发送的消息,发现,用的是COMMAND_CLASS_MULTI_CHANNEL - MULTI_CHANNEL_CMD_ENCAP。
查看<<SDS12657-5 - Z-Wave Command Class Specification,A-M.pdf>>这个文档。
可以看到,实际但一个z-wave结点上有多个执行器的时候,实际可以有多个通道来控制的。
COMMAND_CLASS_MULTI_CHANNEL- MULTI_CHANNEL_CMD_ENCAP后面再封装真正的控制指令。比如COMMAND_CLASS_BASIC - BASIC_SET,如下图。
接下来,我们来验证这个事情。
1. 在Z-WAVE PC Controller软件选择已配对的智能开关。
从上图中可以看到,我们的智能开关的node id是11,即0x0B。
2. 向智能开关发送灯光的开闭数据。
分析如下
Command Classes | COMMAND_CLASS_MULTI_CHANNEL | 60 |
Command Name | MULTI_CHANNEL_CMD_ENCAP | 0D |
Source End Point | controller的结点号,从第一节的那个图中可以看到 | 01 |
Destination End Point | 经测试,是智能开关上的两个通道 | 01或02 |
Command Class | 封装的实际命令类COMMAND_CLASS_BASIC | 20 |
Commands | 封装的实际命令BASIC_SET | 01 |
Parameter | 开关数据 | FF或00 |
3. 从Z-WAVE PC Controller软件的log区可以看到如下信息
可以看到这帧数据的Series Api编号是0x13。
从<<INS12308-6 - Z-Wave 500 Series Appl.Prg. Guide v6.51.03.pdf>>这个手册上找到0x13这条协议,可以看到此条串口协议的整体格式。
并且pData[]里的数据就是第2节分析的所有数据。
nodeID | Z-Wave结点ID | 0B |
dataLength |
| 07 |
pData[] |
| 60 0D 01 01或02 20 01 FF或00 |
txOptions |
| 25 |
funcID |
| 03,这个编号是需要以此递增的,不递增也不影响功能 |
4.在<<INS12350-4 - Serial API Host Appl. Prg.Guide.pdf>>这个手册里找到下图,这是z-wave串口协议的一个整体结构图。
各个字段的说明都可以在这个文档里找到,包括Checksum的计算方式 。
5.至此,我们就可以组成一个完整的串口报文了。
通道1
01 0E 00 13 0B 07 60 0D 01 01 20 01FF 25 03 7B 开
01 0E 00 13 0B 07 60 0D 01 01 20 0100 25 03 84 关
通道2
01 0E 00 13 0B 07 60 0D 01 02 20 01FF 25 03 78 开
01 0E 00 13 0B 07 60 0D 01 02 20 0100 25 03 87 关
6.下面我们来分析一下,z-wave结点的反馈信息
上面4条协议的反馈信息均一样。
06 ACK
01 04 01 13 01 E8
01 04 01 13 01 E8
01 04 01 13 01 E8
01 04 01 13 01 E8
01 05 00 13 03 00 EA
01 05 00 13 03 00 EA
01 05 00 13 03 00 EA
01 05 00 13 03 00 EA
上面红色字03是和发送端的funcID匹配的,是依次递增的。
01 | SOF |
04 | Length,从上图看length应该不包括checksum???????????? |
01 | RES |
13 | Series Api编号 |
01 | RetVal |
E8 | checksum |
01 | SOF |
05 | Length,从上图看length应该不包括checksum???????????? |
00 | REQ |
13 | Series Api编号 |
03 | funcID |
00 | txStatus |
E8 | checksum |
如果用z-wave pc controller来发送的话,会在log窗口看到如下信息
就是说,z-wave结点反馈的两条数据,需要我们用ACK来回复,否则z-wave结点会重发4次。并且在重发的过程中,我们没法再发送信息给z-wave结点。