本站所列毕业设计(论文)资料均属于原创者所有,初衷是为大家在毕业设计(论文)过程中参考和学习交流之用。

毕业设计我帮你

物联网工程毕业论文外文翻译

www.bysj580.com / 2017-06-25
物联网工程毕业论文外文翻译
引言
传感是传感器网络应用的一个组成部分。 在TinyOS 1.x感测与模数转换器(ADC)语法连接:TinyOS 1.x应用程序,如Oscilloscope或Sense使用ADC和ADCControl接口收集传感器数据。 当新平台出现通过串行接口读出的传感器时,不仅需要引入其他接口,例如ADCError,但很明显,将传感器与ADC等同并不总是适当的。
通常,传感包括两个任务:配置传感器(和/或其附接的硬件模块,例如ADC或SPI总线)和读取传感器数据。 第一个任务是棘手的,因为感测应用程序,例如Sense意图运行在任何TinyOS平台上。 Sense如何知道所连接的传感器的配置细节(如ADC输入通道,所需的参考电压等)? 它不能,因为传感器的配置细节将因平台而异。 除非Sense了解所有平台上的所有传感器,否则将无法执行配置任务。 然而,可以解决读取传感器数据的第二任务,使得Sense应用可以收集传感器数据,即使它对其正在运行的平台不可知。
在TinyOS 2.0平台中,独立的传感应用,如Oscilloscope,Sense或RadioSenseToLeds不再使用像ADCControl这样的配置接口; 而是使用标准数据采集接口Read,ReadStream或ReadNow来采集传感器数据。 所有配置细节从应用程序中隐藏,这就是为什么您可以在telosb或micaz平台上编译Sense和显示传感器数据的原因,即使实际的传感器及其与系统其余部分的连接可能完全不同。
这就提出了类似下列问题: 
由于检测应用程序组件仅使用标准的数据采集接口,谁是负责确定哪些传感器它的样本?
如果Sense应用程序组件没有配置传感器,那么谁负责呢?
像Sense这样的应用程序不知道传感器配置的详细信息时,是如何显示传感器数据? 这包括诸如“传感器数据的值范围是什么”或“是以摄氏度或华氏度解释的温度读数”的问题?
假设平台上有几个传感器:必须采取哪些步骤让Sense或示波器应用程序显示来自不同传感器的数据? 
阅读本教程后,您应该能够回答这些问题。 使用Sense和Oscilloscope应用程序作为示例,以下部分说明如何使用数据采集接口,配置过程如何工作,以及作为示例,Sense如何可以连接到telosb平台上默认的传感器以外的传感器 。 
Sense应用程序
Sense是一个简单的感应演示应用程序。 它定期对默认传感器采样,并在LED上显示读数的底部位。 Sense应用程序可以在tinyos-2.x / apps / Sense中找到。 让我们先来看看SenseAppC.nc配置:
configuration SenseAppC
{
}
implementation {
  components SenseC, MainC, LedsC, new TimerMilliC();
  components new DemoSensorC() as Sensor;
 
  SenseC.Boot -> MainC;
  SenseC.Leds -> LedsC;
  SenseC.Timer -> TimerMilliC;
  SenseC.Read -> Sensor;
}
SenseAppC配置看起来类似于第1课中描述的BlinkAppC配置(如果您还没有这样做,请阅读第1课中Blink应用程序上的部分)。 为了理解接线,让我们来看看SenseC.nc模块的签名: 
module SenseC
{
  uses {
    interface Boot;
    interface Leds;
    interface Timer<TMilli>;
    interface Read<uint16_t>;
  }
}
像BlinkC.nc模块一样,SenseC.nc模块使用接口Boot,Leds和Timer <TMilli>。 此外,它使用Read <uint16_t>接口。 SenseC.nc实现中的操作顺序如下:SenseC.nc使用Boot界面在系统初始化后启动周期性定时器。 每次定时器到期时,SenseC.nc发出一个定时器事件并通过Read <uint16_t>接口读取数据。 读取数据是分割相位操作,它被分成命令Read.read()和事件Read.readDone()。 因此,每次定时器到期时,SenseC.nc调用Read.read()并等待Read.readDone()事件。 当在Read.readDone()事件中发出数据信号时,SenseC.nc在LED上显示它:LED 0(0 =关闭,1 =开启)显示最低有效位,LED 1上显示第二个最低有效位 等等。
Read接口(在tinyos-2.x / tos / interfaces中)可以用来读取单个传感器数据,让我们来详细看一下:
interface Read<val_t> {
  /**
   * Initiates a read of the value.
   *
   * @return SUCCESS if a readDone() event will eventually come back.
   */
  command error_t read();
 
  /**
   * Signals the completion of the read().
   *
   * @param result SUCCESS if the read() was successful
   * @param val the value that has been read
   */
  event void readDone( error_t result, val_t val );
}
如果你不熟悉通用接口,你会想知道<val_t>(在第一行)的含义是什么以及SenseC.nc的签名为什么使用读取<uint16_t>。你上面看到的是一个通用的接口定义,因为Read接口需要一个类型参数。通用接口在nesC语言参考手册(版本1.2及更高版本)中进行了说明。现在足以知道,通用接口至少有一个类型参数,只有当两个组件提供/使用相同类型的接口时,两个组件才能连接在一起(注意,readDone事件传递参数<val_t>参数,它是实际数据类型的占位符)。这意味着由于SenseC.nc正在使用Read接口的uint16_t变量,因此它只能连接到提供Read <uint16_t>接口的组件,因此SenseC.nc需要读取16位无符号整数传感器数据。如果您试图将SenseC.nc连接到提供例如Read <uint8_t>接口的组件,您将从nesC编译器获取错误。
回想一下,SenseAppC.nc配置中定义了接线。 让我们再次看一下SenseC.nc使用SenseAppC配置中的Read <uint16_t>接口连接到哪个组件。 有趣的线是
  components new DemoSensorC() as Sensor;
and 
  SenseC.Read -> Sensor;
这意味着通用的DemoSensorC组件为SenseC.nc提供了Read <uint16_t>接口
重要的是要理解SenseC.nc模块没有办法告诉它连接到哪个传感器;事实上它甚至不能告诉它是否从传感器获取数据,因为它可以连接到任何提供Read <uint16_t>接口的组件。在没有任何内置传感器(如micaz)和没有连接传感器板的平台上,DemoSensorC组件可以简单地返回常量值。最后一句暗示DemoSensorC组件对于每个平台都是不同的:因此你不会在TinyOS库中找到DemoSensorC.nc。相反,必须为每个平台编写不同的DemoSensorC.nc,即telosb的DemoSensorC.nc实现将不同于micaz的DemoSensorC.nc实现。这是在介绍部分中提到的第一个问题的答案:平台相关的DemoSensorC组件定义了Sense或Oscilloscope应用程序采样的传感器,并且每个需要运行传感应用程序(如Oscilloscope,Sense或RadioSenseToLeds)的平台必须提供自己的版本的DemoSensorC。此外,传感器板可以具有它们自己的版本的DemoSensorC(例如,用于云母族的传感器的基础b传感器板将DemoSensorC.nc定义为该板的光传感器)。 
DemoSensorC组件
让我们仔细看看DemoSensorC组件。 每个DemoSensorC组件都有以下签名: 
generic configuration DemoSensorC()
{
  provides interface Read<uint16_t>;
}
然而,在其实施部分中,DemoSensorC可以在平台之间不同。 例如,在Telosb平台DemoSensorC上实例化一个名为VoltageC的组件,该组件从MCU内部电压传感器读取数据。 因为micaz没有任何内置的传感器,它的DemoSensorC使用像ConstantSensorC或SineSensorC这样的系统库组件,它返回“假的”传感器数据。 因此,DemoSensorC是将平台特定传感器组件(如VoltageC)的传感器数据采集间接到平台独立应用(如Sense或Oscilloscope)的手段。 通常,传感器的配置在DemoSensorC实例化的组件中完成。
如何更改传感器来采样除平台默认传感器以外的传感器? 通常这需要在DemoSensorC中只改变一行代码; 例如,如果要通过常量传感器组件ConstantSensorC替换telosb上的VoltageC组件,您可以更改DemoSensorC中的以下行:
components new VoltageC() as DemoSensor;
可用的传感器取决于平台。 传感器组件通常位于相应的平台子目录(tinyos-2.x / tos / platforms)中,位于相应的sensorboard子目录(tinyos-2.x / tos / sensorboards)中,或者如果是微处理器内部传感器, 各个芯片子目录(tinyos-2.x / tos / chips)。 ConstantSensorC和SineSensorC可以在tinyos-2.x / tos / system中找到。
运行Sense应用程序
要编译Sense应用程序,请转到apps / Sense目录,根据具体的硬件类型,输入类似于telosb install的内容。 如果您收到以下错误, 
SenseAppC.nc:50: component DemoSensorC not found
SenseAppC.nc:50: component `DemoSensorC' is not generic
SenseAppC.nc:55: no match
您的平台尚未实现DemoSensorC组件。 对于快速解决方案,您可以将DemoSensorC.nc从tinyos-2.x / tos / platforms / micaz复制到平台目录(关于如何创建传感器组件的一个很好的起点可能是TEP 101和TEP 114)。
如果你有一个云母族微粒和一个“基本”(mda100)传感器板,你可以得到一个更有趣的测试,通过编译
SENSORBOARD=basicsb make platform install
使用mda100的光传感器运行Sense。
安装应用程序后,传感器读数的三个最低有效位将显示在节点的LED上(0 =关闭,1 =打开)。 它是最低有效位,因为Sense不知道返回的传感器读数的精度(值范围),例如,通过12位ADC采样的uint16_t传感器读取中的三个最高有效位将是无意义的(除非 值被左移)。 如果你的DemoSensorC代表一个传感器的读数波动,你可能会看到LED切换,否则感觉不是很令人印象深刻。 让我们来看一个更有趣的应用:示波器。
示波器应用
示波器是一个应用程序,让您在PC上显示传感器读数。 每个安装了示波器的节点通过(DemoSensorC)定期采样默认传感器,并通过无线电广播一个具有10个累积读数的消息。 运行基站应用程序的节点将使用串行通信将这些消息转发到PC。 要运行示波器,您至少需要两个节点:一个节点连接到运行BaseStation应用程序的PC(基站可以在tinyos-2.x / apps / BaseStation上找到,并在上一课中介绍),一个或多个节点运行 示波器应用。
让我们来看看OscilloscopeAppC.nc配置: 
configuration OscilloscopeAppC
{
}
implementation
{
  components OscilloscopeC, MainC, ActiveMessageC, LedsC,
    new TimerMilliC(), new DemoSensorC() as Sensor,
    new AMSenderC(AM_OSCILLOSCOPE), new AMReceiverC(AM_OSCILLOSCOPE);
 
  OscilloscopeC.Boot -> MainC;
  OscilloscopeC.RadioControl -> ActiveMessageC;
  OscilloscopeC.AMSend -> AMSenderC;
  OscilloscopeC.Receive -> AMReceiverC;
  OscilloscopeC.Timer -> TimerMilliC;
  OscilloscopeC.Read -> Sensor;
  OscilloscopeC.Leds -> LedsC;
}
应用程序的实际实现是在OscilloscopeC.nc中。 这是OscilloscopeC.nc的签名: 
module OscilloscopeC
{
  uses {
    interface Boot;
    interface SplitControl as RadioControl;
    interface AMSend;
    interface Receive;
    interface Timer;
    interface Read;
    interface Leds;
  }
}
示波器是本教程前面部分中介绍的不同构建块的组合。 像Sense一样,示波器使用DemoSensorC和定时器定期采样平台的默认传感器。 当它收集到10个传感器读数时,OscilloscopeC将它们放入消息中,并通过AMSend接口广播该消息。 OscilloscopeC使用接收接口进行同步(见下文)和SplitControl接口,以打开无线电。 如果您想了解更多关于遥控,遥控无线电通信读课3。
运行示波器应用程序
要安装示波器应用程序,请转到tinyos-2.x / apps /示波器,并根据您使用的硬件类型,输入类似于telosb install,1。 请注意安装选项后面的“,1”,它将ID 1分配给节点。 为节点分配ID有助于以后在GUI中区分它们,因此请确保为安装了Oscilloscope的所有节点分配不同的ID(例如,在安装telosb的第二个节点上安装示波器2等)。 运行示波器的节点将为其发送的每条消息切换其第二个LED,并且当它收到来自另一个节点的示波器消息时,它将切换其第三个LED:传入消息用于序列号同步,以使节点在切换时赶上 晚于其他人; 它们还用于改变定义传感器值被读取的频率的采样率。 如果无线电连接出现问题,第一个LED将切换。
在另一个节点上安装基站并将其连接到PC。 像往常一样,在基站节点上,您应该看到第二个LED切换从无线电到串行的每条消息。
运行Java GUI
要在PC上显示传感器读数,首先转到tinyos-2.x / apps / Oscilloscope / java并键入make。 这将创建/编译必要的消息类和示波器Java GUI。 现在启动一个SerialForwarder,并确保它连接到您已安装了BaseStation应用程序的节点(如何在上一课中解释)。 如果您通过上一课有Java编译或串行连接工作的问题。
运行SerialForwarder后,您可以通过键入./run启动GUI(在tinyos-2.x / apps / Oscilloscope / java中)。 您应该看到类似下面的窗口:
每个节点由不同颜色的线表示(您可以通过单击微粒表中的颜色来更改颜色)。 x轴是包计数器数量,y轴是传感器读数。 要更改采样率,请在“采样率”输入框中编辑数字。 当您按Enter键时,将创建包含新速率的消息,并通过BaseStation节点广播到网络中的所有节点。 您可以通过单击“清除数据”按钮清除图形显示上的所有接收数据。
示波器(或感测)应用程序显示由Read.readDone()事件通知的原始数据。 如何解释这些值超出了应用程序的范围,但GUI允许您将y轴的可见部分适配到合理的范围(在右下角)。 
TOSThreads示例
已经使用TOSThreads实现了一个称为TestSineSensor的示例传感应用程序。 使用nesC和C API的实现文件分别在apps / tosthreads / apps / TestSineSensor /和apps / tosthreads / capps / TestSineSensor中。 TestSineSensor采样传感器并将读数发送到串行端口。 由于TOSThreads库使用阻塞调用替换分裂阶段系统调用,应用程序线程会阻止操作(例如发送数据包),因此不应感到惊讶。
由于微粒平台具有不同的硬件和传感器配置,因此TestSineSensor会对所有平台上提供的基于软件的SineSensor进行采样。 传感器读数发送到串行端口。 SineSensor也可用于非TOSThreads应用程序,实现文件可以在tos / system / SineSensorC.nc中找到。 为了与TestSineSensor一起使用,我们在SineSensor顶部创建了一个阻塞层(BlockingSineSensor),以提供BlockingRead接口。 BlockingSineSensor组件位于tos / lib / tosthreads / sensorboards / universal中。
 

收缩