1-2 实验2 点对点通信

1、实验内容:两个ZigBee节点进行点对点通信,ZigBee节点2(终端节点EndDevice,稍后,下载EndDeviceEB里的代码)发送“LED”三个字符,ZigBee节点1(协调器节点Coordinator,稍后,下载CoordinatorEB里的代码)接受数据后,判断接受到的数据是否为“LED”,是,则使板子上的LED灯闪烁。

2、简介

无线传感器主要有三种类型:协调器、路由器、终端节点。

协调器:负责网络的组件、维护、控制终端节点的加入

路由器:负责数据包的路由的选择

终端节点:负责数据的采集

(本实验不用路由器)

3、编程(主要使用的是C:\Texas Instruments\ZStack-CC2530-2.3.1-1.4.0\Projects\zstack\Samples\GenericApp\CC2530DB中的GenericApp.eww工程,并在此基础上,添加修改代码,在App文件夹移除掉GenericApp.c、添加Coordinator.h、Coordinator.c、Enddevice.c)

4、协调器编程(协调器工作流程:开始-》初始化-》建立网络(不用进行相关的编程)-》接收数据(没接收到数据时,一直等待接受数据)-》使得LED闪烁),此处的代码在GenericApp.c的基础上修改添加代码以实现数据的接受和LED闪烁。

//Coordinator.h
#ifndef COORDINATOR_H
#define COORDINATOR_H

#include "ZComDef.h"  //??????????????

#define GENERICAPP_ENDPOINT   10

#define GENERICAPP_PROFID     0x0F04    //?????
#define GENERICAPP_DEVICEID   0x0001  //????

#define GENERICAPP_DEVICE_VERSION 0 //?????
#define GENERICAPP_FLAGS          0 //??????

#define GENERICAPP_MAX_CLUSTERS   1 //????????
#define GENERICAPP_CLUSTERID      1 //???????

extern void GenericApp_Init(byte task_id);
extern UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 evens);

#endif

//Coordinator.c
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>

#include "Coordinator.h"

#include "DebugTrace.h"

#if !defined(WIN32) //????
#include "OnBoard.h"
#endif

#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
  GENERICAPP_CLUSTERID 
};

//简单设备描述符(描述一个ZigBee设备节点)
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
  GENERICAPP_ENDPOINT,
  GENERICAPP_PROFID,
  GENERICAPP_DEVICEID,
  GENERICAPP_DEVICE_VERSION,
  GENERICAPP_FLAGS,
  GENERICAPP_MAX_CLUSTERS,
 
 (cId_t*)GenericApp_ClusterList, //?????
  0,
  (cId_t *)NULL
};

endPointDesc_t GenericApp_epDesc;//节点描述符
byte GenericApp_TaskID;//任务优先级
byte GenericApp_TransID;//数据发送序列号。

void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pckt);//消息处理函数
void GenericApp_SendTheMessage(void);//数据发送函数

void GenericApp_Init(byte task_id)//任务初始化函数
{
  GenericApp_TaskID     =task_id;   //初始化任务优先级(任务优先级有协议栈的操作系统OSAL分配)
  GenericApp_TransID    =0;         //发送数据包的序号初始化为0
  
  //对节点描述符进行初始化
  GenericApp_epDesc.endPoint    =GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id     =&GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc   =(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq  =noLatencyReqs;
  
  afRegister(&GenericApp_epDesc);//afRegister()对节点的描述符进行注册。注册后,才能使用OSAL提供的系统服务。
}


//消息处理函数  
     
UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)
{
  afIncomingMSGPacket_t* MSGpkt;//MSGpkt用于指向接收消息结构体的指针
  if(events&SYS_EVENT_MSG)
  {
  // MSGpkt=(afIncomingMSGPacket_t*)osal_msg_reveive(GenericApp_TaskID);//osal_msg_receive()从消息队列上接收消息
     MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
   while(MSGpkt)
   {
     switch(MSGpkt->hdr.event)
    {
    case AF_INCOMING_MSG_CMD:          //接受到新数据的消息的ID是AF_INCOMING_MSG_CMD,这个宏是在协议栈中定义好的值为0x1A
                                       //接受到的是无线数据包
      GenericApp_MessageMSGCB(MSGpkt);//功能是完成对接受数据的处理
      break;
    default:
      break;
    }
    
    osal_msg_deallocate((uint8 *)MSGpkt);//接收到的消息处理完后,释放消息所占的存储空间
    
   // MSGpkt = (afIncomingMSGPacket_t *)osal_msg_reveive(GenericApp_TaskID);
     MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
    //处理完一个消息后,再从消息队列里接受消息,然后对其进行相应处理,直到所有消息处理完
   }
   return (events ^ SYS_EVENT_MSG);
  }
    return 0;
}


void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)
{
 unsigned char buffer[4]= "    ";
 
 switch(pkt->clusterId)
 {
 case GENERICAPP_CLUSTERID:
   osal_memcpy(buffer,pkt->cmd.Data,3);
   
   if((buffer[0]=='L')&&(buffer[1]=='E')&&(buffer[2]=='D'))
   {
      HalLedBlink(HAL_LED_1,0,50,500);    //LED2 闪烁
       HalLedBlink(HAL_LED_2,0,50,500);    //LED2 闪烁
      HalLedBlink(HAL_LED_3,0,50,500);    //LED2 闪烁
      HalLedBlink(HAL_LED_4,0,50,500);    //LED2 闪烁
   }
   else
   {
     HalLedSet(HAL_LED_2,HAL_LED_MODE_ON);//其他内容 LED2 亮    这几个函数在哪里定义了呢????
     
   }
   
   break;
 }
}

5、终端节点编程(终端节点流程:开始-》初始化-》加入网络-》发送数据-》发送完数据后使LED闪烁)此处的代码在添加代码以实现数据的发送和LED闪烁。

//Enddevice.c

#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>

#include "Coordinator.h"

#include "DebugTrace.h"

#if !defined(WIN32)
#include "OnBoard.h"
#endif

#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
 GENERICAPP_CLUSTERID
};

const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
  GENERICAPP_ENDPOINT,
  GENERICAPP_PROFID,
  GENERICAPP_DEVICEID,
  GENERICAPP_DEVICE_VERSION,
  GENERICAPP_FLAGS,
  0,
  (cId_t*)NULL,
  GENERICAPP_MAX_CLUSTERS,
  (cId_t*)GenericApp_ClusterList
  
};

endPointDesc_t GenericApp_epDesc;//节点描述符
byte GenericApp_TaskID;          //任务优先级
byte GenericApp_TransID;         //数据发送序列号
devStates_t GenericApp_NwkState;//保存节点状态

void GenericApp_MessageMSGCB(afIncomingMSGPacket_t* pckt);//消息处理函数的声明
void GenericApp_SendTheMessage(void); //数据发送函数的声明

//任务初始化函数
void GenericApp_Init(byte task_id)
{
  GenericApp_TaskID     = task_id;//初始化任务优先级
  GenericApp_NwkState   =DEV_INIT; //初始化为DEV_INIT,表节点没有连接到ZigBee网络
  GenericApp_TransID    =0;        //发送数据包的序列号初始化为0
  
  //对节点描述符进行初始化
  GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id =&GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq=noLatencyReqs;
  
  //afRegister()函数将节点描述符进行注册,注册后才可以使用OSAL提供的系统服务
  afRegister(&GenericApp_epDesc);
}

//消息处理函数
UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)
{
  afIncomingMSGPacket_t* MSGpkt;
  
  if(events&SYS_EVENT_MSG)
  {
    MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
    
    while(MSGpkt)
    {
      switch(MSGpkt->hdr.event)
      {
    case ZDO_STATE_CHANGE:
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型
      if(GenericApp_NwkState==DEV_END_DEVICE)
      {
        GenericApp_SendTheMessage(); //终端节点类型,执行无线数据发送
      }
      break;
    default:
      break;
      }
    osal_msg_deallocate((uint8*)MSGpkt);
    MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
    }
    return (events^SYS_EVENT_MSG);
  }
  return 0;
  
}

void GenericApp_SendTheMessage(void)
{
  unsigned char theMessageData[4]="LED";//存放发送数据
  afAddrType_t my_DstAddr;    
  my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//数据发送模式:可选 单播、广播、多播方式  这里选Addr16Bit表单播
  my_DstAddr.endPoint=GENERICAPP_ENDPOINT;   //初始化端口函
  my_DstAddr.addr.shortAddr=0x0000;  //标志目的地址节点的网络地址  这里是协调器的地址
  
  //下面是数据发送                                                  长度  数据发送缓冲区
  AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,3,theMessageData,
			&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);

      HalLedBlink(HAL_LED_1,0,50,500);    //LED2 闪烁
      HalLedBlink(HAL_LED_2,0,50,500);    //LED2 闪烁
      HalLedBlink(HAL_LED_3,0,50,500);    //LED2 闪烁
      HalLedBlink(HAL_LED_4,0,50,500);    //LED2 闪烁
  
}


6、代码分析:(协调节点和终端节点交叉分析)

协调器工作流程:开始-》初始化-》建立网络(不用进行相关的编程)-》接收数据(没接收到数据时,一直等待接受数据)-》使得LED闪烁

终端节点流程:开始-》初始化-》加入网络-》发送数据-》发送完数据后使LED闪烁

可知,协调器工作流程:开始-》初始化-》建立网络

然后是终端节点流程:开始-》初始化-》加入网络

(1)初始化:完成各种硬件的初始设置,这里主要讲任务初始化:void GenericApp_Init(byte task_id),调用该函数的是由main()一直往下调用的,过程如下:

int main( void )
osal_init_system( void )
void osalInitTasks( void )
GenericApp_Init( taskID );

任务初始化:void GenericApp_Init(byte task_id)的主要功能:

  1. //任务初始化函数  
  2. void GenericApp_Init(byte task_id)  
  3. {  
  4.   GenericApp_TaskID     = task_id;//初始化任务优先级  
  5.   GenericApp_NwkState   =DEV_INIT; //初始化为DEV_INIT,表节点没有连接到ZigBee网络  
  6.   GenericApp_TransID    =0;        //发送数据包的序列号初始化为0  
  7.     
  8.   //对节点描述符进行初始化  
  9.   GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;  
  10.   GenericApp_epDesc.task_id =&GenericApp_TaskID;  
  11.   GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;  
  12.   GenericApp_epDesc.latencyReq=noLatencyReqs;  
  13.  
  14.   //afRegister()函数将节点描述符进行注册,注册后才可以使用OSAL提供的系统服务  
  15.   afRegister(&GenericApp_epDesc);  
  16. }  

其中上面的那个些变量都是本文件中的局部变量(定义如下,除了GenericApp_epDesc被afRegister(&GenericApp_epDesc); 直接应用后,其他的变量都在哪引用了呢?

  1. endPointDesc_t GenericApp_epDesc;//节点描述符  
  2. byte GenericApp_TaskID;          //任务优先级  
  3. byte GenericApp_TransID;         //数据发送序列号  
  4. devStates_t GenericApp_NwkState;//保存节点状态
上面的  void  GenericApp_Init(byte task_id)函数在协调器和终端节点基本上是一样的,不同的是在终端节点中多了一句 GenericApp_NwkState   =DEV_INIT;  //初始化为DEV_INIT,表节点没有连接到ZigBee网络  

(2)消息处理函数UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events) ,这个函数在协调器和终端节点都是有的。

先以终端节点的说:

int main( void )
{
  // Initialize the operating system
  osal_init_system();
...
  osal_start_system(); // No Return from here
  return 0;  // Shouldn't get here.
} // main()
//OSAL_Tasks.h 
typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );

//OSAL_GenericApp.c 
// The order in this table must be identical to the task initialization calls below in osalInitTask.
const pTaskEventHandlerFn tasksArr[] = {
...
  GenericApp_ProcessEvent
};
void osal_start_system( void )
{
  for(;;)  // Forever Loop
  {
  ...  
    do {
      if (tasksEvents[idx])  // Task is highest priority that is ready.
      {
        break;
      }
    } while (++idx < tasksCnt);

    if (idx < tasksCnt)
    {
      uint16 events;
      halIntState_t intState;
      HAL_ENTER_CRITICAL_SECTION(intState);
      events = tasksEvents[idx];
      tasksEvents[idx] = 0;  // Clear the Events for this task.
      HAL_EXIT_CRITICAL_SECTION(intState);
      events = (tasksArr[idx])( idx, events ); //调用了tasksEvents[idx]指向的函数
      HAL_ENTER_CRITICAL_SECTION(intState);
      tasksEvents[idx] |= events;  // Add back unprocessed events to the current task.
      HAL_EXIT_CRITICAL_SECTION(intState);
    }
    ...
  }
}
//Cooperation.h/Cooperation.c/Endevice.c
UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)

UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)中,

终端的代码是

  1. switch(MSGpkt->hdr.event)  
  2.       {  
  3.     case ZDO_STATE_CHANGE:  
  4.       GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型  
  5.       if(GenericApp_NwkState==DEV_END_DEVICE)  
  6.       {  
  7.         GenericApp_SendTheMessage(); //终端节点类型,执行无线数据发送  
  8.       }  

之后是发送数据(要注意发送数据之前要做的一系列事情,比如端口函、对方的的网址、广播、单播还是多播)

  1. void GenericApp_SendTheMessage(void)  
  2. {  
  3.   unsigned char theMessageData[4]="LED";//存放发送数据  
  4.   afAddrType_t my_DstAddr;      
  5.   my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//数据发送模式:可选 单播、广播、多播方式  这里选Addr16Bit表单播  
  6.   my_DstAddr.endPoint=GENERICAPP_ENDPOINT;   //初始化端口函  
  7.   my_DstAddr.addr.shortAddr=0x0000;  //标志目的地址节点的网络地址  这里是协调器的地址  
  8.   //下面是数据发送                                                  长度  数据发送缓冲区  
  9.   AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,3,theMessageData,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);  

协调器的是

  1.   switch(MSGpkt->hdr.event)  
  2.     {  
  3.     case AF_INCOMING_MSG_CMD:          //接受到新数据的消息的ID是AF_INCOMING_MSG_CMD,这个宏是在协议栈中定义好的值为0x1A  
  4.                                        //接受到的是无线数据包  
  5.       GenericApp_MessageMSGCB(MSGpkt);//功能是完成对接受数据的处理  
  6.       break;  

之后就是接受信息

  1. void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)  
  2. {  
  3.  unsigned char buffer[4]= "    ";  
  4.  switch(pkt->clusterId)  
  5.  {  
  6.  case GENERICAPP_CLUSTERID:  
  7.    osal_memcpy(buffer,pkt->cmd.Data,3);  


本文参考自: 《ZigBee无线传感器网络设计与实现》      王小强等人编著化学工业出版社


  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Android开发实验---通讯录 实验报告 通讯录 姓名: 学号: 课程名称: 移动应用开发 所在学院: 信息科学与工程学院 专业班级: 计算机 任课教师: Android开发实验---通讯录全文共25页,当前为第1页。 Android开发实验---通讯录全文共25页,当前为第1页。 实验项目名称 通讯录 实验目的与要求: 目的:练习掌握 Android 软件开发基本编程技术、Android 系统 SQLite 数据库的使用、通话、短信的使用等,设计制作一 Android 通讯录软件。 要求: (1)每位同学独立设计软件功能、完成软件的开发与测试。 (2)软件完成后由任课教师检查、提问软件功能、软件的设计和开发的代码。(3)每位同学独立完成实验报告(包括学号、姓名,实验目的、实验内容、软件功能、设计思想、实验总结等),并将实验报告和开发软件的工程文件压缩包提交任课教师。 实验设备及软件: 一台电脑,Androidstudio2.3.3软件 实验方法(原理、流程图) 实现的通讯录功能和界面可在实验开发中由每位同学自己设计,但必须使用 SQLite 数据库保存通讯录信息。 以下功能和软件界面供参考:仿照一般手机通讯录的使用界面和功能,主要功能可包括: (1)可以添加、删减联系人 (2)联系人的信息包括:姓名、手机号码、工作单位、群组、电子邮件、手机铃声 (3)选择联系人后,可以快速进行操作,如:拨打电话发送短信、查看详细、移出群组、移动分组、删除联系人等。查看详细时显示手机号码、群组、和设定的手机铃声以及同该联系人的通话记录。 (4)在联系人界面,可以查看各群组。点击群组,跳出对应联系人。 (5)有拨号键盘,点击数字将号码显示出来,并可以对手机号码进行删减 (6)可以发送信息,显示信息记录 (7)发送信息时,可以快速选择现有联系人。 实验过程、步骤及内容 通讯录界面要求布局合理简约,颜色舒,控制按钮简单明了,让用户一眼就能看出各个按钮的作用及操方法。能实要求的功能,但又不重复。要考到不同手机屏幕大小可能不一样,应尽兼容大多数手机屏幕尺寸,使之显示无障碍。 实现思路与简单设计 1. 关于通讯录获取联系人信息以及联系人信息的存储结构的分析。 2. 解决添加联系人的表中添加数据以及读取已保存的数据 3. 实现通讯录的基本功能的具体实现。 4. 对通讯录界面的具体设计,给人一种方便的操作通道。 5. 灵活应用各种系统库函数实现完整的通讯录。 Android开发实验---通讯录全文共25页,当前为第2页。开发流程图: Android开发实验---通讯录全文共25页,当前为第2页。 主要功能分析: 增加、删除、编联系人 点击通信录界面中的增加按钮,入增加联系人面。输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,击确认返回主界面。点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改系人的资料或进行删除联系人操作,完成后退回到主界面。对列表中联系人的标记,点mnu键弹出功能界面上的删除按键也可进行删除。还可以在菜单上选择删除全部联系人清空通讯录。在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则系人信息将继续保存。 2、查找联系人 用户点击menu键打开底部菜单框,底部菜单框为查询系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话息排列,用户点击查找按键输入联系人基本信息,,通讯录显所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。 3、通功能 用户在通录选择联系人进入联系详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息的功能进行操作。 4、菜单能 通过对menu按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,菜单按键则包含显示所有、删除所有等实用功能。 增加联系人: 这个功能由ContactAdder类完成,具体实现不是比较麻烦,保存动作由ContentResolver类解决,但实现方式有所不同,可分为一次性批量增加与挨个增加。 由于界面设置繁琐,代码页过多,所以挑出其中的一部分进行说明 首先是DB数据库建库过程: Android开发实验---通讯录全文共25页,当前为第3页。package com.xample.hivian.my_contact_manager.models.db; import android.content.ContentValues; import android.database.Cursor; import android.database.
网络安全实验---Windows防火墙应用全文共9页,当前为第1页。网络安全实验---Windows防火墙应用全文共9页,当前为第1页。实验目的和要求 网络安全实验---Windows防火墙应用全文共9页,当前为第1页。 网络安全实验---Windows防火墙应用全文共9页,当前为第1页。 了解防火墙的含义与作用 学习防火墙的基本配置方法 实验内容和原理 一.防火墙 在古代,人们已经想到在寓所之间砌起一道砖墙,一旦火灾发生,它能够防止火势蔓延到别的寓所,于是有了"防火墙"的概念。 进入信息时代后,防火墙又被赋予了一个类似但又全新的含义。防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。它是不同网络或网络安全域之间信息的唯一出入口,能根据企业的安全政策控制(允许、拒绝、监测)出入网络的信息流,且本身具有较强的抗攻击能力。它是提供信息安全服务,实现网络和信息安全的基础设施。在逻辑上,防火墙是一个分离器、一个限制器、也是一个分析器,有效地监控了内部网络和Internet之间的任何活动,保证了内部网络的安全。 二.防火墙功能 1. 防火墙是网络安全的屏障 一个防火墙(作为阻塞点、控制点)能极大地提高一个内部网络的安全性,并通过过滤不安全的服务而降低风险。由于只有经过精心选择的应用协议才能通过防火墙,所以网络环境变得更安全。如防火墙可以禁止诸如众所周知的不安全的NFS协议进出受保护的网络,这样外部的攻击者就不可能利用这些脆弱的协议来攻击内部网络。防火墙同时可以保护网络免受基于路由的攻击,如IP选项中的源路由攻击和ICMP重定向中的重定向攻击。防火墙应该可以拒绝所有以上类型攻击的报文并通知防火墙管理员。 2. 防火墙可以强化网络安全策略 通过以防火墙为中心的安全方案配置,能将所有安全软件(如口令、加密、身份认证、审计等)配置在防火墙上。与将网络安全问题分散到各个主机上相比,防火墙的集中安全管理更经济。例如在网络访问时,一次一密口令系统和其它的身份认证系统完全可以不必分散在各个主机上,而集中在防火墙一身上。 3. 对网络存取和访问进行监控审计 如果所有的访问都经过防火墙,那么,防火墙就能记录下这些访问并作出日志记录,同时也能提供网络使用情况的统计数据。当发生可疑动作时,防火墙能进行适当的报警,并提供网络是否受到监测和攻击的详细信息。另外,收集一个网络的使用和误用情况也是非常重要的。这样可以清楚防火墙是否能够抵挡攻击者的探测和攻击,并且清楚防火墙的控制是否充足。而网络使用统计对网络需求分析和威胁分析等而言也是非常重要的。 4. 防止内部信息的外泄 通过利用防火墙对内部网络的划分,可实现内部网重点网段的隔离,从而限制了局部重点或敏感网络安全问题对全局网络造成的影响。再者,隐私是内部网络非常关心的问题,一个内部网络中不引人注意的细节可能包含了有关安全的线索而引起外部攻击者的兴趣,甚至因此而暴露了内部网络的某些安全漏洞。使用防火墙就可以隐蔽那些透漏内部细节的服务如Finger,DNS等。Finger显示了主机的所有用户的注册名、真名,最后登录时间和使用shell网络安全实验---Windows防火墙应用全文共9页,当前为第2页。网络安全实验---Windows防火墙应用全文共9页,当前为第2页。类型等。Finger显示的信息非常容易被攻击者所获悉。攻击者可以知道一个系统使用的频繁程度,这个系统是否有用户正在连线上网,这个系统是否在被攻击时引起注意等等。防火墙可以同样阻塞有关内部网络中的DNS信息,这样一台主机的域名和IP地址就不会被外界所了解。 网络安全实验---Windows防火墙应用全文共9页,当前为第2页。 网络安全实验---Windows防火墙应用全文共9页,当前为第2页。 除了安全作用,防火墙还支持具有Internet服务特性的企业内部网络技术体系VPN。通过VPN,将企事业单位在地域上分布在全世界各地的LAN或专用子网,有机地联成一个整体。不仅省去了专用通信线路,而且为信息共享提供了技术保障。 三.NAT NAT英文全称是"Network Address Translation",中文意思是"网络地址转换",它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公共IP地址出现在Internet上。顾名思义,它是一种把内部私有IP地址翻译成公共IP地址的技术。 简单的说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关处,将内部地址替换成公用地址,从而在外部公网(Internet)上正常使用,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了公共
班级 研01-12 学号 西安电子科技大学 通信系统综合实验报告 学 院 : 通信工程学院 班 级 : 研01-12 专 业 : 交通信息工程及控制 姓 名 : 2012年11月 目录 实验一 数字基带仿真实验 1 1.1 实验目的 1 1.2 实验原理 1 1.2.1 差错控制原理 1 1.2.2 跳频扩频原理 3 1.2.3 保密通信原理 4 1.3 实验内容 4 1.4 实验结果及数据分析 5 1.4.1 差错控制 5 1.4.2 跳频 7 1.4.3 加密解密 12 实验二 通信传输的有效性与可靠性分析 14 2.1实验目的 14 2.2实验原理 14 2.2.1 数据传输的流量控制 14 2.2.2 误码和差错控制 15 2.2.3 信道共享技术 15 2.3实验内容 16 2.4 实验结果及数据分析 17 2.4.1 性能仿真 17 2.4.2. 速率测试 22 2.4.3. 文件传输 24 实验三 无线多点组网 27 3.1 实验目的 27 3.2 实验原理 27 3.2.1 通信网络拓扑结构 27 3.2.2 路由技术 28 3.2.3 广播和组播 28 3.2.4 Ad hoc网络 28 3.3 实验内容 28 3.4 实验结果及数据分析 29 3.4.1 组网过程 29 3.4.2 单跳与多跳转接 31 3.4.3. 单播(Unicast) 31 3.4.4. 路由协议 32 3.4.5. 广播(Broadcast)与组播(Multicast) 32 实验四 语音传输 34 4.1 实验目的 34 4.2 实验原理 34 4.2.1 脉冲编码调制 34 4.2.2 连续可变斜率增量调制 35 4.2.3 随机错误和突发错误 36 4.2.4 内部通话与数据传输的工作过程 36 4.2.5 蓝牙设备的身份切换 37 4.3 实验内容 37 4.4 实验结果及数据分析 38 4.4.1 参数相同时的波形 38 4.4.2 相同误码率不同频率的波形 39 4.4.3 用蓝牙连接的传输过程 42 实验一 数字基带仿真实验 2 实验目的 此实验软件主要对蓝牙(bluetooth)技术中基带信号处理方法作了仿真,包括差错控 制方法、跳频扩频原理以及保密通信等。本实验要求实验人员利用本软件对通信系统特 别是无线通信系统的基带信号处理方法有较深入的认识和理解,具体有以下几个目的: 1、理解基带传输中的差错控制方法、差错控制编码分类及其纠检错能力;了解差错控制 编码的生成和纠、检错方法。 2、理解扩频通信(特别是跳频扩频通信)的基本概念、原理及其优缺点。 3、理解两种加密体制的异同;了解保密通信的全过程,以及密钥在保密通信中的作用。 1.2 实验原理 本实验原理主要包括差错控制原理,调频扩频原理,保密通信原理等。 1.2.1 差错控制原理 数字信号在传输过程中,由于受到干扰的影响,码元波形将变坏。接收端收到后可能 发生错误判决。一般理论中,合理设计基带信号,选择调制解调方式,采用时域、频域 均衡,以此来降低比特误码率,但是在实际中,许多通信系统的比特误码率并不能满足 实际的需求,因此我们需要进行差错控制。常用的差错控制方法有检错重发(简称ARQ) 、前向纠错(FEC)、混合纠错(HEC)。 通常差错控制编码的实现方法:在发送端将被传输的信息附上一些监督码元,这些多 余的码元与信息码元之间以某种确定的规则相互关联,然后在接收端按照既定的规则校 验信息码元与监督码元之间的关系,一旦传输发生错误,则信息码元与监督码元的关系 就受到破坏,从而接收端可以发现错误乃至纠正错误。蓝牙基带包中采用的差错控制编 码如下: a.包头附加循环冗余校验码以保证包头的完整性,该差错控制通常被称为包头检查 (HEC)。 HEC的生成示意图见图1。在产生HEC前,线性移位反馈寄存器(LFSR)需要 初始化。为易于理解,初始化值采用设备的高8位地址(UAP)。输入数据为10位的包头 信息(低位先入)。输出数据为包头信息(10位,低位先出)+HEC(8位,低位先出)。 在接收端,恢复包头信息的示意图与图1同。此时,输入数据为18位的附加HEC的包头数 据。若8位寄存器的结果值全为0,则说明包头信息传输正确;反之,则说明包头信息传 输错误,需重传。 图1 HEC的生成示意图 b.有效载荷校验(采用CRC,cyclic redundancy check)。添加到有效载荷中的16位CRC循环冗余校验码,用来判断有效载荷数据传送得 是否正确。该16位码通过CRC- CCITT多项式210041(8进制表示)生成,见图2的生成示意图。在生成CRC码前,采用设 备的高8位地址初始化线性反馈移位寄存器。实验中规定输入数据为80位的有效载荷信息 (低位先入)。输出为有效载荷
好的,下面是一个基于C语言的点对点串口通信程序设计实验,以STM32F103为例: ### 硬件连接 将两个STM32F103单片机的USART1串口连接,其中一个单片机的TX引脚连接另一个单片机的RX引脚,同时将两个单片机的GND连接。 ### 程序设计 1. 首先,需要在STM32F103单片机上配置USART1串口通信。以下是相应的初始化函数: ```c void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } ``` 2. 编写主函数,实现点对点串口通信。以下是一个简单的点对点通信程序: ```c #include "stm32f10x.h" #include <stdio.h> #include <string.h> void USART1_Init(void); void USART1_SendChar(uint8_t ch); uint8_t USART1_ReceiveChar(void); int main(void) { USART1_Init(); while (1) { uint8_t ch = USART1_ReceiveChar(); USART1_SendChar(ch); } } void USART1_SendChar(uint8_t ch) { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } uint8_t USART1_ReceiveChar() { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART1); } ``` 以上程序实现了从USART1串口接收一个字符,然后将该字符发送回去的功能。在实际应用中,需要考虑数据帧格式、校验等问题。此外,如果需要进行双向通信,还需要在程序中实现另一个USART通道的初始化和数据收发操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdliweibing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值