【技能大赛笔记01】Zigbee点对点按键控制程序开发

--2017年“物联网物联网技术应用与维护”任务五题1(中职组)

广东职业技术学院  欧浩源 2017-12-20

1、题目要求

2、工程文件

在比赛中,提供了一个基于BasicRF的工程项目和一份函数说明文档,参赛选手需要在这个工程项目中编写合适的代码以实现题目的功能。在工程项目中有“rf_set.c”和"slave_node.c"这两个代码文件,分别是主节点从节点的应用代码,参赛选手需要在这两个文件中编写合适的代码。
<1> 主节点“rf_set.c”的代码如下:

<2> 从节点"slave_node.c"的代码如下:

3、关键知识点

<1> 对题目的理解非常关键。

刚看到题目的时候我也懵B了。四个LED怎么表示8个数据位呢?
    主节点和从节点分别有4个LED,一共8个LED分别表示8个数据位。
    1:用LED亮表示,
    0:用LED灭表示。
    数据依次从高到低排列:
    主节点的D4 D3 D6 D5,从节点的D4 D3 D6 D5
    例如:1110 0100用二进制表示,就是:
    主节点的D4:
    主节点的D3:
    主节点的D6:
    主节点的D5:灭
    从节点的D4:灭
    从节点的D3:
    从节点的D6:灭
    从节点的D5:灭
    理解这个很重要,不然题目是做不出来的。

<2> 补码与原码的换算关系

对于正数,原码 = 补码。
    对于负数,原码 = 补码(除了符号位)的各个位取反,加1。
    补码1001 1100的原码为:1110 0100
    补码1010 0110的原码为:1101 1010
    补码1011 0000的原码为:1101 0000

<3> 点对点通信的数据发送和数据接收的两个函数的应用。
    //将数据mode的一个字节发送到目标地址为0x0002的板子上。
    basicRfSendPacket(0x0002, mode, );
    //将板子接收到的数据读取1个字节放到Rx数组中。
    basicRfReceive(Rx,,NULL);

4、代码实现

<1> 主节点“rf_set.c”的代码编写如下:

  1. //↓↓↓↓↓↓↓请在选手此区域内补充代码↓↓↓↓↓↓↓
  2.  
  3. void RFInit()
  4. {
  5. rf.myAddr=0x0001; //本机地址
  6. rf.panId=0x1000; //网络ID
  7. rf.channel=10; //通信信道
  8. rf.ackRequest=1; //应答信号
  9. while(basicRfInit(&rf)==1);
  10. basicRfReceiveOn();
  11. }
  12.  
  13. void main()
  14. {
  15. Init();
  16. RFInit();
  17. while(1)
  18. {
  19. if(key1==0)
  20. {
  21. DelayMS(10);
  22. if(key1==0)
  23. {
  24. while(key1==0);
  25. P1=0x00;
  26. mode[0]++;
  27. switch(mode[0])
  28. {
  29.  
  30. case 0x30: break;
  31. P1=0x00;
  32. //补码1001 1100的原码为:1110 0100
  33. case 0x31:
  34. LED4 = 1;
  35. LED3 = 1;
  36. LED6 = 1;
  37. LED5 = 0;
  38. break;
  39.  
  40. //补码1010 0110的原码为:1101 1010
  41. case 0x32:
  42. LED4 = 1;
  43. LED3 = 1;
  44. LED6 = 0;
  45. LED5 = 1;
  46. break;
  47.  
  48. //补码1011 0000的原码为:1101 0000
  49. case 0x33:
  50. LED4 = 1;
  51. LED3 = 1;
  52. LED6 = 0;
  53. LED5 = 1;
  54. break;
  55. }
  56. basicRfSendPacket(0x0002, mode, 1);
  57. if(mode[0]>=0x34)
  58. {
  59. mode[0]=0x30;
  60. }
  61. }
  62. }
  63. }
  64. }
  65. //↑↑↑↑↑↑↑请在选手此区域内补充代码↑↑↑↑↑↑↑

<2> 从节点"slave_node.c"的代码编写如下:

  1. //↓↓↓↓↓↓↓请在选手此区域内补充代码↓↓↓↓↓↓↓
  2.  
  3. void RFInit()
  4. {
  5. rf.myAddr=0x0002; //本机地址
  6. rf.panId=0x1000; //网络ID
  7. rf.channel=10; //通信信道
  8. rf.ackRequest=1; //应答信号
  9. while(basicRfInit(&rf)==1);
  10. basicRfReceiveOn();
  11. }
  12.  
  13. void main()
  14. {
  15. Init();
  16. RFInit();
  17. while(1)
  18. {
  19. if(basicRfPacketIsReady())
  20. {
  21. uint8 Rx[5]=0x00;
  22. //basicRfReceive(Rx,5,NULL);
  23. basicRfReceive(Rx,1,NULL);
  24. P1=0x00;
  25. switch(Rx[0])
  26. {
  27. case 0x30:
  28. P1=0x00;
  29. break;
  30. //补码1001 1100的原码为:1110 0100
  31. case 0x31:
  32. LED4 = 0;
  33. LED3 = 1;
  34. LED6 = 0;
  35. LED5 = 0;
  36. break;
  37. //补码1010 0110的原码为:1101 1010
  38. case 0x32:
  39. LED4 = 1;
  40. LED3 = 0;
  41. LED6 = 1;
  42. LED5 = 0;
  43. break;
  44. //补码1011 0000的原码为:1101 0000
  45. case 0x33:
  46. LED4 = 0;
  47. LED3 = 0;
  48. LED6 = 0;
  49. LED5 = 0;
  50. break;
  51. }
  52. }
  53. }
  54. }
  55. //↑↑↑↑↑↑↑请在选手此区域内补充代码↑↑↑↑↑↑↑

在编译和烧写代码的时候要注意,主节点的要把"slave_node.c"代码文件移除出工程,在把“rf_set.c”添加进来,然后编译、烧写。从节点也需要做相应的移除和添加代码文件。当代码分别烧写到两个Zigbee模块上,上电就可以实现题目的功能了。

<注1>:完整工程代码下载(百度云盘):https://pan.baidu.com/s/1bpxxNqf
<注2>:关于BasicRF更详细的资料,可以参考网络中《基于BasicRF的点对点无线双向控制LED灯案例分析》一文。

【技能大赛笔记01】Zigbee点对点按键控制程序开发的更多相关文章

  1. OpenCV2学习笔记01:Linux下OpenCV开发环境的搭建

    个人已经厌倦了Windows下的开发方式,于是决定转到Linux平台上来,当然我也知道这个转变会很艰辛,但是我还是要坚持.所以,后面的所有开发我都会基于Linux和Qt,先从开发环境的搭建开始做起,当 ...

  2. PHP 学习笔记 01

    例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...

  3. 2018工业信息安全技能大赛华东赛区初赛 第2题 writeup

    2018工业信息安全技能大赛华东赛区初赛 第2题 解题思路 本题主要考察点是对常见工控协议的理解(modbus/tcp和s7comm),题目目标是寻找出报文中某条异常报文流量.很让人疑惑的是,题目中并 ...

  4. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  5. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  6. 《The Linux Command Line》 读书笔记01 基本命令介绍

    <The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...

  7. JS自学笔记01

    JS自学笔记01 1.开发工具 webstorm 2.js(javascript) 是一门脚本.解释性.动态类型.基于对象的语言 含三个部分: ECMAScript标准–java基本语法 DOM(Do ...

  8. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  9. ASP.NET Identity 2集成到MVC5项目--笔记01

    Identiry2是微软推出的Identity的升级版本,较之上一个版本更加易于扩展,总之更好用.如果需要具体细节.网上具体参考Identity2源代码下载 参考文章 在项目中,是不太想直接把这一堆堆 ...

随机推荐

  1. 【开源】【前后端分离】【优雅编码】分享我工作中的一款MVC+EF+IoC+Layui前后端分离的框架——【NO.1】框架概述

    写博客之前总想说点什么,但写的时候又忘了想说点什么,算了,不说了,还是来送福利吧. 今天是来分享我在平时工作中搭建的一套前后端分离的框架. 平时工作大多时候都是在做管理类型的软件开发,无非就是增.删. ...

  2. node多版本管理--nvmw

    最近要搭建koa2+node环境,发现需要node较高版本,不然ES6.7中的语法使用不了.就像安装多个版本的node,发现了nvmw. 1.下载nvmw  https://github.com/ha ...

  3. js数组遍历some,foreach,map,filter,every对比

    1.  [...].some(ck)函数       ----      某个一个为true,则为true 对数组中每个元素执行一次ck函数,知道某个元素返回true,则直接返回true.如果都返回f ...

  4. HTML学习笔记 域元素(form表单、textarea文本域、fieldset域集合、input使用) 案例 第四节 (原创)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. C#3.0中的扩展方法

    在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...

  6. C#模拟登录总结

    /// <summary>  登录        /// </summary>        /// <param name="url">< ...

  7. 冒泡排序-Python与PHP实现版

    Python实现 import random a=[random.randint(1,999) for x in range(0,33)] # 冒泡排序,python中数组是按引用传递的,会直接在原数 ...

  8. MVC中提交包含HTML代码的页面处理方法(尤其是在使用kindeditor富文本编辑器的时候)

    针对文本框中有HTML代码提交时,mvc的action默认会阻止提交,主要是出于安全考虑.如果有时候需求是要将HTML代码同表单一起提交,那么这时候我们可以采取以下两种办法实现: 1.给Control ...

  9. 移动端h5拍照压缩即时上传后台并预览

    项目经理让迭代一个功能,实时预览并上传到后台的功能,听到这立马想起了几个第三方插件去实现,mui  和api cloude万万没想到的是这个app前面使用ios 和安卓原生写的,然后mui和api c ...

  10. SQL1

    这是社团的题目,我现在就写出来吧,总共两种方法,一种手注,一种用工具(sqlmap). 一.手注(盲注) 1,我们打开题目,可以看到一个登陆页面,这是我们在输入框里面输入万能密码:  ' and '1 ...