欢迎光临
我们一直在努力

信息系统仿真:物联网系统仿真_(4).物联网仿真环境搭建

物联网仿真环境搭建

在本节中,我们将详细介绍如何搭建一个物联网仿真环境。物联网仿真环境的搭建是进行物联网系统仿真研究的基础,它可以帮助我们验证和测试各种物联网应用场景和技术方案。我们将从以下几个方面进行详细介绍:

  • 选择仿真工具
  • 安装和配置仿真工具
  • 搭建物理节点模型
  • 构建网络拓扑
  • 配置通信协议
  • 仿真数据生成
  • 仿真环境验证与调试
  • 1. 选择仿真工具

    选择合适的仿真工具是搭建物联网仿真环境的第一步。常用的物联网仿真工具包括:

    • NS-3 (Network Simulator 3): 适用于网络层和传输层的仿真,支持各种无线通信协议。
    • OMNeT++: 适用于系统级仿真,支持多种物联网设备和协议。
    • MATLAB/Simulink: 适用于数学建模和算法仿真,支持与硬件的交互。
    • COOJA: 适用于嵌入式系统和无线传感器网络的仿真,特别是Contiki操作系统。

    根据具体的研究需求,选择合适的工具是非常重要的。例如,如果您的研究重点在于网络层和传输层的性能评估,NS-3是一个很好的选择。如果您的研究涉及更多的系统级仿真和协议细节,OMNeT++可能更适合。这里我们以NS-3为例进行详细说明。

    2. 安装和配置仿真工具

    2.1 安装NS-3

    NS-3是一个开源的网络仿真器,支持多种操作系统,包括Linux、macOS和Windows。我们以Ubuntu Linux为例,介绍安装NS-3的步骤。

    2.1.1 安装依赖项

    首先,确保您的系统已经安装了必要的依赖项。打开终端,执行以下命令:

    sudo apt update
    sudo apt install build-essential autoconf automake libxmuu-dev libxmu-dev python3-pygraphviz python3-tk python3-scipy python3-matplotlib python3-cmake

    2.1.2 下载NS-3

    从NS-3的官方仓库下载最新的源代码:

    cd ~
    git clone https://github.com/nsnam/ns-3-dev.git
    cd ns-3-dev

    2.1.3 编译和安装NS-3

    执行以下命令进行编译和安装:

    ./waf configure
    ./waf build

    2.2 配置NS-3

    NS-3的配置主要包括设置仿真场景、选择仿真模块等。您可以通过编辑ns-3-dev/scratch目录下的脚本文件来配置仿真环境。

    2.2.1 创建仿真脚本

    在ns-3-dev/scratch目录下创建一个新的仿真脚本,例如iot-simulation.cc:

    // iot-simulation.cc
    #include "ns3/core-module.h"
    #include "ns3/network-module.h"
    #include "ns3/internet-module.h"
    #include "ns3/point-to-point-module.h"
    #include "ns3/applications-module.h"
    #include "ns3/mobility-module.h"
    #include "ns3/wifi-module.h"
    #include "ns3/energy-module.h"
    #include "ns3/ipv4-global-routing-helper.h"

    using namespace ns3;

    int main (int argc, char *argv[])
    {
    // Log component settings
    LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
    LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

    // Create nodes
    NodeContainer nodes;
    nodes.Create (10);

    // Internet stack
    InternetStackHelper stack;
    stack.Install (nodes);

    // Assign IPv4 addresses
    Ipv4AddressHelper address;
    address.SetBase ("10.1.1.0", "255.255.255.0");

    // Device containers
    NetDeviceContainer devices;
    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

    // Connect nodes
    devices = pointToPoint.Install (nodes.Get (0), nodes.Get (1));

    // Install applications
    UdpEchoServerHelper echoServer (9);
    ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));

    UdpEchoClientHelper echoClient (Ipv4Address ("10.1.1.2"), 9);
    echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
    echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
    echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

    ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));

    // Routing
    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

    // Run simulation
    Simulator::Run ();
    Simulator::Destroy ();

    return 0;
    }

    2.2.2 编译和运行仿真脚本

    在NS-3的根目录下,使用以下命令编译和运行仿真脚本:

    ./waf –run scratch/iot-simulation

    3. 搭建物理节点模型

    物理节点模型是仿真环境中最基本的组成部分。在NS-3中,物理节点模型可以通过NodeContainer来创建和管理。

    3.1 创建节点

    在上述示例中,我们使用了NodeContainer来创建10个节点:

    NodeContainer nodes;
    nodes.Create (10);

    3.2 配置节点属性

    您可以为每个节点配置不同的属性,例如位置、能量模型等。这里我们配置节点的位置:

    // Mobility model
    MobilityHelper mobility;
    mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
    "MinX", DoubleValue (0.0),
    "MinY", DoubleValue (0.0),
    "DeltaX", DoubleValue (50.0),
    "DeltaY", DoubleValue (50.0),
    "GridWidth", UintegerValue (10),
    "LayoutType", StringValue ("RowFirst"));
    mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
    "Bounds", RectangleValue (Rectangle (0.0, 100.0, 0.0, 100.0)));
    mobility.Install (nodes);

    3.3 配置能量模型

    能量模型是物联网仿真中非常重要的一部分,特别是对于电池供电的设备。NS-3提供了多种能量模型,例如SimpleEnergyModel:

    // Energy model
    EnergySourceHelper basicSource ("ns3::BasicEnergySource");
    DeviceEnergyModelHelper basicModel ("ns3::SimpleDeviceEnergyModel");
    basicModel.Set ("EnergySource", basicSource);

    EnergySourceContainer energySources = basicSource.Install (nodes);
    DeviceEnergyModelContainer deviceEnergyModels = basicModel.Install (energySources);

    4. 构建网络拓扑

    网络拓扑决定了节点之间的连接方式和通信路径。NS-3支持多种网络拓扑,包括点对点、星型、网格等。

    4.1 点对点拓扑

    点对点拓扑是最简单的网络拓扑,适用于基本的通信仿真。在上述示例中,我们使用了点对点拓扑:

    // Point-to-point devices
    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

    // Install devices
    NetDeviceContainer devices = pointToPoint.Install (nodes.Get (0), nodes.Get (1));

    4.2 星型拓扑

    星型拓扑适用于中心节点(如网关)与多个边缘节点之间的通信。以下是一个星型拓扑的示例:

    // Star topology
    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

    // Create central node
    NodeContainer centralNode;
    centralNode.Create (1);

    // Create peripheral nodes
    NodeContainer peripheralNodes;
    peripheralNodes.Create (9);

    // Connect peripheral nodes to central node
    NetDeviceContainer devices;
    for (uint32_t i = 0; i < peripheralNodes.GetN (); i++)
    {
    NetDeviceContainer devicePair = pointToPoint.Install (peripheralNodes.Get (i), centralNode.Get (0));
    devices.Add (devicePair);
    }

    4.3 网格拓扑

    网格拓扑适用于节点分布在网络中的多个位置,形成一个网格结构。以下是一个网格拓扑的示例:

    // Grid topology
    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

    // Create nodes
    NodeContainer nodes;
    nodes.Create (10);

    // Create grid topology
    GridPositionAllocator gridPos;
    gridPos.SetMinX (0.0);
    gridPos.SetMinY (0.0);
    gridPos.SetDeltaX (50.0);
    gridPos.SetDeltaY (50.0);
    gridPos.SetGridWidth (10);
    gridPos.SetLayoutType ("RowFirst");

    MobilityHelper mobility;
    mobility.SetPositionAllocator (gridPos);
    mobility.Install (nodes);

    // Connect nodes
    for (uint32_t i = 0; i < nodes.GetN (); i++)
    {
    for (uint32_t j = i + 1; j < nodes.GetN (); j++)
    {
    NetDeviceContainer devicePair = pointToPoint.Install (nodes.Get (i), nodes.Get (j));
    devices.Add (devicePair);
    }
    }

    5. 配置通信协议

    配置通信协议是物联网仿真中的关键步骤。NS-3支持多种无线通信协议,包括802.11、LoRa、ZigBee等。

    5.1 配置802.11协议

    802.11协议是WiFi的标准协议,适用于局域网仿真。以下是一个配置802.11协议的示例:

    // 802.11 protocol
    YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
    YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
    phy.SetChannel (channel.Create ());

    WifiHelper wifi;
    wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

    NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
    Ssid ssid = Ssid ("ns-3-ssid");
    mac.SetType ("ns3::StaWifiMac",
    "Ssid", SsidValue (ssid),
    "ActiveProbing", BooleanValue (false));

    // Install WiFi devices
    NetDeviceContainer devices = wifi.Install (phy, mac, nodes);

    5.2 配置LoRa协议

    LoRa协议适用于低功耗广域网(LPWAN)的仿真。以下是一个配置LoRa协议的示例:

    // LoRa protocol
    LoRaHelper lora;
    lora.SetChannelType ("ns3::LoRaChannel");
    lora.SetPhyType ("ns3::LoRaPhy");
    lora.SetMacType ("ns3::LoRaMac");

    NetDeviceContainer devices = lora.Install (nodes);

    5.3 配置ZigBee协议

    ZigBee协议适用于短距离无线通信,适用于智能家居等场景。以下是一个配置ZigBee协议的示例:

    // ZigBee protocol
    ZigbeeHelper zigbee;
    zigbee.SetChannelType ("ns3::SpectrumChannel");
    zigbee.SetPhyType ("ns3::ZigbeePhy");
    zigbee.SetMacType ("ns3::ZigbeeMac");

    NetDeviceContainer devices = zigbee.Install (nodes);

    6. 仿真数据生成

    仿真数据的生成是验证仿真结果的重要步骤。NS-3提供了多种应用模块,例如UdpEchoClientApplication和UdpEchoServerApplication,用于生成和接收数据包。

    6.1 生成UDP数据包

    在上述示例中,我们使用了UdpEchoClientApplication和UdpEchoServerApplication来生成和接收UDP数据包:

    // UDP Echo Server
    UdpEchoServerHelper echoServer (9);
    ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));

    // UDP Echo Client
    UdpEchoClientHelper echoClient (Ipv4Address ("10.1.1.2"), 9);
    echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
    echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
    echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

    ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));

    6.2 生成HTTP请求

    如果您需要仿真HTTP请求,可以使用HttpServerHelper和HttpClientHelper模块。以下是一个生成HTTP请求的示例:

    // HTTP Server
    HttpServerHelper httpServer (80);
    ApplicationContainer serverApps = httpServer.Install (nodes.Get (1));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));

    // HTTP Client
    HttpClientHelper httpClient (Ipv4Address ("10.1.1.2"), 80);
    httpClient.SetAttribute ("RequestInterval", TimeValue (Seconds (1.0)));
    httpClient.SetAttribute ("RequestSize", UintegerValue (1024));

    ApplicationContainer clientApps = httpClient.Install (nodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));

    7. 仿真环境验证与调试

    验证和调试仿真环境是确保仿真结果准确性和可靠性的关键步骤。NS-3提供了多种工具和方法来帮助您进行验证和调试。

    7.1 使用Logging进行调试

    NS-3的Logging功能可以帮助您记录仿真过程中的关键信息,方便调试。在上述示例中,我们使用了LogComponentEnable来启用日志记录:

    LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
    LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

    7.2 使用Traces进行数据记录

    Traces功能可以记录仿真过程中的数据包传输情况,生成详细的日志文件。以下是一个使用Traces的示例:

    // Enable packet tracing
    AsciiTraceHelper ascii;
    pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("iot-simulation.tr"));

    7.3 使用Visualizer进行可视化

    NS-3的Visualizer模块可以帮助您直观地查看仿真过程中的网络拓扑和数据包传输情况。以下是一个使用Visualizer的示例:

    // Enable visualization
    AnimationInterface anim ("iot-simulation.xml");

    7.4 运行仿真并查看结果

    编译并运行上述仿真脚本,查看日志文件和可视化结果:

    ./waf –run scratch/iot-simulation

    生成的日志文件iot-simulation.tr和可视化文件iot-simulation.xml可以使用相应的工具进行查看和分析。

    8. 高级仿真环境配置

    在搭建基本的物联网仿真环境之后,您可能需要进行一些高级配置,以模拟更复杂的物联网场景。这些高级配置包括多跳网络、动态网络拓扑和网络安全等。以下我们将详细介绍这些配置步骤。

    8.1 配置多跳网络

    多跳网络适用于复杂的物联网应用场景,例如传感器网络中的数据传输。多跳网络中,数据包需要通过多个节点进行中继传输,这可以模拟现实世界中的复杂网络环境。

    8.1.1 创建多跳网络

    在NS-3中,您可以通过创建多个PointToPointHelper实例来配置多跳网络。以下是一个配置多跳网络的示例:

    // Multi-hop network
    PointToPointHelper pointToPoint1;
    pointToPoint1.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
    pointToPoint1.SetChannelAttribute ("Delay", StringValue ("2ms"));

    PointToPointHelper pointToPoint2;
    pointToPoint2.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
    pointToPoint2.SetChannelAttribute ("Delay", StringValue ("5ms"));

    // Create nodes
    NodeContainer nodes;
    nodes.Create (3);

    // Install devices
    NetDeviceContainer devices1 = pointToPoint1.Install (nodes.Get (0), nodes.Get (1));
    NetDeviceContainer devices2 = pointToPoint2.Install (nodes.Get (1), nodes.Get (2));

    // Internet stack
    InternetStackHelper stack;
    stack.Install (nodes);

    // Assign IPv4 addresses
    Ipv4AddressHelper address;
    address.SetBase ("10.1.1.0", "255.255.255.0");
    Ipv4InterfaceContainer interfaces1 = address.Assign (devices1);
    address.SetBase ("10.1.2.0", "255.255.255.0");
    Ipv4InterfaceContainer interfaces2 = address.Assign (devices2);

    // Install applications
    UdpEchoServerHelper echoServer (9);
    ApplicationContainer serverApps = echoServer.Install (nodes.Get (2));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));

    UdpEchoClientHelper echoClient (Ipv4Address ("10.1.2.2"), 9);
    echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
    echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
    echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

    ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));

    // Routing
    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

    // Run simulation
    Simulator::Run ();
    Simulator::Destroy ();

    8.2 配置动态网络拓扑

    动态网络拓扑适用于节点位置和连接关系不断变化的场景。例如,移动的传感器节点或无人机网络。NS-3提供了多种移动性模型来模拟这种动态变化。

    8.2.1 配置动态网络拓扑

    以下是一个配置动态网络拓扑的示例:

    // Dynamic topology
    MobilityHelper mobility;
    mobility.SetPositionAllocator ("ns3::RandomBoxPositionAllocator",
    "X", StringValue ("ns3::UniformRandomVariable[Min=0.0,Max=100.0]"),
    "Y", StringValue ("ns3::UniformRandomVariable[Min=0.0,Max=100.0]"),
    "Z", StringValue ("ns3::UniformRandomVariable[Min=0.0,Max=0.0]"));

    mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
    "Bounds", RectangleValue (Rectangle (0.0, 100.0, 0.0, 100.0)));

    mobility.Install (nodes);

    // Update mobility every 1 second
    Simulator::Schedule (Seconds (1.0), &MobilityHelper::UpdatePositions, &mobility);

    8.3 配置网络安全

    物联网系统中的网络安全是一个重要的研究领域。NS-3支持多种安全机制,包括加密、认证和安全传输等。以下是一个配置网络安全的示例:

    8.3.1 配置安全传输

    NS-3可以通过SecurityHelper模块来配置安全传输。以下是一个使用AES加密的示例:

    // Security configuration
    SecurityHelper security;
    security.SetKey ("ns3::SecKeyGenerator[Aes128Ccm]");
    security.SetSink ("ns3::SecSink");

    // Install security on nodes
    security.Install (nodes);

    // Create secure applications
    UdpEchoServerHelper secureEchoServer (9);
    secureEchoServer.SetAttribute ("SecurityHelper", PointerValue (&security));

    ApplicationContainer serverApps = secureEchoServer.Install (nodes.Get (1));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));

    UdpEchoClientHelper secureEchoClient (Ipv4Address ("10.1.1.2"), 9);
    secureEchoClient.SetAttribute ("MaxPackets", UintegerValue (1));
    secureEchoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
    secureEchoClient.SetAttribute ("PacketSize", UintegerValue (1024));
    secureEchoClient.SetAttribute ("SecurityHelper", PointerValue (&security));

    ApplicationContainer clientApps = secureEchoClient.Install (nodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));

    // Run simulation
    Simulator::Run ();
    Simulator::Destroy ();

    8.4 配置多协议支持

    在实际的物联网系统中,不同类型的设备可能使用不同的通信协议。NS-3支持多种协议的混合仿真,这可以更真实地反映实际网络环境。

    8.4.1 配置多协议支持

    以下是一个配置多协议支持的示例,包括802.11和LoRa:

    // 802.11 protocol for some nodes
    YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
    YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
    wifiPhy.SetChannel (wifiChannel.Create ());

    WifiHelper wifi;
    wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

    NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
    Ssid ssid = Ssid ("ns-3-ssid");
    wifiMac.SetType ("ns3::StaWifiMac",
    "Ssid", SsidValue (ssid),
    "ActiveProbing", BooleanValue (false));

    NetDeviceContainer wifiDevices = wifi.Install (wifiPhy, wifiMac, nodes.Get (0));

    // LoRa protocol for other nodes
    LoRaHelper lora;
    lora.SetChannelType ("ns3::LoRaChannel");
    lora.SetPhyType ("ns3::LoRaPhy");
    lora.SetMacType ("ns3::LoRaMac");

    NetDeviceContainer loraDevices = lora.Install (nodes.Get (1));

    // Internet stack
    InternetStackHelper stack;
    stack.Install (nodes);

    // Assign IPv4 addresses
    Ipv4AddressHelper address;
    address.SetBase ("10.1.1.0", "255.255.255.0");
    Ipv4InterfaceContainer interfaces = address.Assign (wifiDevices);
    address.SetBase ("10.1.2.0", "255.255.255.0");
    interfaces.Add (address.Assign (loraDevices));

    // Routing
    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

    // Install applications
    UdpEchoServerHelper echoServer (9);
    ApplicationContainer serverApps = echoServer.Install (nodes.Get (2));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));

    UdpEchoClientHelper echoClient (Ipv4Address ("10.1.2.2"), 9);
    echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
    echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
    echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

    ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));

    // Run simulation
    Simulator::Run ();
    Simulator::Destroy ();

    9. 仿真结果分析

    在完成仿真后,分析仿真结果是验证仿真有效性和优化系统设计的重要步骤。NS-3提供了多种工具和方法来分析仿真结果。

    9.1 使用日志文件分析

    NS-3生成的日志文件包含了仿真过程中的各种信息,包括数据包传输、节点状态变化等。您可以使用文本编辑器或日志分析工具来查看这些日志文件。

    例如,查看生成的iot-simulation.tr文件:

    cat iot-simulation.tr

    9.2 使用可视化工具分析

    NS-3的Visualizer模块生成的XML文件可以使用NS-3可视化工具(如NetAnim)来查看网络拓扑和数据包传输情况。

    例如,使用NetAnim查看iot-simulation.xml文件:

    netanim iot-simulation.xml

    9.3 使用数据处理工具分析

    您还可以使用MATLAB、Python等数据处理工具来分析仿真结果。例如,使用Python读取日志文件并进行分析:

    import re

    # Read the trace file
    with open('iot-simulation.tr', 'r') as file:
    lines = file.readlines()

    # Parse the trace file
    for line in lines:
    match = re.match(r'(\\d+\\.\\d+) (\\S+) (\\S+) (\\S+)', line)
    if match:
    time = float(match.group(1))
    event = match.group(2)
    node_id = int(match.group(3))
    packet_id = int(match.group(4))
    print(f"Time: {time}, Event: {event}, Node ID: {node_id}, Packet ID: {packet_id}")

    10. 总结

    通过上述步骤,您可以搭建一个基本的物联网仿真环境,并进行多跳网络、动态网络拓扑和网络安全等高级配置。NS-3是一个功能强大的网络仿真工具,能够帮助您验证和测试各种物联网应用场景和技术方案。 在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » 信息系统仿真:物联网系统仿真_(4).物联网仿真环境搭建
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址