当前位置: 首页 > 知识库问答 >
问题:

在Cooja/Contiki上模拟不同的温度

艾自强
2023-03-14

我在Cooja上读不到不同的温度读数。我做了以下工作:

  • 创建了一个初始化灯光和温度传感器的源文件
  • 使用天空微尘创建了模拟
  • 使用8个微尘网络运行模拟

每个微尘的读数都是相同的温度,这对我想要的东西是无用的。在过去的8个小时里,我一直在浏览线程、文档(包括Contiki wiki),但没有找到任何东西。

如果我误解了Cooja/Contiki的工作方式,我也希望得到一些帮助,但是,底线是,我如何模拟模拟环境中的微粒传感器可以读取的不同温度?

共有2个答案

梁丘琛
2023-03-14

以下是z1 mote的示例(根据kfx答案中的链接进行了大量修改):

/**
 * @{
 * \file
 *         Method for simulating environmental temperatures for z1 sensors in COOJA
 *         Three temperature simulation methods are included:
 *              - fixed value
 *              - a slider UI that can be set in the Cooja simulation interface
 *              - a mathematical formula that links temperature to position; this
 *                  has the effect of simulating a cold spot in a very hot environment.
 * \author
 *         Dave Hirsch
 */

package org.contikios.cooja.mspmote;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridLayout;
import java.util.Collection;

import javax.swing.JSlider;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;


import java.util.logging.*;
import org.jdom.Element;

import org.contikios.cooja.ClassDescription;
import org.contikios.cooja.Mote;
import org.contikios.cooja.MoteInterface;
import org.contikios.cooja.MoteInterfaceHandler;
import org.contikios.cooja.interfaces.Position;
import org.contikios.cooja.Simulation;
import org.contikios.cooja.interfaces.Button;
import org.contikios.cooja.mspmote.MspMoteTimeEvent;
import org.contikios.cooja.mspmote.Z1Mote;
import se.sics.mspsim.core.ADC12;
import se.sics.mspsim.core.ADCInput;
import se.sics.mspsim.core.IOUnit;

@ClassDescription("Z1 Temp sensor")
public class Z1TempInt extends MoteInterface {
    private static Logger logger = Logger.getLogger("org.contikios.cooja.mspmote.interfaces.Z1Temp");
    private static int lastVal = -1;
    private IOUnit adc = null;

    private Z1Mote z1Mote = null;

    protected class ADCfixed implements ADCInput {
        private int fixedVal;
        public ADCfixed(int inp) {
            logger.log(Level.FINE, "In ADCfixed. ");
            fixedVal = inp;
        }

        public int nextData(){
            return fixedVal;
        }

    }

    protected class ADCsliderVal implements ADCInput {
        private JSlider myslider; 

        public ADCsliderVal(JSlider slider){
            logger.log(Level.FINE, "In ADCsliderVal(). ");
            myslider = slider;
        }

        public int nextData(){
            if (myslider == null) {
                return 88;
            } else {
                if (myslider.getValue() != lastVal) {
                    lastVal = myslider.getValue();
                    logger.log(Level.FINE, "DMH-new value: " + myslider.getValue() );
                }
                return myslider.getValue();
            }  
        }
    }

    protected class ADCTempPos implements ADCInput {

        public ADCTempPos(){
            logger.log(Level.FINE, "In ADCTempPos(). ");
        }

        public int nextData(){
            if (getZ1Mote() == null) {
                return 87;
            } else {
                Position pos = getZ1Mote().getInterfaces().getPosition();
                double x = pos.getXCoordinate();
                double y = pos.getYCoordinate();
                return (int) Math.floor(Math.sqrt(x*x + y*y));
            }  
        }
    }

    public Z1TempInt(Mote mote) {
        z1Mote = (Z1Mote) mote;

        try {
            Handler fh = new FileHandler("/home/user/contiki/Z1Temp.log");
            logger.addHandler(fh);
            logger.setLevel(Level.FINEST);
        } catch (Exception ex) {
            return;
        }
        logger.log(Level.FINE, "Creating Z1Temp object.");
        adc = z1Mote.getCPU().getIOUnit("ADC12");
        String adcClass = adc.getClass().getSimpleName();
        logger.log(Level.FINE, "ADC is:" + adc);
        if (adc instanceof ADC12) {
            logger.log(Level.FINE, "ADC is an ADC12.");
            ((ADC12) adc).setADCInput(10, new ADCTempPos());
        }

    }

    public Z1Mote getZ1Mote() {
        return z1Mote;
    }

    public JPanel getInterfaceVisualizer() {
        JPanel panel = new JPanel(new GridLayout(2,0));
        final JSlider sADC1 = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 25);
        panel.add(new JLabel("Temperature:"));
        panel.add(sADC1);
        logger.log(Level.FINE, "Setting up panel");
        if (adc != null) {
            logger.log(Level.FINE, "Connecting ADC to slider");
            ((ADC12) adc).setADCInput(10, new ADCsliderVal(sADC1));
        }
        return panel;
    }

    public void releaseInterfaceVisualizer(JPanel panel) {
    }

    public Collection<Element> getConfigXML() {
        return null;
    }

    public void setConfigXML(Collection<Element> configXML, boolean visAvailable) {
    }
}
呼延修然
2023-03-14

默认情况下,Cooja/MSPsim不会尝试模拟真实的传感器读数。为此,需要扩展MSPsim的Java代码。

读取sky上的温度传感器只意味着读取ADC端口。这意味着要在该端口上模拟自定义读数,您需要在该端口上设置自定义ADCInput。

这是一个简单的示例,这是一个高级示例(它还展示了如何模拟DAC)。

代码改编自第一个链接:

private SkyMote skyMote;

private final int MY_VALUE = 123;

protected class MyADC implements ADCInput {
   private int fixedValue;

   public MyADC(int value) {
       fixedValue = value;
   }
   public int nextData() {
       return fixedValue;
   }
}

// temperature sensor on sky is on ADC port 10
IOUnit temperatureADC = skyMote.getCPU().getIOUnit("ADC10");
if (temperatureADC instanceof ADC12) {
   ((ADC12) temperatureADC).setADCInput(4, new MyADC(MY_VALUE));
}
 类似资料:
  • 我正在尝试在Cooja/Contiki上启动我的第一个模拟器,但出现以下错误:

  • 我目前正在Cooja运行模拟,以使用有向图无线电模型模拟WSN。 由于研究需要,我需要使用脚本动态更改DGRM Configurator中节点之间的数据包接收率。请问如何在Cooja模拟sapts中更改节点之间的PRR?

  • 我的能量估计在天空尘埃的Cooja模拟中没有意义。我想在加密之前和之后读取CPU、TX和RX值,并将数据从一个mote传输到另一个mote。总CPU的读数开始增加,但几轮之后又突然下降。我的理解是,它们不会重置,但会显示点击总数。因此,我从当前值中减去旧值以显示每个时期的消耗量。 这里是我调用的最强大的函数 这里有一些输出: 正如您所看到的,这些值并不相加。我错过了什么?ENERGEST\u开/关

  • 我已经包含了头文件套接字。h在contiki rpl控制消息文件中,但它给出了一个找不到目录/文件的错误。问题是,在一个单独的C文件中编写的客户机/服务器代码工作正常,但只要我复制代码并将其放入cooja中,它就找不到文件。我需要将一些数据从cooja contiki发送到nodejs服务器。如何做到这一点?

  • 我正在尝试使用Contiki 3.0和Cooja模拟器对RPL协议进行一些模拟。我正在使用sky motes,我想看看DODAG是如何形成的,并使用Collect视图监视网络的参数。我有一些问题: 1) 在何处以及如何更改目标函数? 2) 我的传感器能耗为1mW,我认为对于实际应用来说太多了,因为传感器需要工作几年 3)我可以在哪里更改模拟的其他参数?比如Tx/Rx数据包? 4) 如何解释coll

  • 我正在使用一个udp服务器和几个udp客户端在Contiki-NG中进行一个项目。到目前为止,我一直只使用这些固件,在Contiki Cooja中模拟为Sky Motes,但现在我需要添加一个RPL边界路由器,它将是DAG根,以便使用tunSlip6工具执行ping。 然而,我似乎无法按照github中提供的教程中的说明编译此工具。。。examples文件夹中的自述文件说:“它支持两种主要的操作模