发新帖我要提问
12
返回列表
打印

请教一个通讯协议的问题

[复制链接]
楼主: hwk612167
手机看帖
扫描二维码
随时随地手机跟帖
21
cjseng| | 2013-5-26 12:42 | 只看该作者 回帖奖励 |倒序浏览
hwk612167 发表于 2013-5-26 11:50
最后在问您一个问题:
如A下面有200个B,B下有200个C,C下共有200个C和D,C可能做为多层中继到D。
这种情 ...

chunyang版主不是说的很清楚了吗:地址分为两部分,层级地址、节点地址。
就算你的节点地址是6个字节,但是层级只有A、B、C、D共4级,用一个字节表示已经绰绰有余。假设A要发给D中的一个节点,则协议格式:指定层级地址的1个字节、D的6个字节的节点地址,共7个字节,其它就是需要传送的数据以及校验相关的字节。200个B节点收到后,通过层级地址可以判断出不是自己这一层级的,不做任何处理,200个C节点收到后,也可以判断出不是自己这一层级,不作处理,最终数据到达D节点。
不过,这还要看你的通讯物理结构。

使用特权

评论回复
22
hwk612167|  楼主 | 2013-5-26 12:48 | 只看该作者
本帖最后由 hwk612167 于 2013-5-26 12:50 编辑
cjseng 发表于 2013-5-26 12:42
chunyang版主不是说的很清楚了吗:地址分为两部分,层级地址、节点地址。
就算你的节点地址是6个字节,但 ...

这样的话,是不是要浪费很多资源? A为了到达某个D,竟然发到了200个B,每个B又都发到了各自的200个C。。。

假设通讯媒介是无线,纯打个比方,如2.4G无线

使用特权

评论回复
23
cjseng| | 2013-5-26 13:25 | 只看该作者
hwk612167 发表于 2013-5-26 12:48
这样的话,是不是要浪费很多资源? A为了到达某个D,竟然发到了200个B,每个B又都发到了各自的200个C。。 ...

如果是无线方式,那就更好了,根本不需要转发啊,完全就是广播的方式,大家都能收到,然后对号入座,不是自己的地址不理睬就是了。就是说,A和D是直接通讯的,中间不需要转发,加入层级这个字节,B和C只要判断一个字节就知道不是自己的了。

使用特权

评论回复
24
hwk612167|  楼主 | 2013-5-26 14:13 | 只看该作者
cjseng 发表于 2013-5-26 13:25
如果是无线方式,那就更好了,根本不需要转发啊,完全就是广播的方式,大家都能收到,然后对号入座,不是 ...

谢谢答复。
真这么简单,就好了。。。

之所以这么多种设备,每种配置不一样,有无线也有有线。还有就是,无线距离都没多远,需要无线中继,所以有这些问题。。。

使用特权

评论回复
25
cjseng| | 2013-5-26 14:21 | 只看该作者
hwk612167 发表于 2013-5-26 14:13
谢谢答复。
真这么简单,就好了。。。

如果是这样,最简单的方式还是用TCP/IP来实现,至于内部的细节你就不用考虑了,由交换机来实现了,对于你来说就相当于点对点通讯了。

使用特权

评论回复
26
hwk612167|  楼主 | 2013-5-26 14:51 | 只看该作者
cjseng 发表于 2013-5-26 14:21
如果是这样,最简单的方式还是用TCP/IP来实现,至于内部的细节你就不用考虑了,由交换机来实现了,对于你 ...

你说的细节不用考虑,意思是借鉴TCP/IP,还是嵌入TCP/IP协议啊/

我这些东西都是简单MCU加些简单通讯模块,如485,还有其它的,协议复杂啊,我是这么觉得:dizzy:。

使用特权

评论回复
27
cjseng| | 2013-5-26 17:31 | 只看该作者
本帖最后由 cjseng 于 2013-5-26 17:32 编辑
hwk612167 发表于 2013-5-26 14:51
你说的细节不用考虑,意思是借鉴TCP/IP,还是嵌入TCP/IP协议啊/

我这些东西都是简单MCU加些简单通讯模块 ...


我说的就是将串口换成以太网,不过这样成本较高。
不过如果只用简单的MCU来做的话,不用TCP/IP,也是可以的,不过要麻烦些。
还是以A发给D来举例,如果物理链接只能是A-B-C-D这种拓扑结构,那么我想可以这样:
A对B广播,所有的B节点根据层级地址判断出不是发给本层级,则全部进行转发,所有C节点收到数据后进行同样处理,直到信息传送到所有D节点,D节点进行分析,最终只有地址对应上的一个D节点进行响应。这样看起来数据量很大,其实对于每一个B、C节点来说,只是判断一下层级,然后转发,耗费的时间不会太多,数据到达D节点,每个D节点不要判断层级地址了,只要判断本机地址,实际上工作量也不大。

打个比方:
习总要捎句话给HWK612167,他只要给各个省长开个电话会议,说要给某个村子里的HWK612167捎句话。省长得到这个消息,心想只是给某个村子里的人捎句话,不是找我的,然后每个省长又召开个电话会议,向各市长传达这个精神,市长接到电话,就可以通知乡长啦,乡长再找到村长,村长直接上HWK612167的门,就把话捎到了。如果HWK612167想对习总回个话,直接对村长说就行了,至于怎么把话捎到习总那边,就不要HWK612167考虑了,有人会把这事情给办好的。
这个捎句话的过程看起来劳师动众的,其实对于参与的每一个人来说,也就是接到上面的电话,然后把电话往下级传达一下,就是收一下、发一下,没多大事。

使用特权

评论回复
28
hwk612167|  楼主 | 2013-5-26 18:11 | 只看该作者
cjseng 发表于 2013-5-26 17:31
我说的就是将串口换成以太网,不过这样成本较高。
不过如果只用简单的MCU来做的话,不用TCP/IP,也是可以 ...

呵呵,比喻的很形象,道理是明白的,但是如果每个层级设备都是无线的话,同频会有干扰。不知是否可以这样理解?

打电话,不是这种方式吧。

使用特权

评论回复
29
cjseng| | 2013-5-26 18:31 | 只看该作者
hwk612167 发表于 2013-5-26 18:11
呵呵,比喻的很形象,道理是明白的,但是如果每个层级设备都是无线的话,同频会有干扰。不知是否可以这样 ...

同频会有干扰,这不要紧,时间上错开好了,事先定义好发送的顺序,确保同一时刻只有一个设备在发送。比如,每次发送数据都有主机A发起,不管A有没有数据要发送,每隔一段时间都发送一个同步帧。收到同步帧之后,按照B0、B1、B2、B3。。。Bn的顺序发送,之后再有C0、C1、C2、C3...Cn。

使用特权

评论回复
30
cjseng| | 2013-5-26 18:43 | 只看该作者
如果前面的方法延时太大,可以考虑每一级收到上级信号都进行解析,确定是要转发给自己的下级之后开始转发。
还是上面那个例子:习总要给B省C市D乡E村的hwk捎句话,则可以直接打电话给B省的省长,有B省的省长打电话给C市的市长,有C市的市长打电话给D乡的乡长,有D乡的乡长打电话给E村的村长,有E村的村长找到hwk。这个过程中,为了避免同频干扰,只需在上一级挂断电话后再开始给下一级打电话。
这里面还要考虑个优先级的问题,如果省长正在给市长打电话,此时习总的电话打进来,则省长立即挂断给市长的电话,先接听习总的电话。

使用特权

评论回复
31
hwk612167|  楼主 | 2013-5-26 18:47 | 只看该作者
cjseng 发表于 2013-5-26 18:31
同频会有干扰,这不要紧,时间上错开好了,事先定义好发送的顺序,确保同一时刻只有一个设备在发送。比如 ...

主机发出命令后,等待应答时,还隔一段时间主动发同步帧,是否存在冲突/?而且所有B收到命令后,还要等A的同步帧再一个个去发数据,效率会低下很多,到C还是这样。后面层级设备跟前级比是平方、立方的关系啊。

这样的话,我数据包中带上去目标的路径所有层地址,我感觉更省事些?

使用特权

评论回复
32
cjseng| | 2013-5-26 19:14 | 只看该作者
hwk612167 发表于 2013-5-26 18:47
主机发出命令后,等待应答时,还隔一段时间主动发同步帧,是否存在冲突/?而且所有B收到命令后,还要等A ...

我的想法是这样:主机发送命令也必须在同步帧期间进行,如果有命令,则这一次的同步帧跳过,以命令代替同步帧。
不用同步帧的话,数据包中带上所有的目标路径信息,假如A对B发信号,而此时B正在对C发信号,这里面还是有同频干扰的问题。或许可以用不同信道来解决,A到B用一个信道,B到C用一个信道,C到D用一个信道。

使用特权

评论回复
33
hwk612167|  楼主 | 2013-5-26 19:20 | 只看该作者
cjseng 发表于 2013-5-26 19:14
我的想法是这样:主机发送命令也必须在同步帧期间进行,如果有命令,则这一次的同步帧跳过,以命令代替同 ...

发送数据前,侦听信道空闲状况,连续空闲多长时间后才发送,能相当程度的减少同时发送造成的干扰吧?

使用特权

评论回复
34
gmgmgm| | 2013-5-26 21:20 | 只看该作者
hwk612167 发表于 2013-5-26 19:20
发送数据前,侦听信道空闲状况,连续空闲多长时间后才发送,能相当程度的减少同时发送造成的干扰吧? ...

这样侦听有意义吗?要是两个设备同时在侦听呢?而且同时侦听后同时发送数据的情况呢?

使用特权

评论回复
35
cjseng| | 2013-5-26 21:47 | 只看该作者
gmgmgm 发表于 2013-5-26 21:20
这样侦听有意义吗?要是两个设备同时在侦听呢?而且同时侦听后同时发送数据的情况呢? ...

所以最好还是有个发号司令的来协调这个工作吧,我觉得主机A来做这个工作是最合适的了。

使用特权

评论回复
36
lcdi| | 2013-5-26 22:22 | 只看该作者
hwk612167 发表于 2013-5-26 11:50
最后在问您一个问题:
如A下面有200个B,B下有200个C,C下共有200个C和D,C可能做为多层中继到D。
这种情 ...

你的想法很好,方法1最好,虽然数据包里包含地址,但是并不会太多,比如200->200->200,这样3个字节就能表示D的地址了,如果A也需要寻址,那么D用4个字节也可以表示到了,这样可以实现双向通讯的。
每个数据包增加两个字节(其实你的设备这么多,地址原本也要2个字节)。不会占用太多资源的。B、C两个节点兼路由功能,来回转发数据。
这样简化的协议就够了,否则真要搞好用TCPIP或者ZIGBEE都很复杂的。

使用特权

评论回复
37
lcdi| | 2013-5-26 22:34 | 只看该作者
比如说:
用4个字节地址。
第一个字节 A地址
第二个字节 B地址
第三个字节 C地址
第四个字节 D地址

0不作为地址,那么一个A节点地址为 xx 00 00 00
一个B节点地址为 00 xx 00 00
C节点为 00 00 xx 00
D节点为 00 00 00 xx
这样每个节点只要判断自己的地址部分符合就响应,然后转发到对应的下一级或上一级地址。如果下一级是0,那就是自己要响应。

使用特权

评论回复
38
chunyang| | 2013-5-26 23:25 | 只看该作者
网络规模较大时不能直接对子网节点访问,否则效率太低,而且485本身也不支持直接带载过多,总线必须配置成带有分支集线器的树形模式,集线器用来转发对特定地址段的指令和数据,通讯帧结构中的地址信息仍然是两级的,如我前面所言。
先好好弄明白什么是树形网络拓扑吧。

使用特权

评论回复
39
hwk612167|  楼主 | 2013-5-27 09:13 | 只看该作者
谢谢各位的回答,我先消化消化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则