diff --git a/CarService.cc b/CarService.cc index 6bdfb10e88f7e7ce5c7f754d909873dec2a5c6e9..a0722b81041e9d427d7ced5ae9b3ade7ba4a262f 100644 --- a/CarService.cc +++ b/CarService.cc @@ -1,34 +1,33 @@ +#include <algorithm> +#include <math.h> #include <omnetpp.h> #include <stdlib.h> -#include <math.h> -#include <algorithm> -#include "artery/traci/VehicleController.h" -#include "artery/traci/MobilityBase.h" -#include "artery/application/CaService.h" -#include "artery/application/CaObject.h" #include "artery/application/Asn1PacketVisitor.h" +#include "artery/application/CaObject.h" +#include "artery/application/CaService.h" #include "artery/application/VehicleDataProvider.h" +#include "artery/traci/MobilityBase.h" +#include "artery/traci/VehicleController.h" #include <boost/units/cmath.hpp> #include <boost/units/systems/si/prefixes.hpp> -#include <vanetza/btp/data_request.hpp> -#include <vanetza/dcc/profile.hpp> -#include <vanetza/geonet/interface.hpp> #include <vanetza/asn1/cam.hpp> #include <vanetza/asn1/its/CAM.h> -#include <vanetza/asn1/its/ItsPduHeader.h> #include <vanetza/asn1/its/CoopAwareness.h> +#include <vanetza/asn1/its/ItsPduHeader.h> +#include <vanetza/btp/data_request.hpp> #include <vanetza/btp/ports.hpp> #include <vanetza/common/byte_order.hpp> +#include <vanetza/dcc/profile.hpp> +#include <vanetza/geonet/interface.hpp> - -#include <vanetza/asn1/its/MisbehaviorReportNZKP.h> #include <vanetza/asn1/its/MisbehaviorReport.h> +#include <vanetza/asn1/its/MisbehaviorReportNZKP.h> -#include "HelpFunctions.hpp" #include "Crust.h" +#include "HelpFunctions.hpp" #include "art/NZKPObject.h" #include "CarService.h" @@ -36,7 +35,6 @@ using namespace omnetpp; using namespace vanetza; - auto microdegree = vanetza::units::degree * boost::units::si::micro; auto decidegree = vanetza::units::degree * boost::units::si::deci; auto degree_per_second = vanetza::units::degree / vanetza::units::si::second; @@ -47,250 +45,180 @@ static const simsignal_t scSignalCamSent = cComponent::registerSignal("CamSent") static const simsignal_t scSignalNZKPSent = cComponent::registerSignal("NZKPSent"); - static const auto scLowFrequencyContainerInterval = std::chrono::milliseconds(500); - Define_Module(CarService); void CarService::finish() { - EV << "time misbehaviour detected for " << mVehicleDataProvider->getStationId() << "/" << mVehicleController->getVehicleId() << " : " << numReceieved << endl; - delete mLocalDynamicMap; - delete vehicleScope; -} + EV << "time misbehaviour detected for " << mVehicleDataProvider->getStationId() << "/" + << mVehicleController->getVehicleId() << " : " << misbehaviourDetectedTime << ", nzkp verified : -1" + << ", already known malicious ITS detected : -1" << endl; -void CarService::initialize() -{ - EV_STATICCONTEXT; - Enter_Method("CarService initialize"); - CaService::initialize(); + delete mLocalDynamicMap; + delete vehicleScope; +} - mVehicleController = &getFacilities().get_mutable<traci::VehicleController>(); - mVehicleController->setMaxSpeed(10 * units::si::meter_per_second); +void CarService::initialize() { + EV_STATICCONTEXT; + Enter_Method("CarService initialize"); + CaService::initialize(); - mVehicleDataProvider = &getFacilities().get_const<artery::VehicleDataProvider>(); + mVehicleController = &getFacilities().get_mutable<traci::VehicleController>(); + mVehicleController->setMaxSpeed(10 * units::si::meter_per_second); - mTimer = &getFacilities().get_const<artery::Timer>(); - mLocalDynamicMap = new artery::LocalDynamicMap2(*(mTimer)); + mVehicleDataProvider = &getFacilities().get_const<artery::VehicleDataProvider>(); + mTimer = &getFacilities().get_const<artery::Timer>(); + mLocalDynamicMap = new artery::LocalDynamicMap2(*(mTimer)); - std::shared_ptr<traci::API> traci_API = mVehicleController->getTraCI(); - vehicleScope = (traci::API::VehicleScope*)malloc(sizeof(traci::API::VehicleScope)); - new (vehicleScope) traci::API::VehicleScope(*traci_API); - // Does vehicles have POIs by default? If not, adding a POI is necessary if no other way is possible. - standardColor = vehicleScope->getColor(mVehicleController->getVehicleId()); + std::shared_ptr<traci::API> traci_API = mVehicleController->getTraCI(); + vehicleScope = (traci::API::VehicleScope *)malloc(sizeof(traci::API::VehicleScope)); + new (vehicleScope) traci::API::VehicleScope(*traci_API); + // Does vehicles have POIs by default? If not, adding a POI is necessary if no other way is possible. + standardColor = vehicleScope->getColor(mVehicleController->getVehicleId()); - EV << " car init" << endl; + EV << " car init" << endl; - maliciousVehicles = {}; - numSent = 0; - numReceieved = -1; - evilness = 0; - u_int32_t stationID = mVehicleDataProvider->getStationId(); - WATCH(stationID); - WATCH(vectorString); - WATCH(numSent); - WATCH(numReceieved); - WATCH(evilness); + maliciousVehicles = {}; + numSent = 0; + evilness = 0; + u_int32_t stationID = mVehicleDataProvider->getStationId(); + WATCH(stationID); + WATCH(vectorString); + WATCH(numSent); + WATCH(misbehaviourDetectedTime); + WATCH(evilness); +} +void CarService::trigger() { + numSent += 1; + updateVectorString(); + CaService::trigger(); + time_t t = time(NULL); + Enter_Method("CarService trigger"); } -void CarService::trigger() -{ - numSent += 1; - updateVectorString(); - CaService::trigger(); - time_t t = time(NULL); - Enter_Method("CarService trigger"); +void CarService::indicate(const vanetza::btp::DataIndication &ind, std::unique_ptr<vanetza::UpPacket> packet) { + Enter_Method("CarService indicate"); + artery::Asn1PacketVisitor<vanetza::asn1::Cam> visitor; + const vanetza::asn1::Cam *message = boost::apply_visitor(visitor, *packet); -} + // 294.025 400.75 <- cPos nPos -> 18220 35400 + const artery::Position carPos = mVehicleDataProvider->position(); -void CarService::indicate(const vanetza::btp::DataIndication& ind, std::unique_ptr<vanetza::UpPacket> packet) { - Enter_Method("CarService indicate"); - artery::Asn1PacketVisitor<vanetza::asn1::Cam> visitor; - const vanetza::asn1::Cam* message = boost::apply_visitor(visitor, *packet); + // ->speed() returns m/s. km/h used in comparison. + double carSpeed = boost::units::quantity_cast<double>(mVehicleDataProvider->speed()) * 3.6; - // 294.025 400.75 <- cPos nPos -> 18220 35400 - const artery::Position carPos = mVehicleDataProvider->position(); - - // ->speed() returns m/s. km/h used in comparison. - double carSpeed = boost::units::quantity_cast<double>(mVehicleDataProvider->speed()) * 3.6; + if (message) { + artery::CaObject obj = visitor.shared_wrapper; - if (message) { - artery::CaObject obj = visitor.shared_wrapper; - - const vanetza::asn1::Cam& msg = obj.asn1(); + const vanetza::asn1::Cam &msg = obj.asn1(); - // CAMs store long/lat in 10s of microdegrees. - artery::Position nPos = getPositionFromCam(msg); + unsigned long fromStationID = msg->header.stationID; - unsigned long fromStationID = msg->header.stationID; + EV << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - EV << " DISTANCE: " << artery::distance(nPos, carPos).value() << " :ecnatsid "; - EV << nPos.x.value() << " " << nPos.y.value() << " 1-pos-2 " << carPos.x.value() << " " << carPos.y.value() << " "; - EV << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - //EV << "WITHIN DISTANCE " << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - // For simulation purposes, cars outside range are out of range. - /* - if (artery::distance(nPos, carPos).value() > SAFE_DISTANCE) { - EV << "RETURN " << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - return; - } - */ - - long fromGenDeltaTime = msg->cam.generationDeltaTime; - - u_int latestMessage = 0; - long timeDiff = LONG_MAX; - - // Find the latest message by fromStationID. - for(auto& x : mLocalDynamicMap->mCaMessages) { - if (x.first != fromStationID) continue; - - const vanetza::asn1::Cam& msg = x.second.object.asn1(); - long genDeltaTime = msg->cam.generationDeltaTime; - - if (fromGenDeltaTime - genDeltaTime < timeDiff) { - latestMessage = x.first; - timeDiff = fromGenDeltaTime - genDeltaTime; - } - } - - auto mapIt = mLocalDynamicMap->mCaMessages.find(latestMessage); - if (mapIt != mLocalDynamicMap->mCaMessages.end()) { - const vanetza::asn1::Cam& msg2 = mapIt->second.object.asn1(); - - double acc = checkCAM(msg2, msg); - - // Check for misbehaviour from new nodes. - if (acc > 0) { - numReceieved = mVehicleController->getTraCI()->simulation.getTime(); - std::array<char, 1024>* proof = new std::array<char, 1024>; - std::cerr << "Create proof " << std::endl; - const size_t p = create_proof(10 * acc, proof); - size_t status = verify_proof(proof, p); - std::cerr << "p: " << p << std::endl; - - std::cerr << "create mr nzkp " << std::endl; - vanetza::asn1::Nzkp mrNZKP = CarService::createMrNZKP(acc, msg, msg2, proof, p); - bool val = mrNZKP.validate(); - - bool success = CarService::sendMrNZKP(simTime(), mrNZKP); - - - std::cerr << "vali: " << val << ", status: " << status << std::endl; - if (status == 0) { - EV << "PROOF CREATED (SIZE: " << p << ") AND VERIFIED" << endl; - } else { - EV << "PROOF CREATED (SIZE: " << p << ") NOT VALID" << endl; - } - // mVehicleController->setMaxSpeed(5 * units::si::meter_per_second); - EV << "SLOW DOWN "; - EV << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - - // std::shared_ptr<traci::API> traci_API = mVehicleController->getTraCI(); - // vehicleScope->setColor(mVehicleController->getVehicleId(), libsumo::TraCIColor(0, 0, 255)); - std::cerr << "SEND MR NZKP IN TEH HAAOAOUSUUSE" << std::endl; - } else if (std::find(maliciousVehicles.begin(), maliciousVehicles.end(), msg->header.stationID) == maliciousVehicles.end()) { - EV << "ASDKLFASDFKL STEADY ON1 " << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - evilness -= 1; - } else EV << "ASDKLFJASDFKLJ STEADY ON2 " << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - } - - EV << " RECEIVED CAM " << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << " " << (double)mVehicleController->getTraCI()->simulation.getCurrentTime()/1000 << endl; - // emit(scSignalCamReceived, &obj); - mLocalDynamicMap->dropExpired(); - mLocalDynamicMap->updateAwareness(obj); - } -} + long fromGenDeltaTime = msg->cam.generationDeltaTime; -void CarService::updateVectorString() { - std::stringstream mVehStr; - std::copy(maliciousVehicles.begin(), maliciousVehicles.end(), std::ostream_iterator<unsigned long>(mVehStr, " ")); - vectorString = mVehStr.str(); -} + u_int latestMessage = -1; + long timeDiff = LONG_MAX; + long genDeltaTime = 0; + + // Find the latest message by fromStationID. + for (auto &x : mLocalDynamicMap->mCaMessages) { + if (x.first != fromStationID) + continue; -double CarService::checkCAM(const vanetza::asn1::Cam& cam1, const vanetza::asn1::Cam& cam2) { - // centimeter per second in the CAM. - double speed1 = (double)cam1->cam.camParameters.highFrequencyContainer.choice.basicVehicleContainerHighFrequency.speed.speedValue/100; - double speed2 = (double)cam2->cam.camParameters.highFrequencyContainer.choice.basicVehicleContainerHighFrequency.speed.speedValue/100; - - // Milliseconds in the CAM. - double genDeltaTime1 = (double)cam1->cam.generationDeltaTime/1000; - double genDeltaTime2 = (double)cam2->cam.generationDeltaTime/1000; - - unsigned long vehicleID = cam1->header.stationID; - - double acceleration = (speed1 - speed2)/(genDeltaTime1 - genDeltaTime2); - EV_INFO << "ACC: " << abs(acceleration) << " " << speed1 << " 1-speed-2 " << speed2 << " " << genDeltaTime1 << " 1-time-2 " << genDeltaTime2 << " "; - EV_INFO << cam1->header.stationID << " 1-id-2 " << cam2->header.stationID << endl; - bool misbehaviour = abs(acceleration) > 20; - if (misbehaviour && std::find(maliciousVehicles.begin(), maliciousVehicles.end(), vehicleID) == maliciousVehicles.end()) { - EV << "YOU JUST MADE THE LIST BITCH " << cam1->header.stationID << " bitch-id-me " << mVehicleDataProvider->getStationId() << endl;; - maliciousVehicles.push_back(vehicleID); - return acceleration; + const vanetza::asn1::Cam &msg = x.second.object.asn1(); + genDeltaTime = msg->cam.generationDeltaTime; + + if (fromGenDeltaTime - genDeltaTime < timeDiff) { + latestMessage = x.first; + timeDiff = fromGenDeltaTime - genDeltaTime; + } } - return -1; -} - -vanetza::asn1::Nzkp CarService::createMrNZKP(const double acc, const vanetza::asn1::Cam& cam1, const vanetza::asn1::Cam& cam2, std::array<char, 1024>* proof, size_t p) { - std::cerr << "create mr nzkp start" << std::endl; - vanetza::asn1::Nzkp MRnzkp; + EV << "LATEST MESSAGE: " << latestMessage << endl; + auto mapIt = mLocalDynamicMap->mCaMessages.find(latestMessage); + if (mapIt != mLocalDynamicMap->mCaMessages.end()) { + const vanetza::asn1::Cam &msg2 = mapIt->second.object.asn1(); + EV << "OTHER CAM FOUND " << mVehicleDataProvider->getStationId() << endl; - Header& h = (*MRnzkp).header; - h.messageID = 1; - h.stationID = mVehicleDataProvider->getStationId(); + double acc = abs(checkCAM(msg2, msg)); - - Payload& payload = (*MRnzkp).payload; + // Check for misbehaviour from new nodes. + if (acc > 0) { + if (misbehaviourDetectedTime == -1) + misbehaviourDetectedTime = mVehicleController->getTraCI()->simulation.getTime(); - OCTET_STRING octComitV = {}; - octComitV.buf = new u_int8_t[32]; - memcpy(octComitV.buf, proof->data(), 32); - octComitV.size = 32; - payload.nkzp.committedValue = octComitV; + vehicleScope->setColor(mVehicleController->getVehicleId(), libsumo::TraCIColor(0, 0, 255)); - OCTET_STRING octProof = {}; - octProof.buf = new u_int8_t[p-32]; - memcpy(octProof.buf, proof->data() + 32, p-32); - octProof.size = p-32; - payload.nkzp.proof = octProof; + EV << "SLOW DOWN "; + EV << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << endl; - delete proof; - std::cerr << "create mr nzkp end" << std::endl; - return MRnzkp; + if (std::find(maliciousVehicles.begin(), maliciousVehicles.end(), msg->header.stationID) == + maliciousVehicles.end()) { + EV << "ASDKLFASDFKL STEADY ON1 " << msg->header.stationID << " 1-id-2 " + << mVehicleDataProvider->getStationId() << endl; + evilness -= 1; + } else + EV << "ASDKLFJASDFKLJ STEADY ON2 " << msg->header.stationID << " 1-id-2 " + << mVehicleDataProvider->getStationId() << endl; + + EV << " RECEIVED CAM " << msg->header.stationID << " 1-id-2 " << mVehicleDataProvider->getStationId() << " " + << (double)mVehicleController->getTraCI()->simulation.getCurrentTime() / 1000 << endl; + // mLocalDynamicMap->dropExpired(); + } + } else { + EV << "NO OTHER CAM FOUND " << mVehicleDataProvider->getStationId() << endl; + } + emit(scSignalCamReceived, &obj); + mLocalDynamicMap->updateAwareness(obj); + + } else { + EV << "MESSAGE IS FALSE" << endl; + } +} + +void CarService::updateVectorString() { + std::stringstream mVehStr; + std::copy(maliciousVehicles.begin(), maliciousVehicles.end(), std::ostream_iterator<unsigned long>(mVehStr, " ")); + vectorString = mVehStr.str(); } -bool CarService::sendMrNZKP(const omnetpp::SimTime& simTime, vanetza::asn1::Nzkp& mrNZKP) { - - std::cerr << "SEND MR NZKP IN TEH HAAOAOUSUUSE 1234123412341234" << std::endl; - using namespace vanetza; - btp::DataRequestB request; - request.destination_port = host_cast<uint16_t>(2345); - request.gn.its_aid = aid::MR; - request.gn.transport_type = geonet::TransportType::SHB; - request.gn.maximum_lifetime = geonet::Lifetime { geonet::Lifetime::Base::One_Second, 1 }; - request.gn.traffic_class.tc_id(static_cast<unsigned>(dcc::Profile::DP2)); - request.gn.communication_profile = geonet::CommunicationProfile::ITS_G5; - - unsigned char* b1 = (*mrNZKP).payload.nkzp.proof.buf; - unsigned char* b2 = (*mrNZKP).payload.nkzp.committedValue.buf; - - artery::NZKPObject obj(std::move(mrNZKP)); - emit(scSignalNZKPSent, &obj); - - using NZKPByteBuffer = convertible::byte_buffer_impl<asn1::Nzkp>; - NZKPByteBuffer* b = new NZKPByteBuffer(obj.shared_ptr()); - size_t bSize = b->size(); - - std::unique_ptr<geonet::DownPacket> payload { new geonet::DownPacket() }; - std::unique_ptr<convertible::byte_buffer> buffer { b }; - payload->layer(OsiLayer::Application) = std::move(buffer); - this->request(request, std::move(payload)); - std::cerr << "NZKP send " << std::endl; - //delete b1; - //delete b2; - return true; +double CarService::checkCAM(const vanetza::asn1::Cam &cam1, const vanetza::asn1::Cam &cam2) { + // centimeter per second in the CAM. + double speed1 = + (double) + cam1->cam.camParameters.highFrequencyContainer.choice.basicVehicleContainerHighFrequency.speed.speedValue / + 100; + double speed2 = + (double) + cam2->cam.camParameters.highFrequencyContainer.choice.basicVehicleContainerHighFrequency.speed.speedValue / + 100; + + // Milliseconds in the CAM. + double genDeltaTime1 = (double)cam1->cam.generationDeltaTime / 1000; + double genDeltaTime2 = (double)cam2->cam.generationDeltaTime / 1000; + + unsigned long vehicleID = cam1->header.stationID; + + double acceleration = (speed1 - speed2) / (genDeltaTime1 - genDeltaTime2); + EV << "ACC: " << abs(acceleration) << " " << speed1 << " 1-speed-2 " << speed2 << " " << genDeltaTime1 << " 1-time-2 " + << genDeltaTime2 << " "; + EV << cam1->header.stationID << " 1-id-2 " << cam2->header.stationID + << ", CHECKED BY: " << mVehicleDataProvider->getStationId() << endl; + + bool misbehaviour = abs(acceleration) > 20; + if (misbehaviour && + std::find(maliciousVehicles.begin(), maliciousVehicles.end(), vehicleID) == maliciousVehicles.end()) { + EV << "YOU JUST MADE THE LIST BITCH " << cam1->header.stationID << " bitch-id-me " + << mVehicleDataProvider->getStationId() << endl; + ; + maliciousVehicles.push_back(vehicleID); + return acceleration; + } else + acceleration = -1; + return acceleration; } \ No newline at end of file diff --git a/CarService.h b/CarService.h index 7632264c9fb717ef8739c89491f2c800130bf3dc..982d1712cd0d52e74eeb88b10daa155ae211d606 100644 --- a/CarService.h +++ b/CarService.h @@ -3,48 +3,53 @@ #include <vector> -#include "artery/application/ItsG5BaseService.h" #include "artery/application/CaService.h" +#include "artery/application/ItsG5BaseService.h" #include "../scenario1-artery/art/LocalDynamicMap2.h" #include <vanetza/asn1/its/MisbehaviorReportNZKP.h> - -namespace traci { class VehicleController; } - -namespace artery { - class VehicleDataProvider; class LocalDynamicMap2; class Timer; +namespace traci { +class VehicleController; } +namespace artery { +class VehicleDataProvider; +class LocalDynamicMap2; +class Timer; +} // namespace artery /* CarService broadcasts CAMs to the surroundings. */ -class CarService : public artery::CaService -{ - private: - long numSent; - double numReceieved; - long evilness; - std::vector<unsigned long> maliciousVehicles; - void updateVectorString(); - std::string vectorString; - libsumo::TraCIColor standardColor; - double checkCAM(const vanetza::asn1::Cam&, const vanetza::asn1::Cam&); - bool sendMrNZKP(const omnetpp::SimTime&, vanetza::asn1::Nzkp&); - vanetza::asn1::Nzkp createMrNZKP(const double, const vanetza::asn1::Cam&, const vanetza::asn1::Cam&, std::array<char, 1024>*, const size_t); - public: - void trigger() override; - void initialize() override; - void finish() override; - void indicate(const vanetza::btp::DataIndication&, std::unique_ptr<vanetza::UpPacket>) override; - protected: - traci::VehicleController* mVehicleController = nullptr; - const artery::VehicleDataProvider* mVehicleDataProvider = nullptr; - artery::LocalDynamicMap2* mLocalDynamicMap = nullptr; - const artery::Timer* mTimer = nullptr; - traci::API::VehicleScope* vehicleScope = nullptr; +class CarService : public artery::CaService { +private: + long numSent; + double misbehaviourDetectedTime; + long evilness; + std::vector<unsigned long> maliciousVehicles; + void updateVectorString(); + std::string vectorString; + libsumo::TraCIColor standardColor; + double checkCAM(const vanetza::asn1::Cam &, const vanetza::asn1::Cam &); + bool sendMrNZKP(const omnetpp::SimTime &, vanetza::asn1::Nzkp &); + vanetza::asn1::Nzkp createMrNZKP(const double, const vanetza::asn1::Cam &, const vanetza::asn1::Cam &, + std::array<char, 1024> *, const size_t); + +public: + CarService() : misbehaviourDetectedTime{-1} {} + void trigger() override; + void initialize() override; + void finish() override; + void indicate(const vanetza::btp::DataIndication &, std::unique_ptr<vanetza::UpPacket>) override; + +protected: + traci::VehicleController *mVehicleController = nullptr; + const artery::VehicleDataProvider *mVehicleDataProvider = nullptr; + artery::LocalDynamicMap2 *mLocalDynamicMap = nullptr; + const artery::Timer *mTimer = nullptr; + traci::API::VehicleScope *vehicleScope = nullptr; }; #endif /* CARSERVICE_H_ */ diff --git a/omnetpp.ini b/omnetpp.ini index 1b74248b4c497cf98493af4f1d8c7266f19f2992..fa7481a51d98164dd6b7045a684ca57b6b888df3 100644 --- a/omnetpp.ini +++ b/omnetpp.ini @@ -27,8 +27,7 @@ cmdenv-output-file = "log.log" *.node[*].wlan[*].typename = "VanetNic" *.node[*].wlan[*].radio.channelNumber = 180 *.node[*].wlan[*].radio.carrierFrequency = 5.9 GHz -*.node[*].wlan[*].radio.transmitter.power = 10 mW - +*.node[*].wlan[*].radio.transmitter.power = 0.009 mW *.node[*].middleware.updateInterval = 0.05s *.node[*].middleware.datetime = "2018-03-19 10:00:00" @@ -44,7 +43,7 @@ cmdenv-output-file = "log.log" *.node[*].wlan[*].typename = "VanetNic" *.node[*].wlan[*].radio.channelNumber = 180 *.node[*].wlan[*].radio.carrierFrequency = 5.9 GHz -*.node[*].wlan[*].radio.transmitter.power = 10 mW +*.node[*].wlan[*].radio.transmitter.power = 0.009 mW *.node[*].middleware.updateInterval = 0.3s *.node[*].middleware.datetime = "2013-06-01 12:35:00"