first commit

This commit is contained in:
Jingfan Ke 2024-09-05 13:29:00 +08:00
commit 53515a5a50
75 changed files with 3863 additions and 0 deletions

View File

@ -0,0 +1,79 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业1</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 请给出IoT定义
物联网Internet of Things简称IoT是互联网基础上的延伸和扩展的网络将各种信息传感设备与网络结合起来而形成的一个巨大网络实现任何时间、任何地点人、机、物的互联互通。它通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术实时采集任何需要监控、连接、互动的物体或过程采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息通过各类可能的网络接入实现物与物、物与人的泛在连接实现对物品和过程的智能化感知、识别和管理。
## 2. 描述现实生活中的IoT应用例子
- **智能家居:**物联网应用的一个非常常见的领域。通过将各种家电设备连接到互联网我们可以通过手机、平板电脑或专门的智能家居中心来控制它们。我购置了一个智能开关在宿舍使用它配套的App可以在手机充满电时自动关闭开关避免手机过度充电。
- **智能健康:**物联网在健康领域也有很多应用。智能健康手环可以实时监测我们的心率、睡眠质量并给出健康建议。我有一位在养老院工作的亲戚他们为每一位老人配备了一个健康手环并把实时心率等身体信息发到亲属的手机App上。
- **智能交通:**物联网在交通领域的应用也很广泛。例如智能交通灯可以通过感应车辆的流量来自动调整红绿灯的时间,以改善交通状况;我家的汽车配备了物联网技术,可以通过远程控制来进行解锁、启动、定位等功能。
- **智能城市:**物联网也被广泛应用于构建智能城市。例如可以通过物联网技术来监控城市的能源使用情况,预测未来的能源需求,甚至控制城市的基础设施,如桥梁、隧道、公路等。同时,物联网也可以用于环保监测,例如空气质量监测、噪声监测等。
- **工业物联网:**在工业领域,物联网的应用也非常广泛。例如,通过物联网技术,我们可以远程监控和管理工厂的生产线,提高生产效率。同时,物联网也可以用于预测维护,即在设备发生故障前就进行预警和维护。我父亲在石油化工公司上班,他们厂区的反应炉等设备内部的温度通过传感器发送到中控室,从而让技术人员了解化学反应发生的状况。
## 3. 给出国际上物联网相关技术的描述及其与IoT的内在关联性
- **传感器技术**。传感器是可以检测环境变化的设备,如温度、湿度、光线、运动或压力。执行器是一种可以引起环境物理变化的设备,例如打开或关闭阀门或打开电机。这些设备是物联网的核心,因为它们允许机器和设备与物理世界进行交互。当传感器和执行器在没有人为干预的情况下解决问题时,自动化是可能的<sup>[[2]](https://www.ibm.com/topics/internet-of-things)</sup>。价格合理且低功耗、可靠的传感器使物联网技术成为更多制造商的可能<sup>[[1]](https://www.oracle.com/internet-of-things/what-is-iot)</sup>
- **网络协议**。互联网的一系列网络协议使传感器可以轻松地连接到云和其他“东西”,以实现高效的数据传输<sup>[[1]](https://www.oracle.com/internet-of-things/what-is-iot)</sup>。要将物联网数据从传感器和执行器传输到云端物联网设备需要连接到互联网。物联网中使用了几种连接技术包括Wi-Fi、蓝牙、蜂窝、Zigbee和LoRaWAN<sup>[[2]](https://www.ibm.com/topics/internet-of-things)</sup>
- **云计算平台**。云是存储、处理和分析物联网设备生成的大量数据的地方。云计算平台提供了存储和分析这些数据以及构建和部署物联网应用程序所需的基础设施和工具<sup>[[2]](https://www.ibm.com/topics/internet-of-things)</sup>。云平台可用性的增加使企业和消费者都能够访问他们需要扩展的基础设施,而无需实际管理所有基础设施<sup>[[1]](https://www.oracle.com/internet-of-things/what-is-iot)</sup>
- **机器学习和分析**。为了理解物联网设备产生的大量数据,企业需要使用先进的分析工具来提取见解和识别模式。这些工具可以包括机器学习算法、数据可视化工具和预测分析模型<sup>[[2]](https://www.ibm.com/topics/internet-of-things)</sup>
- **会话人工智能。**神经网络的进步将自然语言处理带到了物联网设备如Cortana和Siri并使其具有吸引力、价格合理且适合家庭使用<sup>[[1]](https://www.oracle.com/internet-of-things/what-is-iot)</sup>
- **安全和隐私技术**。随着物联网部署的日益广泛,物联网安全和隐私变得越来越重要。加密、访问控制和入侵检测系统等技术用于保护物联网设备及其生成的数据免受网络威胁<sup>[[2]](https://www.ibm.com/topics/internet-of-things)</sup>
- **边缘计算**。边缘运算将原本完全由中心节点处理大型服务加以分解,切割成更小与更容易管理的部分,分散到边缘节点去处理。边缘节点更接近于用户终端设备,可以加快资料的处理与发送速度,减少延迟<sup>[[3]](https://en.wikipedia.org/wiki/Edge_computing)</sup>。物联网有着大量的传感器,产生海量数据,边缘计算能够减少中心处理器的计算压力。
- **嵌入式系统**。嵌入式系统是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。嵌入式系统常被用于高效控制许多常见设备,被嵌入的系统通常是包含数字硬件和机械部件的完整设备<sup>[[4]](https://en.wikipedia.org/wiki/Embedded_system)</sup>。嵌入式系统可以利用网络将设备信息上传至服务器,方便用户分析数据和操控设备。
[1] [https://www.oracle.com/internet-of-things/what-is-iot](https://www.oracle.com/internet-of-things/what-is-iot)
[2] [https://www.ibm.com/topics/internet-of-things](https://www.ibm.com/topics/internet-of-things)
[3] [https://en.wikipedia.org/wiki/Edge_computing](https://en.wikipedia.org/wiki/Edge_computing)
[4] [https://en.wikipedia.org/wiki/Embedded_system](https://en.wikipedia.org/wiki/Embedded_system)
## 4. 请简述架构的定义与内涵,以及架构师的综合知识要求。
架构的定义有多种。一般来说,架构可以被理解为一种对结构内元素及元素间关系的映射,这种映射反映了系统的基本组织结构和功能。
根据IEEE的定义架构描述了一个系统的基本组织结构包含了组成系统的组件、组件之间的关系、组件与环境之间的关系以及指导上述内容进行设计和演化的原则。在系统开发过程中架构是系统的蓝图它指导了系统的开发、演化方向并且确定了系统的主要功能和组件以及它们之间的相互关系。
架构的内涵包括以下几点:
1. 架构是一种对系统的抽象描述,它关注的是系统的结构和功能,而不是具体的实现细节。
2. 架构是人们主观设计的结果,因此存在好坏之分,好的架构设计可以提高系统的性能、可维护性和可扩展性,而坏的架构设计则可能导致系统难以扩展和维护。
3. 架构的核心是关注点分离,即将复杂问题分解为更小的、更容易处理的子问题,然后再将这些子问题组合起来形成整体解决方案。
架构师的综合知识要求:
1. 技术知识和经验:架构师需要对多种编程语言、开发框架、操作系统、数据库、网络通信等技术有深入的了解。这种知识帮助他们理解和设计复杂的系统,并做出合理的技术选择。
2. 设计模式和实践:熟悉常用的设计模式、架构风格和实践对架构师至关重要。这包括了解如何在不同的情境下应用这些模式,以及如何平衡不同的架构决策以满足系统的需求。
3. 系统分析和设计能力:架构师应能分析业务需求,将其转化为技术解决方案。他们还需要设计高效、可维护且易于扩展的系统。
4. 沟通和协调能力:架构师通常需要与多个团队合作,包括开发团队、产品团队、运营团队等。因此,良好的沟通技巧和团队协作能力是必不可少的。
5. 问题解决能力:在架构设计过程中,架构师需要解决各种技术和业务上的挑战。这要求他们具备出色的问题解决能力和创新思维。
6. 持续学习和适应能力:鉴于技术领域的快速变化,架构师需要持续学习新技术、新方法,并能适应这些变化。
7. 领导力和影响力:架构师经常需要领导项目,影响决策。因此,领导力和影响力也是必须具备的能力。

View File

@ -0,0 +1,85 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业10</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简述网络安全的本质。
网络安全的本质是保护网络系统和网络中的数据不受到攻击、破坏、未经授权的访问或其他可能的安全威胁。它涉及一系列的技术、过程和措施,用于保护网络连接的设备、程序和数据免遭攻击或未经授权的访问。网络安全的关键组成部分包括:
1. **数据保密性**:确保敏感信息不被未授权的个人访问或披露。
2. **数据完整性**:保护数据免受未经授权或意外的修改,确保信息的准确性和完整性。
3. **可用性**:确保授权用户能够可靠且及时地访问信息和资源。
4. **认证和授权**:确保只有经过验证的用户和设备才能访问网络资源。
5. **威胁检测与响应**:监测网络活动,及时发现和响应安全威胁。
网络安全不仅仅是技术问题,它也涉及人员和政策。培训员工意识、制定有效的安全策略和程序,以及持续更新和维护安全措施,都是确保网络安全的重要方面。随着技术的发展和网络攻击手段的不断演变,网络安全也必须不断适应新的威胁和挑战。
## 2. 简述网络安全的三维结构。
网络安全的三维结构包括防御、制止和检测,这三个方面共同构成了一个全面和多层次的安全策略:
1. **防御**:这是网络安全中的第一道防线。其主要目标是防止未经授权的访问和攻击。这包括使用防火墙、加密、安全协议、密码策略和安全配置等手段,来保护网络和系统免受外部和内部的威胁。防御措施的目的是减少攻击的可能性,并确保网络和数据的完整性和保密性。
2. **制止**:即使有最好的预防措施,也可能发生安全事件。制止措施的目的是限制或减少安全事件的影响。这包括即时响应机制、安全漏洞修复、系统和网络的隔离措施,以及恢复程序。制止措施确保即使在攻击发生时,也能快速恢复正常操作,并减少对业务的影响。
3. **检测**检测是网络安全的关键组成部分旨在及时发现潜在的威胁和安全事件。这通常涉及使用入侵检测系统IDS、安全事件管理系统SIEM和其他监控工具来持续监视网络和系统的异常活动。有效的检测机制可以快速识别攻击行为从而允许及时采取行动以应对威胁。
这三维结构相互补充,共同构成了一个坚固的网络安全防线。防御措施可以阻止许多攻击,制止策略有助于减轻攻击的影响,而检测机制则确保及时发现并应对那些逃过初步防御的威胁。通过这种综合方法,组织可以更有效地保护自己的网络和数据免受各种网络安全威胁的侵害。
## 3. 给出物联网网络安全案例。
物联网网络安全案例中一个著名的例子是“Mirai僵尸网络”。这个案例突出了物联网设备在网络安全中的脆弱性和潜在的影响。
### Mirai僵尸网络案例简述
- **事件时间**: 2016年
- **事件概述**: Mirai是一种恶意软件它利用智能设备的安全漏洞感染物联网设备如家用路由器、摄像头、DVR等。这些设备通常配置较弱安全性不高易于被黑客利用。
- **攻击方式**: Mirai通过扫描互联网寻找易于猜测的用户名和密码来感染这些设备。一旦设备被感染它们就被添加到僵尸网络中。
- **影响**: 这个僵尸网络用于发动大规模的分布式拒绝服务攻击DDoS。其中一个著名的攻击是针对DNS提供商Dyn的攻击这导致了Twitter、Netflix、Reddit等大量流行网站的服务中断。
### 安全教训和对策
1. **默认凭证的安全性**: 许多物联网设备使用弱默认密码,或者用户未更改这些默认设置。设备制造商需要提供更安全的默认凭证,并鼓励用户更改密码。
2. **设备的定期更新**: 为了防止利用已知漏洞,物联网设备应定期接收安全更新和补丁。
3. **网络隔离和分割**: 将物联网设备放在与主工作或个人网络分离的网络中,可以减少潜在的损害。
4. **增强的认证机制**: 加强物联网设备的认证机制,例如使用双因素认证,可以提高安全性。
5. **用户和制造商的教育与意识**: 提高用户和制造商对物联网设备安全性的认识至关重要。
Mirai僵尸网络案例展示了物联网设备在网络安全方面的脆弱性同时也强调了加强这些设备安全性的重要性。随着物联网设备的不断增加确保这些设备的安全已成为网络安全领域的一项重要任务。
## 4. 简述AI技术带来的网络安全挑战。
1. **自动化攻击**: AI技术可以使攻击者实现更高级别的自动化。通过使用AI黑客能够快速识别系统漏洞自动化生成针对性攻击代码甚至实时调整攻击策略以适应安全系统的防御。
2. **更复杂的社会工程攻击**: AI可以帮助攻击者制定更加精准和可信的网络钓鱼攻击。例如通过分析个人或企业的在线行为AI可以生成高度定制化的欺诈邮件或消息增加欺骗成功的几率。
3. **模仿和深度伪造技术**: 利用深度学习攻击者可以创建深度伪造deepfake视频或音频这可能用于冒充他人进行欺诈或在社交工程攻击中起到关键作用。
4. **数据隐私和保护**: AI系统通常需要大量数据进行训练这可能涉及敏感或个人数据。确保这些数据的安全防止在AI训练过程中发生数据泄露是一个重要挑战。
5. **对抗性攻击**: 在对抗性攻击中攻击者设计特殊输入误导AI系统做出错误判断。例如对抗性图像可以欺骗图像识别系统这在安全关键领域如面部识别系统可能带来严重威胁。
6. **法律和伦理问题**: AI在网络安全领域的应用还涉及到一系列法律和伦理问题如何在提高安全防护的同时保护个人隐私和遵守法律规定是一个复杂的问题。
7. **AI系统的安全性**: AI系统本身的安全性也是一个挑战。如果黑客能够攻破AI系统他们可能会获取控制权或利用这些系统进行更广泛的攻击。

View File

@ -0,0 +1,77 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业2</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 结合一个你所给出的IOT案例分析其技术需求并指出其技术挑战和运营模式难点。
**案例:**
智能农业。通过物联网技术,实现对农田环境的实时监控、数据分析和优化配置,以提高农作物产量和质量的应用。
**技术需求:**
1. **传感器技术**:需要各种传感器(如温度、湿度、光照、土壤养分等传感器)对农田环境进行实时监控,并获取准确的数据。
2. **通信技术**:收集到的数据需要实时传输回数据中心进行处理,用户端发送的指令也需要快速得到执行,因此需要稳定、低延迟的通信网络。
3. **数据收集和存储:** 从传感器和设备收集的数据需要被可靠地存储和管理。需要云存储或本地服务器作为数据中心。
4. **数据分析技术**:收集到的数据需要进行深入分析,以提供对农田环境的准确理解,并生成优化建议。
5. **自动化技术**:根据数据分析结果,可能需要自动化设备(如无人机、灌溉系统等)进行农田环境的调整和优化。
6. **用户界面和应用开发:** 需要开发一个用户友好的应用程序,允许用户监控和控制他们的智能农业系统。这涉及移动应用程序和网页应用程序的开发。
**技术挑战:**
1. **数据准确性问题**:由于环境中的噪声和干扰,如天气变化、土壤质量等,可能会影响数据的准确性,使得数据分析变得困难。
2. **通信网络问题**:在农田这样的开阔环境中,通信网络可能会受到影响,如信号遮挡、干扰等问题,需要有稳定的通信解决方案。
3. **数据处理和存储问题**:大量的传感器数据需要高性能的数据处理和存储系统,以满足实时分析和存储的需求。
4. **设备成本和维护问题**引入IoT技术需要投入大量的设备和基础设施这些设备和基础设施在室外容易老化需要设计良好密封性的外壳。
5. **能源管理:** 农业物联网设备往往分布广泛,需要独立电源供应,因此需要考虑如何延长设备的电池寿命,或设计太阳能电池供电。
**运营模式难点:**
1. **设备部署和维护**如何有效地部署和维护大量的IoT设备是一个大的挑战。这些设备可能需要在恶劣的环境下工作而且可能分布广泛这增加了维护的难度。
2. **数据安全和隐私问题**:农田数据可能包含大量的敏感信息,如土地使用情况、作物生长情况等,如何保证这些数据的安全和隐私是一个重要的问题。
3. **用户教育和培训**如何让用户理解和使用这些IoT设备也是一个重要的挑战。可能需要对用户进行教育和培训以帮助他们理解并使用这些设备。需要建立一个有效的客户支持团队以解决用户的问题和故障。
4. **商业模式**如何通过IoT技术创造可持续的商业模式也是一个重要的问题。例如设备的成本可能需要通过提高农作物产量或降低运营成本来回收。
## 2. 国际上物联网相关标准组织有哪些?目前工作重点为何。
1. **国际电信联盟ITU** ITU致力于制定全球电信标准并在物联网领域发挥重要作用。目前ITU的工作重点包括5G和6G网络标准IoT设备之间的通信标准以及IoT中的安全和隐私标准。
2. **国际电工委员会IEC** IEC负责制定国际电气和电子标准。对于IoTIEC的工作包括制定有关传感器、通信协议、数据安全和设备互操作性的标准。
3. **国际标准化组织ISO** ISO制定了各种与IoT相关的标准包括物联网体系结构、安全性和隐私、云计算和物联网互操作性标准。该组织的信息技术部门ISO/IEC开展了大量物联网相关的标准研制工作例如制定了ISO/IEC 18000-1至18000-3等多项物联网相关标准。当前ISO的工作重点之一是推动IoT设备的互操作性。
4. **物联网联盟IoT Alliance** 这是一个由企业和政府机构组成的组织致力于推动IoT的发展和采用。IoT Alliance的工作包括推广IoT技术、制定行业标准和推动创新。
5. **LoRa联盟** LoRa联盟致力于推广LoRaWAN无线通信协议该协议适用于低功耗广域网LPWAN应用如智能城市、农业和工业IoT。
6. **WiFi联盟** WiFi联盟关注WiFi技术在IoT中的应用特别是WiFi HaLow标准它提供了更好的覆盖范围和低功耗特性。
7. **Bluetooth SIG蓝牙特别兴趣小组** 蓝牙SIG负责蓝牙技术标准的制定包括用于物联网设备的蓝牙低功耗Bluetooth Low EnergyBLE标准。
8. **IEEE国际电气和电子工程师协会**IEEE也参与了物联网相关的标准制定工作并制定了多项与物联网相关的标准。
## 3. 结合国家IOT发展规划给出物联网应用需求分析。
1. **智能制造:**智能制造作为国家重要发展战略,将物联网技术应用于工业制造、研发设计、生产管理等领域,提高生产效率、降低能耗和提升产品质量成为迫切需求。通过物联网技术实现生产过程的实时监控与优化、资源调度与优化配置、质量检测与控制等方面的应用,将有助于提升制造业的核心竞争力。
2. **智慧城市:**智慧城市是城市现代化发展的重要方向,物联网技术可以应用于城市基础设施、公共安全、环境保护等领域。例如,通过物联网技术实现智能交通、智能安防、智能环保等应用,提高城市治理水平、提升居民生活品质。
3. **智慧农业:**智慧农业是农业现代化的重要手段,物联网技术可以应用于农业生产、农业资源管理、农业灾害预警等领域。通过物联网技术实现精准农业、农业大数据应用等,提高农业生产效率、提升农产品质量。
4. **智能医疗:**智能医疗是民生保障的重要环节,物联网技术可以应用于医疗设备监测、健康管理、药品溯源等领域。通过物联网技术实现远程医疗、智慧健康管理等方面的应用,提高医疗效率和医疗质量,提升医疗服务水平。
5. **智能物流:**智能物流是现代物流业的重要趋势,物联网技术可以应用于物流运输、仓储、配送等领域。通过物联网技术实现物流过程的实时监控与优化、自动化仓库管理等,提高物流效率、降低物流成本,提升物流业的竞争力。
6. **智能家居:**智能家居是家庭生活的重要发展方向,物联网技术可以应用于家居设备控制、家庭安防、家庭能源管理等领域。通过物联网技术实现智能家居的智能化和自动化,提高家庭生活品质和便利性。
7. **其他:**除了以上领域外,物联网技术还可以应用于文化旅游、教育培训、金融科技等领域。通过物联网技术的应用,可以实现产业升级和跨界融合,推动经济社会的发展。
## 4. 简述数字孪生技术,并给出相关基于物联网技术应用案例。
数字孪生技术是一种将物理世界与虚拟世界相结合的技术,它利用物联网技术收集现实世界中的数据,并在虚拟世界中创建与之相对应的数字模型。这种数字模型可以模拟现实世界中的各种系统和流程,帮助人们更好地理解和预测现实世界中的各种变化。
在智能制造领域,数字孪生技术被广泛应用于产品设计和生产过程中。通过物联网技术,可以在实际制造之前在虚拟环境中对产品设计进行测试和验证,以检查其可制造性和可靠性。同时,利用数字孪生技术还可以实现生产过程的优化和实时监控,提高生产效率和产品质量。
**案例:**
在一家汽车制造企业中,数字孪生技术被用于生产线上车辆的监控和故障预测。通过物联网技术收集生产线上的车辆数据,并在虚拟环境中创建数字模型,实现车辆的实时监控和故障预测。当实际车辆出现故障时,数字模型可以预测故障并指导维修人员进行排查和修复,大大缩短了维修时间和降低了停机成本。

View File

@ -0,0 +1,109 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业3</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 请简述体系架构概念、作用。
物联网体系架构包括以下几个核心组成部分:
1. **感知层**这是物联网的最底层负责收集信息。它主要由各种传感器和监测设备组成如温度传感器、摄像头、RFID标签等。这些设备用于感知和收集周围环境的数据如温度、湿度、位置、运动等。
2. **网络层**网络层的作用是将感知层收集到的数据传输到其他设备或者处理中心。这一层包括各种通讯技术如Wi-Fi、蓝牙、蜂窝网络、LPWAN低功耗广域网等。它确保数据能够安全、可靠地传输。
3. **处理层(或中间件层)**:这一层处理和存储从感知层收集来的数据。它可以包括云计算平台、数据中心、服务器等,用于数据分析、处理和存储。这一层的关键是将大量数据转化为有用的信息。
4. **应用层**:这是物联网架构的最顶层,直接为用户提供服务。根据不同的需求,应用层可以开发出各种应用程序,如智能家居、智慧城市、远程医疗、智能交通等。
作用和意义:
- 物联网架构对促进物联网健康规模发展具有重要的意义,是全球研究和关注的焦点,在全球有多个研究项目并且已经形成了很多研究成果;
- 明晰的物联网概念模型和参考体系架构,为物联网众多行业应用提供顶层指导和科学设计依据;
- 为解决行业应用系统和接口标准混乱现象,促进物联网多层次、多领域的协同应用服务奠定重要基础;
- 围绕新型信息服务、信息共享的信息消费时代特征,从系统架构设计层面,引导、推动新的物联网应用服务和商业模式产生,促进我国物联网产业健康、有序的发展。
**物联网体系架构对推动物联网规模和可持续发展具有重要意义而成为全球关注和推进的重点。**
## 2. 给出物联网体系架构IoT-A定义。
IoT-A 的定义和组成部分包括以下几个关键要素:
1. **感知层**:这是物联网体系架构的最底层,负责收集数据。它包含各种传感器和数据采集设备,用于感知和收集环境中的物理参数(如温度、湿度、运动等)或其他类型的信息。
2. **网络层**这一层的主要功能是传输感知层收集到的数据。它包括各种通信技术和协议如Wi-Fi、蓝牙、LPWAN低功耗广域网以及更传统的网络技术以实现数据的有效传输。
3. **处理层或中间件层**:这一层主要负责数据的存储、处理和分析。它可以包括云计算平台、数据中心和其他计算资源。中间件在这一层提供了连接不同设备和应用程序所需的软件服务和工具。
4. **应用层**:这是体系架构的最顶层,直接面向最终用户。应用层根据不同的需求,将处理层的数据转化为有用的信息,以支持各种智能应用,如智能家居、智能交通、智能医疗等。
同时架构不仅是结构,还是“系统在其环境中的最高层概念”构架还包括符合系统完整性、经济约束条件、审美需求和样式。它并不仅注重对内部的考虑,而且还在系统的用户环境和开发环境中对系统进行整体考虑,即同时注重对外部的考虑。
物联网体系架构的目标是创建一个高度集成和灵活的环境,使不同的设备和应用能够高效地互联互通,实现数据的有效收集、传输、处理和应用。通过这样的体系架构,物联网可以在各个领域发挥其巨大潜力,促进技术创新和社会发展。
## 3. 软件体系架构概念、模型、方法。
- **概念**:软件体系架构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。
- **模型**:处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。
- **方法**:这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。由于软件系统具有的一些共通特性,这种模型可以在多个系统之间传递,特别是可以应用到具有相似质量属性和功能需求的系统中,并能够促进大规模软件的系统级复用。
## 4. IoT-A的设计原则和方法。
物联网体系结构IoT-AInternet of Things Architecture旨在创建一个统一和普遍适用的物联网解决方案框架。它的设计原则和方法主要包括以下几点
1. **模块化和可扩展性**IoT-A 架构采用模块化方法,确保系统可以灵活地添加新的功能和组件,同时保持整体结构的稳定性和可维护性。
2. **互操作性**:设计强调不同物联网设备和平台之间的互操作性。这通过定义通用的接口标准和协议来实现,使不同制造商和技术能够无缝集成。
3. **安全性和隐私保护**IoT-A 架构在设计中特别考虑了安全性和隐私保护。这包括数据加密、安全认证、访问控制和个人数据保护等措施。
4. **可靠性和鲁棒性**物联网环境要求系统在各种条件下都能可靠运行包括网络不稳定和设备故障等情况。IoT-A 架构设计中包含了提高系统稳定性和容错能力的策略。
5. **可持续性和能效性**鉴于物联网设备可能数量庞大IoT-A 架构注重能效性设计,以减少能源消耗和环境影响。
6. **用户友好性**IoT-A 还考虑到最终用户的使用体验,强调易用性和直观的交互设计。
7. **适应性和智能化**IoT-A 支持通过机器学习和人工智能技术的应用,实现系统的自我学习和适应能力,以更好地响应环境变化和用户需求。
这些原则和方法共同构成了IoT-A的核心框架旨在为物联网的发展提供一个坚实、灵活且安全的基础。
## 5. 结合参考书中的智慧城市物联网体系架构模型,简要描述其功能和作用。
智慧城市物联网IoT体系架构模型通常包括几个关键组件它们共同协作以提高城市运营的效率和质量。以下是其主要功能和作用的简要描述
1. **感知层**:这是物联网体系架构的基础层,主要由各种传感器和监测设备组成。它的作用是收集城市中的实时数据,如交通流量、空气质量、能源使用情况等。
2. **网络层**这一层负责将感知层收集到的数据通过网络无线或有线传输到处理中心。它包括各种通信技术如Wi-Fi、蜂窝网络、LPWAN低功耗广域网络等。
3. **处理层(或中间件层)**:在这一层中,收集到的数据被存储、管理和处理。它利用云计算、大数据分析等技术,对数据进行整合、分析和处理,以提取有价值的信息。
4. **应用层**:这是体系架构的最高层,涉及将处理层的输出转化为实际的城市管理和服务应用。例如,基于数据分析的智能交通系统、能源管理系统、公共安全监控等。
5. **安全层**:在整个架构中,安全是一个横跨各层的关键组成部分。它确保数据的安全性和隐私保护,防止未经授权的访问和数据泄露。
智慧城市物联网体系架构的主要作用是:
- **提高效率**:通过优化资源配置和服务交付,提高城市运营的效率。
- **增强决策**:提供实时数据和深入分析,帮助政府和管理者做出更好的决策。
- **改善生活质量**:提高城市服务的质量和可用性,从而改善居民的生活质量。
- **促进可持续发展**:通过智能管理能源使用和环境影响,支持可持续城市发展。
智慧城市物联网体系架构通过这些层次的协同工作,实现了对城市环境和活动的全面感知、智能分析和高效管理。

View File

@ -0,0 +1,82 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业4</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简述RFID应用价值及其应用现状。
- **应用价值**RFID通过非接触自动识别技术使物体具有一个识别广泛应用于采购与分配、商业贸易、生产制造、物流、防盗以及军事用途上在IoT中占基础性地位。
- **应用现状**
- 随着RFID应用场合的不断扩大与延伸以及软件技术的发展RFID应用系统也越来越多样化功能也越来越强大。通过软硬件的技术支持RFID应用系统集成商可以根据用户的要求以及不同的应用场合提出最适合的解决方案从而合理地共享资源协同合作共同推动RFID产业的发展。
- 值得一提的是RFID中间件的发展越来越引人注目。对于各RFID读写器生产厂家的产品一般都彼此不兼容各有各的一套技术规范因此也限制了RFID的大规模应用。
- RFID中间件扮演RFID标签和应用程序之间的中介角色可以独立于各厂家的RFID读写器RFID中间件又称RFID管理软件它可以使RFID项目的开发速度加快系统投入使用的时间缩短。中间件可以消除不同来源RFID标签的差别把它们的数据进行整合对建立灵活的、配置可变的RFID系统十分有利。中间件也包括用于监视和维护RFID系统的工具。RFID中间件的另一个重要功能是及早过滤无效的RFID数据。正确使用中间件架构可以有效保护RFID网络的投资。
## 2. 列举国内外RFID技术相关标准组织。
国内外与RFID射频识别技术相关的标准组织包括
### 国际标准组织
1. **国际电工委员会IEC**: 负责制定电子和电工领域的国际标准。
2. **国际标准化组织ISO**: 发布了多个与RFID技术相关的标准如ISO/IEC 18000和ISO/IEC 15693。
3. **欧洲电信标准协会ETSI**: 在RFID技术的电信方面起着关键作用。
### 区域与国家标准组织
**中国国家标准化管理委员会SAC**: 负责制定中国的国家标准包括RFID技术。
### 行业标准组织
1. **国际物流自动识别技术协会AIM**: 专注于自动识别和数据捕获技术包括RFID。
2. **GS1**: 一个国际组织致力于改善供应链管理其标准包括RFID应用。
3. **EPCglobal**: 由GS1和GS1 US联合创立专注于使用RFID技术的电子产品代码EPC标准。
以上这些组织在制定和推动RFID技术的标准化方面起着重要作用。
## 3. 简述RFID中间件技术、数据安全与隐私保护技术。
- RFID中间件技术
- **作用**RFID中间件是位于RFID硬件如读写器和企业应用软件如ERP系统之间的软件层。它的主要作用是处理和转换RFID数据使其适用于企业应用。
- **功能**
- **数据过滤和聚合**:中间件筛选出无关或重复的数据,仅将有用的信息传递到应用程序。
- **设备管理**管理和监控RFID读写器和其他硬件设备的运行状态。
- **数据转换**将RFID原始数据转换为更有意义的格式以便于应用程序理解和处理。
- **集成支持**:提供与现有企业系统(如仓库管理、物流跟踪)的集成能力。
- 数据安全与隐私保护技术
- **数据安全**
- **加密技术**对RFID标签中的数据进行加密以防止未授权访问。
- **认证机制**确保只有授权的读写器能够访问RFID标签中的数据。
- **防篡改**:确保数据在传输和存储过程中不被篡改。
- **隐私保护**
- **射频屏蔽**使用射频屏蔽技术保护RFID标签不被非法读取。
- **杀死命令**允许RFID标签在特定条件下被永久性地禁用以保护用户隐私。
- **匿名和伪装技术**:使用匿名标识和数据伪装技术,减少个人信息的暴露。
这些技术不仅提高了RFID系统的效率和有效性也确保了数据的安全性和用户的隐私保护。随着RFID技术的不断发展这些安全和隐私保护措施也在不断进化以应对新的挑战和威胁。

View File

@ -0,0 +1,100 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业5</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简述传感器定义、工作原理和基本分类。
传感器是一种检测设备,能够感知被测量的信息,并能将感知的信息转换成电信号或其他所需形式的输出,以满足信息传输、处理、存储、显示、记录和控制等要求。它是自动检测和自动控制系统中的重要组成部分。
**工作原理:**
1. **能量转换原理:** 传感器通常依靠能量转换原理工作。它接收由某种物理形式(如热量、光量、力和压力等)表达的信息,并将其转换成电信号。这种转换涉及能量的形式转变。
2. **响应机制:** 当传感器感知到外部的物理或化学变化时,它根据设计的响应机制产生相应的变化,这种变化随后被转换为电信号。
**基本分类:**
1. **按照检测对象的不同**:可以分为位置传感器、速度传感器、加速度传感器、力传感器、压力传感器、温度传感器、流量传感器、水质传感器等。
2. **按照工作原理的不同**:可分为热电传感器、光电传感器、磁电传感器、声电传感器、力电传感器等。
3. **按照输出信号的不同**:可以分为模拟传感器和数字传感器。模拟传感器输出连续变化的模拟信号,而数字传感器则输出数字信号。
传感器的选择和应用取决于其检测对象和工作环境。高效的传感器能够准确、可靠地捕获信息,并在复杂的系统中发挥关键作用。
## 2. 简述网络智能化传感器原理和特点。
- 能够完成对信号的采集、变换、逻辑判断、功能计算;
- 具有搭建同类和不同类多个传感器的复合能力;
- 能实现内部自检测、自诊断、自校正、自补偿;
- 能与其他系统实现单向或双向通讯;
- 提供离散输出或模拟输出;
- 极大地提高了传感器输出的一致性、重复性、稳定性、准确性及可靠性;
- 使应用开发更简便、经济、快速,具备良好的兼容性;
- 允许用户的控制程序下载至智能化传感器;
- 具备在线标定和校准能力;
- 具备传感器休眠功能;
- 具有自我学习功能。
## 3. 简述IEEE1451标准的产生背景和主要内容。
IEEE1451标准的产生背景是解决不同智能传感器之间的互操作性和互换性等问题简化接口设计和应用。
IEEE1451是由IEEE仪器和测量协会传感器技术技术委员会开发的一套智能换能器接口标准描述了一套开放、通用、独立于网络的通信接口用于将换能器传感器或致动器连接到微处理器、仪器系统和控制/场网络。
## 4. 网络智能传感器应用案例。
网络智能传感器应用案例之一是在智能农业中的使用。在这种情况下,传感器可以部署在农田中,用于监测各种环境参数,如土壤湿度、温度、光照强度以及空气质量。这些数据通过无线网络实时传输到农场管理系统。
例如,智能传感器可以监测土壤湿度,并根据土壤的实际需要自动调整灌溉系统。这不仅节省了水资源,而且确保了作物能够在最佳环境下生长。同时,通过分析气象数据,传感器还可以帮助预测天气变化,如干旱或暴雨,从而提前采取措施保护作物。
此外,智能传感器还可以监测作物生长状况和害虫活动,及时通知农民采取相应措施。这种智能化的管理方式不仅提高了农业生产效率,还有助于实现可持续农业发展。
## 5. 简述嵌入式软件系统特征。
嵌入式软件就是基于嵌入式系统设计的软件,它也是计算机软件的一种,同样由程序及其文档组成,可细分成系统软件、支撑软件、应用软件三类,是嵌入式系统的重要组成部分。
其特征,包括:
1. **专用性**:嵌入式软件通常是为了控制或增强特定硬件的功能而设计的。它们是专门为某种应用或设备开发的,与一般的电脑软件相比,功能更为专一。
2. **实时性**:许多嵌入式系统需要实时操作,意味着它们能够在严格的时间限制内完成任务。例如,汽车的制动系统或机器人的控制系统就需要快速、实时地响应。
3. **资源受限**:与普通计算机系统相比,嵌入式系统在处理能力、存储空间和电源使用等方面通常有更多限制。因此,嵌入式软件需要高效地利用有限资源。
4. **稳定性和可靠性**:由于嵌入式系统常用于关键应用中,如医疗设备、交通控制等,因此它们必须非常稳定和可靠。
5. **长期运行**:嵌入式系统经常需要在没有或很少维护的情况下持续运行较长时间。
6. **与硬件紧密集成**:嵌入式软件通常与特定的硬件紧密集成,有时甚至是定制的,以提高效率和性能。
7. **用户界面简化**:许多嵌入式系统可能没有传统意义上的用户界面,或者界面非常简单,因为用户交互不是主要目的。
## 6. 结合铁路事故案例(如路基沉降等健康状态),给出基于物联网传感器技术的解决方案。
1. **实时监测与预警系统**:部署一系列传感器沿着铁路线,用以实时监测路基的稳定性、轨道的几何状态以及其他关键参数,如振动和温度。这些数据可以即时传输到中央监控系统,以便及时发现任何异常情况。
2. **地面沉降检测**:特别设计的传感器可以用于监测地面沉降情况。这些传感器可以精确地检测出即使是微小的地面移动,这对于预防路基沉降和其他相关问题至关重要。
3. **结构健康监测**:结构健康监测传感器可以安装在桥梁、隧道和其他关键结构上,用以评估其完整性。这些传感器可以检测裂缝、变形或其他可能导致结构失败的迹象。
4. **环境监测**:环境监测传感器可用于监测可能影响铁路安全的环境条件,例如洪水、地震或滑坡。这些数据有助于预测和防止由极端天气条件引起的事故。
5. **数据分析与预测维护**:收集的数据可以使用先进的数据分析技术进行处理,以识别潜在的问题并预测未来的维护需求。这种预测性维护可以减少意外故障和相关事故。
6. **无线通信网络**:通过建立稳定的无线通信网络来确保数据的实时传输和处理。这样可以确保即使在偏远或难以接入的区域也能进行有效的监控。

View File

@ -0,0 +1,135 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业6</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简述ARPANET网的诞生原因以及TCP/IP产生的背景、意义和体系架构。
ARPANET的诞生原因可以追溯到1960年代的美国。主要有以下几个因素
1. **军事需求**:在冷战时期,美国国防部意识到需要一种可靠的通信系统,即使在核战争中也能保持运作。这种网络需要能够在部分节点被摧毁的情况下继续运作。
2. **科研合作**随着科学研究的增多不同机构之间的信息交流和数据共享变得越来越重要。ARPANET的建立使得不同地理位置的研究人员可以共享资源和信息。
3. **计算技术的发展**计算机科学的快速发展要求更高效的数据交换和处理方式。ARPANET的建立提供了这样一个平台促进了计算机技术的进一步发展。
而TCP/IP传输控制协议/互联网协议)的产生背景、意义和体系架构如下:
1. **背景**随着ARPANET的发展出现了对更可靠、更灵活的网络协议的需求。原有的NCP网络控制协议不足以支持日益增长的网络规模和复杂性。
2. **意义**
- **互操作性**TCP/IP为不同计算机网络之间的互联提供了标准使得不同类型的网络可以通信。
- **可靠性和健壮性**TCP/IP设计有能力在网络出现问题时保持通信增加了网络的可靠性。
- **扩展性**TCP/IP支持广泛的网络规模从小型局域网到全球互联网。
3. **体系架构**
- **应用层**:负责处理特定应用程序的通信。
- **传输层**其中的TCP负责确保数据的正确传输。
- **互联网层**IP协议处在这一层负责数据包的寻址和路由。
- **网络接口层**:处理与具体物理网络的接口细节。
TCP/IP的引入是互联网发展史上的一个重大里程碑它不仅促进了不同网络之间的通信也奠定了现代互联网的基础。
## 2. 简述互联网技术目前面临的挑战。
互联网技术目前面临的挑战是多方面的,涉及技术、安全、社会、经济和政策等多个领域。主要挑战包括:
1. **安全问题**
- **网络攻击**随着网络攻击技术的日益成熟如DDoS攻击、网络钓鱼、恶意软件等互联网的安全风险日益增大。
- **数据泄露和隐私保护**:个人和企业数据的泄露日益严重,保护用户隐私成为重大挑战。
2. **网络中立性**:网络中立性的争议涉及到网络服务提供商是否应该平等对待所有数据流量。这涉及到公平竞争、创新鼓励与用户权益保护等问题。
3. **技术更新与维护**
- **基础设施老化**:随着互联网技术的迅速发展,旧有的基础设施需要升级以支持更高的数据传输速度和更大的用户量。
- **IPv4地址耗尽**随着设备数量的增加IPv4地址的枯竭成为问题需要向IPv6过渡。
4. **数字鸿沟**:不同地区、不同社会经济背景的人群在互联网接入和技术应用方面存在明显差距,加剧了社会不平等。
5. **内容监管和审查**:互联网上的内容监管与言论自由之间存在紧张关系。不同国家和地区在内容审查和信息流通方面的政策差异很大。
6. **人工智能和自动化的影响**AI和自动化技术的发展对就业市场、隐私保护、道德伦理等方面带来了挑战。
7. **信息过载和假新闻**:互联网上信息的海量增长导致了信息过载,同时假新闻和错误信息的传播也对社会造成了影响。
8. **国际监管和合作**:随着互联网的全球化,跨国监管和国际合作在数据流通、网络安全等方面变得复杂且必要。
## 3. 结合WiFi技术简述无线宽带网络的技术特征并给出一个应用场景。
无线宽带网络技术尤其是以WiFi为代表的技术具有以下几个主要特征
1. **无线接入**:最显著的特点是无线连接。通过无线信号,设备可以在一定范围内自由移动,同时保持网络连接。
2. **高速数据传输**随着无线技术的发展现代WiFi标准如802.11ac和802.11ax)支持高速数据传输,可满足高清视频流媒体、在线游戏等对带宽要求较高的应用。
3. **多设备连接**WiFi网络可以支持多个设备同时连接这些设备可以是手机、平板、笔记本电脑、智能家居设备等。
4. **安全性**现代WiFi技术包括多种安全措施如WPA3加密以保护用户数据不被未授权访问。
5. **易于部署和维护**与有线网络相比WiFi网络部署简单不需要铺设复杂的线缆且可通过软件进行配置和管理。
6. **覆盖范围限制**WiFi信号有其有效覆盖范围通常为数十米内。信号强度会随距离和障碍物的增加而减弱。
应用场景示例:
**智能家居系统**在一个智能家居系统中多种设备如智能灯泡、智能插座、安全摄像头、智能音箱、智能冰箱等通过WiFi连接到家庭网络。用户可以通过智能手机或其他智能设备远程控制这些家居设备实现家庭自动化。例如用户可以在下班回家的路上通过手机应用打开家中的空调调整灯光甚至查看门口的安全摄像头。这种应用不仅提高了生活便利性还可以通过远程监控增加家庭安全。
## 4. 结合ZigBee技术简述无线低速网络的特征并给出一个应用场景。
ZigBee技术是一种基于IEEE 802.15.4标准的低功耗无线通信技术,它是无线低速网络的典型代表。以下是其主要特征:
1. **低功耗**ZigBee设计的重点是低能耗使设备能在电池供电下长时间运行甚至数年。
2. **低数据传输速率**与WiFi等高速无线技术相比ZigBee的数据传输速率较低通常在20-250 kbps范围内适合不需要高带宽的应用。
3. **小型化和成本低**ZigBee设备通常小巧且成本较低适合大规模部署。
4. **可靠性和安全性**尽管速度较低但ZigBee提供稳定的通信与较强的安全性支持数据加密和身份验证。
5. **支持大量节点**ZigBee网络可以支持成百上千的节点适合大规模的传感器网络和控制系统。
6. **良好的兼容性**ZigBee遵循开放标准可以与多种不同厂商的设备兼容。
7. **较强的网络自组织和自愈能力**ZigBee网络具有自组织和自愈的特性能够自动选择最佳路径和在节点失效时重构网络。
应用场景示例:
**智能农业**在智能农业应用中ZigBee技术可以用于建立一个大型的传感器网络用于监测农田的各种环境参数如土壤湿度、温度、光照强度和空气湿度等。这些传感器将数据实时传输回中央控制系统以便于农业管理者远程监控和控制灌溉系统、温室环境等。这种应用不仅能提高农作物的产量和质量还能有效节约水资源和降低劳动成本。
## 5. 给出IOT应用例子结合近日在乌镇召开的2023年世界互联网大会展示的技术描述其需求并给出技术描述。
**需求描述:**
智能农业的需求主要集中在两个方面:一是提高农作物的产量和质量,二是降低生产成本。具体来说,需要实现以下目标:
1. 精准种植:根据土壤、气候等条件,精确控制种植的品种、数量和时间。
2. 智能灌溉:通过传感器监测土壤湿度和植物生长情况,实现自动化的灌溉。
3. 病虫害预警:通过物联网技术,实时监测植物的生长情况,及时发现病虫害并采取措施。
4. 产量预测:根据历史数据和实时监测数据,预测未来的产量,帮助农民做出更好的决策。
5. 品质追溯:通过物联网技术,实现从种植到销售的全程追溯,提高农产品的品质和安全性。
**技术描述:**
为了实现上述需求,需要运用多种技术,包括传感器技术、通信技术、云计算、大数据等。具体来说,需要做到以下几点:
1. 传感器部署:在农田中部署土壤湿度传感器、温度传感器、光照传感器等多种传感器,实时监测农田环境的变化。
2. 数据传输通过无线通信技术如LoRa、NB-IoT等将传感器数据传输到云端服务器。
3. 数据处理和分析:在云端服务器上,利用云计算和大数据技术,对传感器数据进行处理和分析,提取有价值的信息。
4. 决策支持:根据数据处理和分析的结果,制定相应的决策(如灌溉、施肥、喷药等),并通过物联网技术将决策指令发送到相应的设备上。
5. 设备控制:通过物联网技术,控制相应的设备(如灌溉设备、施肥设备等),实现自动化操作。

View File

@ -0,0 +1,83 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业7</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简述SDN的产生背景。
软件定义网络SDN的产生背景主要与网络技术的发展及其面临的挑战密切相关。以下是SDN产生的几个关键背景因素
1. **网络管理的复杂性**:随着网络规模的不断扩大,传统的网络架构开始显示出管理和配置上的复杂性。在传统网络中,每个网络设备(如交换机和路由器)需要独立配置,这不仅耗时而且容易出错。
2. **创新速度受限**:在传统网络模型中,网络控制功能(如路由决策)紧密集成在网络硬件中。这种紧密耦合限制了网络技术的创新速度,因为任何新功能的实现都可能需要更换或升级硬件设备。
3. **云计算的兴起**:云计算的发展要求网络架构具有更高的灵活性和可扩展性,以支持动态变化的计算和存储需求。传统的静态网络结构难以满足这些要求。
4. **中心化管理的需求**:随着大型数据中心和云服务的兴起,对于能够从中心化的位置管理和优化网络资源的需求日益增长。
5. **开放标准的推动**:业界对开放标准和开源解决方案的兴趣增加,希望通过这些方式降低成本,提高互操作性,并促进创新。
SDN应运而生它通过将网络控制平面决定数据如何流动从数据转发平面实际转发网络流量的部分中分离出来来解决这些问题。这种分离使得网络管理员可以通过软件应用来编程控制网络行为而不是直接操作每个网络硬件设备从而实现网络配置和管理的更大灵活性和自动化。此外SDN的出现也为网络研究和创新提供了一个更加灵活和开放的平台。
## 2. 简述SDN的技术特性。
软件定义网络SDN的技术特性体现了它作为一种创新网络架构的核心优势。以下是SDN的主要技术特性
1. **中心化网络控制**SDN将网络的控制逻辑从传统的网络设备如路由器和交换机中抽象出来集中在一个或多个中央控制器上。这种中心化的控制机制允许网络管理员从一个中央位置管理整个网络而不是单独配置每个网络设备。
2. **程序化网络管理**SDN提供了通过软件编程来管理网络的能力。这意味着网络管理员可以使用编程语言和脚本来自动化网络配置任务实现更快速、灵活的网络调整。
3. **开放标准和接口**SDN推崇使用开放标准和接口如OpenFlow协议。这些开放接口使得不同供应商的网络设备和控制器可以相互操作并允许第三方开发者设计和实现创新的网络应用和服务。
4. **网络虚拟化**SDN支持在物理网络上创建多个虚拟网络。每个虚拟网络可以有独立的、可定制的网络拓扑和策略支持多租户架构并为不同的业务需求提供灵活性。
5. **动态的流量管理和优化**SDN允许网络流量和网络性能的动态管理。网络控制器可以根据实时的网络状态信息来优化流量路由提高网络的整体效率和性能。
6. **可扩展性和弹性**SDN架构支持网络的水平扩展可以适应大规模网络环境。同时中心化的控制也提高了网络的弹性有助于快速恢复网络故障。
7. **安全性增强**由于有了中心化的视角和控制SDN可以更有效地实现网络安全策略如流量隔离、入侵检测和防止网络攻击。
SDN通过这些技术特性提供了一个灵活、可编程、高效且安全的网络架构使得网络管理更加自动化和智能化同时促进了网络技术创新。
## 3. 给出OPENFLOW的网络架构。
OpenFlow作为软件定义网络SDN的关键组成部分提供了一种实现网络虚拟化和集中式管理的架构。OpenFlow的网络架构主要包括以下几个关键组件
1. **OpenFlow交换机或路由器**
- 这些是网络中的物理或虚拟设备,负责数据包的转发。
- 每个OpenFlow交换机包含一个或多个流表以及一个用于执行包转发决策的OpenFlow协议接口。
- 流表包含一系列流表项,每个流表项包括匹配字段、计数器和一组指令(如转发、丢弃、修改字段等)。
2. **控制器**
- 控制器是OpenFlow架构的核心它是一个运行在网络中的软件应用用于管理网络设备。
- 控制器与OpenFlow交换机通过南向接口如OpenFlow协议通信控制器发送指令给交换机以决定网络流量如何处理和转发。
- 控制器还提供北向接口,允许更高级别的网络管理应用和服务与之交互。
3. **南向接口**
- 南向接口是连接控制器和交换机的接口通常是指OpenFlow协议。
- 这个接口使得控制器能够动态地添加、更新和删除流表项,以控制网络流量。
4. **北向接口**
- 北向接口允许高层次的网络应用和服务与控制器交互。
- 这些接口通常基于REST API或其他标准化接口允许开发人员编写应用程序来实现高级网络管理功能如负载均衡、网络监视、安全管理等。
5. **应用层**
- 这是网络架构中的顶层,包括运行在控制器之上的各种网络应用和服务。
- 应用层利用控制器提供的北向接口来获取网络状态信息,并根据业务需求对网络进行编程和管理。
总体而言OpenFlow架构通过这些组件实现了对网络设备的集中式控制和程序化管理提高了网络的灵活性、可扩展性和创新能力。

View File

@ -0,0 +1,94 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业8</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简要描述云计算概念,并给出云架构。
云计算是一种通过互联网提供计算资源和数据存储的服务模式。它允许用户通过网络访问和使用存储在远程服务器上的资源,而不是本地或个人设备上。云计算的主要特点包括:
1. **按需自助服务**:用户可以根据需要自行获取计算资源,如服务器时间和网络存储,无需人工干预。
2. **广泛的网络访问**:服务通过网络提供,可以用各种标准设备如手机、平板、笔记本和台式机访问。
3. **资源池化**:云服务提供商的计算资源被池化以服务多个客户,使用多租户模型,其中不同的物理和虚拟资源根据客户的需求动态分配和重新分配。
4. **快速弹性**:资源可以迅速地、弹性地提供和释放,以便迅速扩展和缩减。
5. **计量服务**:云系统自动控制和优化资源的使用,利用一定级别的计量能力,可以为不同类型的服务提供计费。
云架构通常分为三个主要层次:
1. **基础设施即服务IaaS**:这是最底层,提供如服务器、存储和网络设备等基础计算资源。用户可以在这些资源上部署和运行任意软件,包括操作系统和应用程序。
2. **平台即服务PaaS**:这个层次提供了应用程序开发和部署的平台。用户可以在这个平台上创建软件应用,而无需担心底层基础设施。
3. **软件即服务SaaS**在最高层提供的是完整的应用程序。用户通过网络接入这些应用程序通常是通过Web浏览器并且不需要担心维护和管理底层的基础设施或平台。
云计算的这种架构使得资源的使用更加灵活和成本效益,同时提高了数据的可访问性和可靠性。
## 2. 简要描述大数据技术的技术特征,并给出大数据技术架构。
大数据技术主要具有以下几个技术特征:
1. **海量性Volume**大数据处理的数据量巨大通常达到PB千兆字节甚至更高级别。
2. **多样性Variety**:大数据不仅包括传统的结构化数据,还包括半结构化和非结构化数据,如文本、图片、视频等。
3. **速度Velocity**:大数据技术能够快速处理和分析数据,支持实时或接近实时的数据处理。
4. **真实性Veracity**:大数据技术强调数据的真实性和准确性,确保数据质量。
5. **价值密度Value**:大数据本身可能价值密度低,但通过分析和处理能够提取有价值的信息。
大数据技术架构通常包括以下几个层面:
1. **数据采集层**:负责从各种来源收集数据,包括传统数据库、互联网、物联网设备等。
2. **数据存储层**使用分布式文件系统或数据库存储海量数据。例如Hadoop的HDFS分布式文件系统
3. **数据处理层**使用各种处理工具对数据进行预处理、清洗、转换等操作。例如MapReduce、Spark等。
4. **数据分析层**:对数据进行深入分析,包括机器学习、数据挖掘等。
5. **数据展示层**:将处理和分析的结果以图表、报告的形式展示出来,便于用户理解和决策。
6. **数据管理和安全层**:确保数据的安全性和隐私性,包括数据加密、访问控制等。
这个架构是灵活的,根据不同的应用场景和需求,可能会有所调整。
## 3. 简要描述数字孪生的概念和技术特征,并给出面向机器人应用的技术架构。
数字孪生是一种技术,它创建了一个实体或系统的虚拟模型。这个虚拟模型是基于物理实体的数据和模拟而构建的,可以实时更新以反映其物理对应物的状态。数字孪生的技术特征主要包括:
1. **数据集成与模拟**:数字孪生整合了来自物理实体的实时数据(如传感器数据),并使用这些数据来模拟和预测实体的行为和性能。
2. **实时分析与监控**:通过持续分析实体的数据,数字孪生能够提供实时的洞察和预警,帮助预测和预防潜在的问题。
3. **交互性**:用户可以与数字孪生模型互动,以更好地理解物理实体的运作,并测试不同的方案或设置。
4. **优化与决策支持**:数字孪生可以用于优化物理实体的运行,提供决策支持,如维护计划或操作改进。
面向机器人的数字孪生技术架构可能包括以下几个关键组成部分:
1. **传感器与数据采集**:在机器人上安装的传感器用于收集各种数据,如位置、运动、环境互动等。
2. **通信与数据传输**:通过网络将收集到的数据传输到云平台或数据中心。
3. **数据处理与存储**:使用高效的数据处理和存储系统来处理和存储从机器人收集到的大量数据。
4. **虚拟建模与仿真**:创建机器人的详细虚拟副本,包括其物理属性和行为特征。
5. **分析与优化**:应用数据分析和机器学习算法来优化机器人的性能和决策过程。
6. **用户界面与交互**:提供用户界面,使操作者能够监控和控制机器人的数字孪生,以及进行不同的模拟和预测分析。
这样的架构能够提高机器人的操作效率和可靠性,同时降低维护成本和提高安全性。

View File

@ -0,0 +1,52 @@
<h1><center>课程作业</center></h1>
<div style="text-align: center;">
<div><span style="display: inline-block; width: 65px; text-align: center;">课程名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网架构与技术</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">作业名称</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">作业9</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">学号</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">21281280</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">姓名</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">柯劲帆</span></div>
<div><span style="display: inline-block; width: 65px; text-align: center;">班级</span><span style="display: inline-block; width: 25px;">:</span><span style="display: inline-block; width: 210px; font-weight: bold; text-align: left;">物联网2101班</span></div>
</div>
---
## 1. 简述开源软件及其特点,给出一个物联网相关的软件开源社区并简要描述其特色。
开源软件是指其源代码对公众开放的软件。用户可以自由地查看、修改、和分发这个软件。它的主要特点包括:
1. **可访问性**:开源软件的源代码对所有人都是可获取的,这意味着任何人都可以研究和了解软件是如何构建的。
2. **自由修改和分享**:用户可以自由地修改软件,并且可以在社区中共享这些改进,促进了创新和快速发展。
3. **社区支持**:开源软件通常依赖于一个积极的社区来进行开发、测试和支持。
4. **透明度**:由于源代码的开放,用户可以完全了解软件的功能和安全性。
5. **成本效益**:很多开源软件是免费提供的,降低了使用成本。
在物联网IoT领域一个著名的开源社区是**Eclipse IoT**。这个社区提供了一系列开源物联网项目,支持物联网设备、网关以及云平台的开发和整合。它的特色包括:
- **多样化的项目**Eclipse IoT包含了不同的项目涵盖从设备端到云端的多个层面。
- **强大的生态系统**:它有一个活跃的社区,为开发者提供支持,并促进了各种项目和想法的交流。
- **易于整合**由于其开放性和标准化Eclipse IoT的项目容易与其他系统和应用集成。
- **适应性强**:这些项目可以根据特定的需求进行定制和扩展,使其适用于各种不同的物联网场景。
## 2. 简述开源硬件及其特点。
开源硬件指的是按照开源协议发布的硬件设计这些设计通常包括电路图、清单、PCB布局数据、以及集成的软件等。它们可以被任何人自由地研究、修改、分发、制造和销售。开源硬件的特点主要包括
1. **透明度**:开源硬件的设计、构成和工作原理都是公开的,任何人都可以访问这些信息。
2. **社区参与**:由于其开源性质,开源硬件项目通常鼓励社区参与。开发者、工程师和爱好者可以共同改进设计,分享心得,增强产品的功能和性能。
3. **自由修改和再分发**:用户可以自由地修改开源硬件设计,同时在遵守原始许可协议的情况下再分发这些设计。
4. **教育和创新的促进**:由于设计是开放的,开源硬件在教育和研究领域尤其受欢迎,它们帮助学生和研究人员了解硬件的工作原理并鼓励创新。
5. **成本效益**:开源硬件可以减少研发成本,因为用户可以基于现有的设计进行改进,而不是从零开始。
6. **标准化和互操作性**:开源硬件通常遵循某些标准,易于与其他设备或系统集成。
7. **快速迭代**:开放的设计和社区的参与有助于快速迭代和改进,从而加速新产品的开发。
这些特点使得开源硬件在许多领域,如消费电子、教育、科研等变得越来越受欢迎。

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,410 @@
![cover](cover.png)
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验一二三的操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# **实验一** 环境搭建
## 1.1. 实验目的
安装必要的开发工具、烧写工具构建EnOcean模块开发环境以便进行模块开发及实验。
## 1.2. 工具/原料
- 计算机Windows操作系统
- IAR FOR ARM 7.20安装包
- TI-TM4C-SDK工具包
- DolphinView安装包
- J-link安装包
## 1.3. 实验步骤
实验一的实验步骤在实验指导书上非常详细,只需要按照配图和文字执行即可。因此我们在本实验报告中仅简单概括一下实验的步骤,并说明我们对每个步骤在本物联网项目中在架构与技术上的理解。
1. 安装IAR FOR ARM 7.20
IAR软件作为项目的IDE软件主要用于编写程序代码、搭建软件工程、调用JTAG工具烧写硬件以及进行DEBUG等。
2. 破解IAR软件
~~IAR软件是商业收费软件。~~
3. 安装SDK工具包
SDK工具包是使用软件驱动硬件的依赖文件是厂商设计的与硬件通信的接口由硬件制造厂商提供。
4. 重建SDK驱动程序库
为了使IAR能在新的安装路径中找到SDK驱动程序需要重建SDK驱动程序库。
在这个步骤我们遇到了困难。排查原因发现是由于项目文件路径含有中文字符导致。由于编译机器使用MinGW作为C语言编译器MinGW不支持中文路径。
5. 安装J-link驱动
J-link是PC机与物联网模块进行烧写和DEBUG等的工具。作为外接的额外硬件需要在PC机上安装J-link的驱动以实现让PC机调用J-link的接口进行控制。
6. 安装DolphinView软件
DolphinView软件能够与后面烧写的Sniffer进行联动显示EnOcean_Sniffer程序采集的数据包。
## 1.4. 实验结果
我们最后成功将实验环境配置完成。
## 1.5. 实验感想
通过此次实验我们对物联网系统开发流程有了更直观的了解。在配置开发环境过程中我们安装了IAR、JLink等开发和调试所需的软硬件工具并解决了编译链接和烧录时遇到的问题。这使我们对物联网设备固件的编译、烧录等开发过程有了直接的体会。
# 实验二 EnOcean Sniffer 实验
## 2.1. 实验目的
将一个易能森设备配置为嗅探器Sniffer抓取易能森通信数据包以便分析数据。
## 2.2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 2.3. 预备知识
1. Sniffer嗅探器是一种基于被动侦听原理的网络分析方式。使用这种技术方式可以监视网络的状态、数据流动情况以及网络上传输的信息。
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. 利用DolphinView 可以实现Sniffer的检测。
## **2.4**. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
void EnOceanUARTIntHandler(void) {
uint32_t ui32Ints; // 用于存储UART中断标志的变量
uint8_t data; // 用于存储接收到的数据字节
static uint8_t PacketHeader = 0; // 表示数据包头部的标志
static uint32_t PacketLen = 0; // 用于存储预期数据包长度的变量
//
// Get and clear the current interrupt source(s)
//
// 获取并清除当前的中断源
ui32Ints = ROM_UARTIntStatus(ENOCEAN_UART_BASE, true);
ROM_UARTIntClear(ENOCEAN_UART_BASE, ui32Ints); // 清除已处理的中断
//
// Handle receive interrupts.
//
// 处理接收中断。
if (ui32Ints & (UART_INT_RX | UART_INT_RT)) { // 检查RX FIFO非空或者超时中断是否发生
data = ROM_UARTCharGetNonBlocking(ENOCEAN_UART_BASE); // 从UART中读取一个字符
// 检查接收缓冲区是否有空间,并且数据包接收不在进行中
if (EnOceanRxCount < ENOCEAN_RX_BUFFER_SIZE && (!EnOceanTelegramRxflags)) {
EnOceanRxBuffer[EnOceanRxCount++] = data; // 将接收到的数据存储到缓冲区中
// 检查数据包头部是否已经被检测到
if (!PacketHeader) {
// 检查数据包的第一个字节是否是头部0x55
if (EnOceanRxBuffer[0] != 0x55) EnOceanRxCount = 0; // 如果头部不符合预期,重置缓冲区
else {
// 检查是否已经接收到6个字节头部 + 数据长度 + 校验和)
if (EnOceanRxCount == 6) {
// 使用接收到的数据计算预期的数据包长度
if (GetCheckSum(&EnOceanRxBuffer[1], 4) == EnOceanRxBuffer[5]) {
PacketLen = 7 + (EnOceanRxBuffer[1] << 8) + EnOceanRxBuffer[2] + EnOceanRxBuffer[3];
PacketHeader = 1; // 设置数据包头部标志
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0
} else {
EnOceanRxCount = 0; // 如果校验和验证失败,重置缓冲区
}
}
}
} else if (EnOceanRxCount == PacketLen) {
EnOceanTelegramRxflags = 1; // 设置表示完整数据包接收的标志
PacketHeader = 0; // 重置数据包头部标志
PacketLen = 0; // 重置预期数据包长度
}
} else {
// 如果缓冲区已满或者接收到无效的数据包,重置接收缓冲区和数据包头部信息
EnOceanRxCount = 0;
PacketHeader = 0;
PacketLen = 0;
}
}
}
```
## 2.5. 实验步骤
### 2.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 2.5.2. 步骤二 加载工程文件
加载EnOcean_Sniffer工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“EnOcean_Sniffer.eww”工程文件点击“打开”。
### 2.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
在这里我们遇到了问题。在完成上述设置后,我们还是遇到了烧录错误,报错截图如下:
<img src="picture1.png" alt="picture1" style="zoom: 67%;" />
上网查阅资料后我们对比发现设置中的Interface默认为SWD但是我们实验使用的工具为JATG所以需要选择JATG。更改如下
<img src="picture2.png" alt="picture2" style="zoom:67%;" />
更改该选项之后,成功烧录程序。
**加载一位翘板开关工程Rocker_Switch工程**
点击工具栏的红叉退出调试拔掉下载EnOcean_Sniffe程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载1.4Rocker_Switch工程。
### 2.5.4. 步骤四 安装USB Serial Port
将下载EnOcean Sniffer程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电和传输数据。
在这里我们再次遇到了问题。
用一根micro USB线将OURS_EnOcean模块和PC机相连后PC机并没有如实验指导书所述弹出驱动安装提示窗口。且在设备管理器中可以看到PC机没有正确识别OURS_EnOcean设备如下图所示
<img src="picture3.png" alt="picture3" style="zoom:67%;" />
我们在网上查找新版本的设备驱动程序。将驱动程序版本从“TivaWare_C_Series-2.1.4.178”升级到了“TivaWare_C_Series-2.2.0.295”。在设备管理器右键设备->点击“属性”->点击“驱动程序”->点击“更新驱动程序”->点击“浏览我的电脑以查找驱动程序”->点击“浏览”->选择新驱动的安装目录->点击“确定”即可让PC机更新驱动。现在PC机能正确识别OURS_EnOcean设备了
<img src="picture4.png" alt="picture4" style="zoom:67%;" />
### 2.5.5. 步骤五 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Rocker_Switch工程的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Rocker_Switch工程的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 2.6. 实验结果
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S4键数据包的Data为00按下S3键数据包的Data为10。
<img src="picture5.png" alt="picture5" style="zoom:67%;" />
在这个过程中我们将烧有Rocker_Switch工程的OURS-EnOcean模块脱离连接着Sniffer的PC机使用手机充电器供电也能在Sniffer上接收到Rocker_Switch的数据包这验证了数据包是无线传输的。
## 2.7. 实验感想
在Sniffer实验中我们通过串口抓取了EnOcean无线模块之间的通信数据包并在DolphinView可视化软件中查看。这帮助我们理解和掌握了Sniffer嗅探器的工作原理。同时阅读Sniffer源码也加深了我们对EnOcean通信协议和TM4C单片机串口通信的理解。
在实验过程中,我们学习到了解决实验问题的方法。当遇到困难时,我们会小组讨论分析问题原因,充分利用网络资源查阅相关资料,在助教的帮助下最终找到解决办法。这种经验对我们今后独立分析和解决问题具有重要的启示意义。
本次实验采用小组合作形式。通过分工协作,不仅提高了工作效率,也培养了我们的团队协作能力。今后我们会继续提升合作中各成员的配合水平。
# 实验三 EnOcean温度采集实验
## 3.1. 实验目的
学习易能森协议栈温度传感器采集Profile模拟一个温度数据以温度采集Profile发送出去利用Sniffer进行抓包。
## 3.2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 3.3. 预备知识
1. 温度传感器是指能感受温度并转换成可用输出信号的传感器
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. STM330F为一个室内光能供电的温度传感器。
4. 利用DolphinView 可以实现温度传感器的检测。
## 3.4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
uint8_t SendSensorValue(void)
{
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 设置GPIO引脚电平为0表示开始发送数据
uint8_t randtemp = g_ui32SysTickCount & 0x3f; // 生成一个随机数模拟温度传感器值
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x0a; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备类型
EnOceanTelegramBuf[datalen++] = 0x00; // 数据1
EnOceanTelegramBuf[datalen++] = 0x00; // 数据2
EnOceanTelegramBuf[datalen++] = randtemp; // 随机温度传感器值
EnOceanTelegramBuf[datalen++] = 0x08; // 数据3
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0x80; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送功率FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别为0表示电报未加密
// 计算并设置数据段CRC校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否正确
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 通过UART发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
这个函数的作用是生成并发送一个EnOcean数据包其中包含了模拟的温度传感器值和一些固定的字段。函数通过UART发送数据包然后等待接收到带有返回OK标志的响应。
## 3.5. 实验步骤
### 3.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 3.5.2. 步骤二 加载工程文件
加载Temp_Sensor工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“Temp_Sensor.eww”工程文件点击“打开”。
### 3.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Temp_Sensor程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
### 2.5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Temp_Sensor程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Temp_Sensor程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 3.6. 实验结果
按下烧有Temp_Sensor工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S3键数据包的Data为固定值08 B0 01 87按下S4键数据包的Data始终变化。
<img src="picture6.png" alt="picture6" style="zoom:67%;" />
## 3.7. 实验感想
通过这次温度传感器数据采集实验我们进一步理解和掌握了EnOcean无线通信模块的使用。我们学会了使用随机数模拟温度传感器值并组装成符合EnOcean协议格式的数据包进行无线发送。在Sniffer端成功捕获了发送的温度数据包验证了传输的正确性。
在阅读Temp_Sensor发送端代码时我们学习到了如何按照通信协议格式组织数据以及校验和的计算方法。这对我们后续开发EnOcean无线传感网络具有很好的指导意义。在配置和调用TM4C单片机外设(如GPIO、UART等)的过程中,也加深了我们对单片机外设编程的理解。
本次实验我们小组分工合作,分工明确,团队协作顺畅,实验效率得到提高。我们会在今后的项目中,继续提升团队协作能力,以适应未来更复杂的开发任务。

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@ -0,0 +1,100 @@
![cover](cover.png)
<h1><center>实验一 环境搭建</center></h1>
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验的组织与操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# 1. 实验目的
安装必要的开发工具、烧写工具构建EnOcean模块开发环境以便进行模块开发及实验。
# 2. 工具/原料
- 计算机Windows操作系统
- IAR FOR ARM 7.20安装包
- TI-TM4C-SDK工具包
- DolphinView安装包
- J-link安装包
# 3. 实验步骤
实验一的实验步骤在实验指导书上非常详细,只需要按照配图和文字执行即可。因此我们在本实验报告中仅简单概括一下实验的步骤,并说明我们对每个步骤在本物联网项目中在架构与技术上的理解。
1. 安装IAR FOR ARM 7.20
IAR软件作为项目的IDE软件主要用于编写程序代码、搭建软件工程、调用JTAG工具烧写硬件以及进行DEBUG等。
2. 破解IAR软件
~~IAR软件是商业收费软件。~~
3. 安装SDK工具包
SDK工具包是使用软件驱动硬件的依赖文件是厂商设计的与硬件通信的接口由硬件制造厂商提供。
4. 重建SDK驱动程序库
为了使IAR能在新的安装路径中找到SDK驱动程序需要重建SDK驱动程序库。
在这个步骤我们遇到了困难。排查原因发现是由于项目文件路径含有中文字符导致。由于编译机器使用MinGW作为C语言编译器MinGW不支持中文路径。
5. 安装J-link驱动
J-link是PC机与物联网模块进行烧写和DEBUG等的工具。作为外接的额外硬件需要在PC机上安装J-link的驱动以实现让PC机调用J-link的接口进行控制。
6. 安装DolphinView软件
DolphinView软件能够与后面烧写的Sniffer进行联动显示EnOcean_Sniffer程序采集的数据包。
# 4. 实验结果
我们最后成功将实验环境配置完成。
# 5. 实验感想
通过此次实验我们对物联网系统开发流程有了更直观的了解。在配置开发环境过程中我们安装了IAR、JLink等开发和调试所需的软硬件工具并解决了编译链接和烧录时遇到的问题。这使我们对物联网设备固件的编译、烧录等开发过程有了直接的体会。

View File

@ -0,0 +1,185 @@
![cover](cover.png)
<h1><center>实验三 EnOcean温度采集实验</center></h1>
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验的组织与操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# 1. 实验目的
学习易能森协议栈温度传感器采集Profile模拟一个温度数据以温度采集Profile发送出去利用Sniffer进行抓包。
# 2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
# 3. 预备知识
1. 温度传感器是指能感受温度并转换成可用输出信号的传感器
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. STM330F为一个室内光能供电的温度传感器。
4. 利用DolphinView 可以实现温度传感器的检测。
# 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
uint8_t SendSensorValue(void)
{
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 设置GPIO引脚电平为0表示开始发送数据
uint8_t randtemp = g_ui32SysTickCount & 0x3f; // 生成一个随机数模拟温度传感器值
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x0a; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备类型
EnOceanTelegramBuf[datalen++] = 0x00; // 数据1
EnOceanTelegramBuf[datalen++] = 0x00; // 数据2
EnOceanTelegramBuf[datalen++] = randtemp; // 随机温度传感器值
EnOceanTelegramBuf[datalen++] = 0x08; // 数据3
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0x80; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送功率FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别为0表示电报未加密
// 计算并设置数据段CRC校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否正确
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 通过UART发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
这个函数的作用是生成并发送一个EnOcean数据包其中包含了模拟的温度传感器值和一些固定的字段。函数通过UART发送数据包然后等待接收到带有返回OK标志的响应。
# 5. 实验步骤
## 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
## 5.2. 步骤二 加载工程文件
加载Temp_Sensor工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“Temp_Sensor.eww”工程文件点击“打开”。
## 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Temp_Sensor程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
## 5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Temp_Sensor程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Temp_Sensor程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
# 6. 实验结果
按下烧有Temp_Sensor工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S3键数据包的Data为固定值08 B0 01 87按下S4键数据包的Data始终变化。
<img src="picture6.png" alt="picture6" style="zoom:67%;" />
# 7. 实验感想
通过这次温度传感器数据采集实验我们进一步理解和掌握了EnOcean无线通信模块的使用。我们学会了使用随机数模拟温度传感器值并组装成符合EnOcean协议格式的数据包进行无线发送。在Sniffer端成功捕获了发送的温度数据包验证了传输的正确性。
在阅读Temp_Sensor发送端代码时我们学习到了如何按照通信协议格式组织数据以及校验和的计算方法。这对我们后续开发EnOcean无线传感网络具有很好的指导意义。在配置和调用TM4C单片机外设(如GPIO、UART等)的过程中,也加深了我们对单片机外设编程的理解。
本次实验我们小组分工合作,分工明确,团队协作顺畅,实验效率得到提高。我们会在今后的项目中,继续提升团队协作能力,以适应未来更复杂的开发任务。

View File

@ -0,0 +1,211 @@
![cover](cover.png)
<h1><center>实验二 EnOcean Sniffer 实验</center></h1>
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验的组织与操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# 1. 实验目的
将一个易能森设备配置为嗅探器Sniffer抓取易能森通信数据包以便分析数据。
# 2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
# 3. 预备知识
1. Sniffer嗅探器是一种基于被动侦听原理的网络分析方式。使用这种技术方式可以监视网络的状态、数据流动情况以及网络上传输的信息。
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. 利用DolphinView 可以实现Sniffer的检测。
# 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
void EnOceanUARTIntHandler(void) {
uint32_t ui32Ints; // 用于存储UART中断标志的变量
uint8_t data; // 用于存储接收到的数据字节
static uint8_t PacketHeader = 0; // 表示数据包头部的标志
static uint32_t PacketLen = 0; // 用于存储预期数据包长度的变量
//
// Get and clear the current interrupt source(s)
//
// 获取并清除当前的中断源
ui32Ints = ROM_UARTIntStatus(ENOCEAN_UART_BASE, true);
ROM_UARTIntClear(ENOCEAN_UART_BASE, ui32Ints); // 清除已处理的中断
//
// Handle receive interrupts.
//
// 处理接收中断。
if (ui32Ints & (UART_INT_RX | UART_INT_RT)) { // 检查RX FIFO非空或者超时中断是否发生
data = ROM_UARTCharGetNonBlocking(ENOCEAN_UART_BASE); // 从UART中读取一个字符
// 检查接收缓冲区是否有空间,并且数据包接收不在进行中
if (EnOceanRxCount < ENOCEAN_RX_BUFFER_SIZE && (!EnOceanTelegramRxflags)) {
EnOceanRxBuffer[EnOceanRxCount++] = data; // 将接收到的数据存储到缓冲区中
// 检查数据包头部是否已经被检测到
if (!PacketHeader) {
// 检查数据包的第一个字节是否是头部0x55
if (EnOceanRxBuffer[0] != 0x55) EnOceanRxCount = 0; // 如果头部不符合预期,重置缓冲区
else {
// 检查是否已经接收到6个字节头部 + 数据长度 + 校验和)
if (EnOceanRxCount == 6) {
// 使用接收到的数据计算预期的数据包长度
if (GetCheckSum(&EnOceanRxBuffer[1], 4) == EnOceanRxBuffer[5]) {
PacketLen = 7 + (EnOceanRxBuffer[1] << 8) + EnOceanRxBuffer[2] + EnOceanRxBuffer[3];
PacketHeader = 1; // 设置数据包头部标志
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0
} else {
EnOceanRxCount = 0; // 如果校验和验证失败,重置缓冲区
}
}
}
} else if (EnOceanRxCount == PacketLen) {
EnOceanTelegramRxflags = 1; // 设置表示完整数据包接收的标志
PacketHeader = 0; // 重置数据包头部标志
PacketLen = 0; // 重置预期数据包长度
}
} else {
// 如果缓冲区已满或者接收到无效的数据包,重置接收缓冲区和数据包头部信息
EnOceanRxCount = 0;
PacketHeader = 0;
PacketLen = 0;
}
}
}
```
# 5. 实验步骤
## 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
## 5.2. 步骤二 加载工程文件
加载EnOcean_Sniffer工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“EnOcean_Sniffer.eww”工程文件点击“打开”。
## 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
在这里我们遇到了问题。在完成上述设置后,我们还是遇到了烧录错误,报错截图如下:
<img src="picture1.png" alt="picture1" style="zoom: 67%;" />
上网查阅资料后我们对比发现设置中的Interface默认为SWD但是我们实验使用的工具为JATG所以需要选择JATG。更改如下
<img src="picture2.png" alt="picture2" style="zoom:67%;" />
更改该选项之后,成功烧录程序。
**加载一位翘板开关工程Rocker_Switch工程**
点击工具栏的红叉退出调试拔掉下载EnOcean_Sniffe程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载1.4Rocker_Switch工程。
## 5.4. 步骤四 安装USB Serial Port
将下载EnOcean Sniffer程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电和传输数据。
在这里我们再次遇到了问题。
用一根micro USB线将OURS_EnOcean模块和PC机相连后PC机并没有如实验指导书所述弹出驱动安装提示窗口。且在设备管理器中可以看到PC机没有正确识别OURS_EnOcean设备如下图所示
<img src="picture3.png" alt="picture3" style="zoom:67%;" />
我们在网上查找新版本的设备驱动程序。将驱动程序版本从“TivaWare_C_Series-2.1.4.178”升级到了“TivaWare_C_Series-2.2.0.295”。在设备管理器右键设备->点击“属性”->点击“驱动程序”->点击“更新驱动程序”->点击“浏览我的电脑以查找驱动程序”->点击“浏览”->选择新驱动的安装目录->点击“确定”即可让PC机更新驱动。现在PC机能正确识别OURS_EnOcean设备了
<img src="picture4.png" alt="picture4" style="zoom:67%;" />
## 5.5. 步骤五 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Rocker_Switch工程的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Rocker_Switch工程的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
# 6. 实验结果
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S4键数据包的Data为00按下S3键数据包的Data为10。
<img src="picture5.png" alt="picture5" style="zoom:67%;" />
在这个过程中我们将烧有Rocker_Switch工程的OURS-EnOcean模块脱离连接着Sniffer的PC机使用手机充电器供电也能在Sniffer上接收到Rocker_Switch的数据包这验证了数据包是无线传输的。
# 7. 实验感想
在Sniffer实验中我们通过串口抓取了EnOcean无线模块之间的通信数据包并在DolphinView可视化软件中查看。这帮助我们理解和掌握了Sniffer嗅探器的工作原理。同时阅读Sniffer源码也加深了我们对EnOcean通信协议和TM4C单片机串口通信的理解。
在实验过程中,我们学习到了解决实验问题的方法。当遇到困难时,我们会小组讨论分析问题原因,充分利用网络资源查阅相关资料,在助教的帮助下最终找到解决办法。这种经验对我们今后独立分析和解决问题具有重要的启示意义。
本次实验采用小组合作形式。通过分工协作,不仅提高了工作效率,也培养了我们的团队协作能力。今后我们会继续提升合作中各成员的配合水平。

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,580 @@
![cover](cover.png)
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验一二三的操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# **实验四** EnOcean门卡实验
## 4.1. 实验目的
学习易能森门卡Profile模拟一个门卡监测设备发送数据使用Sniffer进行抓包。
## 4.2. 工具/原料
- 计算机Windows操作系统
- IAR FOR ARM 7.20安装包
- TI-TM4C-SDK工具包
- DolphinView安装包
- J-link安装包
- 调试单板模块(转接板)一个
## 4.3. 预备知识
1. 门卡实验是通过记录是否刷卡,可以用于门禁卡的应用;
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. 利用DolphinView 可以实现是否刷门卡的检测。
## 4.4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
// CardStatus: 当卡插入时传参为0x70; 当卡拔出时传参为0x00
// main函数中会循环调用这个函数发送门卡状态且通过标志变量在每次门卡状态变化之后只发送1次
uint8_t SendCardStatus(uint8_t CardStatus) {
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0表示开始传输数据
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
EnOceanTelegramBuf[datalen++] = CardStatus; // 卡片状态
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送情况FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别0表示电报未加密
// 计算并设置数据包的校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否符合预期
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
## 4.5. 实验步骤
### 4.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 4.5.2. 步骤二 加载工程文件
加载Key_Card工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.3Key_Card\IAR_Files”目录下的“Key_Card.eww”工程文件点击“打开”。
### 4.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Key_Card程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
### 4.5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Key_Card程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Key_Card程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 4.6. 实验结果
按下烧有Key_Card工程的OURS-EnOcean模块的S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
按下S4键模拟门卡插入发送数据包的Data为0x70松开S4键模拟门卡拔出发送数据包的Data为0x00。所以按一次S4按钮DolphinView窗口会显示收到两个数据包。
<img src="p1.png" alt="p1" style="zoom:67%;" />
## 4.7. 实验感想
通过这次门卡状态检测实验我们进一步理解和掌握了EnOcean无线通信模块的使用。我们模拟门卡插入和拔出的状态按照EnOcean协议格式组装数据并无线发送。同时模拟了一个门卡监测设备使用Sniffer进行抓包并在Sniffer端成功捕获了发送的门卡状态数据包验证了无线传输的正确性。这样可以监测和分析EnOcean门卡的通信数据。通过分析抓包数据我们可以了解门卡的工作状态、通信协议以及与其他设备的交互过程。这对于门卡系统的优化和故障排查非常有帮助。通过这个实验我们对EnOcean技术有了更深入的了解。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,我们提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应未来更复杂的系统开发任务。
# 实验五 易能森开关控制实验
## 5.1. 实验目的
学习易能森开关控制Profile模拟一个开关发送开关指令使用Sniffer抓包。
## 5.2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 5.3. 预备知识
1. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
2. 利用DolphinView 可以实现对于翘板开关打开关闭的检测。
## 5.4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
// SwitchStatus: 当开关打开时传参为0x10; 当开关关闭时传参为0x00
// main函数中会循环调用这个函数发送开关状态且通过标志变量在每次开关状态变化之后只发送1次
uint8_t SendSwitchStatus(uint8_t SwitchStatus) {
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0表示开始传输数据
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
EnOceanTelegramBuf[datalen++] = SwitchStatus; // 开关状态0表示关闭1表示打开
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送情况FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别0表示电报未加密
// 计算并设置数据包的校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否符合预期
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
## 5.5. 实验步骤
### 5.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 5.5.2. 步骤二 加载工程文件
加载Rocker_Switch工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.4Rocker_Switch\IAR_Files”目录下的“Rocker_Switch.eww”工程文件点击“打开”。
### 5.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Rocker_Switch程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
### 5.5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Rocker_Switch程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Rocker_Switch程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 5.6. 实验结果
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
按下S3键表示关闭开关发送数据包的Data为固定值00按下S4键表示打开开关发送数据包的Data为固定值10。
<img src="p2.png" alt="p2" style="zoom:67%;" />
## 5.7. 实验感想
通过这次开关状态检测实验我们进一步掌握了EnOcean无线通信模块的使用方法。我们学习了如何模拟开关的打开和关闭状态,按照EnOcean协议要求组装无线数据包。在Sniffer端成功捕获了发送的开关状态数据验证了无线传输的正确性。
这个实验让我们意识到,在物联网时代,各种智能设备之间的通信变得越来越重要。了解和掌握设备的通信协议和控制方式,可以帮助我们更好地理解和应用这些智能设备。这对于我今后在物联网领域的学习和研究将会非常有帮助。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应更复杂的系统开发。
# 实验六 易能森照明控制实验
## 6.1. 实验目的
学习通过开关控制Profile发送控制指令控制另一个设备上的LED实现模拟照明控制。
## 6.2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 6.3. 预备知识
1. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
2. 与EnOcean一位翘板开关结合以实现智能控制LED灯的目的。
## 6.4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
int main(void) {
// 启用延迟堆栈,允许在中断处理程序中使用浮点指令,但会增加额外的堆栈使用。
ROM_FPULazyStackingEnable();
// 设置时钟运行在50MHz的PLL模式下
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
// 启用系统滴答定时器
ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICK_PERIOD_MS - 1);
ROM_SysTickIntEnable();
ROM_SysTickEnable();
// 启用用于板载LED的GPIO端口
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_4);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
// 启用用于其他设备的GPIO端口
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7);
ROM_GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7);
// 启用处理器中断
ROM_IntMasterEnable();
// 初始化EEPROM
HW_Initeeprom();
// 初始化定时器0A
Timer0AInit();
// 初始化EnOcean UART
EnOcean_uart_Init();
// 初始化按键
InitKey();
// 初始化TCM310F设备
InitTCM310F();
while (1) {
// 处理LightLRNFlags标志该标志用于表示系统正在学习中
if (LightLRNFlags) {
// 启用定时器和禁用过滤器
ROM_TimerEnable(TIMER0_BASE, TIMER_A);
FilterEnable(0);
// 在LightLRNFlags标志被清除前持续处理EnOcean数据包
while (LightLRNFlags) {
// 处理EnOcean数据包的接收标志EnOceanTelegramRxflags
if (EnOceanTelegramRxflags) {
// 关闭LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
// 复制接收到的EnOcean数据包到缓冲区
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
EnOceanRxCount = 0;
EnOceanTelegramRxflags = 0; // 清除接收标志
// 检查数据包的CRC校验和和数据包类型
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
// 计算数据包的总长度
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
// 检查数据包的尾部CRC校验和
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
// 检查数据包类型是否为EN_DEVICE_RORG
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
// 提取设备ID
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
// 检查设备ID是否需要被控制
if (PollControlDeviceID(DeviceID)) {
// 存储控制的设备ID然后切换灯的状态
ControlDeviceIDMsg.ControlDeviceID[ControlDeviceIDMsg.ControlDeviceIDNum % 32] = DeviceID;
ControlDeviceIDMsg.ControlDeviceIDNum += 1;
Light_Toggle(); // 切换灯的状态(开关)
}
}
}
}
// 打开LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
}
}
}
// 处理LightExitLRNFlags标志该标志用于表示系统学习结束
if (LightExitLRNFlags) {
// 禁用定时器、重置学习计时器、清除学习标志
ROM_TimerDisable(TIMER0_BASE, TIMER_A);
LRNTimeCount = 0;
LightLRNFlags = 0;
// 将控制设备ID的信息存储到EEPROM中
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
SetControlDevice(); // 设置控制设备
// 启用过滤器并关闭灯
FilterEnable(1);
Light_OFF(); // 关闭灯
LightExitLRNFlags = 0;
}
// 处理LightCLRFlags标志该标志用于表示需要清除控制设备ID的信息
if (LightCLRFlags) {
// 删除所有过滤器并启用新的过滤器
FilterDelAll();
FilterEnable(1);
// 清除控制设备ID的信息
ControlDeviceIDMsg.ControlDeviceIDNum = 0;
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
LightCLRFlags = 0;
}
// 处理EnOcean数据包
if (EnOceanTelegramRxflags) {
// 关闭LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
// 复制接收到的数据包到缓冲区
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
EnOceanRxCount = 0;
EnOceanTelegramRxflags = 0; // 清除接收标志
// 检查数据包的CRC校验和和数据包类型
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
// 计算数据包的总长度
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
// 检查数据包的尾部CRC校验和
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
// 检查数据包类型是否为EN_DEVICE_RORG
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
// 提取设备ID
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
// 检查设备ID是否需要被控制
if (!PollControlDeviceID(DeviceID)) {
// 提取数据包的信息,控制灯的状态
uint8_t data = EnOceanTelegramBuf[FIRST_DATA_SEQ + 1] & 0xf0;
if (data == 0x10 || data == 0x50) {
Light_ON(); // 打开灯
}
else if (data == 0x30 || data == 0x70) {
Light_OFF(); // 关闭灯
}
}
}
}
}
// 打开LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
}
}
}
```
主要实现的功能是:
- **学习模式**不断从接收到的数据包中提取设备ID然后将其存储到EEPROM中。
- **工作模式**不断从接收到的数据包中提取设备ID然后在EEPROM中检索设备ID如果检索到则亮灯。
## 6.5. 实验步骤
### 6.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 6.5.2. 步骤二 加载工程文件
加载Light_Control工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.5Light_Control\IAR_Files”目录下的“Light_Control.eww”工程文件点击“打开”。
### 6.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Light_Control程序的OURS-EnOcean模块电源用同样的方法向另外两块OURS-EnOcean模块加载Rocker_Switch工程。
### 6.5.4. 步骤四 实验结果
1. 长按Light_Control模块的S4按键至左上角LED灯闪烁一下清除EEPROM缓存的设备ID
1. 长按Light_Control模块的S3按键至右上角LED灯不断闪烁进入学习模式
1. 按下Rocker_Switch模块的S3按键向Light_Control模块发送数据包
1. 按一下Light_Control模块的S3按键结束学习模式进入工作模式
1. 按下Rocker_Switch模块的S3按键Light_Control模块右上角的LED会点亮按下Rocker_Switch模块的S4按键Light_Control模块右上角的LED会熄灭。
<img src="p3.jpg" alt="p3" style="zoom: 33%;" />
## 6.6. 实验结果
Light_Control模块学习到了收到的数据包的设备ID。
进入工作模式后再次接收到记录的设备ID的数据包后能够辨认该设备并且点亮/熄灭LED灯。
<img src="p4.jpg" alt="p4" style="zoom:33%;" />
## 6.7. 实验感想
通过这次灯光控制实验我们掌握了EnOcean无线通信的学习和控制模式。我们实现了存储控制设备ID并据此点亮和熄灭灯光。在Sniffer端成功捕获了整个过程的无线数据包验证了系统的正确运行。
在阅读代码时我们学习到了如何实现EnOcean设备的双向通信、数据存储和控制。这为我们后续开发基于EnOcean的智能照明控制系统奠定了基础。在配置和调用TM4C单片机外设的过程中进一步加深了对单片机编程的理解。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

View File

@ -0,0 +1,191 @@
![cover](cover.png)
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :--------------------------------------------- |
| 柯劲帆 | 21281280 | 详细解读实验代码,规划实验目的,撰写实验报告。 |
| 李桦炅 | 21281282 | 共同完成实验具体操作部分。 |
| 王子励 | 21281292 | 共同完成实验具体操作部分。 |
| 李志民 | 20281146 | 对实验过程中遇到的问题与实验结果进行记录。 |
# 实验五 易能森开关控制实验
## 1. 实验目的
学习易能森开关控制Profile模拟一个开关发送开关指令使用Sniffer抓包。
## 2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 3. 预备知识
1. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
2. 利用DolphinView 可以实现对于翘板开关打开关闭的检测。
## 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
// SwitchStatus: 当开关打开时传参为0x10; 当开关关闭时传参为0x00
// main函数中会循环调用这个函数发送开关状态且通过标志变量在每次开关状态变化之后只发送1次
uint8_t SendSwitchStatus(uint8_t SwitchStatus) {
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0表示开始传输数据
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
EnOceanTelegramBuf[datalen++] = SwitchStatus; // 开关状态0表示关闭1表示打开
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送情况FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别0表示电报未加密
// 计算并设置数据包的校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否符合预期
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
## 5. 实验步骤
### 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 5.2. 步骤二 加载工程文件
加载Rocker_Switch工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.4Rocker_Switch\IAR_Files”目录下的“Rocker_Switch.eww”工程文件点击“打开”。
### 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Rocker_Switch程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
### 5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Rocker_Switch程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Rocker_Switch程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 6. 实验结果
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
按下S3键表示关闭开关发送数据包的Data为固定值00按下S4键表示打开开关发送数据包的Data为固定值10。
<img src="p2.png" alt="p2" style="zoom:67%;" />
## 7. 实验感想
通过这次开关状态检测实验我们进一步掌握了EnOcean无线通信模块的使用方法。我们学习了如何模拟开关的打开和关闭状态,按照EnOcean协议要求组装无线数据包。在Sniffer端成功捕获了发送的开关状态数据验证了无线传输的正确性。
这个实验让我们意识到,在物联网时代,各种智能设备之间的通信变得越来越重要。了解和掌握设备的通信协议和控制方式,可以帮助我们更好地理解和应用这些智能设备。这对于我今后在物联网领域的学习和研究将会非常有帮助。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。我们会在今后的项目中,继续提升团队协作能力,以适应更复杂的系统开发。

View File

@ -0,0 +1,309 @@
![cover](cover.png)
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 详细解读了实验文件代码,具体分析了实验的含义与功能,分析了代码实现的功能对现实的映射,对实验的具体问题如信号的含义,模块的学习方式进行了分析与测试,并撰写实验报告的主要部分。 |
| 李桦炅 | 21281282 | 完成实验的具体操作部分,协助分析模块的学习方式,通过对不同操作方式进行测试分析模块学习的具体方式。 |
| 王子励 | 21281292 | 协助了实验操作与实验报告撰写,并协助进行二者之间的沟通,分析实验需求。 |
| 李志民 | 20281146 | 对实验过程中发现的问题与实验结果进行记录,并对实验内容进行总结,协助撰写实验报告。 |
# 实验六 易能森照明控制实验
## 1. 实验目的
学习通过开关控制Profile发送控制指令控制另一个设备上的LED实现模拟照明控制。
## 2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 3. 预备知识
1. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
2. 与EnOcean一位翘板开关结合以实现智能控制LED灯的目的。
## 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
int main(void) {
// 启用延迟堆栈,允许在中断处理程序中使用浮点指令,但会增加额外的堆栈使用。
ROM_FPULazyStackingEnable();
// 设置时钟运行在50MHz的PLL模式下
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
// 启用系统滴答定时器
ROM_SysTickPeriodSet(ROM_SysCtlClockGet() / SYSTICK_PERIOD_MS - 1);
ROM_SysTickIntEnable();
ROM_SysTickEnable();
// 启用用于板载LED的GPIO端口
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_4);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
// 启用用于其他设备的GPIO端口
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_7);
ROM_GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7);
// 启用处理器中断
ROM_IntMasterEnable();
// 初始化EEPROM
HW_Initeeprom();
// 初始化定时器0A
Timer0AInit();
// 初始化EnOcean UART
EnOcean_uart_Init();
// 初始化按键
InitKey();
// 初始化TCM310F设备
InitTCM310F();
while (1) {
// 处理LightLRNFlags标志该标志用于表示系统正在学习中
if (LightLRNFlags) {
// 启用定时器和禁用过滤器
ROM_TimerEnable(TIMER0_BASE, TIMER_A);
FilterEnable(0);
// 在LightLRNFlags标志被清除前持续处理EnOcean数据包
while (LightLRNFlags) {
// 处理EnOcean数据包的接收标志EnOceanTelegramRxflags
if (EnOceanTelegramRxflags) {
// 关闭LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
// 复制接收到的EnOcean数据包到缓冲区
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
EnOceanRxCount = 0;
EnOceanTelegramRxflags = 0; // 清除接收标志
// 检查数据包的CRC校验和和数据包类型
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
// 计算数据包的总长度
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
// 检查数据包的尾部CRC校验和
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
// 检查数据包类型是否为EN_DEVICE_RORG
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
// 提取设备ID
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
// 检查设备ID是否需要被控制
if (PollControlDeviceID(DeviceID)) {
// 存储控制的设备ID然后切换灯的状态
ControlDeviceIDMsg.ControlDeviceID[ControlDeviceIDMsg.ControlDeviceIDNum % 32] = DeviceID;
ControlDeviceIDMsg.ControlDeviceIDNum += 1;
Light_Toggle(); // 切换灯的状态(开关)
}
}
}
}
// 打开LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
}
}
}
// 处理LightExitLRNFlags标志该标志用于表示系统学习结束
if (LightExitLRNFlags) {
// 禁用定时器、重置学习计时器、清除学习标志
ROM_TimerDisable(TIMER0_BASE, TIMER_A);
LRNTimeCount = 0;
LightLRNFlags = 0;
// 将控制设备ID的信息存储到EEPROM中
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
SetControlDevice(); // 设置控制设备
// 启用过滤器并关闭灯
FilterEnable(1);
Light_OFF(); // 关闭灯
LightExitLRNFlags = 0;
}
// 处理LightCLRFlags标志该标志用于表示需要清除控制设备ID的信息
if (LightCLRFlags) {
// 删除所有过滤器并启用新的过滤器
FilterDelAll();
FilterEnable(1);
// 清除控制设备ID的信息
ControlDeviceIDMsg.ControlDeviceIDNum = 0;
ROM_EEPROMProgram((uint32_t*)&ControlDeviceIDMsg, EEPROM_FLAGS_ADDR, sizeof(ControlDeviceIDMsg));
LightCLRFlags = 0;
}
// 处理EnOcean数据包
if (EnOceanTelegramRxflags) {
// 关闭LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
// 复制接收到的数据包到缓冲区
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount);
EnOceanRxCount = 0;
EnOceanTelegramRxflags = 0; // 清除接收标志
// 检查数据包的CRC校验和和数据包类型
if (EnOceanTelegramBuf[HEADER_CRC8_SEQ] == GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN) &&
EnOceanTelegramBuf[PACKET_TYPE_SEQ] == PACKET_TYPES_RADIO) {
// 计算数据包的总长度
uint16_t datalen = (EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] << 8) + EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] + EnOceanTelegramBuf[OPTION_LENGTH_SEQ];
// 检查数据包的尾部CRC校验和
if (EnOceanTelegramBuf[BASE_PACKET_LEN + datalen - 1] == GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen)) {
// 检查数据包类型是否为EN_DEVICE_RORG
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == EN_DEVICE_RORG) {
// 提取设备ID
uint32_t DeviceID = (EnOceanTelegramBuf[FIRST_DATA_SEQ + 2] << 24) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 3] << 16) +
(EnOceanTelegramBuf[FIRST_DATA_SEQ + 4] << 8) +
EnOceanTelegramBuf[FIRST_DATA_SEQ + 5];
// 检查设备ID是否需要被控制
if (!PollControlDeviceID(DeviceID)) {
// 提取数据包的信息,控制灯的状态
uint8_t data = EnOceanTelegramBuf[FIRST_DATA_SEQ + 1] & 0xf0;
if (data == 0x10 || data == 0x50) {
Light_ON(); // 打开灯
}
else if (data == 0x30 || data == 0x70) {
Light_OFF(); // 关闭灯
}
}
}
}
}
// 打开LED指示灯
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4);
}
}
}
```
主要实现的功能是:
- **学习模式**不断从接收到的数据包中提取设备ID然后将其存储到EEPROM中。
- **工作模式**不断从接收到的数据包中提取设备ID然后在EEPROM中检索设备ID如果检索到则亮灯。
## 5. 实验步骤
### 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 5.2. 步骤二 加载工程文件
加载Light_Control工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.5Light_Control\IAR_Files”目录下的“Light_Control.eww”工程文件点击“打开”。
### 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Light_Control程序的OURS-EnOcean模块电源用同样的方法向另外两块OURS-EnOcean模块加载Rocker_Switch工程。
### 5.4. 步骤四 实验结果
1. 长按Light_Control模块的S4按键至左上角LED灯闪烁一下清除EEPROM缓存的设备ID
1. 长按Light_Control模块的S3按键至右上角LED灯不断闪烁进入学习模式
1. 按下Rocker_Switch模块的S3按键向Light_Control模块发送数据包
1. 按一下Light_Control模块的S3按键结束学习模式进入工作模式
1. 按下Rocker_Switch模块的S3按键Light_Control模块右上角的LED会点亮按下Rocker_Switch模块的S4按键Light_Control模块右上角的LED会熄灭。
<img src="p3.jpg" alt="p3" style="zoom: 33%;" />
## 6. 实验结果
Light_Control模块学习到了收到的数据包的设备ID。
进入工作模式后再次接收到记录的设备ID的数据包后能够辨认该设备并且点亮/熄灭LED灯。
<img src="p4.jpg" alt="p4" style="zoom:33%;" />
## 7. 实验感想
通过这次灯光控制实验我们掌握了EnOcean无线通信的学习和控制模式。我们实现了存储控制设备ID并据此点亮和熄灭灯光。在Sniffer端成功捕获了整个过程的无线数据包验证了系统的正确运行。
在阅读代码时我们学习到了如何实现EnOcean设备的双向通信、数据存储和控制。这为我们后续开发基于EnOcean的智能照明控制系统奠定了基础。在配置和调用TM4C单片机外设的过程中进一步加深了对单片机编程的理解。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,提高了实验效率。

View File

@ -0,0 +1,185 @@
![cover](cover.png)
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 详细解读实验代码,分析信号中不同数据对应的含义,撰写实验报告。 |
| 李桦炅 | 21281282 | 完成实验的具体操作部分,协助分析数据含义。 |
| 王子励 | 21281292 | 协助实验操作与报告撰写工作,并协助二者间的沟通。 |
| 李志民 | 20281146 | 对实验过程中遇到的问题与实验结果进行记录,并协助完成报告和总结。 |
# 实验四 EnOcean门卡实验
## 1. 实验目的
学习易能森门卡Profile模拟一个门卡监测设备发送数据使用Sniffer进行抓包。
## 2. 工具/原料
- 计算机Windows操作系统
- IAR FOR ARM 7.20安装包
- TI-TM4C-SDK工具包
- DolphinView安装包
- J-link安装包
- 调试单板模块(转接板)一个
## 3. 预备知识
1. 门卡实验是通过记录是否刷卡,可以用于门禁卡的应用;
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. 利用DolphinView 可以实现是否刷门卡的检测。
## 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
// CardStatus: 当卡插入时传参为0x70; 当卡拔出时传参为0x00
// main函数中会循环调用这个函数发送门卡状态且通过标志变量在每次门卡状态变化之后只发送1次
uint8_t SendCardStatus(uint8_t CardStatus) {
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0表示开始传输数据
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x07; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验和
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备RORG
EnOceanTelegramBuf[datalen++] = CardStatus; // 卡片状态
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0xA0; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送情况FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别0表示电报未加密
// 计算并设置数据包的校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否符合预期
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
## 5. 实验步骤
### 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 5.2. 步骤二 加载工程文件
加载Key_Card工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.3Key_Card\IAR_Files”目录下的“Key_Card.eww”工程文件点击“打开”。
### 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Key_Card程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
### 5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Key_Card程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Key_Card程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 6. 实验结果
按下烧有Key_Card工程的OURS-EnOcean模块的S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。
按下S4键模拟门卡插入发送数据包的Data为0x70松开S4键模拟门卡拔出发送数据包的Data为0x00。所以按一次S4按钮DolphinView窗口会显示收到两个数据包。
<img src="p1.png" alt="p1" style="zoom:67%;" />
## 7. 实验感想
通过这次门卡状态检测实验我们进一步理解和掌握了EnOcean无线通信模块的使用。我们模拟门卡插入和拔出的状态按照EnOcean协议格式组装数据并无线发送。同时模拟了一个门卡监测设备使用Sniffer进行抓包并在Sniffer端成功捕获了发送的门卡状态数据包验证了无线传输的正确性。这样可以监测和分析EnOcean门卡的通信数据。通过分析抓包数据我们可以了解门卡的工作状态、通信协议以及与其他设备的交互过程。这对于门卡系统的优化和故障排查非常有帮助。通过这个实验我们对EnOcean技术有了更深入的了解。
本次实验我们小组分工明确,合作顺畅。通过合理的分工,我们提高了实验效率。

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@ -0,0 +1,405 @@
<img src="222.png" alt="cover" style="zoom: 150%;" />
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 负责实验代码的解读,分析了代码的整体思想与运行流程,设计了最后的展示成果。 |
| 李桦炅 | 21281282 | 协助进行实验代码解读分析了LCD屏幕显示图像的代码格式。 |
| 王子励 | 21281292 | 撰写实验报告,与小组成员积极沟通,记录实验进程。 |
| 李志民 | 20281146 | 参与报告撰写,记录实验当中遇到的问题并总结。 |
# 实验一 LCD控制实验
## 1. 实验目的
简易的GUI的相关函数的使用LCD的点阵的原理和应用。通过LCD的控制实验学会利用LCD显示数字、英文和中文并在后续实验中使用LCD显示从传感节点得到的部分数据。
## 2. 工具/原料
- 装有IAR的PC机一台
- 2530仿真器,USB线(A型转B型)
- 无线节点模块,带LCD的智能主板。
## 3. 预备知识
1. 在S012864FPD-14ASBE(3S)点阵图形液晶模块(ST7565P)驱动程序的基础上学习一个简易的GUI(图形用户接口),如画点,线,矩形,矩形填充,显示一幅128*64的图画以及汉字显示等。其中IO分配为
| SCL | SID | A0 | CSn | RESETn |
| ---- | ---- | ---- | ---- | ------ |
| P1.5 | P1.6 | P1.7 | P1.4 | P2.0 |
2. 128\*64点阵型LCD简介
128\*64是一种图形点阵液晶显示器它主要由行驱动器/列驱动器及128\*64全点阵液晶显示器组成。可完成图形显示,也可以显示8\*4个(16\*16点阵)汉字。所谓128\*64全点阵就是有128\*64个点组成当给相应的点通高电平(即1)时点变亮,通低电平(即0)时点不亮。显示汉字也是一样的道理通过对16\*16点阵的设计得到对应汉字。
3. 该实验程序主要分为3部分第一部分为LCM的几个函数主要实现的是对LCD显示的初始化对于硬件编程很重要有兴趣的同学可以了解下这里不作为重点。第二部分为GUI的一系列函数是本次实验的重点主要实现画点、线、矩形、矩形填充显示字等显示功能。前两部分程序都在LCD.c程序中。第三部分是GUIDemo.c主要包含主函数和一些点阵显示内容的定义以及change清屏函数。
## 4. 核心代码
### 4.1. GUI_Init()
在该函数中,首先调用了`LCM_Init()`
1. 设置IO需要的引脚的方向为输出
2. 设置`P2_0`为低电平等待一会儿后再置为高电平这里猜测是在操作LED指示灯
3. 向开发板发送命令开启LCD显示
4. 向开发板发送命令,设置其他参数
然后调用`GUI_ClearScreen()`向缓冲区全写0最后调用`LCM_Refresh()`输出缓冲区内容。
(限于篇幅,这里不贴源代码)
### 4.2. GUI_SetColor()
```c
void GUI_SetColor(UINT8 color1, UINT8 color2)
{
GUI_CopyColor(&disp_color, color1); // 设置显示色
GUI_CopyColor(&back_color, color2); // 设置背景色
}
```
实现了显示色和背景色的设置。
### 4.3. GUI_LoadBitmap()
此函数和`GUI_PutHZ()`的实现是一样的。
```c
void GUI_LoadBitmap(UINT8 x, UINT8 y, UINT8 *dat, UINT8 hno, UINT8 lno)
{
UINT8 i;
for(i=0; i<lno; i++)
{
GUI_LoadLine(x, y, dat, hno); // 输出一行数据
y++; // 显示下一行
dat += (hno>>3); // 计算下一行的数据
if( (hno&0x07)!=0 ) dat++;
}
}
```
这个函数实现了循环调用`GUI_LoadLine()`显示`dat`图像中的每一行。
跟踪`GUI_LoadLine()`
```c
UINT8 GUI_LoadLine(UINT8 x, UINT8 y, UINT8 *dat, UINT8 no)
{
UINT8 bit_dat;
UINT8 i;
UINT8 bakc;
/* 参数过滤 */
/*===========================================================================*/
if(x>=128) return(0); // x坐标越界返回0
if(y>=64) return(0); // y坐标越界返回0
/*===========================================================================*/
for(i=0; i<no; i++)
{
/* 判断是否要读取点阵数据 */
if( (i%8)==0 ) bit_dat = *dat++;
/* 设置相应的点为color或为back_color */
if( (bit_dat&DCB2HEX_TAB[i&0x07])==0 ) GUI_CopyColor(&bakc, back_color);
else GUI_CopyColor(&bakc, disp_color);
GUI_Point(x, y, bakc);
if( (++x)>=128 ) return(0);
}
return(1);
}
```
这个函数执行以下逻辑:
1. 判断要显示的内容坐标有没有越过LCD显示屏的边界
2. 如果`(i%8)==0`读取下一个8位
3. 使用位屏蔽码读取当前8位中的每一位如果为0则用背景色打印在LCD上否则用显示色打印在LCD上
4. 判断要显示的内容坐标有没有越过LCD显示屏的边界
5. 跳转回2继续循环直至打印完毕。
跟踪`GUI_Point()`
```c
UINT8 GUI_Point(UINT8 x, UINT8 y, UINT8 color)
{
UINT8 bak;
if(x>=128) return(0); if(y>=64) return(0); // 参数判断出错返回0
//x=x+4;
/* 设置指定点为1或0 */
/*===========================================================================================*/
bak = ReadByteFromDisplayBuffer(x,y); // 从显示缓冲区读取指定点的1字节数据
if(0==color) // 若让该点灭
{
bak &= (~DEC_HEX_TAB[y&0x07]); // 该点对应的位复位而其他7位不变
}
else // 若让该点亮
{
bak |= DEC_HEX_TAB[y&0x07]; // 该点对应的位置位而其他7位不变
}
WriteByteToDisplayBuffer(x, y, bak); // 向LCM12864指定点对应的显示缓冲区写一字节数据
/*===========================================================================================*/
return(1); // 操作成功返回1
}
```
这个函数执行以下逻辑:
1. 判断要显示的点坐标有没有越过LCD显示屏的边界
2. 读取该点原来的信息;
3. 通过参数color使用与或操作将该点置为亮或灭
4. 将修改后的该点信息写入缓冲区。
### 4.4. GUI_Rectangle()
```c
void GUI_Rectangle(UINT8 x0, UINT8 y0, UINT8 x1, UINT8 y1, UINT8 color)
{
GUI_HLine(x0, y0, x1, color);
GUI_HLine(x0, y1, x1, color);
GUI_RLine(x0, y0, y1, color);
GUI_RLine(x1, y0, y1, color);
}
```
即画出4条边横边用`GUI_HLine()`,竖边用`GUI_RLine()`
跟踪`GUI_HLine()`
```c
void GUI_HLine(UINT8 x0, UINT8 y0, UINT8 x1, UINT8 color)
{
UINT8 bak;
if(x0>x1) {bak = x1;x1 = x0; x0 = bak;} // 对x0、x1大小进行排列以便画图
/* 逐点显示,描出水平线 */
/*==========================*/
do
{
GUI_Point(x0, y0, color);
x0++;
}while(x1>=x0);
/*==========================*/
}
```
实际上就是在循环向缓冲区写入线上的点,`GUI_RLine()`也如此,就不再赘述了。
同理,`GUI_RectangleFill()`就是在画出矩形边框的基础上在中间空白区域用`GUI_HLine()``GUI_RLine()`填充线。
### 4.5. 自主设计的main()函数
```c
void main(void) {
UINT8 i;
GUI_Init(); // GUI初始化
GUI_SetColor(1, 0); // 显示色为亮点,背景色为暗点
while (1) {
GUI_PutHZ(8, 0, (UINT8*)YUANSHEN, 80, 64);
LCM_Refresh(); // 将显示缓冲区中的数据刷新到SO12864FPD-13ASBE(3S)上显示
halWait(200);
GUI_PutHZ(88, 24, (UINT8*)QIDONG, 48, 16);
LCM_Refresh();
change(); // 延时大约2秒后清屏
}
}
```
其中,`YUANSHEN`是一副图像的Bitmap`QIDONG`是三个汉字字符“启动”的Bitmap但实际上这两个变量的实质都是将要显示的内容m*n个像素点中要点亮的设置为1相反则设置为0转换成16进制数存储如下图所示
![p2](p2.png)
<img src="p3.png" alt="p3" style="zoom:40%;" />
代码中使用的两个Bitmap见附录。
## 5. 实验步骤
1. 步骤一给智能主板供电。
2. 步骤二 将一个无线节点模块插入到带LCD智能主板的相应位置。
3. 步骤三 将`CC2350`仿真器的一端通过USB线连接到PC机另一端通过10Pin下载线连接到智能主板的`CC2350`JTAG口。
4. 将智能主板上电源开关拨动开位置,按下仿真器的按钮,仿真器上的指示灯为绿色时,表示连接成功。
5. 仔细分析工程中已有的函数,搞清功能后完成自己的程序,实现显示汉字功能。
6. 通过线上工具将图片或者汉字转换为LCD编码后直接加入代码后在LCD板上完成显示。
## 6. 实验结果
在LCD板上显示自己喜欢的图样并且加入了两幅图像间的显示延迟不再是单一的汉字显示更像是艺术字也属于我们将热爱与实验结合的表现。
<img src="111.jpg" alt="cover" style="zoom:33%;" />
## 7. 实验感想
本次LCD控制实验让我们对LCD的显示原理有了更深入的了解。通过学习GUI相关的函数`GUI_Init()``GUI_SetColor()``GUI_LoadBitmap()`我们理解了LCD的显示是通过逐点控制来实现的。另外需要将要显示的内容先转换为点阵表示的Bitmap然后再逐行扫描输出到LCD上这样的显示流程很有启发意义。
在编写`main()`函数时我们尝试将一副图片和几个汉字字符转换为Bitmap数据并加载显示出来。这个过程让我体会到了将设计转换为代码的乐趣。通过添加必要的延时实现了一个循环显示、切换效果使展示更丰富。
总体来说通过这个实验我们对LCD显示的软硬件原理有了更直观的了解也锻炼了独立设计并实现的能力。这是一次收获颇丰的实验。
## 8. 附录
`YUANSHEN`Bitmap
```c
UINT8 YUANSHEN[] =
{
/*-- 宽x高=80x64 --*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xf0, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xf0, 0x00,
0x00, 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0xf0, 0x00,
0x00, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0xf8, 0x00,
0x03, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x03, 0xfc, 0x00,
0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0x00,
0x07, 0xf8, 0x00, 0xc0, 0x00, 0x3f, 0x80, 0x07, 0xfe, 0x00,
0x03, 0xf0, 0x01, 0xe0, 0x00, 0x0f, 0x00, 0x01, 0xf8, 0x00,
0x03, 0xf0, 0x01, 0xe0, 0x00, 0x06, 0x40, 0x00, 0xe0, 0x00,
0x01, 0xf3, 0x01, 0xe0, 0xc0, 0x04, 0xe3, 0x80, 0xe0, 0x70,
0x01, 0xf3, 0xe1, 0xc3, 0xf0, 0x05, 0xf3, 0xe0, 0x61, 0xfc,
0x01, 0xf3, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xfe,
0x01, 0xf3, 0xe0, 0x01, 0xf0, 0x0f, 0xfb, 0xf0, 0x60, 0xfc,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0xfb, 0xf0, 0xe0, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x03, 0xf1, 0xf0, 0xf8,
0x01, 0xf3, 0xff, 0xf9, 0xf1, 0xcf, 0x03, 0xf3, 0xf8, 0xf8,
0x01, 0xf3, 0xf7, 0xf1, 0xf1, 0xcf, 0x7b, 0xff, 0xff, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x7b, 0xff, 0xff, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x7b, 0xf3, 0xf8, 0xf8,
0x01, 0xf3, 0xe0, 0x01, 0xf1, 0xcf, 0x7b, 0xf1, 0xf0, 0xf8,
0x01, 0xf3, 0xff, 0xff, 0xf1, 0xcf, 0x7b, 0xf0, 0xe0, 0xf8,
0x01, 0xf3, 0xc3, 0xf1, 0xf1, 0xcf, 0x7b, 0xf0, 0x60, 0xf8,
0x03, 0xf3, 0x83, 0xf1, 0xc1, 0xcf, 0x7b, 0xff, 0xff, 0xf8,
0x03, 0xe0, 0x03, 0xf0, 0x01, 0xcf, 0x73, 0xf0, 0x61, 0xf8,
0x03, 0xe0, 0xe3, 0xf1, 0xc1, 0xcf, 0x63, 0xe0, 0x60, 0xf8,
0x03, 0xc7, 0xe3, 0xf3, 0xf9, 0xcf, 0x43, 0xc0, 0xe0, 0x78,
0x07, 0x9f, 0xfb, 0xf7, 0xff, 0xcf, 0x03, 0x81, 0xf0, 0x18,
0x07, 0xbf, 0xfb, 0xf7, 0xff, 0x8f, 0x00, 0x07, 0xfc, 0x00,
0x0f, 0x3f, 0x03, 0xf0, 0x3f, 0x8f, 0x00, 0x1f, 0xff, 0x00,
0x1c, 0x3c, 0x03, 0xf0, 0x0f, 0x0f, 0x00, 0x0f, 0xfe, 0x00,
0x18, 0x0c, 0x03, 0xf0, 0x0e, 0x0f, 0x00, 0x07, 0xfc, 0x00,
0x20, 0x03, 0x83, 0xe0, 0x70, 0x0f, 0x00, 0x03, 0xf8, 0x00,
0x00, 0x00, 0x03, 0xe0, 0x00, 0x0e, 0x00, 0x01, 0xf8, 0x00,
0x00, 0x00, 0x03, 0xc0, 0x00, 0x0c, 0x00, 0x01, 0xf0, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xe0, 0x00,
0x00, 0x24, 0x28, 0x11, 0x05, 0x00, 0x08, 0x00, 0x60, 0x00,
0x00, 0x24, 0x20, 0x10, 0x45, 0x00, 0x08, 0x00, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
```
`QIDONG`Bitmap
```c
UINT8 QIDONG[] =
{
/*-- 宽x高=48x16 --*/
0x01, 0xc0, 0x7f, 0x70, 0x38, 0x00,
0x7f, 0xff, 0x00, 0x70, 0x38, 0x00,
0x70, 0x07, 0x01, 0xff, 0x38, 0x00,
0x70, 0x07, 0x00, 0x77, 0x18, 0x00,
0x7f, 0xff, 0xff, 0xf7, 0x18, 0x00,
0x70, 0x07, 0x38, 0x77, 0x18, 0x00,
0x70, 0x00, 0x38, 0x77, 0x18, 0x00,
0x70, 0x00, 0x3e, 0x67, 0x18, 0x00,
0x7f, 0xfe, 0x77, 0xe7, 0x00, 0x00,
0x7c, 0x06, 0x6f, 0xe7, 0x00, 0x00,
0x6c, 0x06, 0xfb, 0xc7, 0x3c, 0x00,
0xec, 0x06, 0x01, 0xc7, 0x3c, 0x00,
0xef, 0xfe, 0x03, 0xbe, 0x00, 0x00,
0xcc, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
```
图片或文字转Bitmap网站https://www.zhetao.com/fontarray.html

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

View File

@ -0,0 +1,207 @@
<img src="222.png" alt="cover" style="zoom: 150%;" />
---
[TOC]
---
**实验分工**
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 负责实验代码的解读,分析了代码的整体思想与运行流程,设计了最后的报警展示效果。 |
| 李桦炅 | 21281282 | 协助进行实验代码解读分析了LCD可实行的温湿度阈值使得可以展示出实验效果。 |
| 王子励 | 21281292 | 撰写实验报告,与小组成员积极沟通,记录实验进程。 |
| 李志民 | 20281146 | 参与报告撰写,记录实验当中遇到的问题并总结。 |
# 实验二 传感层数据收集实验
## 1. 实验目的
学习使用CC2530及相应的模块采集温湿度光电信号 并针对温湿度电传感器的编程通过Zigbee网络将传感器节点与协调器连接协调器通过Zigbee网络收集传感器的数据将部分收集到的数据显示在LCD上以显示成功收集数据。
## 2. 工具/原料
- 装有IAR的PC机一台。
- 22530仿真器usb线A型转B型
- 无限节点模块带LCD的智能主板温湿度传感器模块。
## 3. 实验原理及其说明
本实验将使用 CC2530 读取温湿度传感器 SHT10 的温度和湿度数据,并通过 CC2530 内部的 ADC 得到光照传感器的数据。最后将采样到的数据转换然后在 LCD 上显示。其中对温湿度的读取是利用 CC2530 的 I/OP1.0 和 P1.1)模拟一个类 IIC 的过程。对光照的采集使用内部的 AIN0 通道。光照和温湿度传感器
SHT10 是一款高度集成的温湿度传感器芯片, 提供全标定的数字输出。它采用专利的 CMOSens 技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与 14 位的 A/D 转换器以及串行接口电路实现无缝连接。
**SHT10 引脚特性如下:**
1. VDDGND SHT10 的供电电压为 2.4~5.5V。传感器上电后,要等待 11ms 以越过“休眠”状态。在此期间无需发送任何指令。电源引脚VDDGND之间可增加一个 100nF 的电容,用以去耦滤波。
2. SCK 用于微处理器与 SHT10 之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小 SCK 频率。
3. DATA 三态门用于数据的读取。DATA 在 SCK 时钟下降沿之后改变状态,并仅在 SCK 时钟上升沿有效。数据传输期间,在 SCK 时钟高电平时DATA 必须保持稳定。为避免信号冲突,微处理器应驱动 DATA 在低电平。需要一个外部的上拉电阻例如10kΩ将信号提拉至高电平。上拉电阻通常已包含在微处理器的 I/O 电路中。
**向 SHT10 发送命令:**
用一组“ 启动传输”时序,来表示数据传输的初始化。它包括:当 SCK 时钟高电平时 DATA 翻转为低电平,紧接着 SCK 变为低电平,随后是在 SCK 时钟高电平时 DATA 翻转为高电平。后续命令包含三个地址位目前只支持“000”和五个命令位。SHT10 会以下述方式表示已正确地接收到指令:在第 8 个 SCK 时钟的下降沿之后,将 DATA 拉为低电平ACK 位)。在第 9 个 SCK 时钟的下降沿之后,释放 DATA恢复高电平
**测量时序(RH 和 T)**
发布一组测量命令00000101表示相对湿度 RH00000011表示温度 T控制器要等待测量结束。这个过程需要大约 11/55/210ms分别对应 8/12/14bit 测量。确切的时间随内部晶振速度最多有±15%变化。SHTxx 通过下拉 DATA 至低电平并进入空闲模式,表示测量的结束。控制器在再次触发 SCK 时钟前,必须等待这个“数据备妥”信号来读出数据。检测数据可以先被存储,这样控制器可以继续执行其它任务在需要时再读出数据。接着传输 2 个字节的测量数据和 1 个字节的CRC 奇偶校验。uC 需要通过下拉DATA 为低电平,以确认每个字节。所有的数据从 MSB 开始,右值有效(例如:对于 12bit 数据,从第 5 个 SCK 时钟起算作 MSB 而对于 8bit 数据, 首字节则无意义)。用 CRC 数据的确认位,表明通讯结束。如果不使用 CRC-8 校验,控制器可以在测量值 LSB 后,通过保持确认位 ack 高电平, 来中止通讯。在测量和通讯结束后SHTxx 自动转入休眠模式。
**通讯复位时序:**
如果与 SHTxx 通讯中断,下列信号时序可以复位串口:当 DATA 保持高电平时,触发 SCK 时钟 9 次或更多。在下一次指令前,发送一个“传输启动”时序。这些时序只复位串口,状态寄存器内容仍然保留。更多 SHT10 信息,请参考相应文档。
**光照强度采集:**
光照采集主要是通过用 CC2530 内部的 ADC 来得到 OURS-CC2530 开发板上的光照传感器输出电压。传感器输出电压(连接到 CC2530 的 AIN0)。
## 4. 核心代码
### 4.1. MAIN函数
```c
void main()
{
SET_MAIN_CLOCK_SOURCE(CRYSTAL); // 设置系统时钟源为32MHz晶体振荡器
GUI_Init(); // GUI初始化
GUI_SetColor(1, 0); // 显示色为亮点,背景色为暗点
int t = 0, h = 0;
int t_threshold = 27, h_theshold = 40;
while (1) {
th_read(&t, &h);
char t_string[40] = {0};
char h_string[40] = {0};
sprintf(t_string, "Temperature = %d", t);
sprintf(h_string, "Humidity = %d", h);
// 当任意监控的值超过阈值,设置警报
if (t > t_threshold || h > h_theshold) GUI_ExchangeColor(); // 警报为将显示的背景颜色设置为深色
// 在LCD屏幕上显示温湿度
GUI_PutString5_7(0, 0, t_string);
GUI_PutString5_7(0, 15, h_string);
LCM_Refresh();
if (t > t_threshold || h > h_theshold) GUI_ExchangeColor();
}
}
```
实现逻辑为:
1. 初始化LCD屏幕
2. 设置温湿度报警阈值;
3. 调用`th_read()`读取温湿度;
4. 将温湿度信息写进字符串;
5. 判断温湿度是否超过了阈值。若是,调用`GUI_ExchangeColor()`将背景颜色设置为深色,表示报警;否则不变;
6. 在LCD屏幕上显示温湿度信息字符串调用函数接口`GUI_PutString5_7()`
7. 结束本轮循环,如果设置了报警,将深色反转回来;
8. 返回3重复循环。
### 4.2. th_read函数
本函数为读取传感器的温湿度的函数。
```c
void th_read(int* t, int* h)
{
unsigned char error, checksum; // 定义错误标志和校验和变量
float humi, temp; // 定义存储原始湿度和温度数据的临时变量
int tmp; // 用于临时存储用于四舍五入计算的变量
initIO(); // 初始化输入输出接口
s_connectionreset(); // 启动传输,准备接收数据
error = 0; // 清除错误标志
error += s_measure(&checksum, 5); // 读取湿度数据并进行校验,错误计数会增加如果有错误发生
humi = d1 * 256 + d2; // 将读取的数据转换为湿度值
error += s_measure(&checksum, 3); // 读取温度数据并进行校验
temp = d1 * 256 + d2; // 将读取的数据转换为温度值
if (error != 0) // 如果有错误发生
s_connectionreset(); // 通信复位,准备重新读取数据
else { // 如果读取成功
// 对温度和湿度数据进行转换和计算,得到最终的值
temp = temp * 0.01 - 44.0;
humi = (temp - 25) * (0.01 + 0.00008 * humi) - 0.0000028 * humi * humi + 0.0405 * humi - 4;
if (humi > 100) humi = 100;
if (humi < 0.1) humi = 0.1;
}
// 对温度值进行四舍五入处理
tmp = (int)(temp * 10) % 10;
if (tmp > 4) temp = temp + 1;
*t = (int)temp; // 返回处理后的温度值
// 对湿度值进行四舍五入处理
tmp = (int)(humi * 10) % 10;
if (tmp > 4) humi = humi + 1;
*h = (int)humi; // 返回处理后的湿度值
}
```
此函数负责读取温度和湿度数据。它初始化通信接口,读取并校验从传感器获得的数据,然后计算出温度和湿度的正确值。
如果数据读取失败,它会重置通信连接。最后,函数通过指针参数返回处理后的温度和湿度值。
## 5. 实验步骤
1. 给智能主板供电。
2. 将一个无线节点模块插入到带LCD的智能主板的相应位置
3. 将温湿度传感器模块插入到智能主板的传感及控制扩展口位置
4. 将CC2530仿真器的一端通过USB线A型转B型连接到PC机另一端通过10Pin下载线连接到智能主板的CC2530 JTAG口J203
5. 将智能主板上电源开关拨至开位置。按下仿真器上的按钮,仿真器上的指示灯为绿色时表示连接成功
6. 将自己改好的程序编译下载到板子上运行,观察现象。
7. 改变温湿度可以向温湿度传感器吹气或将手指按压在传感器上观察LCD上温湿度的变化。
## 6. 实验结果
在LCD板上显示了温湿度的实时测量数据可自行设置阈值来使得lcd板的颜色反转来实现警示的作用。
温湿度正常情况下的显示:
<img src="111.jpg" alt="cover" style="zoom: 25%;" />
温湿度异常,报警的显示:
<img src="666.jpg" alt="cover" style="zoom: 25%;" />
## 7. 实验感想
通过这次的传感层数据收集实验,我深刻体会到了物联网技术在实际应用中的重要性和潜力。实验过程不仅加深了我的理论知识,更重要的是,它提高了我的实践能力和问题解决能力。
一方面实验中使用的CC2530及相关模块为我提供了一个直观的平台让我能够亲手操作和观察温湿度信号的采集过程。这种实践操作使我们对传感器的工作原理和数据通信过程有了更深入的了解。
另一方面团队合作在这次实验中发挥了关键作用。我们每个人都有自己的分工但实验的成功依赖于团队成员之间的有效沟通和协作。在实验过程中我们遇到了一些挑战比如如何优化LCD的显示效果。通过团队讨论和共同努力我们不仅解决了这些问题还增进了团队协作和沟通能力。
总的来说,这次实验不仅让我们对物联网技术有了更深刻的认识,还锻炼了我们的实践操作能力和团队合作能力。我们相信这些经验和技能将在未来学习和职业生涯中发挥重要作用。

BIN
Lab/5_FaceDetection/111.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

BIN
Lab/5_FaceDetection/222.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
Lab/5_FaceDetection/333.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 KiB

View File

@ -0,0 +1,184 @@
![cover](222.png)
---
# 目录
[TOC]
---
**实验分工**
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 负责完成实验代码的主要部分,对模型做细节化调整,设计识别方法与显示效果。检查修正报告。 |
| 李桦炅 | 21281282 | 在实验中协同各个成员进行沟通,确保成员间协作和报告的完成与优化。 |
| 王子励 | 21281292 | 参与实验部分代码的修改调整,撰写实验报告。 |
| 李志民 | 20281146 | 参与报告撰写,记录实验中的问题并总结。 |
# 1. 实验目的
通过互联网等方式对计算机视觉Computer Vision中的Face Detection方向进行自主学习。并进行实践进一步深入理解。
获取摄像头的信息数据使用视频数据实现实时Face Detection任务。人脸检测Face Detection就是给一幅图像找出图像中的所有人脸位置通常用一个矩形框框起来。
# 2. 工具/原料
- PC机一台。
# 3. 实验任务
1.调取本机个人PC摄像头模组。
2.不限编程语言不限算法实现Face Detection任务。
# 4. 实验内容
1.在PC机上通过程序获取无线摄像头的视频数据。
2.在视频数据上做实时的人脸跟踪。实时输出的数据可以各组通过不同算法来实现如多人检测id标志性别等内容
# 5. 核心代码
**配置环境**
```sh
pip install facenet-pytorch opencv-python
```
**运行代码**
```python
import cv2
from facenet_pytorch import MTCNN
# 设置输入图像的大小
image_size = (480, 480)
# 使用MTCNN创建人脸检测流水线
mtcnn = MTCNN(image_size=image_size, keep_all=True)
# 打开摄像头
cap = cv2.VideoCapture(0) # 0 表示默认摄像头,可以根据需要更改为其他数字
# 检查摄像头是否成功打开
if not cap.isOpened():
print("Error: Could not open camera.")
exit()
# 设置窗口名称
cv2.namedWindow("Face Detection", cv2.WINDOW_NORMAL)
while True:
# 读取视频流的帧
ret, frame = cap.read()
# 检查帧是否成功读取
if not ret:
print("Error: Could not read frame.")
break
# 裁剪图像使其成为正方形
min_dim = min(frame.shape[0], frame.shape[1])
start_x = (frame.shape[1] - min_dim) // 2
start_y = (frame.shape[0] - min_dim) // 2
cropped_frame = frame[start_y:start_y+min_dim, start_x:start_x+min_dim]
# 人脸检测
boxes, probs = mtcnn.detect(cropped_frame)
# 绘制人脸边界框
if boxes is not None:
for box in boxes:
# 在原始帧上绘制边界框
cv2.rectangle(frame,
(int(box[0] + start_x), int(box[1] + start_y)),
(int(box[2] + start_x), int(box[3] + start_y)),
(0, 255, 0), 4)
# 在窗口中显示帧
cv2.imshow("Face Detection", frame)
# 检测按键,如果是'q',退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()
```
代码主要功能模块是MTCNN。
MTCNN的工作原理是通过级联的方式利用多个卷积神经网络来实现人脸检测和对齐。
![cover](111.png)
1. 首先通过P-NetProposal Network粗略地识别出可能包含人脸的区域
2. 然后使用R-NetRefine Network对候选框进行进一步的筛选
3. 最后通过O-NetOutput Network精细化地定位人脸关键点和提取人脸特征。
MTCNN可以同时完成人脸位置的精准定位、人脸对齐和特征提取从而在人脸识别应用中发挥关键作用。
# 6. 实验结果
通过对相关知识的学习后小组成员们最后完成了使用python语言在自己的pc机上完成了调取摄像头画面并框选人脸的任务。不过不尽人意的是由于条件的限制不能够识别框选出侧脸。
<img src="333.png" alt="cover" style="zoom: 33%;" />
# 7. 实验感想
通过实现人脸识别项目,我们深刻体会到了团队合作的重要性和技术创新的挑战。在实验过程中,我们遇到了多种技术难题,例如算法优化和数据处理。通过共同努力,我们克服了这些难关,实现了高效的人脸识别。这个过程不仅提升了我们的编程能力和问题解决技巧,也让我们更深刻地理解了人脸识别技术的潜力与局限。