2.4G单点对单点通信

  • 一、实现功能
  • 二、通信原理概述
  • 三、Client端完整代码

一、实现功能

本章节实现了两个Core设备进行通信,其中一个设备是server、另一个设备是client。每当client设备按下电路板上的BTN1按键时,会向server上传数据。当server收到client的数据并验证通过后也会切换电路板上的LED1的亮灭状态,同时client也会收到server下发的命令,client验证命令通过后也会切换电路板上的LED1的亮灭状态。

另外server和client的电路板上的LED2都用来指示连接状态,只有当两边的LED2都同时亮时,才说明二者可以开始正常通信。

注意:由于Core内部自带2.4G无线功能,所以无需外部器件或模块即可实现本章节的无线通讯功能。但如果用了2.4G功能,Core的Ble蓝牙功能和USB功能就无法使用了,这一点开发者需要注意。

二、通信原理概述

Core在底层采用了基于 Thread无线网络的COAP协议,其实它是一个多点mesh网络通信协议,但是本例中的点对点通信只是实现了两个结点而已。

通过了解Thread无线网络的机制应该知道,在Thread中的节点分为三类:Leader,Router,EndDevice。但请不要将它们和COAP协议中的server,client概念混淆。因为在Thread网络中的server和client节点可能是Leader,Router,EndDevice三者中的任意一种,而且还不是固定的,会随着网络的动态变化而变化,而这也体现出了Thread网络的强大之处,即网络中如果某一个路由节点出现了问题,网络其他节点会动态调整自己的角色来自愈网络。

Server和Client间通信示意图

通信限制
一个网络中只能有一个server,但可以有上百个client。

所以server可以作为整个网络的网关,来连接到外部其他的网络比如wifi,NBIOT,LORA等。
PanID和频率Channel决定了mesh网络的唯一性。
基于此,我们可以设计PanID和频率Channel不同的Mesh网络来共存在同一个物理空间。

client的名字必须为8个字符,client上传给server的数据长度必须为8个字节,server下发给client的命令长度也必须为8个字节。(一般8个字节的空间对于传感器数据上传或控制类命令下发来讲已经足够了。)
server下发给client的命令不会马上被client收到,而是等到client下次上传数据给server时,server才会在应答过程中附带上命令数据下发给client。所以如果想让client尽早收到命令,client可以增加向server上传数据的频率。

这么做的原因有三点:(1) 如果client节点是低功耗休眠的传感器设备,大多数时候可能都不会在线,所以server也不可能实时下发数据
(2) 如果client节点是动态入网离网的,server也无法和这种节点建立稳定的连接 (3)
Core的内部资源有限,如果为每个client节点都维护一个连接会耗费大量的Ram。

Client端代码中的ClientName名字变量可以是任意的8个字符(必须是8个),例如本例中ClientName名字为"Client01"。

注意:ClientName是Client在网络中被Server所识别的唯一身份ID。

三、Client端完整代码

--PanID和Channel决定了mesh网络的唯一性
PanID = 0x1234 --16位整型
Channel = 11 --选择范围(11~26)
MyRole = "Client" --定义为client角色
LIB_MeshConfig(MyRole,PanID,Channel) --启动并加入mesh网络
--client自身的名字"Client01"必须为8个字符,且和server端所提及到的client名字要一致
ClientName = "Client01" --ClientName是Client在网络中被Server所识别的唯一身份ID
LIB_GpioOutputConfig("D8","STANDARD") --LED1
LIB_GpioOutputConfig("D9","STANDARD") --LED2
LIB_GpioWrite("D8",1) --灭
LIB_GpioWrite("D9",1) --灭
--设置按键1(占用D0口,低电平有效)
LIB_ButtonConfig("BTN1","D10","L")
net_state = 0
--开始大循环
while(GC(1) == true)
do--网络状态led指示net_state = LIB_MeshClientNetStateQuery()if net_state == 2 then --client已加入mesh网且找到了serverLIB_GpioWrite("D9",0) --LED2亮elseLIB_GpioWrite("D9",1) --LED2灭end--如果BTN1按键短按且client已经加入mesh网并找到了server,就向Server上传数据key = LIB_ButtonQuery("BTN1")if key == 1 and net_state == 2 thendata = {0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00} LIB_MeshClientSendData(ClientName,data)end--查询是否收到来自server下发的8字节命令,并解析recv_flag, cmd = LIB_MeshClientRecvCommand()if recv_flag == 1 and #cmd == 8 thenif cmd[1] == 0x01 then --这里只解析server下发的命令的第一个字节LIB_GpioToggle("D8") --LED1亮或灭切换endend
end

快速实现Thread Mesh组网详解相关推荐

  1. mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...

  2. 快速傅里叶变换(FFT)详解

    快速傅里叶变换(FFT)详解 (这是我第一次写博,不喜勿喷...) 关于FFT已经听闻已久了,这次终于有机会在Function2的介绍下来了解一下FFT了. 快速傅里叶变换(Fast Fourier ...

  3. Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46441571,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  4. Go 语言快速开发入门(基础语法详解,第一节)

    Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...

  5. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  6. android idata 模式,Android快速开发之appBase——(3).详解IHolder和IData

    Android快速开发之appBase--(3).详解IHolder和IData IHolder和IData是AVLib的两个组件,在前面已经使用过了,那么这一篇将会详细说明这两个组件的用法. IHo ...

  7. NB-IOT模块 小区重选和异频组网详解

    概述 关于NB-IOT模块 小区重选和异频组网详解. 异频组网是指同一区域基站的小区频点配置是不同的. 启动异频组网的原因在于同频组网有以下劣势: ●所有基站小区都是同一频点会导致同频干扰,提升了通信 ...

  8. 【JavaWeb篇】快速上手Tomcat|实战项目详解

    作者主页:橙子! 主页 系列专栏:JavaWeb基础教程系列 精彩回顾:HTTP协议详解 文章目的:Web服务器TomCat的使用以及配置问题 文章目录 前言 1.Web服务器 2.Tomcat简介 ...

  9. Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解

    http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...

最新文章

  1. EOS主网上线只是开始,如何运营决定未来
  2. python3 的 str bytes 区别
  3. 为什么机器人发展了几十年感觉还是没太大进展
  4. 【MYSQL】总结MySQL中对表内容的关联运算(join)
  5. CSS3的边框(三)
  6. 验证Vsphere 5 支持大于2TB磁盘
  7. 《Java程序员职场全攻略:从小工到专家》连载十四:先挣的是资本,后挣的是钱
  8. Android浸入式
  9. 【Java面试题系列】:Java中final finally finalize的区别
  10. ⚡自组织映射(SOM)神经网络⚡Python实现 |Python技能树征题
  11. Mathtype6.9保姆级安装教程,亲测可用-----经常踩坑
  12. element-tree 实现部门-人员选择(支持ID相同)
  13. android微信支付跳转逻辑,Android对接微信支付
  14. 不是Nvidia(英伟达)显卡可以安装CUDA跑深度学习算法吗?
  15. Ubuntu16.04安装播放器软件SMPlayer
  16. 金丝楠PhoebeSheareri
  17. 人脸识别-arcface损失函数
  18. 小样本不符合正态_抽样检验到底需要多少样本,你真的知道吗?
  19. Linux学习笔记——Linux、命令 01
  20. 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)

热门文章

  1. 腹肌和皮肤应该怎么画?女生腹部马甲线画法
  2. char类型能否存放中文
  3. Cache简介(一)
  4. SOC计算方法:电流积分+开路电压
  5. Mac 此账户尚未用于app store_精品良心Mac应用下载网站
  6. 银行家算法原理及代码实现
  7. 精选20个高品质的免费素材,可以下载PSD格式
  8. Mac操作系统下怎么显示隐藏文件
  9. chinacache解决方案——静态内容加速
  10. 大数据技术之Hadoop(入门)概述、运行环境搭建、运行模式