带C的Z波协议:关于Z波帧结构的问题&一般编程

时间:2015-07-09 13:28:35

标签: c networking packet z-wave

(在我提出问题之前;我真的不知道是否允许任何人回答我的问题,因为Z波协议应该是机密信息,但如果它确实违反了任何类型的规则那么感觉免费删除这篇文章。)

我目前正在尝试编写一个C程序,它只是构造一个由原始二进制数据组成的Z波消息,然后将该消息发送到连接Z波控制器的USB接口(我正在使用AEOTEC Z- Aeon Labs坚持使用USB加密狗。我也使用this指南作为参考,并尝试在简单C中重写示例代码。但是,如果你看一下指南,特别是他试图发送给USB控制器的消息:

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

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

另外,如果您从USB端口读取应用程序层信息(f.ex.在C)中使用open()& read()命令,是否正确无法检索应用程序层信息?

提前谢谢!

2 个答案:

答案 0 :(得分:5)

我认为通过研究OpenZWave's source code可以节省大量的时间和精力。这是一个用于处理ZWave的开源C ++库,它非常成熟且功能齐全。你可以从普通的C中轻松使用它。

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

./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;
}

答案 1 :(得分:4)

找到我要找的东西。如果有人有兴趣,这是我在Google搜索的日子和天后发现的......

Huge compilation of Z-Wave information

在该页面上(直接在Z-Wave帧描述下)是对用于直接与USB控制器通信的帧结构的描述。