zigbee笔记:十二、单播通信单字符、字符串收发

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

      

一、zigbee四种通讯

        1、单播:在Zigbee网络里,模块之间进行通信,发送模块非常明确知道接收模块的网络地址,以这个地址发送数据给接收模块,叫做单播。

        2、广播(略)

        3、组播(略)

        4、绑定(略)

        PS:zigbee模块的网络地址的特点:当模块入网时,父节点随机分配网络地址给子节点;协调器作为网络中的第一个节点,它的网络地址固定是0x0000。

  二、单播字符收发实验

        本次做的实验是一共两个模块,协调器作为接收方,终端作为发送方。实现终端按键1按下,发送数据包;协调器收到数据包后,LED亮灭翻转,将数据包中的有效数据发送给电脑上位机。

        本次实验的代码是在zigbee笔记:十一 实验基础上完成的。

        1、发送端(终端)代码配置

        实现效果:按下按钮KEY1,将数据发送出去。

        1)首先在smartHomeApp.c中找到smartHomeApp_ProcessZDOMsgs函数。

        选择如下代码,提取出来。

smartHomeApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
smartHomeApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
smartHomeApp_DstAddr.endPoint = pRsp->epList[0];
/*
 smartHomeApp_DstAddr.addr.shortAddr = pRsp->nwkAddr中的
pRsp->nwkAddr表示接收方地址,改为0x0000,作为我们的协调器地址(接收方);

*/
smartHomeApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
smartHomeApp_DstAddr.addr.shortAddr = 0x000;
smartHomeApp_DstAddr.endPoint = pRsp->epList[0];

        2)然后在smartHomeApp_Init找到smartHomeApp_ENDPOINT,将其提取出来。

        将smartHomeApp_DstAddr.endPoint = pRsp->epList[0]中的pRsp->epList[0]替换为smartHomeApp_ENDPOINT。

smartHomeApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
smartHomeApp_DstAddr.addr.shortAddr = 0x000;
smartHomeApp_DstAddr.endPoint = pRsp->epList[0];

/*
将smartHomeApp_DstAddr.endPoint = pRsp->epList[0]中的pRsp->epList[0]替换为smartHomeApp_ENDPOINT。
*/
smartHomeApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
smartHomeApp_DstAddr.addr.shortAddr = 0x000;
smartHomeApp_DstAddr.endPoint = smartHomeApp_ENDPOINT;

        3)找到smartHomeApp_SendTheMessage函数,该函数的作用将"Hello World"字符串发送出去。我们将其中的数组char theMessageData[] = "Hello World"; 和发送信息函数部分拷贝出来,放在第1)步提取的代码后面。如下图和代码

         将theMessageData里放一个字符"a",AF_DataRequest函数中只需要修改字符格式即可,而由于存放的是单个字符,且没有'\0'结尾,因此不可以用strlen来计算大小,填1即可,发送模块的代码如下。

//  将theMessageData里放一个字符"a",AF_DataRequest函数中
//只需要修改字符格式即可,而由于存放的是单个字符,且没有'\0'结尾,
//因此不可以用strlen来计算大小,填1即可,发送模块的代码如下。

//char theMessageData[] = "Hello World";
char theMessageData[] = {'a'};
smartHomeApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
smartHomeApp_DstAddr.addr.shortAddr = 0x000;
smartHomeApp_DstAddr.endPoint = smartHomeApp_ENDPOINT;

AF_DataRequest( &smartHomeApp_DstAddr, &smartHomeApp_epDesc,
                       smartHomeApp_CLUSTERID,
                     // (byte)osal_strlen( theMessageData ) + 1,  表示发送字节个数
                        1, 
                       (byte *)&theMessageData,//发送的数组的首地址
                       &smartHomeApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );

//添加一份LED灯,指示按键被按下

        4) 将步骤 3)中的代码放在应用处理函数的自定义事件执行内容中。效果是,当终端设备按下按键1,会发送一个字符'a'给协调器,同时LED2亮灭翻转。

        5) 选择终端设备编译,然后下载代码

        2、接收端(协调器)配置

        1)在smartHomeApp.c中找到static void smartHomeApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )函数,smartHomeApp_MessageMSGCB函数的作用是,当发送模块发送数据包,接收模块接收到信息后会进入该函数,无线数据包里的内容会作为afIncomingMSGPacket_t的参数传进来。

        在结构体afIncomingMSGPacket_t中有一个小结构体afMSGCommandFormat_t 

        afMSGCommandFormat_t中有两个域,DataLength表示无线数据包里有用的数据有多少个字节,Data表示具体的内容是从该地址位置往后(数组首地址)。

        2)、在 smartHomeApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )函数添加一行代码即可,如图。

         3) 选择协调器设备编译,然后下载代码

        ps:接收的大概过程

         当终端模块发送数据后,协调器模块底层任务接收到无线数据后,会给应用层任务的系统事件发送一个AF_INCOMING_MSG_CMD消息,在消息处理函数中把有用的信息提取出来。

        3、效果

        在两个设备开启后,当终端设备加入协调器网络后。在终端设备按按键1,终端设备的LED2亮灭翻转一次,同时协调器LED2亮灭也同样翻转一次。

三、单播字符串收发实验

       在单播字符收发实验的基础上,添加串口通讯操作,将接收的数据发送到电脑上。

     1、发送端(终端)代码配置

        实现效果:按下按钮KEY1,将字符串发送出去。发送模块的代码如下。

//  将theMessageData里放一个字符"Hello World",AF_DataRequest函数中
//只需要修改字符格式即可,而由于存放的是字符串 ,且有'\0'结尾,
//因此可以用strlen来计算大小,发送模块的代码如下。

char theMessageData[] = "Hello World";
//char theMessageData[] = {'a'};
smartHomeApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
smartHomeApp_DstAddr.addr.shortAddr = 0x000;
smartHomeApp_DstAddr.endPoint = smartHomeApp_ENDPOINT;

AF_DataRequest( &smartHomeApp_DstAddr, &smartHomeApp_epDesc,
                       smartHomeApp_CLUSTERID,
                      (byte)osal_strlen( theMessageData ) + 1,  //表示发送字节个数
                     //   1, 
                       (byte *)&theMessageData,//发送的数组的首地址
                       &smartHomeApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );

//添加一份LED灯,指示按键被按下

         2、接收端(协调器)配置

         需要添加串口配置,通过串口将接收到的数据发送到电脑。

串口实验参考:zigbee笔记:四、zigbee串口uart通讯_cc2530zigbee通信配置-CSDN博客

        1)在工程ZMain目录下的ZMain.c文件添加串口uart0的配置,如下图

//****************** 初始化USART_0为uart模式,使用备用位置1
void ConfigUart0()
{
    PERCFG &= 0xfe; // USART_0 ,  用备用位置1
    P0SEL |=  0x0c;  //P0_2,P0_3 设为偏上外设 ,作为Tx和Rx
    P2DIR &= ~0xc0; //当PERCFG分配给一些外设到相同引脚的时候,USART 0优先
    //串口传输8位数据,无奇偶校验
    U0CSR |= 0x80; // USART模式选择为UART
    U0CSR |= 0x40; //使能UART0接收器,使之能接收数据
    U0UCR &= 0xff; //U0UCR寄存器使用默认值
    U0BAUD = 216 ; //设置波特率小数部分的值
    U0GCR |= 0x0b ; //设置波特率指数值
   // EA = 1;                    //总中断
   // IEN0 |= 0x04;           //USART 0 Rx中断使能
    //IEN2 |= 0x04;          //USART 0 Tx中断使能
    // UTX0IF 发送中断标志,URX0IF接收中断标志
}

        2)先取消TI在main函数默认对串口的配置,流程如下图。这样才能完成对串口的配置

        3)在接收数据的函数中添加串口发送数据函数,发送接收到的数据。

//****************** 初始化USART_0为uart模式,使用备用位置1
void ConfigUart0()
{
    PERCFG &= 0xfe; // USART_0 ,  用备用位置1
    P0SEL |=  0x0c;  //P0_2,P0_3 设为偏上外设 ,作为Tx和Rx
    P2DIR &= ~0xc0; //当PERCFG分配给一些外设到相同引脚的时候,USART 0优先
    //串口传输8位数据,无奇偶校验
    U0CSR |= 0x80; // USART模式选择为UART
    U0CSR |= 0x40; //使能UART0接收器,使之能接收数据
    U0UCR &= 0xff; //U0UCR寄存器使用默认值
    U0BAUD = 216 ; //设置波特率小数部分的值
    U0GCR |= 0x0b ; //设置波特率指数值
   // EA = 1;                    //总中断
   // IEN0 |= 0x04;           //USART 0 Rx中断使能
    //IEN2 |= 0x04;          //USART 0 Tx中断使能
    // UTX0IF 发送中断标志,URX0IF接收中断标志
}
//******************

            //*****************************uart0发送一个字符
void UTX0SEND( char a )
{
    U0DBUF = a;
    while( UTX0IF == 0 );
    UTX0IF = 0;
}

//***************串口uart0信息发送函数
void InformationSend(unsigned char* send ,unsigned short len)
{
//    UTX0SEND( '#' );
//    UTX0SEND( ' ' );
//    UTX0SEND( ' ' );
    for( unsigned short i = 0 ; i < len; i++ )
    {
        U0DBUF = send[i];
        while( UTX0IF == 0 );
        UTX0IF = 0;
    }
//   UTX0SEND( ' ' );
//    UTX0SEND( ' ' );
//    UTX0SEND( '#' );
    UTX0SEND( '\r' );
}

      3、效果

        在两个设备开启后,当终端设备加入协调器网络后。在终端设备按按键1,终端设备的LED2亮灭翻转一次,同时发送字符串 ''hello world'' 到协调器,协调器的LED2亮灭也同样翻转一次。协调器再将接收到的字符串通过串口发送到电脑上

参考链接

        (1)lesson8上官方改做出单播收发字符字符串收发_哔哩哔哩_bilibili

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

内容概要:本文围绕考虑隐私保护的分布式联邦学习在电力负荷预测中的应用展开研究,并提供了完整的Python代码实现。该方法采用联邦学习的分布式架构,允许多个数据持有方在不共享原始敏感数据的前提下协同训练高精度的负荷预测模型,有效解决了数据孤岛与用户隐私泄露之间的矛盾。研究详细阐述了联邦学习的核心机制,包括本地模型训练、加密参数上传、全局模型聚合等关键流程,并基于真实电力负荷数据进行了实验验证,结果表明该方法在保障数据隐私安全的同时,仍能保持优异的预测性能与模型泛化能力。; 适合人群:具备一定机器学习基础和电力系统背景的研究人员,以及从事负荷预测、数据隐私保护、联邦学习算法开发的研究生和技术人员。; 使用场景及目标:①应用于居民区、工业园区等多主体参与的电力负荷预测场景,解决跨机构数据协作中的隐私合规问题;②为构建安全可信的智能电网数据共享与分析平台提供关键技术支撑;③推动联邦学习在能源互联网、需求响应、虚拟电厂等领域的工程化落地。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,深入理解联邦学习的通信协议、梯度聚合机制与隐私保护策略,可在复现实验的基础上尝试引入差分隐私、同态加密等增强手段,或优化模型结构以提升预测效率与精度。
内容概要:本文提出了一种基于压缩感知中密钥控制测量矩阵的新型图像压缩加密混合算法,深度融合压缩感知理论与现代密码学机制,实现图像在高效压缩的同时完成高强度的安全加密。该算法通过引入密钥动态生成或调控测量矩阵,确保仅有持有正确密钥的授权方能够准确重构原始图像,从而显著提升系统的抗攻击能力和保密性。文中系统阐述了算法的设计原理、密钥控制机制、测量矩阵构造方法以及信号重构流程,并基于Matlab平台进行了完整的代码实现与仿真实验,验证了该算法在压缩效率、重构图像质量(如PSNR、SSIM指标)以及抵抗常见攻击(如噪声、剪切、统计分析)等方面的优异性能。; 适合人群:具备信号处理、信息安全或数字图像处理基础知识,正在从事相关领域研究的研究生、科研人员及工程技术开发者。; 使用场景及目标:①适用于军事通信、医疗影像安全传输、云端敏感图像存储等需兼顾压缩效率与数据安全的场景;②为探索压缩感知与信息安全交叉领域的研究人员提供可复现的算法设计范例与仿真代码参考;③推动图像数据在传输与存储过程中实现高效性与安全性的有机统一。; 阅读建议:建议读者结合提供的Matlab代码深入理解算法实现细节,重点分析密钥控制测量矩阵的生成逻辑及其对重构性能的影响,同时可在不同类型的图像数据集上进行测试,以全面评估算法的鲁棒性与泛化能力。
内容概要:本文研究了一种面向间歇性拒绝服务(DoS)攻击的混合动态事件触发微电网多目标二次均衡控制策略,旨在保障孤岛微电网在遭受网络安全威胁时仍能实现电压频率的稳定恢复与有功无功功率的精确均分。通过构建非奇异终端滑模面,结合基于强化学习的RBF神经网络与扰动观测器,有效提升了系统对未知扰动和攻击导致通信中断的鲁棒性;同时引入混合动态事件触发机制,显著降低了控制器间的通信频率,节约了通信资源。该方法在Simulink平台上建立了完整的微电网仿真模型,验证了所提控制框架在复杂攻击场景下的有效性与优越性,实现了安全性、稳定性与资源效率的协同优化。; 适合人群:具备电力系统自动化、现代控制理论基础及MATLAB/Simulink仿真能力的研究生、科研人员,以及从事微电网控制系统设计与安全防护的工程技术人员。; 使用场景及目标:① 提升高危网络环境下微电网的抗攻击能力与运行可靠性;② 实现二次控制中多目标(电压、频率、功率分配)的协同优化调控;③ 在保证动态响应性能的前提下减少通信开销,适用于资源受限的分布式能源系统实际部署场景。; 阅读建议:建议读者结合提供的Simulink仿真模型深入理解控制器的设计流程与稳定性分析方法,重点关注滑模面构造、RBF神经网络补偿机制及事件触发阈值设定等关键技术环节,并可根据具体应用场景调整参数以实现定制化优化。
内容概要:本文针对高渗透率新能源接入背景下电力系统稳定运行的挑战,研究了可切换构网型(GFM)与跟网型(GFL)逆变器之间的双向平滑切换控制策略。传统GFL逆变器依赖电网锁相运行,在弱电网或孤岛工况下易失稳;而GFM逆变器虽具备自主建压能力,但在并网时缺乏同步调节机制,难以实现无缝切换。为此,文章提出一种基于共用硬件平台和统一内环控制架构的双向切换策略,重点设计了切换判据、切换时序及过渡过程中的平滑抑制方法,有效避免切换过程中出现功率冲击、电压畸变和频率波动等问题。研究建立了GFL与VSG型GFM逆变器的完整控制模型,并通过Simulink仿真实验验证了该策略在不同工况下的有效性,结果表明系统在模式切换过程中能够保持良好的动态响应和平滑过渡性能。; 适合人群:从事电力电子、新能源并网控制、微电网与智能配电网研究的科研人员及工程技术人员,具备一定电力系统与控制理论基础的研究生及以上学历人员。; 使用场景及目标:①应用于分布式光伏、储能系统等新能源并网设备,提升其在复杂电网环境下的适应性与稳定性;②实现逆变器在并网与孤岛模式间的无缝切换,增强微电网的自治运行能力;③为构网型与跟网型控制技术的融合应用提供理论支持与工程参考。; 阅读建议:建议结合文中提供的Simulink仿真模型进行实践操作,重点关注切换判据设置与过渡控制策略的实现细节,同时可进一步拓展至多机并联系统中的协同切换研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值