V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cherryodd
V2EX  ›  程序员

基于 zigbee 技术的组网算法讨论

  •  
  •   cherryodd · 2014-05-20 15:12:18 +08:00 · 3816 次点击
    这是一个创建于 3825 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是项目做到一定程度后的一个需求,先说说已知条件和已知的问题边界吧:

    1.项目中有很多终端机(下位机,嵌入式系统),将其看作节点,每个节点的开机和关机时间随机;

    2.每个节点的坐标(x,y)固定,但是从全局看,对于每个节点(如A)来说,它是不能事先知道其他节点(如B)的坐标信息,除非B将自己的(x,y)告知A,此时A才能知道B的存在。所以从这里就可以看出节点间的相互识别是贯穿整个组网算法的,有新的节点加入,则周围的节点要能识别,有节点退出,同样也要知道该节点已死亡,那么在发送数据进行路径选择时就不会考虑该节点。

    3.用的zigbee底层模块有两个参数是需要重点关注和利用的(说白了,zigbee就是一个无线设备,但是底层的zigbee协议已经帮我做了太多的事,所以就可以好好利用之)。
    (1)节点类型:中心节点、路由节点、终端节点
    (2)发送模式:广播、主-从、点对点

    4.对组网成功后,在进行数据远程传输的时候,能优化数据传输路径,优化体现在这几个方面:最短路径、最短跳数、节点数据压力较小。


    个人感觉难点有一下几个:

    1.节点之间的相互智能识别较难,因为这个要贯穿整个过程,在组网过程中出现的可能性太多,怎样随时更新路由信息。
    2.建网后数据传输的路径优化
    3.节点数据压力的处理
    4.性能要求:自适应性、网络健壮性

    所有问题都需要并行考虑,但是后面两个难点是在第一个难点解决后的基础上才能实现。而且对于第一个难点来说,为了更好的路由策略,节点的身份和发送模式可能发生改变,比如从路由节点改为中心节点,从广播模式改为主-从发送模式。

    目前为止我能考虑到的大概就总结如上,这个问题思考了好一段时间,不过每次考虑出一种方案,总是会有一些具体条件的出现来推翻我的方案,啊啊啊,不好弄啊!

    有没有熟悉自组网算法、路由策略的各位大神来提出我在这个过程中会出现的问题,给给建议或者提供一些资料或算法、书籍参考。小妹在这里不胜感激!
    23 条回复    2014-05-30 13:33:38 +08:00
    rrfeng
        1
    rrfeng  
       2014-05-20 15:25:17 +08:00
    太高端。
    大家好好看最后一句哟,哈哈
    jiang42
        2
    jiang42  
       2014-05-20 16:02:51 +08:00
    ZigBee 。。。难道是 EE 的妹纸?
    用 OSPF 不行?
    computer network 里有一段是论述 无线网络的,具体你自己翻书呗?

    以上皆为瞎扯,错了别打我。
    mccoymir
        3
    mccoymir  
       2014-05-20 16:26:59 +08:00
    我有一些cc2530模块的资料和开发的一些资料需要的话可以联系我
    mccoymir#gmail.com
    cherryodd
        4
    cherryodd  
    OP
       2014-05-20 16:30:10 +08:00
    @rrfeng 不要在乎这些细节。。。。
    mhycy
        5
    mhycy  
       2014-05-20 16:31:02 +08:00
    无责任猜测:
    单个终端加入时主动发送心跳信号
    周边设备捕获到这个信号以后加入到节点列表
    接下来zigbee自己折腾各种信息。。。。

    ##加入完成,进入下一步,路由##
    假设有一个节点被人工设定为主节点

    从这个节点发起信号
    周边设备应答这个信号(无线实现上有个难点,同频干扰)

    ##第一个点对点路由完成 下一步 继续##
    刚刚应答的子节点再次发起一次信号
    重复,应答
    因为区域问题,总有那么几个节点是无法应答的
    记录之。。。同步这个数据
    这两步得到的节点信息
    获得多出来的那几个节点,让那几个节点重复上一步
    获取无应答的节点,建立唯一路由
    ##继续。。。。。##


    可以按照IP路由的方式思考这个问题。。。
    每个路由每个节点都动态指定一个IP之类的


    ########################################
    随便乱说错了别打我
    cherryodd
        6
    cherryodd  
    OP
       2014-05-20 16:34:42 +08:00
    @mccoymir 底层模块的功能以及其提供的具体组网方案都摸清楚了,但是我那个算法研究是基于具体应用的,应用背景我都抽象出来了的嘛,我自己觉得一开始要实现节点之间的相互识别,而且从始至终,还要考虑系统资源、系统性能。不知道你说的开发资料是哪方面的?
    mccoymir
        7
    mccoymir  
       2014-05-20 17:09:36 +08:00
    @cherryodd 好像都是比较基础的,那你应该都不需要了
    听过zigbee讲解
    不过没有深入研究过底层的协议
    记得讲解时候说zigbee本身就是自发现/自组网
    而且可以切换主节点和字节的的身份
    自动选择最优路径发送消息
    这都是他们自己研究实现的么...我以为是zigbee的协议特性
    之前了解有AODVjr 和 cluster-tree 这两种路由算法的不少论文
    不知道有没有过时
    tuteng
        8
    tuteng  
       2014-05-20 18:08:05 +08:00
    @cherryodd 最近也做了一些zigbee的东西,但是远没有到研究算法的地步。下面为自己想的:如果楼主直接应用,能不能根据其信号质量,数据到达的时间来进行优化,每个zigbee设备,协调器,路由器,终端设备都有自己唯一的id,自己维护一份信号质量或者时间延时的信息,并定期更新,然后终端设备和路由器通过比较信息,选择加入哪个网络,z_stack协议栈应该可以直接测出信号质量的(但是不知道用的什么算法,也不知道可不可靠),,,,,
    9hills
        9
    9hills  
       2014-05-20 18:16:20 +08:00
    看有没有条件设立稳定的中转节点(7x24h)

    自组网很麻烦,一般不要用。
    rrfeng
        10
    rrfeng  
       2014-05-21 14:24:35 +08:00
    @cherryodd
    这才是重点好么。
    nuist
        11
    nuist  
       2014-05-21 19:31:11 +08:00
    想到之前做TinyOS组网的艰难日子
    mhycy
        12
    mhycy  
       2014-05-22 09:40:31 +08:00
    @tuteng
    无线通讯的信号质量不需要上层协议栈参与
    只要统计底层解调的误码率就够
    也可以在加多一个信号强度的检测上去,这个只要获取AGC的放大率就够了
    数字高频头有这接口
    vboo27
        13
    vboo27  
       2014-05-22 10:05:49 +08:00
    问个题外话,用的是哪家的解决方案?TI?
    vboo27
        14
    vboo27  
       2014-05-22 10:34:18 +08:00
    1. 如果是通过坐标找路径,那么猜测,至少路由节电和中心节电是固定的,所以他们的坐标是我们事先知道的。我觉得没必要让路由节点相互识别,最多只是需要节点的状态是活动的还是死亡的。
    2. 我觉得通过信号强度来找路径更合理吧,这样就不需要坐标。
    2.1 最短路径,默认认为信号越强的距离越短,虽然有误差,但是我反而觉得找信号最强的路径比找最短路径更有意义,因为比如两个路由节点的距离很近,但是之前隔了一个信号屏蔽效果很强的物体,在它们之前传输是不合理的。
    2.2 最小跳数,找一个可以正常发送的信号强度区间的,两两信号强度只要在这个区间就可以跳,然后找最小跳数。
    2.3 原理同2.2 ,需要记录每个路由节点被占用的情况。

    同样的,说错了别打我…………
    cherryodd
        15
    cherryodd  
    OP
       2014-05-22 11:25:51 +08:00
    @vboo27
    用的是上海顺舟的模块,他的模块的解决方案用的是TI的。
    对于你说的第一点,节点的(x,y)事先是不知道的,如果知道的话会简单很多,但是坐标是固定的,一旦确定了就不会变,会变的是 活动或死亡 状态。
    对于第二点,必然要考虑信号强度,而且这个值我打算用两个节点间的距离来量化,因为底层模块里标定信号强度的参数我获取不了;打个比方,两个顺舟模块间的传输距离是D(1km),我定义两个节点最佳通信距离为d(800m),超过这个具体就视作这两个节点不能通信,就算他们能收到对方的信号,但是信号较弱,那我在一开始决定要不要 把一个节点加到另一个节点的可通信节点列表 的依据就是 两个节点的距离s(通过坐标来算)有没有大于d;你觉得这样做有没有必要?
    cherryodd
        16
    cherryodd  
    OP
       2014-05-22 11:28:43 +08:00
    @tuteng 嗯嗯~定期更新周边节点的身份信息是必要的~z_stack协议栈可以直接测出信号质量,但这个是底层模块封装好的,我自己觉得不需要考虑这点,在通信范围内,肯定就能握手噻~
    cherryodd
        17
    cherryodd  
    OP
       2014-05-22 11:32:56 +08:00
    @mhycy谢谢你提的方案,我在仔细考虑你提的方案,将其与我的问题结合起来,有了些思路; 已有的TCP/IP路由协议就好多,而且路由协议就从分类来说就有好多种,看得我头大,要看懂就得花不少时间,我是打算考虑问题实在想不出策略后再去针对具体问题看具体的某几个协议。
    cherryodd
        18
    cherryodd  
    OP
       2014-05-22 11:33:44 +08:00
    @9hills 就是很麻烦啊~不过现在是骑虎难下,再难都得扛着
    cherryodd
        19
    cherryodd  
    OP
       2014-05-22 11:35:22 +08:00
    @rrfeng 程序猿一点都没有优势,所以这个问题在某种程度讲确实是重点。。。。。。
    cherryodd
        20
    cherryodd  
    OP
       2014-05-22 12:13:23 +08:00
    @nuist 能告知下是怎么个艰难法吗?
    cherryodd
        21
    cherryodd  
    OP
       2014-05-22 13:06:09 +08:00
    @cherryodd 是程序媛。。。。。
    cherryodd
        22
    cherryodd  
    OP
       2014-05-22 13:06:48 +08:00
    @rrfeng 是程序媛。。。。。
    mhycy
        23
    mhycy  
       2014-05-30 13:33:38 +08:00
    @cherryodd
    已有的TCP/IP路由协议不能直接运行在无中心无线环境,因为TCP/IP不会遇到无线通讯的同频干扰问题,而且也没办法获取周边节点的逻辑路径,只能一步步通讯来建立这个模型。
    另外,在没法获取底层通讯两端的信号强度的情况下,貌似只能做一个长期的日志记录来判断节点是否稳定。(没法获取到误码率那真的很难办。。囧)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2860 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:23 · PVG 10:23 · LAX 18:23 · JFK 21:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.