针对这个话题或是课题的研究和相关的文章真是已经很多了,所以,我并不想从理论的方面来讲述这个问题,去百度或是各种资源库或期刊库里一下子就能找到一大堆讨论这个问题的论文,不过,很可惜的是那么多的论文却没有一个提到问题最关键的地方。
组建LONWORKS网络时,如果节点间通信使用网络变量的话,则在网络建成时,需要使用各种可行的网络管理软件来对网络进行构建,即对节点关系进行定义,完成网络变量的绑定及相关的三表修改。
但是,对于小型的网络来说,这一整套事情做下来不免觉得繁杂。所以总希望能有更简单易行的方法来实现要求不高的少量节点间的通信,而上文所说的 显式消息 就刚好能实现这种要求。
使用显式消息其实很简单,拿例程说事,程序代码如下:
void SendMessage(unsigned data[]){ unsigned int i; if(msg_alloc()) { for(i=0;i<RECV_SIZE;i++) msg_out.data[i]=data[i]; msg_out.code=0; //定义消息代码 msg_out.tag=TAG_OUT; //消息TAG msg_out.service=UNACKD; //服务方式 msg_out.dest_addr.no_address = BROADCAST; //广播消息 msg_out.dest_addr.bcast.type = BROADCAST; msg_out.dest_addr.bcast.domain=0; //域地址 msg_out.dest_addr.bcast.backlog=0; msg_out.dest_addr.snode.retry=0; msg_send(); }}
由以上的消息发送函数可知,NC已经提供给我们一个msg_out的对象,我们只需要使用这个对象来构造一个消息即可,然后使用内建的函数msg_send()即将消息发送。如果选择的发送地址为广播BROADCAST的话,那么该条消息将会在整个域内广播。
消息的接收也很简单,使用消息接收事件即可,程序代码如下:
when(msg_arrives){ unsigned int i,len; if(msg_in.code==0) {
///添加有用的代码
}
}
如上所示,消息到达时,会发生一个msg_arrives事件,因为NC已经有一个内建的msg_in对象来接收网络上的消息。我们只需要判断一下接收到的消息的 消息码 即知是否我们所需要的消息。
综上所述,整个过程并不复杂,但是事情的关键是,实现以上代码后并不能实现所要求的目的。关键原因在于节点处于非online状态时,消息是不能发送出去的(除了固件定义的)。因此,在节点Download程序时,还是需要使用网络工具对其下载程序,并配置为online状态。而不能使用Nodeload直接下载程序,使节点为offline状态。至于在应用程序里自己实现online并且configure状态是否也可以则不得而知,因为没有尝试,我可以提供一个应用程序配置的方法,读者有兴趣的话自己尝试一下。方法如下:
extern system void _change_state(int state);
#include <nm_ste.h>
_change_state (CNFG_ONLINE);
大家也许会说,这不还是得用到网络管理工具吗?不过,您可看好了,用显式消息只需要用网络工具把节点配置为online和configure的状态就好了,至于网络变量及网络是不用理会的。如果网络中有节点损坏,只需要再找一个有相同应用程序的节点放进来替换就好了。当然,这样的方式是需要用户自己定义通信协议的。