damiaa 发表于 2021-10-31 19:34

【平头哥蓝牙Mesh网关开发套件免费试用】+nRF Mesh与灯 实验 (二)

<div class='showpostmsg'> 本帖最后由 damiaa 于 2021-10-31 20:15 编辑

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 【平头哥蓝牙Mesh网关开发套件免费试用】+nRF Mesh与灯 实验</p>

<p>&nbsp; &nbsp; <strong>设备和节点(<span style="color:#e74c3c;">Devices</span> and <span style="color:#e74c3c;">Nodes</span>)</strong></p>

<p>&nbsp; &nbsp; <span style="font-size:12px;">一个设备成为了蓝牙mesh网络的一部分,我们就把它叫做节点(node)。 反之它叫做&ldquo;未配网的设备&rdquo;(unprovisioned devices)。把未配网的设备变成节点的过程我们把它叫做 &ldquo;</span><strong><span style="font-size:16px;"><span style="color:#e74c3c;">配网</span></span></strong><span style="font-size:12px;">&rdquo; <span style="color:#e74c3c;"><strong>(</strong></span></span><span style="color:#e74c3c;"><strong><span style="font-size:20px;">provisioning</span></strong></span><span style="font-size:12px;"><span style="color:#e74c3c;"><strong>)</strong></span>。</span></p>

<p>&nbsp; &nbsp; <strong>元素(<span style="color:#27ae60;">element</span>)</strong></p>

<p>&nbsp; &nbsp;&nbsp;<span style="font-size:12px;">比如一组大灯在一个物理设备里面有三个子灯,每个子灯都可以通过寻址访问,子灯就称之为元素(<span style="color:#2ecc71;"><strong>element</strong></span>),大灯称之为节点(node)。每个元素对应一个单播地址(unicast address)。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp;</span><strong>蓝牙mesh模型(<span style="color:#e74c3c;">Model</span>)</strong></p>

<p>&nbsp; &nbsp; &nbsp;<span style="font-size:12px;">Mesh的应用定义的是使用&ldquo;发布-订阅(publish-subscribe)&rdquo;的典型的&ldquo;服务器-客户端(client-server)&rdquo;的架构。定义了三种不同的模式, Client, Server 和Control。</span></p>

<p><span style="font-size:12px;"><strong>&nbsp; &nbsp; &nbsp; <span style="color:#2ecc71;">Server model</span>:</strong>&nbsp;定义了状态states, 状态转换 state transitions, 状态绑定state bindings 和包含了哪些消息,当然也同样定义了与这些消息,状态,状态转换相关的行为Behaviors。</span></p>

<p><span style="font-size:12px;"><strong>&nbsp; &nbsp; &nbsp; <span style="color:#2ecc71;">Control model</span>:</strong>具备client model的功能与其他的server model进行交互,同时也可以有server model功能与其他client model进行交互。内置了逻辑控制层(一套规则和行为在各个与之连接的模型中进行协调交互)。</span></p>

<p><span style="font-size:12px;"><strong>&nbsp; &nbsp; &nbsp; <span style="color:#2ecc71;">Client model</span>:</strong>&nbsp;没有定义任何的状态States,但是它定义了要收发哪些消息。定义这些消息是为了GET,SET或者获取在Server models里面定义的状态。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp;&nbsp;每个Model对应一个<span style="color:#e74c3c;"><strong>Model ID</strong></span>(可以分SIG ModelID和Vendor Model ID),类似这个Model的地址。</span></p>

<p>&nbsp; &nbsp; <strong>地址(<span style="color:#e74c3c;"><span style="background-color:#ffffff;">Addresses</span></span>)</strong></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp;在蓝牙mesh里面定义了三种类型的地址:单播地址(unicast address),组播地址(group address)和虚拟地址(virtual address)。</span></p>

<p>&nbsp; &nbsp;&nbsp;<strong>消息,状态和属性(<span style="color:#e74c3c;"><span style="background-color:#ffffff;">Message,States and Properties</span></span>)</strong></p>

<p>&nbsp; &nbsp; <span style="font-size:12px;">通过消息可以获取和改变状态值,也可以获取属性值。例如开关的读取和控制消息。消息是蓝牙Mesh网络中,节点与节点之间进行数据传输的最小单元。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp; 例如:一个onoff命令即为一条消息,一个调节亮度的命令也是一条消息。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp; 要进行某种操作,就是调用消息这一基本机制。一个给定的消息类型代表了一个对状态的操作或者对多个状态的采集。所有的消息都可以分成三种简单类型:get 、set 、 status。</span></p>

<p>&nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size:12px;">大部分的mesh消息都是对状态进行操作的,只有特别的和属性相关的消息,才会对属性进行操作。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp;</span><strong>发布和订阅(<span style="color:#e74c3c;">Publish/Subscribe</span>)</strong></p>

<p><strong>&nbsp; &nbsp; &nbsp;</strong><span style="font-size:12px;">在蓝牙mesh里面发消息的动作我们叫做发布(Publish)。告诉别人什么事情发生或者做什么事情就叫做发布。谁对某些消息感兴趣就可以订阅这些内容。节点发布消息到单播地址,组播地址或者虚拟地址。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp; 节点有兴趣接收这些数据的可以订阅这些地址。</span></p>

<p><strong>&nbsp; &nbsp; &nbsp;状态绑定(<span style="color:#e74c3c;">Bound States</span>)</strong></p>

<p>&nbsp; &nbsp; &nbsp;<span style="font-size:12px;">当一个状态绑定到另一个状态,在一个上面的改变将作用于另一个的改变。</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp;</span> 蓝牙Mesh的Key(<strong><span style="color:#e74c3c;">DevKey,AppKey, NetKey</span></strong>)</p>

<p>&nbsp; &nbsp; &nbsp; <span style="font-size:12px;">AppKeys用于保护上层传输层的通信,NetKeys用于保护网络层的通信。 两种类型的密钥在节点之间共享。 还有一个设备密钥(DevKey),它是每个节点唯一的特殊应用密钥,只有节点和配置客户端知道,并用</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp; 于保护节点和配置客户端之间的通信。</span></p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp;<strong> &nbsp;双灯组合实验&nbsp;</strong></p>

<p>&nbsp; &nbsp;<strong> &nbsp;烧录灯1和灯2模块</strong>: 剑池CDK集成开发环境生成和编译mesh_light_node_demo,注意修改uuid,使下载到2个灯的uuid不一样。如下图:</p>

<p>&nbsp; &nbsp;&nbsp;</p>

<p>烧录时mac地址要改得不一样。以后所有的设备烧录都要这样。否则一个mesh网络里面有mac地址一样的设备就会有问题。</p>

<p></p>

<p><span style="color:#27ae60;">设备烧录时要连接好串口,J5 TM拨到VCC,然后按复位后,看到提示uart。。。,把mac地址填好,文件在hex那里加载进去,然后erase和 write,成功后会提示</span>。</p>

<p>如果连上putty 按一下复位,就可以看到如下:</p>

<p></p>

<p>&nbsp;入网操作,打开nRF Mesh,目前最新版本为3.16(<span style="color:#2c3e50;">手机做配网设备</span><span style="color:#e74c3c;">Provisioner</span><span style="color:#2c3e50;"><span style="font-size: 16px;">)</span></span></p>

<p><span style="color:#2c3e50;"><span style="font-size: 16px;">&nbsp;入网操作其实就几个动作,一个是</span></span><span style="color:#c0392b;"><span style="font-size: 16px;">创建group 组</span></span><span style="color:#2c3e50;"><span style="font-size: 16px;">,一个 是</span></span><span style="color:#c0392b;"><span style="font-size: 16px;">入网</span></span><span style="color:#2c3e50;"><span style="font-size: 16px;">,一个是</span></span><span style="color:#c0392b;"><span style="font-size: 16px;">节点配置</span></span><span style="color:#2c3e50;"><span style="font-size: 16px;"> (一个是</span></span><span style="color:#c0392b;"><span style="font-size: 16px;">appkey</span></span><span style="color:#2c3e50;"><span style="font-size: 16px;">,BIND KEY,还一个是开关设备要设置</span></span><span style="color:#c0392b;"><span style="font-size: 16px;">发布地址</span></span><span style="color:#2c3e50;"><span style="font-size: 16px;">,灯光设备要设置</span></span><span style="color:#c0392b;"><span style="font-size: 16px;">订阅地址</span></span><span style="color:#2c3e50;"><span style="font-size: 16px;">,发布地址和订阅地址可以是</span></span><span style="font-size:12px;">:单播地址(unicast address),组播地址(group address)和虚拟地址(virtual address))。</span></p>

<p><span style="color:#2c3e50;"><span style="font-size: 16px;">&nbsp; &nbsp;</span><span style="font-size:12px;"> 1,配置一个组</span></span><span style="font-size:12px;">group(分配地址),组地址后面添加也是可以的:</span></p>

<p><span style="font-size:12px;">&nbsp; &nbsp;&nbsp;</span></p>

<p></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp; 2,查找设备</span><span style="color:#e74c3c;">Provision</span></p>

<p>点击addnode查找到两个设备:</p>

<p>点击灯光设备1,出现</p>

<p>点击IDENTIFY,出现</p>

<p>点击PROVSION,设备入网。入网后提示如下</p>

<p></p>

<p><span style="color:#e74c3c;">&nbsp; &nbsp; &nbsp;</span><span style="color:#2c3e50;"><span style="font-size:12px;">3,节点配置,点击下面一个进入节点配置</span></span></p>

<p></p>

<p>Elements进入配置地址(开关设备设置发布地址,灯光设备设置订阅地址),APP keys设置appkey 都搞得一样就可以组网。</p>

<p></p>

<p><span style="font-size:12px;">&nbsp; &nbsp; &nbsp;加appkeys:选第一个就可以。</span></p>

<p></p>

<p>&nbsp; &nbsp; 点击Elements右边符号进入配置地址:</p>

<p>选择Generic On Off Server&nbsp;</p>

<p>配置<strong><span style="color:#c0392b;">BIND KEY</span></strong> 和<strong><span style="color:#c0392b;">订阅地址 SUBSCRIBE </span></strong>如果是SWITCH就设置发布地址SET PUBLICATION 可以选择组或其他地址。</p>

<p>配置好了后组里面就出现一个ON OFF的图标,可以控制灯光亮灭了。</p>

<p>另外一个灯也可以一样配置,如果配的订阅地址在一个组group里,那就一个开关可以控制两个灯同时亮灭,如果放到两个group里,那就单独控制。</p>

<p>实验时也可以通过putty链接板子看到提示信息。</p>

<p>这个实验就先到这里。</p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

annysky2012 发表于 2021-10-31 22:31

感谢分享,期待后续

damiaa 发表于 2021-11-1 08:43

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3101254&amp;ptid=1183901" target="_blank"><font color="#999999">annysky2012 发表于 2021-10-31 22:31</font></a></font> 感谢分享,期待后续</blockquote>
</div>

<p>谢谢。努力!</p>

wangerxian 发表于 2021-11-1 16:35

<p>流程非常详细,发布也可以单独控制某个节点设备的灯~</p>

damiaa 发表于 2021-11-1 16:47

本帖最后由 damiaa 于 2021-11-1 16:56 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3101478&amp;ptid=1183901" target="_blank"><font color="#999999">wangerxian 发表于 2021-11-1 16:35</font></a></font> 流程非常详细,发布也可以单独控制某个节点设备的灯~</blockquote>
</div>

<p>是的&nbsp; &nbsp;发布地址和订阅地址可以是:单播地址(unicast address),组播地址(group address)和虚拟地址(virtual address)nRF Mesh配置时选择&nbsp;&nbsp; 不是只有group group适合一个按键控制多个灯同事亮灭的时候有用。</p>

wangerxian 发表于 2021-11-1 17:14

damiaa 发表于 2021-11-1 16:47
wangerxian 发表于 2021-11-1 16:35 流程非常详细,发布也可以单独控制某个节点设备的灯~


是的&nbsp ...

<p>虚拟地址一般会在什么情况下使用呀?</p>

damiaa 发表于 2021-11-1 19:46

本帖最后由 damiaa 于 2021-11-1 19:47 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3101488&amp;ptid=1183901" target="_blank"><font color="#999999">wangerxian 发表于 2021-11-1 17:14</font></a></font><br />
虚拟地址一般会在什么情况下使用呀?</blockquote>
</div>

<p>&nbsp; &nbsp; &nbsp; &nbsp;</p>

<ol><br />
        <li>虚拟地址(Virtual Address)作用类似与组地址,不同点在于其地址空间为2^16。&nbsp; &nbsp;&nbsp;</li>
        <li>虚拟地址一般用法与组播地址类似,可以通过nrf meshapp建立group的那个按钮建立,也可以配置设备的发布地址和订阅地址为虚拟地址,比如配置switch发布地址和light的订阅地址为同一个虚拟地址,就可以通过switch 控制light。测试发现是一样的。</li>
        <br />
        &nbsp;
</ol>

<p>&nbsp;</p>

wangerxian 发表于 2021-11-2 09:06

damiaa 发表于 2021-11-1 19:46
wangerxian 发表于 2021-11-1 17:14
虚拟地址一般会在什么情况下使用呀?


&nbsp; &nbsp; &nbsp; &n ...

<p>大概理解了,看来虚拟地址的定义还是有意义的!</p>
页: [1]
查看完整版本: 【平头哥蓝牙Mesh网关开发套件免费试用】+nRF Mesh与灯 实验 (二)