zigbee无线遥控代码实现|学习笔记

简介: 快速学习zigbee无线遥控代码实现

开发者学堂课程【嵌入式之RFID开发与应用2020版zigbee无线遥控代码实现】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/665/detail/11135


zigbee无线遥控代码实现

 

本节课浏览zigbee主网的例子。

 

点对点通信的例子

把文件中03导出,将project关闭,删除untitled project si4project。重新创建一个工程。因为代码的量比较大,做起来不是很方便。选择install下的debug下的zigbee下的wireless点击确定。

此代码主要作用于遥控器,第一没有OSAL系统,第二不能组网。主要是一对多、一对一或者多对一的通讯。

首先找到main.c,官方提供了函数。点击scr选择components。components中提供的组件是简单的通讯组件。只需要创建main.c,(将编码方式改为UTF-8)在main.c中需要注意:发送数据的时候发给谁;发送目标的PANID和信道是什么;如果对方正在接收数据也正好开启,能够检测到信息的发射,通讯就是成功的。

init uart();

// Config basicRF

basicfConfig.panId = PAN-ID;

basicRfConfig.channel= RF CHANNEL;

basicfConfig.ackRequest=TRUE;

halBoardInit();

halLedset (1);|

halLedSet(2);

halMcuWaitMs(1000);

halLedClear(1):

halLedClear(2);

整个代码一开始的时候就是初始化串口,里面都是针对计算器的操作。

点对点遥控收发数据主要针对填充一个结构体:basicRfCfg-t。只要将这个结构器填正确,不论是收还是发,都没有问题的。

结构体中的成员:

typedef struct {

uint16 myAddr;(地址)

uint16 panId;(网络ID)

uint8 channel;(所使用的信道)

uint8 ackRequest;(是否允许请求应答)

#ifdef SECURITY-CCM

Uint8* securityKey;(安全的key)

Uint8* securityNonce;

所以它的内容填充的很少。那么ID是多少?从0-65535都是可以的。这里给2007,满足16位的范围。

信道的范围是0-26,总共有27个信道。我们这里给的是25,因为0是800多兆,1-10是900多兆,11-24是2.4G,所以这里选的是2.4G.应答设置为真。下面是对键盘的初始化、LED灯的设置,这里设了2个灯,这些都是官方给的,就不去考虑了,而且都是存单片机的操作,很容易看明白的。代码中也有存按键的操作,在文件02.key中的scr中。

POSEL S= ~0X01 ;//设置P00为普通IO口

PODIR S= ~0X01;//按键在P00口,设置为输入模式

POINP &= ~0x0;//打开P00上拉电阻,不影响

按键就是设置输入,然后不断的判断l口的值是否和按下的键是一致的。下去之后看看参考代码即可。

这里是系统帮助完成按键和灯的设置。

halMcuWaitMs(1000);

延时函数,毫秒为单位。后面几个的接口都不是很重要,关键的是下面的内容:

if (appMode == SWITCH)// Transmitter application

appSwitch(&basicRfConfig);

else if (appMode==LIGHT)// Receiver application

appLight(&basicRfConfig);

这个程序有两个功能:1、作为接收方和发射方,如果模式选择的是switch表示属于发射方;如何发射?将结构体构造好之后,直接调到下面的代码中:

uint8 pTxData[APP PAYLOAD_ LENGTH];

// Initialize BasicRF

basicfConfig-›myAddr= SWITCH-ADDR;

if (basicRfInit (bäsicfConfig) ==FAILED) {

HAL ASSERT (FALSE) ;

}

pTxData[0]=LIGHT TOGGLE CMD;

//Keep Receiver off when not needed to save power

basicRfReceiveOff();

首先明确接收方的地址,这里写的是myAddr= SWITCH-ADDR,其实这是对方的地址。将对方的地址明确,并且对数据结构做初始化。初始化的工作主要是设置通信、地址、参数等内容,而且如果设置失败的话,就会再次回到这个函数内。

接下来就是真正的数据:

Ptxdata[APP-PAYLOAD-LENGTH]这里定义的简单,就是1,就是1个字节。这一个字节给的是0。就是发送的长度只有一个字节。现在需要发送,因此就要将接受能力off掉。Basicreceiveoff();这样可以降低功耗,如果是接收方,就把这个设置改为on。让接受方一直在监听信标。在这个循环里面就是判断有没有按下一个按键:

If(halbuttonpushed()==HAL-BUTTON-1)如果按下了这个按键,就把自身口对应的led灯反转一下ha1ledtoggle(1);

最关键的部分:basicRfsendPacke:LIGHT-ADDR

,PTXDATA,APP-PAYLOAD-LENGTH)(上面提到的地址确实是自己的地址,因为发送的时候需要单独填一个地址)这里的地址是destaddr就是目标地址。第二个参数是发送的地址,第三个参数是发的数据多长。所以发送数据就是三要素:目标、源、长度用上面的函数就可以发送了。

那么这个函数basicRfsendPacke是如何发出去的?

这个是企业占位提供的接口,就不用去看了。将后面降低功耗的接口去掉,暂时用不到。只保留这一个 basicRfsendPacke:LIGHT-ADDR

,PTXDATA,APP-PAYLOAD-LENGTH)接口数据就可以发送出去了。

发出去之后另一方需要用另一个程序,就是light。作为一个接收方,如何做?和上面的代码几乎是一样的,设置接收到的数据方到哪里,设置自己的地址并且初始化,然后使能接收信号。

uint8 pTxData[APP PAYLOAD_ LENGTH];

// Initialize BasicRF

basicfConfig-›myAddr= LIGHT-ADDR;

if (basicRfInit (bäsicfConfig) ==FAILED) {

HAL ASSERT (FALSE) ;

}

basicRfReceiveON();

// Main loop

while (TRUE){

while (!basicRfpacketIsReady());

if (basicRfReceive (pRxData, APP _PAYLOAD_LENGTH, NULL)>0) {

If (oRaDatate) == LIGHi_TOGGLE_ CMO) {

Ha1LedToggle(1);

Ha1LedToggle(2);

接口basicRfpacketIsReady是判断有没有接收到数据。如果接收到数据,返回值为1。取反边0,0刚好退出while循环,进入到下面处理这个数据。怎么处理?

While(TRUE){

While(!basicRfPacketIsReady());

If(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0)

If(pRxData[0] == LIGHT_TOGGLE_CMD){

halLedToggle(1);

halLedToggle(2);

首先提取数据到APP里面,这个APP _PAYLOAD_LENGTH是提取的数据有多长。在提取参数的时候顺便可以prssl看一下信号的强度。如果不考虑信号的强度的话,就可以忽略这个参数。接下来判断接收到的数据是什么。如果接收到的数据是发送的0,那就可以让灯反转一下,亮的变灭,灭的变亮。

下面将这个程序写一些,首先发射端模式改成SWITCH。LIGHT表示先收接收方的代码。将前面打开的关闭,重新开一个新的工程。

打开之后第一步先编一下,将摄像头打开。编译通过。

这个是接收,先把这个程序先稍进去。

一闪一闪的是LED灯,由于刚刚已经编写过了,现在直接稍就可以了。这是接收的代码。

如何稍发送的代码?

需要将代码light改成switch。

image.png

上图是刚刚稍好的一个板子,是接收方。发射方上面有两个按键,按一下就会发射一个信号。

代码很简单,只需要构建一个结构体并且将里面的地址都填好,发给谁,数据是多少,对方就可以收到。

上面提到的一对多,就是上面有多个接收器,他们都设置成相同的信道、网络包括地址的话,是可以进行群发的甚至广播的。也可以一对一的发,也可以多对一的发送,这些发送的过程完全取决于地址怎么设置。

以上就是zigbee点对点通讯的应用。

相关文章
|
存储 Java 索引
十分钟教你学会JAVA中的学生管理系统
十分钟教你学会JAVA中的学生管理系统
342 2
|
机器学习/深度学习 Python
CatBoost高级教程:深度集成与迁移学习
CatBoost高级教程:深度集成与迁移学习【2月更文挑战第17天】
386 1
|
API 调度 语音技术
基于Qt的简易语音助手设计与实现
基于Qt的简易语音助手设计与实现
736 2
|
机器学习/深度学习 数据采集 人工智能
动手实践:从零开始训练AI模型的全面指南
【7月更文第14天】随着人工智能技术的飞速发展,训练AI模型已成为科研、工程乃至创业领域的热门技能。本文旨在为初学者提供一个清晰、实用的指南,带领大家从零开始,了解并实践如何训练一个人工智能模型。我们将以一个简单的线性回归任务为例,逐步深入,探讨数据预处理、模型构建、训练过程及评估方法,最后展示如何使用Python和深度学习库PyTorch实现这一过程。
6747 0
|
缓存 安全 网络协议
【Linux】已解决:There are no enabled repos. Run “yum repolist all” to see the repos you have. You can en
【Linux】已解决:There are no enabled repos. Run “yum repolist all” to see the repos you have. You can en
2031 1
|
运维 监控 NoSQL
RedisShake的基本原理
RedisShake的基本原理
640 0
|
算法 Python
探索LightGBM:并行化与分布式训练
探索LightGBM:并行化与分布式训练【2月更文挑战第4天】
869 1
|
存储 容灾 5G
阿里云服务器快照怎么收费?快照服务价格表
阿里云服务器开通快照收费吗?阿里云服务器开通快照服务收费吗?开通快照不收费,使用快照收费,比如为云服务器的云盘创建快照,就会根据快照大小和存储时间收取快照费,一般中国大陆地域的云服务器快照价格为0.12元/GB/月。阿里云百科来详细说下阿里云服务器快照有什么用、收费价格以及快照的作用:
715 0
阿里云服务器快照怎么收费?快照服务价格表
|
安全 物联网 网络架构
Zigbee—网络层地址分配机制
Zigbee—网络层地址分配机制
|
语音技术 C++
基于Qt的简易语音识别与合成系统设计与实现
基于Qt的简易语音识别与合成系统设计与实现
744 0