1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đánh giá hiệu năng mạng cảm biến không dây

109 48 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 109
Dung lượng 1,13 MB

Nội dung

Đánh giá hiệu năng mạng cảm biến không dây Đánh giá hiệu năng mạng cảm biến không dây Đánh giá hiệu năng mạng cảm biến không dây luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp luận văn tốt nghiệp,luận văn thạc sĩ, luận văn cao học, luận văn đại học, luận án tiến sĩ, đồ án tốt nghiệp

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - LUẬN VĂN THẠC SĨ KỸ THUẬT ĐÁNH GIÁ HIỆU NĂNG MẠNG CẢM BIẾN KHÔNG DÂY NGÀNH: CÔNG NGHỆ THÔNG TIN MÃ SỐ:23.04.3898 BÙI THỊ HÀ Người hướng dẫn khoa học: TS NGÔ QUỲNH THU Hà Nội 2013 TÓM TẮT LUẬN VĂN Ngày nay, nhờ tiến vượt bậc khoa học công nghệ với ưu như: giá thành rẻ, khả triển khai với số lượng thiết bị lớn, tiêu thụ lượng, khả mở rộng dễ dàng, đa chức năng, chi phí bảo trì thấp, mạng cảm biến không dây ngày sử dụng rộng rãi lĩnh vực đời sống như: y tế, qn sự, mơi trường, giao thơng Có nhiều vấn đề đặt cho mạng cảm biến không dây vấn đề tiêu hao lượng, thời gian sống mạng, vấn đề đồng sensor Năng lượng yếu tố quan trọng tất loại mạng Với mạng cảm biến không dây, tính đặc thù mạng hạn chế phần cứng ứng dụng nhiều vùng địa lý phức tạp nên vấn đề lượng trở nên quan trọng Trong khuôn khổ luận văn tập trung nghiên cứu tìm hiểu mạng cảm biến khơng dây, thông số để đánh giá hiệu mạng cảm biến không dây định tuyến mạng cảm biến khơng dây Bên cạnh luận văn có sử dụng giao thức định tuyến LEACH cài đặt chạy OMNET với nhiều kịch mơ hình mạng Kết cho thấy rõ nét thông số ảnh hưởng đến tuổi thọ mạng cảm biến không dây LỜI CAM ĐOAN Tôi xin cam đoan luận văn không chép tài liệu sử dụng (ngoại trừ bảng biểu số liệu tham khảo kiến thức tài liệu học tập nghiên cứu phép sử dụng) Tôi xin chịu hoàn toàn trách nhiệm lời cam đoan Hà Nội, tháng năm 2013 Bùi Thị Hà LỜI CẢM ƠN Tác giả xin bày tỏ lòng cảm ơn chân thành tới TS Ngơ Quỳnh Thu, người hướng dẫn trực tiếp giúp đỡ tận tình việc định hướng nghiên cứu, tổ chức thực đến q trình viết hồn chỉnh Luận văn Tác giả bày tỏ lòng biết ơn Ban lãnh đạo Viện Công nghệ thông tin truyền thông, Viện đào tạo Sau đại học - Trường Đại học Bách Khoa Hà Nội tạo điều kiện thuận lợi để hoàn thành Luận văn Do lực thân nhiều hạn chế nên Luận văn khó tránh khỏi sai sót, tác giả mong nhận đóng góp ý kiến Thầy/ Cơ giáo, nhà khoa học bạn bè đồng nghiệp Hà Nội, tháng năm 2013 Tác giả Bùi Thị Hà MỤC LỤC TÓM TẮT LUẬN VĂN .1 LỜI CAM ĐOAN .2 LỜI CẢM ƠN .3 MỤC LỤC HỆ THỐNG DANH MỤC CÁC HÌNH VẼ, BẢNG BIỂU .6 DANH MỤC TỪ VIẾT TẮT VÀ THUẬT NGỮ .8 PHẦN MỞ ĐẦU .10 CHƯƠNG I : TỔNG QUAN VỀ MẠNG CẢM BIẾN KHÔNG DÂY 12 1.1 Giới thiệu chung mạng cảm biến không dây 12 1.1.1 Định nghĩa 12 1.1.2 Đặc điểm mạng cảm biến không dây .13 1.2 Cấu trúc mạng cảm biến không dây 14 1.2.1 Các thành phần nút cảm biến .14 1.2.2 Mơ hình mạng mạng cảm biến khơng dây 17 1.2.3 Kiến trúc giao thức mạng 19 1.2.4 Các cấu trúc đặc trưng mạng cảm biến không dây 21 1.3 Thách thức triển khai mạng cảm biến không dây 26 1.4 Ứng dụng mạng cảm biến không dây 30 1.4.1 Ứng dụng quân đội 30 1.4.2 Ứng dụng môi trường .32 1.4.3 Ứng dụng chăm sóc sức khỏe 34 1.4.4 Ứng dụng gia đình 34 Kết luận chương I 36 CHƯƠNG II: CÁC THÔNG SỐ ĐÁNH GIÁ HIỆU NĂNG MẠNG .37 2.1 Khái niệm đánh giá hiệu mạng 37 2.2 Các phương pháp đánh giá hiệu mạng .37 2.2.1 Phương pháp toán học .37 2.2.2 Phương pháp đo thực tế 38 2.2.3 Phương pháp mô 38 2.3 Các thông số đánh giá hiệu mạng .39 Kết luận chương II: 43 CHƯƠNG III: ĐỊNH TUYẾN TRONG MẠNG CẢM BIẾN KHÔNG DÂY 44 3.1 Đặt vấn đề 44 3.2 Những thách thức định tuyến mạng cảm biến không dây 45 3.3 Các vấn đề thiết kế giao thức định tuyến .46 3.4 Phân loại so sánh giao thức định tuyến trongWSN 48 3.5 Giao thức phân cấp LEACH .55 3.5.1 Khái niệm 55 3.5.2 Self - Configuring Cluster Formation 57 3.5.3 Sensor Data Aggregation (Tổng hợp liệu) 63 Kết luận chương III: 65 CHƯƠNG IV: CÀI ĐẶT MÔ PHỎNG VÀ ĐÁNH GIÁ KẾT QUẢ 66 4.1 Giới thiệu chương trình mơ OMNeT++ 66 4.1.1 Mơ hình mơ OMNeT++ 67 4.1.2 Các bước thực mô OMNeT++ .69 4.2 Cài đặt giao thức định tuyến LEACH 70 4.2.1 Mô hình tiêu thụ lượng .70 4.2.2 Mơ hình mạng .71 4.2.3 Các bước cài đặt 72 4.3 Chạy mô đánh giá kết 80 4.3.1 Các tham số đầu vào 80 4.3.2 Các thông số đánh giá kết 81 4.3.3 Đánh giá kết 81 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 87 KẾT LUẬN .89 TÀI LIỆU THAM KHẢO 91 PHỤ LỤC 92 HỆ THỐNG DANH MỤC CÁC HÌNH VẼ, BẢNG BIỂU TT Tên hình vẽ Trang Hình 1.1 - Cấu trúc mạng cảm biến khơng dây 14 Hình 1.2 - Cấu tạo nút cảm biến 15 Hình 1.3 - Loại node sở mạng WSN 18 Hình 1.4 - Kết nối mạng cảm nhận qua kênh truyền Internet 18 Hình 1.5a - Truyền đơn bước WSN 18 Hình 1.5b - Truyền đa bước WSN 19 Hình 1.6 - Kiến trúc giao thức mạng cảm biến khơng dây 20 Hình 1.7 - Cấu trúc phẳng mạng cảm biến khơng dây 22 Hình 1.8 - Cấu trúc tầng mạng cảm biến không dây 22 10 Hình 1.9 - Cấu trúc mạng phân cấp chức theo lớp 23 11 Hình 1.10 - Cấu trúc mạng phân lớp xếp tầng 24 12 Hình 1.11 - Cấu trúc mạng phân cấp logic 25 13 Hình 1.12 - Ứng dụng quân đội 31 14 Hình 1.13 - Mạng WSN cảnh báo cháy rừng 33 15 Hình 1.14 - Mạng WSN cảnh báo lũ lụt 33 16 Hình 1.15 - Cảnh báo vào đo thơng số động đất 34 17 Hình 2.1 - Cấu trúc phần hạt cứng Mica 40 18 Hình 3.1 - Phân loại giao thức định tuyến WSN 49 19 Hình 3.2 - Định tuyến phẳng định tuyến phân nhóm 50 20 Hình 3.3 - Giao thức định tuyến LEACH 55 21 Hình 3.4 - Time-line hoạt động LEACH 56 22 Hình 3.5 - Giải thuật hình thành cluster LEACH 59 23 Hình 3.6 - Sự hình thành cụm vịng khác 60 24 Hình 3.7 - Hoạt động pha ổn định LEACH 61 25 Hình 3.8 - Time - line hoạt động LEACH vịng 62 26 Hình 3.9 - Sự ảnh hưởng kênh phát sóng 62 27 Hình 4.1 - Cấu trúc module NED 68 28 Hình 4.2 - Mơ hình tiêu thụ lượng truyền nhận 70 sóng 29 Hình 4.3 - Mơ hình thành phần mạng mơ 73 30 Hình 4.4 - File NED định nghĩa cấu trúc mạng mô 74 31 Hình 4.5 - File MessageType.msg định dạng cho message 76 32 Hình 4.6 - Tham số để chạy chương trình mơ 77 33 Hình 4.7 - Snapshot chạy chương trình 78 34 Hình 4.8 - Các lệnh ghi lại kết thực chương trình 79 35 Hình 4.9 - Kết sau chạy chương trình 79 36 Hình 4.10 - So sánh thơng số FND, HND, LAST 82 37 Hình 4.11 - Tổng lượng lại nút sau vòng 83 38 Hình 4.12 - Số nút cịn sống theo vịng 84 39 Hình 4.13 - Năng lượng cịn lại nút vòng thứ 10 85 40 Hình 4.14 - Năng lượng cịn lại nút vòng cuối 85 41 Bảng - Phân loại so sánh giao thức định tuyến 52 + 53 mạng cảm biến không dây 42 Bảng - Các tham số đầu vào việc mô 80 DANH MỤC TỪ VIẾT TẮT VÀ THUẬT NGỮ STT Từ viết tắt Tên đầy đủ thuật ngữ WSN Wireless Sensor Network Low-Energy LEACH Adaptive Clustering Hierarchy BS Base Station CH Cluster Head Objective Modular OMNeT++ Network Testbed in C++ RSSI TDMA Received Signal Strength Indication Time Division Multiple Access FND Fisrt Node Dead HNA Hafl Node Alive Giải thích Mạng cảm biến khơng dây Một giao thức định tuyến phân nhóm kinh điển WSN Trạm gốc, thu thập liệu từ cảm biến toàn mạng Nút cảm biến chọn thay cho nhóm gửi liệu BS Một công cụ mô mạng sử dụng ngơn ngữ C++ Cường độ tín hiệu, sử dụng để tính khoảng cách nút thu nút truyền Phương pháp đa truy cập theo thời gian, chia quy định khe thời gian cho truy cập Vịng có nút mạng bị chết Vòng mà nửa số nút sống 10 ADC Analog to Digital Bộ chuyển đổi tín hiệu tương tự Converter sang tín hiệu số 94 char idStr[3]; sprintf(idStr, "%d[out] to %d[in]", this->getId(), i); char gateName[] = "connect from "; char *temp = strcat(gateName, idStr); Sensor *s = (Sensor*) simulation.getModule(i); if (1) { //this->getId() != mod->getId() //Thiet lap ket noi giua cac sensor if (computeDistance(this->xpos, this->ypos, s->xpos,s->ypos) < range) { cGate *ownGate = addGate(temp, cGate::OUTPUT); cGate *otherGate = s->addGate(temp, cGate::INPUT); ownGate->connectTo(otherGate); cDisplayString& connDispStr = ownGate->getDisplayString(); connDispStr.parse("ls=,0"); //if (this->state == PLAIN) ownGate->setDisplayString("ls=,0"); //hide the arrow from BS to node //else ownGate->setDisplayString("ls=,1"); } } } } void Sensor::connectChannel2BS() { char idStr[3]; sprintf(idStr, "%d[out] to BS[in]", this->getId()); char gateName[] = "Connect from "; char *temp = strcat(gateName, idStr); // cModule *mod = (cModule*) simulation.getModule(2); //BS BaseStation *bs = (BaseStation*) simulation.getModule(2); //BS cGate *ownGate = addGate(temp, cGate::OUTPUT); cGate *otherGate = bs->addGate(temp, cGate::INPUT); ownGate->connectTo(otherGate); } void Sensor::handleMessage(cMessage *msg) { if (msg->isSelfMessage() && (msg->getKind() == S_INIT1)) { this->energyReceive(SIGNAL); if (this->isConnectedChannel == 0){ this->isConnectedChannel = 1; connectChannel(this->trRange); } float P = this->P; BaseStation *bs = (BaseStation*) simulation.getModule(2); //BS int round = bs->roundDone; double tmp = (1.0/P); int iP = (int) (tmp); 95 if (tmp - iP >= 0.5) iP++; ev getKind() == S_INIT3)) { //this->energyReceive(SIGNAL); //broadcast Head_Adv_MSg HeadAdvMessage *rootHAMsg = new HeadAdvMessage(); rootHAMsg->setSrcID(this->getId()); rootHAMsg->setKind(HEAD_ADV_MSG); rootHAMsg->setSrcXpos(this->xpos); rootHAMsg->setSrcYpos(this->ypos); for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); if (gate->getType()==cGate::OUTPUT) { HeadAdvMessage *HAMsg = rootHAMsg->dup(); Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); double d = computeDistance(this->xpos,this->ypos,s->xpos,s->ypos); if ( ((s->state == PLAIN) || (s->getId() == this->getId())) && (d trRange)) { //(s->state==LIVE) && //cDisplayString& connDispStr = gate->getDisplayString(); //connDispStr.parse("ls=,1"); send(HAMsg->dup(),gate); this->energyTransmit(SIGNAL,d); this->isReducedEnergy = 1; } // } // if (s->getId() == this->getId()) send(HAMsg,gate); } this->energyReceive(SIGNAL); } if ((msg->getKind() == HEAD_ADV_MSG)){ this->energyReceive(SIGNAL); HeadAdvMessage *Headmsg = check_and_cast(msg); int x = Headmsg->getSrcXpos(); int y = Headmsg->getSrcYpos(); double dij = computeDistance(this->xpos, this->ypos, x, y); this->dij[this->numHead] = dij; int ID = Headmsg->getSrcID(); this->headID[this->numHead] = ID; this->numHead++; if (this->isReceivedAdv == 0){ this->isReceivedAdv = 1; this->numHeadNei = 0; for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); 97 if (gate->getType()==cGate::OUTPUT) { Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); if ((s->state == HEAD) ) { //&& (s->state == LIVE) this->numHeadNei++; ev dij[i]; } for (int i=0; inumHead; i++){ if (1){ if (this->dij[i] !=0) cost[i] = this->dij[i]; else cost[i] = MAX; } } double cost_min = MAX; for (int i=0; inumHead; i++){ if (cost[i] < cost_min) cost_min = cost[i]; } for (int i=0; inumHead; i++){ if (cost[i] == cost_min) this->myCluster = this->headID[i]; } JoinClusterMessage *rootJCMsg = new JoinClusterMessage(); for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); if (gate->getType()==cGate::OUTPUT) { JoinClusterMessage *JCMsg = rootJCMsg->dup(); JCMsg->setKind(JOIN_CLUSTER_MSG); JCMsg->setSrcID(this->getId()); JCMsg->setCHID(this->myCluster); 98 Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); if ((s->state == HEAD) && ((s->getId() == this->myCluster) || (s->getId() == this->getId())) ){ //&& (s->state == LIVE) double d = computeDistance(this->xpos,this->ypos,s->xpos,s->ypos); this->energyTransmit(SIGNAL,d); // cDisplayString& connDispStr = gate->getDisplayString(); // connDispStr.parse("ls=,1"); send(JCMsg->dup(),gate); ev getKind() == JOIN_CLUSTER_MSG) { this->energyReceive(SIGNAL); JoinClusterMessage *JCmsg = check_and_cast(msg); this->numMemJoin++; ev isReceivedJoin = 1; this->numJoinNei = 0; for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); if (gate->getType()==cGate::OUTPUT) { Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); if ((s->myCluster == this->getId())) this->numJoinNei++; ev getId()); Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); 99 if (((s->myCluster == this->getId()) || (s->getId() == this->getId())) && (s->state != DEAD) ){ //&& (s->state == LIVE) double d = computeDistance(this->xpos,this->ypos,s->xpos,s->ypos); this->energyTransmit(SIGNAL,d); TDMAMsg->setTDMA(this->TDMA++); //cDisplayString& connDispStr = gate->getDisplayString(); //connDispStr.parse("ls=,1"); send(TDMAMsg,gate); } } } } } if ((!msg->isSelfMessage()) && (msg->getKind() == TDMA_MSG)) { this->energyReceive(SIGNAL); ev isSelfMessage() && (msg->getKind() == TDMA_MSG)) { this->energyReceive(SIGNAL); Data2CHMessage *rootData2CHMsg = new Data2CHMessage(); for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); if (gate->getType()==cGate::OUTPUT) { Data2CHMessage *Data2CHMsg = rootData2CHMsg->dup(); Data2CHMsg->setKind(DATA_2_CH_MSG); Data2CHMsg->setSrcID(this->getId()); int da = (int) (10*(rand() / (RAND_MAX + 1.0))); Data2CHMsg->setData(da); Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); if ((this->myCluster == s->getId()) && (s->state != DEAD)){ //&& (s->state == LIVE) BaseStation *bs = (BaseStation*) simulation.getModule(2); ev energyTransmit(DATA,d); cMessage *selfMess = new cMessage("TDMA-Message2"); 100 selfMess->setKind(TDMA_MSG); if (bs->frame > 0) scheduleAt(simTime() + 1, selfMess); } } } } if (msg->getKind() == DATA_2_CH_MSG) { this->energyReceive(DATA); ev data += D2CHmsg->getData(); if (this->isReceivedData == 0){ this->isReceivedData = 1; this->numDataNei = 0; for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); if (gate->getType()==cGate::OUTPUT) { Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); if ((s->myCluster == this->getId()) && (s->state != DEAD)) this->numDataNei++; // && (s->state == LIVE) } } } ev isConnectedBS = 1; connectChannel2BS(); } this->energyAggregate(this->numMemData); Data2BSMessage *rootD2BMsg = new Data2BSMessage(); for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); if (gate->getType()==cGate::OUTPUT) { Data2BSMessage *D2BMsg = rootD2BMsg->dup(); D2BMsg->setKind(DATA_2_BS_MSG); D2BMsg->setSrcID(this->getId()); D2BMsg->setData(this->data); BaseStation* bs = (BaseStation*)gate->getPathEndGate()->getOwnerModule(); 101 if (bs->state == BS){ cDisplayString& connDispStr = gate->getDisplayString(); connDispStr.parse("ls=,2"); send(D2BMsg,gate); double d = computeDistance(this->xpos,this->ypos,bs->xpos,bs->ypos); this->energyTransmit(DATA,d); } } } this->numMemData = 0; this->data = 0; } } if (msg->getKind() == RESET_MSG){ if (this->state != DEAD){ ev setKind(S_INIT1); scheduleAt(simTime() + INIT_WAIT, selfMess); } else{ setDisplayString("p=$xpos,$ypos;i=device/accesspoint_s,black;r=$trRange,,,0"); } for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); cDisplayString& connDispStr = gate->getDisplayString(); connDispStr.parse("ls=,0"); } } } void Sensor::energyReceive(int kBits) { double en; if (this->state != DEAD) { en = (double) kBits * Eelec * NANO; ev getDisplayString(); connDispStr.parse("ls=,0"); // if (this->state == PLAIN) ownGate>setDisplayString("ls=,0"); //hide the arrow from BS to node // else ownGate->setDisplayString("ls=,1"); } } } } void BaseStation::handleMessage(cMessage *msg) { if (msg->isSelfMessage()){ if (msg->getKind() == S_INIT1){ ev getKind() == S_RESET){ ResetMessage *rootRMsg = new ResetMessage(); for (cModule::GateIterator i(this); !i.end(); i++) { cGate *gate = i(); 105 if (gate->getType()==cGate::OUTPUT) { ResetMessage *RMsg = rootRMsg->dup(); RMsg->setKind(RESET_MSG); RMsg->setSrcID(this->getId()); // cModule *mod = gate->getPathEndGate()->getOwnerModule(); //Sensor* s = (Sensor*)gate->getPathEndGate()->getOwnerModule(); send(RMsg,gate); } } } } if ((msg->getKind() == DATA_2_BS_MSG) || (msg->getKind() == DATA_2_RN_MSG) || (msg->getKind() == E_MSG)) { this->numRcv++; if (msg->getKind() == DATA_2_BS_MSG) { Data2BSMessage *D2BSmsg = check_and_cast(msg); ev state == HEAD)) this->numNei++; } } } ev numAliveNode[this->roundDone] = node - dead; for (int i = 3; i eRes/s->eInit < 0.1) && (s->state != DEAD)) { s->state = DEAD; this->numDead += 1; if (this->numDead == 1) this->firstDead = this->roundDone; if (this->numDead == (int)(this->numNodes/2)) this->halfDead = this->roundDone; if (this->numDead == (int)(2*this->numNodes/3)) this->lastRound = this->roundDone; s->eRes = 0; } this->totalEnergyRemain[this->roundDone] += s->eRes; } ev roundDone == 500) finish(); } else { reset(); } } else this->numRcv = 0; } else this->numRcv++; // } } 107 void BaseStation::finish(){ recordScalar("RoundDone", this->roundDone); recordScalar("FND", this->firstDead); recordScalar("HNA", this->halfDead); recordScalar("Last", this->lastRound); for (int i = 1; i roundDone; i++){ char c[3]; sprintf(c, "[%d]", i); char s[20] = "TotalEnergyRemain"; char *temp = strcat(s,c); recordScalar(temp, this->totalEnergyRemain[i]); } for (int i = 1; i roundDone; i++){ char c1[3]; sprintf(c1, "[%d]", i); char s1[20] = "NumAliveNode"; char *temp1 = strcat(s1,c1); recordScalar(temp1, this->numAliveNode[i]); } for (int i = 3; i eRes10[i]); } ... dụng mạng cảm biến 37 CHƯƠNG II: CÁC THÔNG SỐ ĐÁNH GIÁ HIỆU NĂNG MẠNG 2.1 Khái niệm đánh giá hiệu mạng Đánh giá hiệu mạng đánh giá tính hiệu lực hoạt động mạng điều kiện cụ thể Như vậy, việc đánh. .. khái niệm đánh giá hiệu mạng, phương pháp để đánh giá hiệu mạng Bên cạnh cịn đưa số thông số để đánh giá hiệu mạng cảm biến không dây 44 CHƯƠNG III: ĐỊNH TUYẾN TRONG MẠNG CẢM BIẾN KHÔNG DÂY 3.1... MẠNG CẢM BIẾN KHÔNG DÂY 12 1.1 Giới thiệu chung mạng cảm biến không dây 12 1.1.1 Định nghĩa 12 1.1.2 Đặc điểm mạng cảm biến không dây .13 1.2 Cấu trúc mạng cảm biến không

Ngày đăng: 13/02/2021, 12:03

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w