6

(在我问我的问题之前;我真的不知道是否允许任何人回答我的问题,因为 Z-wave 协议应该是机密信息,但如果它确实违反了任何类型的规定,请随时删除这个帖子。)

我目前正在尝试编写一个 C 程序,它简单地构造一个包含原始二进制数据的 Z-wave 消息,然后将该消息发送到连接 Z-wave 控制器的 USB 接口(我正在使用 AEOTEC Z-Stick USB 加密狗由永旺实验室)。我也使用指南作为参考,并尝试用纯 C 重写示例代码。但是,如果您查看指南,特别是他试图发送到 USB 控制器的消息:

/*
0x01, 0x09, 0x00, 0x13, nodeId, 0x03, 0x20, 0x01, state, 0x05, checksum
*/

...也许只有我一个人,但似乎缺少来自通常 Z-wave 框架的一些信息。我的猜测是前 4 个字节代表 Home ID,后跟节点 ID,但我无法弄清楚 '0x03' 之后的含义,假设该字节之后的其余部分代表“基本”命令类(' 0x20',1 个字节)和相应的“设置”应用命令('0x01',1 个字节)。校验和位之前的“0x05”代表什么?那么传输头信息呢,为什么不包括在内?似乎他不需要包含它......或者我只是完全错误地解释了数据包。有人可以启发我吗?

此外,如果您从 USB 端口读取应用程序层信息(例如,在 C 中使用 open() 和 read() 命令),您只能从 USB 端口检索应用层信息是否正确?

先感谢您!

4

2 回答 2

5

我认为您可以通过研究OpenZWave 的源代码来节省大量时间和精力。这是一个用于与 ZWave 一起工作的开源 C++ 库,它非常成熟且功能齐全。你可以很容易地从纯 C 中使用它。

您所问的部分内容可以在Msg 类构造函数中看到,该构造函数构造帧的开始(0x01),然后是消息长度(0x09 == 9 字节),消息类型(0x00 == REQUEST)和函数(FUNC_ID_ZW_SEND_DATA == 0x013),然后是目标节点ID,然后是实际的命令体,我想这是一个基本命令:

./src/Defs.h:#define COMMAND_CLASS_BASIC 0x20

bool Basic::SetValue
...
            Msg* msg = new Msg( "BasicCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true );
            msg->SetInstance( this, _value.GetID().GetInstance() );
            msg->Append( GetNodeId() );
            msg->Append( 3 );
            msg->Append( GetCommandClassId() );
            msg->Append( BasicCmd_Set );
            msg->Append( value->GetValue() );
            msg->Append( GetDriver()->GetTransmitOptions() );
            GetDriver()->SendMsg( msg, Driver::MsgQueue_Send );
            return true;
    }

    return false;
}
于 2015-10-25T07:48:49.190 回答
4

Found what I was looking for. In case anyone is interested, here's what I found after days and days of googling...

Huge compilation of Z-Wave information

A bit further down on that page (directly under the Z-Wave frame description) is a description of the frame structure that is used to communicate directly with the USB controller.

于 2015-07-16T13:56:00.373 回答