Báo cáo môn học môn cảm biến

65 564 0
Báo cáo môn học môn cảm biến

Đ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

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CƠ SỞ TẠI THÀNH PHỐ HỒ CHÍ MINH KHOA KỸ THUẬT ĐIỆN TỬ 2 BÁO CÁO MÔN HỌC MẠNG CẢM BIẾN Giáo viên bộ môn :Huỳnh Trọng Thừa Sinh viên thực hiện : 1. Trịnh Phi Hùng MSSV : 409190009 2. Nguyễn Đăng Khoa MSSV : 409190011 3. Nguyễn Chí Nhân MSSV : 4091900Hồ Chí Minh năm 2012 Techniques for Protocol Programming (Các kĩ thuật của giao thức lập trình) Mạng cảm biến không dây thường được dùng trong các ứng dụng trong đo đạc, phát hiện, dự báo như : đo nhiệt độ, đo độ ẩm, cảm nhận độ rung … Hầu hết các nút cảm biến thường được dùng như một cơ sở dữ liệu hoặc phát hiện sự kiện trong tự nhiên, truyền thông đóng vai trò quan trọng trong việc xác định thời gian sống của các nút cảm biến, tốc độ định tuyến và bản chất của dữ liệu truyền đi trong mạng. Do đó mà chúng ta cần quan tâm tới các tính năng, các giao thức được sử dụng trong lớp phân rã IP , đó là lớp MAC. SMAC là giao thức điều khiển truy nhập trung bình trong mạng cảm biến, nó được phát triển từ mạng 802.11 truyền thống có ưu điểm là giảm năng lượng tiêu thụ và khả năng tự cấu hình cho mạng. Trong sự phát triển người ta đã xác định được 2 trong 3 nguồn tiêu tốn năng lượng và đã cải thiện nó nhằm khắc phục. Hai trong ba nguồn tiêu thụ năng lượng được đề cấp đến dưới đây: Cộng tuyến : khi 2 hay nhiều nút cùng gửi một gói tin về nút trung tâm, sự va chạm có thể xảy ra làm sai hỏng các gói tin. Vì thế phải tiêu tốn năng lượng vô ích để truyền lại các gói tin bị hỏng. Nghe lỏm : trong trường hợp các nút nghe nhiều hơn những gói tin không dùng cho mình thì nó phải tiêu tốn năng lượng hơn. Với việc sử dụng giao thức SMAC thì các nút sẽ ở trạng thái ngủ theo lịch trình vì thế sẽ giảm năng lượng do nghe lỏm đi. I. THE MEDIATION DEVICE PROTOCOL( các thiết bị trung gian) Bây giờ ta sẽ xem xét một giao thức nổi tiếng là thiết bị hòa giải trung gian, trong giao thức này nút A muốn truyền tải một gói tin tới nút B. Nút A thông báo cho thiết bị trung gian biết bằng định kì gửi một gói tin RTS (requesttosend), các thiết bị trung gian sẽ bắt các gói tin này. Nút A gửi gói RTS của nó thay vì cảnh báo truy vấn nó. Nút A sau đó ở chế độ nhận (lắng nghe ) Các thiết bị trung gian phải chờ nút B truy vấn nó và sẽ gửi lại một gói tin trả lời truy vấn nó, cho biết địa chỉ của nút A và khoảng thời gian bù đắp cho thời gian truyền Nút B bây giờ sẽ bít B sẽ nghe một lần nữa và gửi một CTS tới nút A (Bây giờ, nút B cũng biết thời gian của nút A, và do đó biết ở thời điểm t nút A là chế độ truyền sẽ xảy ra một lần nữa.) Nút B đợi tại t’ để nhận dử liệu từ nút A. Tại t” nút B sẽ gửi một gói tin báo xác nhận (nút B biết t” vì nó với nút A có cùng chu kỳ ) Sau khi nút A và nút B đã truyền xong nó lại lặp lại quá trình phát đi các tín hiệu truy vấn mới. Nút B cũng khôi phục lại chu kì định kì và nó tách biệt với chu kì của nút A. II. CONTENTIONBASED PROTOCOLS Giao thức contentionbased đề cập đến một lớp trong giao thức truyền thông, khi đó một số quy tắc trong việc thu, phát sóng được đề xuất cho các nút cảm biến trong mạng bắt buộc phải tuân thủ. Carrier Sense Multiple Access Protocol (CSMA): Trước khi có bất kì thông tin nào được truyền đi, nút truyền phải xác nhận không hoạt động truyền đồng thời hay chia sẽ thông tin đang diễn raIII. PROGRAMMING WITH LINKLAYER PROTOCOLS: Trong phần này chúng ta cùng xem xét các thách thức đặt ra trong việc lập trình tại lớp liên kết dữ liệu, chúng ta sử dụng kĩ thuật ARQ (automatic repeat request – tự động lặp lại yêu cầu).Giao thức này cố gắng gửi lại gói tin có độ tin cậy hơn bằng cách sử dụng các báo nhận và gửi lại. IV. AUTOMATIC REPEAT REQUEST (ARQ) PROTOCOL): Ý tưởng cơ bản của giao thức ARQ có thể hiểu như sau : Nút truyền dữ liệu sử dụng giao thức linklayer chấp nhận một gói dữ liệu, sẽ tạo ra một gói tin mới bằng cách thêm vào một header và check sum và truyền gói tin đã được đóng gói đó tới máy thu. Bênmáy thu sẽ kiểm tra check sum có đúng không, nếu đúng nó sẽ gửi một bản tin ACK(báo nhận) dương tới máy phát, còn nếu kiểm tra bị sai thì máy thu sẽ gửi môt ACK âm tới máy phát. Máy phát nếu nhận lại được một ACK dương thì nó biết là đã gửi được gói tin thành công còn nếu nó nhận được một bản tin ACK âm thì nó sẽ gửi lại một gói tin mới cho máy thu. V. TRANSMITTER ROLE : Lưu ý rằng thời gian để máy phát từ lúc gửi gói tin đến lúc thoát ra để vào chế độ ngủ là nhất định và có giới hạn.Nếu máy phát không nhận được tín hiệu ACK âm thì nó sẽ vẫn tiếp gửi những tin nhắn tới các nút khác trong mạng. { Let p be a data packet coming from the MAC layer. frame = Header++data packet p++check sequence (FCS); Construct the link layer packet repeat forever { transmit (frame, to receiver node j); Can be done using Receive.receive( ). parallel { P1: {waitfor (ack);if(ack == positive) exit repeat loop; else continue; it is negative ack waited long enough. P2: {if timeout() exit repeat loop; } } end of parallel } end of repeat; sleep( ) until wokenup( ); } { Receiver node j { repeatfor ever { Can be done using Receive.receive ( ). p = receivepacket( ); result = checksumtest (p); if(result == success) {send (success); exit repeat loop;} elsesend (failure); } end of repeat loop sleep ( ) until wokenup( );} } Nút nhận(máy thu) dữ liệu sẽ vào chế độ ngủ sau khi nó gửi một tín hiệu ACK dương(nếu check sum đúng dữ liệu đúng), còn nếu không nó sẽ gửi tín hiệu ACK âm cho máy phát rồi đợi máy phát gửi lại gói tin. { TRANSMITTER(ARQ) FSM Model Transmitter: s0: frame = getFrame ( ); transmit ( frame ); go to s1; s1: receive( ); if acktype = +ve then {frame = getFrame( ); transmit (frame)} else { transmit (frame);} upon ack go to s1; Use Receive.receive( ) for this. global: frame, acktype = +ve; booted( ):frame = getFrame( ); transmit (frame) receive( ): actype = extract ack type( ); ifacktype = + ve then {frame = getFrame( ); transmit (frame)} else { transmit (frame); } } { RECEIVER fired( ): {NULL} receive( ): ifchecksum is valid then send +ve ack else send ve ack; } N ếu tín hiệu ACK âm bị mất và bên máy phát đã quá thời gian time out, vì vậy bên máy thu sẽ phải chờ bên máy phát gửi lại gói tin bị hỏng nhưng bên máy phát lại không có tín hiệu ACK âm. Để kết thúc sự chờ đợi mãi mãi như vậy thì bên máy phát sẽ thực hiện lệnh receivepacket(). Kết quả là lãng phí thời gian chờ đợi quá nhiều làm tiêu hao thời lượng pin. VI. ALTERNATINGBITBASED ARQ PROTOCOLS:Một biến thể nhỏ của giao thức trên là giao thức alternatingbitbased. Trong giao thức này máy phát sẽ sử dụng một bít gọi là bit điều khiển, được thiết lập luân phiên là 0 hoặc 1, để truyền tải gói tin p1, máy phát sẽ thêm vào bit 0 rồi đến gói tin P1 khi đó gói tin mới có dạng 0:P1 sau đó truyền tới cho máy thu, đặt thời gian s và chờ đợi tín hiệu báo nhận ACK, nếu thời gian timeout xảy ra trước khi nhận được tín hiệu ACK từ máy thu thìmáy phát sẽ gửi lại gói tin 0:P1. Khi nhận được tín hiệu ACK từ máy thu thì máy phát sẽ gửi gói tin tiếp theo p2, khi đó ta sẽ thêm bit điều khiển 1 vào trước p2 khi đó p2 có dạng 1:P2. Nếu máy thu nhận được gói tin p2 và báo nhận lại thì ta truyền tiếp gói tin p3 có dạng 0:P3. Như vậy giao thức này có thể quản lý việc truyền dữ liệu ngay cả khi mất tín hiệu ACK. { Transmitter i Control bit b = 0; REPEAT: repeat for ever { readpackettosend (p); RESEND: transmit (b:p); PARALLEL: P1: { waitforack( ); p = p+1 mod 2;} Receive.receive( ); no clock necessary .P2: { timeout( ); gotoRESEND; } } { Receiver j Control bit b = 0; repeatfor ever { receivepacket (p); Receive.receive( ); is adequate to handle this situation. b1 = extractcontrolbit (p); d = extractdata (p); if(b1 = b) checksumvalid (p) then {sendack( ); b = b+1 mod 2;}; No ve ack is sent. Go back and wait for the next transmission of the same data. } } { TRANSMITTER _ alternating bit FSM ModelTransmitter s0: bit =1; c bit = 1; frame = getFrame( ); transmit (frame); c bit is control bit (sent by receiver) go to s1; s1: receive( ); ifc bit == bit { bit = bit + 1 mod 2; frame = bit: packet }; transmit (frame); upon ack: goto s1; Pseudo code for nesC: global: bit = 1, c bit = 1; booted( ): frame = getFrame( ); transmit (frame) receive( ): actype = extract acktype( ); ifacktype = + ve then {frame = getFrame( ); transmit (frame)} else{ transmit (frame);} } { Receiver _ alternating bit s0: control bit = 0; goto s1;s1: receive( ); b1 = extractcontrolbit (p); d = extractdata (p); if(b1 = b) checksumvalid (p) then {sendack( ); b = b+1 mod 2;}; No ve ack is sent. } 1. A Generalized Version of the Previous Protocol: Chúng ta có thể khái quát các giao thức trên được trình bày ở trên bằng cách quay lại bước truyền n và bắt đầu truyền lại chúng.Chúng tôi sẽ minh họa điều này với một ví dụ dưới đây. 2. Ví dụ: Đặt N= e4, ta sẽ dùng một bộ đệm lưu lại các gói tin. Bắt đầu ta sẽ thêm vào bộ đệm 8 gói tin, thêm vào mỗi gói tin một byte(8 bit) điều khiển, do đó ta có bộ đệm có dạng buff = 0:p0,1:p1,2p2,3p3,4p3,5p4,6p5,7p6, bắt đầu gửi gói tin từ trái trở đi 0:p0,1:p1,2:p2, . . . . (cùng một thời điểm), đồng thời nhận tín hiệu ACK gửi về và xử lí chúng, đặt b là byte điều khiển của gói tin đã gửi. Bên máy thu giả sử luôn gửi một tín hiệu ACK dương( các gói tin đã gửi thành công) { transmitter A{ Let Nmax = 4. repeat forever{ load buffer 0:7 = 0: packet0: 1: packet1:.. .: 7: packet7; i = 1; j is number of packets for which acks received. go = 1; PAR P1: while (i LedsC; algorithm2C.AMPacket>AMSenderC; algorithm2C.Packet>AMSenderC; algorithm2C.AMSend>AMSenderC;algorithm2C.AMA>ActiveMessageAddressC; algorithm2C.PacketAcknowledgements>AMSenderC; algorithm2C.Receive>AMReceiverC; algorithm2C.RadioControl>ActiveMessageC; algorithm2C.Timer0>TimerMilliC; } void generateAddress( ) { call Leds.set (0); my address = (31071334523 % (c a l l Random. rand16( ))); } void broadcastAddress( ) { message t msg; am addr t temp; temp = (am addr t) (call AMSend. getPayload (msg)); temp = call AMA. amAddress( ); call AMSend. send (0 x ffff,msg, sizeof (am addr t));} Ngoài ra để kiểm soát và các sự kiến xảy ra trong quá trình giao tiếp trong mạng, khi đó ta có thể dùng nhiều hơn hai địa điểm để tạo ra các địa chỉ ngẫu nhiên và phát sóng các địa chỉ ra các nút lân cận. eventvoid Boot.booted( ) { call RadioCont rol.start( ); } eventvoid RadioCont rol.startDone (error t err) { puts the address in my address. generateAddress( ); The initial address broadcast call Timer0.startOneShot (6000); Check once if any one else has my address. If not, at this point, we can set the generated address call AMA.setAddress (my group, my address); } Địa chỉ của tôi là một biến số toàn cục trong các địa chỉ ngẫu nhiên được lưu trữ, sau đó được phát ra cho các nút lân cận.Ngay sau khi các thành phần được nêu trên được bật bởi lệnh RadioControl.start() thì chúng ta sẽ thực hiện các nhiệm vụ sau đây. Đầu tiên sẽ tạo ra một địa chỉ ngẫu nhiên và đặt vào trong biến toàn cục của tôi.Chúng ta sẽ kiểm tra tất cả các nút có cùng địa chỉ với mình (các địa chỉ trùng lặp), các trùng lặp được bắt đầu bằng một oneshot (monoshot) xảy ra sẻ gây ra các chậm trể (6000ms) trong chương trình của tôi.Nếu không có sự trùng lặp thì ta thiết lập được địa chỉ riêng cho mỗi nút trong mạng.Nhiệm vụ còn lại là chờ đợi và trả lời các truy vấn nếu có sự trùng lặp địa chỉ. eventvoid Timer0.fired( ) { message t msg; am addr t temp; temp = (am addr t ) call AMSend. getPayload (msg); storing the address of my address in temp. temp = my address; call AMSend.send (0 x ffff, msg, sizeof (am addr t)); } eventvoid AMSend. sendDone (message t msg, error t err) { if(err == FAIL) { If send fails, switch on red ledcall Leds.led0On( ); } } event message t Receive.receive(message t msg, void payload, uint8 t len) { am addr t broadcasted addr; broadcasted addr = (am addr t)payload; call Leds.set (0); Clear debug leds if(broadcasted addr == (call AMA.amAddress( ))) Generate a new addr { call Leds.led0On( ); A collision has occured generateAddress( ); call AMA.setAddress (my group, my address); broadcastAddress( ); Only broadcast new address after a collision } else { call Leds.led1On( ); No collison yet} return msg; } Các xung đột monoshot gây nên sự kiên fired() nơi mà chúng ta gửi gói tin tới nút lân cận, ta thiết lập một trọng tải và lưu trữ địa chỉ của tôi như một phần của các gói tin, sau đó gửi các gói tin đi. Sau khi gửi các gói tin nếu có bất kì báo cáo về lỗi gửi thì chúng ta sẽ bật một đèn LED, sau này ta sẽ không cố gắng gửi lại gói tin nữa mà nếu nhận được mốt gói tin bất kì thì ta sẽ tách lấy địa chỉ của người gửi rồi so sánh với địa chỉ của mình để xem có bị trùng lặp không. Nếu không có trùng lặp ta sẽ tự thiết lập và nhớ địa chỉ của mình và đánh dấu bằng cách đặt một cờ báo( từ giờ trở đi sẽ không trả lời tin nhắn từ các nút khác gửi đến và cũng không thay đổi địa chỉ của mình nữa. Điều này đạt được bằng thiết lập cờ báo TRUE). Tuy nhiên nếu ta nhận thấy địa chỉ bị trùng lặp thì ta sẽ tạo ra một địa chỉ và gán đó là địa chỉ của mình, sau đó phát đi báo cho các nút lân cận và chờ các nút đó trả lời. Ta cứ tiếp tục như thế cho đến khi tìm thấy địa chỉ của mình. Trước khi làm xong công việc ta cần thêm vào một số chi tiết dưới đây. voidgenerateAddress( ) {call Leds. set (0); my address = (31071334523 \% (call Random. rand16( ))); } async event void AMA.changed( ) { } eventvoid RadioControl.stopDone (error t err) { } X IMPROVED ALGORITHMS 1.Perkin’s Solution Chúng ta sẽ minh họa giải pháp này với một ví dụ trong đó chúng ta được cho một đơn giản mạng chỉ với một vài nút có nhãn. Để bắt đầu, không có các nút có bất kỳ địa chỉ được giao.Hãy xem xét nút A, muốn có một địa chỉ cho chính nó. Tạo một cặp số ngẫu nhiên < t, f >, t là địa chỉ tạm thời,còn f là địa chỉ sửa, and floods the network with this pair. Mổi nốt sẻ nhận được 1 cặp số trên. Ví dụ, node B nhận được cặp số trên, nó sẽ kiểm tra cho dù nếu nó đã có một địa chỉ giống như f . Khi node B vẫn chưa có bất cứ địa chỉ nào, nó sẽ gửi một thông điệp ACK tới nút A bằng cách sử dụng các địa chỉ tạm thời t. Tương tự như vậy, các nút khác cũng có thể gửi âm ACK tin nhắn cho A bằng cách sử dụng t. Node A sẻ đợi một thời gian cần thiết đủ dài để nhận được ACK, và cuối cùng chọn f làm địa chỉ của nó. Tương tự, node B tạo ra 1 cặp số ngẫu nhiên < t1, f 1> and floods the network. Bây giờ, node A sẻ kiểm tra xem f 1 có giống address 1, Quá trình này tiếp tực cho đến khi mổi node có 1 địa chỉ riêng,.Và một vấn đề ở thuật toán là mổi node không biết nên đợi ACK bao lâu. Hơn nữa,việc trung lặp giữa các địa chỉ sẻ làm mất nhiều thời gian. Giả sử cho thuật toán này được đưa ra dưới đây. Nếu chúng ta tạo ra các địachỉ từ không gian địa chỉ lớn, các va chạm,trùng lặp sẽ được tối thiểu. Và giả định rằng mổi node biết tổng số node trong mạng. assert f as own address.: { Node P tempaddresspool T= { some addresses }; fixedaddresspool F = {omeaddresses }; haveaddress = NO; kmax = 10; While ( haveaddress or k < kmax) Get address for self. { t = randomlyselectanaddressfrom (T); f = randomlyselectanaddressfrom (F); Announce: If any one has f as his address, message me at flood (t, f); address t; wait (ack, deltat); for deltat units of time.if (ack = Yes I have ) k++; and continue. else { myaddress = f; haveaddress = YES;} } I have an address now. My job from now on is to reply to other’s queries. for (i=1;i < m; i ++) { forward m times. How to choose m? receiverequestsfromothernodes (packet p); t = extracttemporaryaddressfrom (p); f = extractfixedaddressfrom (p); if (f == myaddress) send (to address t, myaddress); } } { PERKINS SOLUTION Assume: n total number of nodes .s0: generate the pair ; send to all neighbours; goto s1; s1: receive( ); receive all acks; if all are ve, assert f as own address .; if any is +ve, goto s0; if it is a request for verifying some other node’s request, then extract par t, and check if f it clashes with its own address; if it does send +ve ack to t; if it doesn;t send ve ack to t; nesC code: total number of nodes; T array of address. global: n, T ; booted ( ): call generate ( );generate ( ): generate; send to all neighbours; receive( ): check if all acks are received and stay in this state. and if a l l are ve, assert f as own address.; if any is +ve, call generate( ); if it is a request for verifying some other node’s request, then extract part, and check if fit clashes with its own address; if it does send +ve ack to t; if it doesn’t send ve ack to t; } XI CONTENTBASED ADDRESSINGThường trong các ứng dụng, một node sẻ biết được những sự kiện mà những node khác phát hiện được. Có thể là nhiều hơn một nút có thể đã phát hiện nút sự kiện và lưu trữ các dữ liệu trong bộ nhớ . Bây giờ chúng ta thảo luận về một giao thức đơn giản nơi mà một nút có thể truy vấn liên quan đến một sự kiện đến một nốt không rõ. Node này được gọi là sink node ,sink node tạo tạo ra tin truy vấn, và nó được gửi tới tất cả các node trong mạng. Node phản hồi lại tin truy vấn bằng cách tạo 1 gói dữ liệu và gửi về sink. Các nút trung gian, ngoài việc chuyển tiếp dữ liệu vào sink node , lưu trữ dữ liệu cùng với các truy vấn trong bộ nhớ cache của nó, mà nó sử dụng sau này cho bất kỳ truy vấn tương tự từ sink node trong tương lai. Xem ví dụ, mạng lưới được hiển thị trong hình. 9,2, node j (green) phát hiện sự kiệnE, và node c (yellow) muốn biết về sự kiện này,nhưng node c không biết thông tin về node j. Node c sau đó sẽ gửi một truy vấn cùng với địa chỉ của nó,được chuyển đến các nút khác trong mạng. A cũng như B sẻ trả lời tin yêu cầu, nhưng trong trường hợp, B không có thông tin về sự kiện, nó sẻ gửi tơi các node lân cận. cuối cùng, node j sẻ nhận được tin truy vấn, và tin này sẽ được trả lời , sau đó được gửi tới các node lân cận, node k.Bây giờ, node k sẽ chứa (i.e., cache) 1 bản sao của trả lời, và chuyển nó đến một nút lân cận. Quá trình này tiếp tục cho đến khi trả lời đến nút c.Nếu tin truy vấn này được bắt đầu ở bất kỳ thời điểm nào trong tương lai, các nút trung gian trước đólưu trữmộtbản sao của replynútjtronglocalmemorycủa nó đểcó thể tạo ramột thư trả lờicho người khởitruyvấn { CONTENT BASED ADDRESSING self = initial Value(); Sink role: if self = = sink then flood network with request, establishing path to sink; if self = = sink reply received then accept it ; source role: if self == source then send reply along path; intermediate role: if self == intermediate node on the path have not already forwarded the request then forward the request and record the path ; if self == intermediate node on the path have not already forwarded the answer then forward the answer and store the answer ; =================================================== ========= booted( ): self = initialValue( ); if self = = sink then flood network with request , establishing path to sink;receive( ) : if self == sink reply received then accept it; if self == intermediate node on the path have not already forwarded the request then forward the request and record the path ; if self == intermediate node on the path have not already forwarded the answer then forward the answer and store the answer ; } XII FLOODING Trong các ứng dụng WSN , việc gửi từ 1 node đến tất cả các node trong mạng là một trong những công việc cần thiết cơ bản. Việc này xảy ra trong tinh huống như giám sát sự kiện, một nút muốn thông báo tới các nút khác trong mạng về một sự kiện mà nó phát hiện được nhưngkhông rõ thông tin về sự kiện. Một giải pháp cho vấn đề này là nút A có thể chọn đểtràndữ liệu mànó cótrongmạng. Phương pháp flooding, node A truyền dữ liệu tới tất cả các node lân cận, với yêu cầu là mổi node hàng xóm phải chuyển tiếp dữ liệu cho các node hàng xóm khác với yêu cầu tương tự để chuyển tiếp. Điều này tiếp tục cho đến khi tất cả các nút trong mạng đã nhận được dữ liệu và chuyển tiếp chúng với các yêu cầu để tất cả các node hàng xóm. Rõ ràng, đây cách truyền dữ liệu từ một nút nguồn đến một node sink là tốn kém, nhưng đôi khi nó là cách duy nhất để gửi dữ liệu. Trong các văn bản sau đây, chúng tôi lần đầu tiên trình bày mã mô phỏng cho flooding, và sau đó thảo luận về những thách thức trong lập trình nesC mà chúng ta gặp phải trong quá trình thực hiên. { Node A, the source node | This node initiates the flooding. { from sensor or user. Higher level behavior. sensedata (packet p); Data d = buildneighbourhoodtable (table T); for each node k in the t able T Or broadcast to every one? sendbyunicast (data d, to node k);sleep( ) until wokenup( ); } Node i, where i is any node except node A. { buildneighborhoodtable (T); waitfor (Data d); Higher level behavior.for each node k in the table T Or broadcast to every one? sendbyunicast (data d, to node k); sleep( ) until wokenup( ); } } Trong đoạn mã mô phỏng trên, ở đây chúng ta sử dụng : sensedata(packetp) and sleep() untilwokenup(). Cả 2 được sử dụng trong SMAC{ interface initialize; command initialize( ); interface table: command build( ); event buildDone (err); module floodC uses interfaces: initialize, read, flood, table; booted( ): FLOODING Pseudo codesource role: read data and flood the network; sink role: reveive data; process; intermediate node role: if (received first time) flood the network; pseudo nesC Components: Assume: Let T be the neighborhood table; booted( ): self = initialize role( ); firstTime = true; if self = = source then read (x) ; readDone( ): d = data from read operation; flood the network; receive( ): if self == sink then extract packet and process;if self == intermediate firstTime then { extract data; flood the network; firstTime = false; } } Ở ví dụ trên, chúng ta đã minh họa làmthếnàođểgiải mãcác các xử lý vai trò của mỗi nodetrong quá trình thực hiệncủa giao thức nàytừthuật toán mô tả. Sau đó chuyển qua dạng mã mô phỏng khac để phù hợp với nesC, ở source role, node đọc dữ liệu sau đó chuyển tới mổi node hàng xóm.Vai trò của mổi node trung gian là bất kì dữ liệu nào nhận được đều được gửi đi tới tất cả các nodes hàng xóm. Vai trò cảu node sink, dữ liệu nhận được xử lý và lưu trữ để sử dụng trong tương lai .Bây giờ, từ những vai trò của mổi node, chúng ta có thể thiết lạp mã mô phỏng cho nesC programming. Những lệnh cơ bản để thực hiện mã mô phỏng trong nesCbooted() , readDone() , và receive(). XIII RUMOR ROUTINGRumor routing cũng tương tự như flooding, anode X có sự kiện e trong đó các cảm biến khác có thể được chú ý đến. Để đạt được muck tiêu này, X để các node lân cận của A biết về sự kiện. (Chú ý: ở flooding, tất cả các node đều được thông báo về sự kiện này.) Bây giờ node K sẽ chuyển tiếp data tới các node lân cận, nhưng các dữ liệu đượclưu trữcùng lúc trong bộ nhớ của nó, X làhàng xóm của mìnhtừnơisự kiệncó nguồn gốc e. Thông tin này là cần thiết nếu một số nút muốn đạt đến X sau. Trong hình 9.3, Như vậy, chúng ta thấy rằng X chọn để thông báo cho các nước láng giềng A và E về sự kiện này, bỏ qua các nước láng giềng khác. Tại thời điểm này, một số các nút hop có khoảng cách 1 biết về sự kiện này và có một lộ trình tới X. Định tuyến này tiếp tục cho một số khoảng cách hop hơn nữa, và chấm dứt, trong ví dụ này khoảng cách hop 4, nơi các nút D và G cũng biết về sự kiện này tại X. 1 Ví dụ Trong mã mô phỏng dưới đây, mỗi nút chọn một vài nodes một ngẫu nhiên từ các node hàng xóm. Chúng ta đã giả định rằng node X sẻ ở trạng thái sleep sau khi truyền dữ liệu của nó, trong khi các nút khác vẫn ở trạng thái wake, thực hiện các hoạt động khác. Không giống như trong flooding, định tuyến tin đồn được theo sau bởi các giai đoạn tiếp theo, nơi các nút khác muốn gửi các truy vấn để node X để tìm hiểu thêm về sự kiện này. chương trình dưới đây cho thấy những gì các nút nên làm tùy thuộc vào vai trò của nó là gì. Một nút có thể thực hiện một trong ba vai trò thể hiện trong mã mô phỏng dưới đây: { source role: {Program Code: Node X Rumour initiator, wants to report an event e to another node Z. { buildneighbourhoodtable (T); for each node k from T { d = randomly decide to send ( ); if (d == yes) send (to node k, own address, event e ); } end for loop sleep( ) until wokenup( ); } Other intermediate nodes Y { (flag = 0); buildneighbourhoodtable (T); if (flag == 1) display (I was selected once before, and I forwarded the packet); else {for each node k from T { d = randomly decide to send ( ); if (d == yes) sendpacket (to node k, own address, event e); } flag = 1; } } } read data and perform rumour routing sink role: receive and process data intermediate node role: if ( received first time ) flood the network; } { Assume: Let T be the neighborhood table; int self, first Time;am addr t sensoraddress = 2; Predetermined address of current sensor am group t sensorgroup = 1; RoutingData table NO OF MOTES; Assume we already have this table. booted( ) : self = initialize Role( ); firstTime = true; call RadioCont rol.start( ); event void RadioControl.startDone (error t err) { First we set the current address of this mote call AMA.setAddress (sensorgroup, sensoraddress); if self = = source then read (x) ; } readDone( ) : Note: This is executed only by source node. if self == source then {d = data from read operation; for each randomly selected neighbour k, send (to node k, data d); } event void AMSend.sendDone (message t msg, error t err) { if (err == FAIL) { call Leds.led0On( ); } } receive( ) : if self = = sink then e xtract packet and process; if self = = intermediate firstTime then { firstTime = false; extract data; for each randomly selected neighbour k, send (to node k, data d);} event void AMSend.sendDone (message t msg, error t err) { if (err == FAIL) { call Leds.led0On( ); } } async event void AMA.changed( ) {} event void RadioControl.stopDone (error t err) {} } module Tracking { uses interface Boot; uses interface ReadStream as Temperature; uses interface Timer as Timer0; uses interface Timer as Timer1; } XIV. TRACKING Đây là một programtracking đơn giản được viết cho một mạng cảm ứng. Trong ví dụ này, chương trình sẻ theo dõi nhiệt độ thay đổi theo thời gian.{ configuration TrackingAppC { } implementation { components TrackingC as App; components MainC; components new TimerMilliC( ) as Timer0 components new TelosbSensorC( ) App.Boot → MainC; App.Timer0 → Timer0; App.ReadStream → TelosbSensorC } } Read Stream đọc nhiệt độ môi trường tự nhiên và timerscần thiết để lấy mẫu. Đầu tiên chúng ta lấy giá trị ban đầu để đưa vào một vector. Sau đó tiếp tục theo dỏi.Chúng ta đọc giá trị của sensor và so sánh giát trị mới với giá trị ở vector, và tìm những giá trị có sự thay đổi đáng kể. Chúng ta chọn ReadStream để cài đặt cho TelosB. Sử dụng nhữngcài đặt từ giao diện, chúng ta thực hiện theo các bước sau.Đầu tiên,chúng ta khởi động 2 timers, 1 single shot và chu kỳ khác. Khi cóđám cháynhỏduy nhất, chúng ta sẽ cảm nhậnnhiệt độ ban đầuvàlưu nó như làgiá trị tham khảo. Đồng hồđịnh kỳ đượcsửdụngđể lấy mẫumôitrườngđịnh kỳ vàkiểm tra xemnhiệt độđã thay đổiđángkể. { implementation { define threshold 0.5 int temp1, temp2; event void Boot.booted() { initialize two timers as Timer0.startOneShot (100) and Timer1.startPeriodic (2000);} event void Timer0.fired() { temp1 = Temperature.read( ); } event void Timer1.fired( ) { temp2 = Temperature.read( ); if (abs (temp1temp2) > threshold) call led0Toggle( ); } } XV.TRUYVẤNTRONG RUMOR ROUTING Ví dụ, trong hình.9,4, nútPmuốn biếtsự kiệnxảy ratại nútX, và gửi một truy vấn. Trình tựcủa các sự kiệndiễn ranhư sau: Kỹ thuật cholập trình giao thức 1. NodePchọn ngẫu nhiênQ,và gửicác truy vấn. 2. Nếu Q khôngbiết câu trả lời, chuyển tiếp đếnR. 3. NodeRchuyển tiếpvào C. 4.NodeCtrả lờivớicácchi tiết củasự kiệne, cũng như các đường dẫn đếncảmbiến X. Chương trình dưới đây phâncác nútthànhbốn loại:các núttruyvấn(P), node đích (X), các nút mà có mộtconđườngdẫnđến nútđích(C), và nút mà không biếtvề nútđích(Q). Lưuýrằng loại hình này phân loại làtiềm ẩnhơn làrõràngbởicông dụng của mã nàymàmỗi nút thực hiện trong mạng.Mỗi nútthựchiệnchức năng của nótrong giao thức, và tất cả các các nút cùng nhauthựchiệnlược đồgiaothứctổng thể. { wait for( ), receivefromneighbour( ), and sendrequest( ) . Node P |originator of query to node X; P does not know the id of X. A node P wants to know about the event e. { Table T = build |neighbourhoodtable( ); a = randomly |choose |a |neighbour (from T); packet p = query q++event e; send |request (own |address, to a, packet p); programming abstraction wait for (reply r, from node a); event E = extract (r); display (message m);} } { wait for(), receivefromneighbour( ), and sendrequest( ). Node P |originator of query to node X; P does not know the id of X. A node P wants to know about the event e.QUERYING IN RUMOR ROUTING 191 { Table T = build |neighbourhoodtable( ); a = randomly |choose |a |neighbour (from T); packet p = query q++event e; send |(own |address, to a, packet p); programming abstraction wait for (reply r, from node a); event E = extract (r); display (message m); }Node Q | a node that does not know anything about X, so only forwards the request to a random neighbour like node R. { flag = 0; Table T = build |neighbourhoodtable( ); if (flag == 1) display (Already forwarded); else { programming abstraction receive |from |neighbour (query packet p); sender P = extract |id |of |sender (p); event E = extract |event (p); a = randomly |choose |a | neighbour (from T) such that the neighbour is not the sender node P; programming abstractionsend |request (own |address, to a, event E); wait for reply. programming abstraction wait for (packet p, from node a); send |reply (to P, packet p); flag = 1; } } Node C192 | a node that knows about the event node X via a neighbour. { I have not forwarded this message before. flag = 0; Table T = build |neighbourhoodtable( ); if (flag == 1) display (Already forwarded); else { receive |from |neighbour (query packet p); sender P = extract |id |of |sender (p); I already have a pointer to B. neighbour B = lookup |local |memory( ); send (packet p, to node B); wait forreply (from node B, reply packet q); send |received |reply (to P, reply packet q); } } Node D Destination node D that reports event e { receive |from |neighbour (query packet p); sender P = extract |id |of |sender (p); extract |original | sender (node S, from packet p); new packet p = sender S++event e send (packet p, to P); } } Mỗi sự trừu tượng hóa xácđịnhmột cách xử lýcơ bản màchúngtathấy hữu íchtrongkinh nghiệm lập trình cảm biến. Tất cả nhữngkhái niệm trừu tượngnàysẽđượcthựchiệnbằng cách sử dụng trạnglistening và sleeping dựa trên lịch trình SMAC.Như vậy đến nay, chúngtôiđãxem xét các ví dụmàcác nútphải truyền tảivà nhận dữ liệu trong một thiết lập chung. Các nútkhôngbiết về nhau.Tuy nhiên, trong nhiềutìnhhuốngthực tế, các nút cómột phần nhận thứcvềnhau.Các mã sau đây minhhọamột trong những kỹ thuậtnhư vậy, nơicác núttrao đổi thông tin hiệu quả hơn theomột số giả định.Đoạn chương trình trên cho thấymãcho mỗi nútliên quan đếncác hoạt độngtruy vấn cho rumor routing.Vai tròthực hiện bởimỗi một nútquy địnhcụthểtrong các mãcó thể đượcsápnhậplại với nhau vàđượccàiđặttrên mỗinode. { role query generator (like P): fired( ): for each randomly generated neighbour q, { store q ’s id; send (query to q); } sendDone( ): { NIL } receive( ): if packet received from one of the neighbours previously randomly neighbour, then extract the answer; halt. role out side rumor domain (like Q): fired( ): NIL.receive( ): if query received from a node p then { store address of p; for each randomly generated neighbour q, { store q’ s id; send (query to q); } } if packet received from one of the neighbours previously randomly chosen neighbour, then extract the answer; send the answer to node p; role | inside rumor domain (like C): fired( ): NIL receive( ): if query received from any node r then { obtain answer to query from the local memory;also obtain address of a node (like B) which has path to the event node like E; send to node r; } } Trả lời câu hỏi: 1. Câu 1: theo bạn, nút trung gian có vai trò như thế nào trong truyền thông trong giao thức MEDIATION DEVICE PROTOCOL Nút trung gian được dùng trong giao thức MEDIATION DEVICE PROTOCOL để thực hiện các quảng bá cho các nút lân cận biết là nó muốn truyền một gói tin. Nút trung gian cũng sẽ thông báo cho máy phát biết có máy thu sẽ nhận tin Nút trung gian cũng làm nhiệm vụ kết nối, duy trì kết nối và kiểm tra lỗi trong quá trình truyền tin. Câu 2: Flooding là gì, trình bày lợi ích và hạn chế của nó trong mạng cảm biến ? Flooding là một thử tục định tuyến dễ dàng, ở thủ tục này mỗi nút có thể quảng bá thông tin mới nhận được đến các nút hàng xóm 1 cách dễ dàng mà không phải nhận biết cấu trúc liên kết của mạng. Trong flooding 1 nút có thể truyền đến tất cả các nút láng giềng, nó có thể truyền ngay trong khi mạng có bất kỳ sự thay đổi gì, thì dữ liệu vẫn có thể truyền theo kiểu tràn đầy miễn có tồn tại nút nguồn đến nút đích. Tuy nhiên, hạn chế của thủ tục này là sẽ tiêu tốn nhiều năng lượng bởi vì mỗi với mỗi gói dữ liệu thị tất cả các nút trong miền quảng bá đều nhận được gói và đều chuyển tiếp nó đến nút mạng hàng xóm của nó. Và phải làm ở công suất lớn nên cũng làm giảm thời gian sống của mạng.

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CƠ SỞ TẠI THÀNH PHỐ HỒ CHÍ MINH KHOA KỸ THUẬT ĐIỆN TỬ BÁO CÁO MÔN HỌC MẠNG CẢM BIẾN Giáo viên môn :Huỳnh Trọng Thừa Sinh viên thực : Trịnh Phi Hùng MSSV : 409190009 Nguyễn Đăng Khoa MSSV : 409190011 Nguyễn Chí Nhân MSSV : 4091900 Hồ Chí Minh năm 2012 Techniques for Protocol Programming (Các kĩ thuật giao thức lập trình) Mạng cảm biến không dây thường dùng ứng dụng đo đạc, phát hiện, dự báo : đo nhiệt độ, đo độ ẩm, cảm nhận độ rung … Hầu hết nút cảm biến thường dùng sở liệu phát kiện tự nhiên, truyền thông đóng vai trò quan trọng việc xác định thời gian sống nút cảm biến, tốc độ định tuyến chất liệu truyền mạng Do mà cần quan tâm tới tính năng, giao thức sử dụng lớp phân rã IP , lớp MAC S-MAC giao thức điều khiển truy nhập trung bình mạng cảm biến, phát triển từ mạng 802.11 truyền thống có ưu điểm giảm lượng tiêu thụ khả tự cấu hình cho mạng Trong phát triển người ta xác định nguồn tiêu tốn lượng cải thiện nhằm khắc phục Hai ba nguồn tiêu thụ lượng đề cấp đến đây: - Cộng tuyến : hay nhiều nút gửi gói tin nút trung tâm, va chạm xảy làm sai hỏng gói tin Vì phải tiêu tốn lượng vô ích để truyền lại gói tin bị hỏng - Nghe lỏm : trường hợp nút nghe nhiều gói tin không dùng cho phải tiêu tốn lượng Với việc sử dụng giao thức S-MAC nút trạng thái ngủ theo lịch trình giảm lượng nghe lỏm I THE MEDIATION DEVICE PROTOCOL( thiết bị trung gian) Bây ta xem xét giao thức tiếng thiết bị hòa giải trung gian, giao thức nút A muốn truyền tải gói tin tới nút B - Nút A thông báo cho thiết bị trung gian biết định kì gửi gói tin RTS (request-to-send), thiết bị trung gian bắt gói tin Nút A gửi gói RTS thay cảnh báo truy vấn - Nút A sau chế độ nhận (lắng nghe ) - Các thiết bị trung gian phải chờ nút B truy vấn gửi lại gói tin trả lời truy vấn nó, cho biết địa nút A khoảng thời gian bù đắp cho thời gian truyền - Nút B bít B nghe lần gửi CTS tới nút A (Bây giờ, nút B biết thời gian nút A, biết thời điểm t nút A chế độ truyền xảy lần nữa.) - Nút B đợi t’ để nhận dử liệu từ nút A - Tại t” nút B gửi gói tin báo xác nhận (nút B biết t” với nút A có chu kỳ ) - Sau nút A nút B truyền xong lại lặp lại trình phát tín hiệu truy vấn - Nút B khôi phục lại chu kì định kì tách biệt với chu kì nút A II CONTENTION-BASED PROTOCOLS Giao thức contention-based đề cập đến lớp giao thức truyền thông, số quy tắc việc thu, phát sóng đề xuất cho nút cảm biến mạng bắt buộc phải tuân thủ Carrier Sense Multiple Access Protocol (CSMA): Trước có thông tin truyền đi, nút truyền phải xác nhận không hoạt động truyền đồng thời hay chia thông tin diễn III PROGRAMMING WITH LINK-LAYER PROTOCOLS: Trong phần xem xét thách thức đặt việc lập trình lớp liên kết liệu, sử dụng kĩ thuật ARQ (automatic repeat request – tự động lặp lại yêu cầu).Giao thức cố gắng gửi lại gói tin có độ tin cậy cách sử dụng báo nhận gửi lại IV AUTOMATIC REPEAT REQUEST (ARQ) PROTOCOL): Ý tưởng giao thức ARQ hiểu sau : Nút truyền liệu sử dụng giao thức link-layer chấp nhận gói liệu, tạo gói tin cách thêm vào header check sum truyền gói tin đóng gói tới máy thu Bên máy thu kiểm tra check sum có không, gửi tin ACK(báo nhận) dương tới máy phát, kiểm tra bị sai máy thu gửi môt ACK âm tới máy phát Máy phát nhận lại ACK dương biết gửi gói tin thành công nhận tin ACK âm gửi lại gói tin cho máy thu V TRANSMITTER ROLE : Lưu ý thời gian để máy phát từ lúc gửi gói tin đến lúc thoát để vào chế độ ngủ định có giới hạn.Nếu máy phát không nhận tín hiệu ACK âm tiếp gửi tin nhắn tới nút khác mạng { //Let p be a data packet coming from the MAC layer frame = Header++data packet p++check sequence (FCS); // Construct the link layer packet repeat forever { transmit (frame, to receiver node j); // Can be done using Receive.receive( ) parallel { P1: {wait-for (ack); if(ack == positive) exit repeat loop; else continue; // it is negative ack // waited long enough P2: {if time-out() exit repeat loop; } } // end of parallel } // end of repeat; sleep( ) until woken-up( ); } { Receiver node j { repeatfor ever { // Can be done using Receive.receive ( ) p = receive-packet( ); result = checksum-test (p); if(result == success) {send ("success"); exit repeat loop;} elsesend ("failure"); } // end of repeat loop sleep ( ) until woken-up( ); } } Nút nhận(máy thu) liệu vào chế độ ngủ sau gửi tín hiệu ACK dương(nếu check sum - liệu đúng), không gửi tín hiệu ACK âm cho máy phát đợi máy phát gửi lại gói tin { TRANSMITTER(ARQ) FSM Model Transmitter: s0: frame = getFrame ( ); transmit ( frame ); go to s1; s1: receive( ); if acktype = +ve then {frame = getFrame( ); transmit (frame)} else { transmit (frame);} upon ack go to s1; // Use Receive.receive( ) for this -global: frame, acktype = +ve; booted( ): frame = getFrame( ); transmit (frame) receive( ): actype = extract ack type( ); ifacktype = + ve then {frame = getFrame( ); transmit (frame)} else { transmit (frame); } } { RECEIVER fired( ): {NULL} receive( ): ifchecksum is valid then send +ve ack else send -ve ack; } Nếu tín hiệu ACK âm bị bên máy phát thời gian time out, bên máy thu phải chờ bên máy phát gửi lại gói tin bị hỏng bên máy phát lại tín hiệu ACK âm Để kết thúc chờ đợi mãi bên máy phát thực lệnh receivepacket() Kết lãng phí thời gian chờ đợi nhiều làm tiêu hao thời lượng pin VI ALTERNATING-BIT-BASED ARQ PROTOCOLS: Một biến thể nhỏ giao thức giao thức alternating-bitbased Trong giao thức máy phát sử dụng bít gọi bit điều khiển, thiết lập luân phiên 1, để truyền tải gói tin p1, máy phát thêm vào bit đến gói tin P1 gói tin có dạng 0:P1 sau truyền tới cho máy thu, đặt thời gian s chờ đợi tín hiệu báo nhận ACK, thời gian timeout xảy trước nhận tín hiệu ACK từ máy thu thìmáy phát gửi lại gói tin 0:P1 Khi nhận tín hiệu ACK từ máy thu máy phát gửi gói tin p2, ta thêm bit điều khiển vào trước p2 p2 có dạng 1:P2 Nếu máy thu nhận gói tin p2 báo nhận lại ta truyền tiếp gói tin p3 có dạng 0:P3 Như giao thức quản lý việc truyền liệu tín hiệu ACK { Transmitter i Control bit b = 0; REPEAT: repeat for ever { read-packet-to-send (p); RESEND: transmit (b:p); PARALLEL: P1: { wait-for-ack( ); p = p+1 mod 2;} // Receive.receive( ); no clock necessary am addr t sensoraddress = 2; // Pre-determined address of current sensor am group t sensorgroup = 1; RoutingData table [NO OF MOTES]; // Assume we already have this table booted( ) : self = initialize Role( ); firstTime = true; call RadioCont rol.start( ); event void RadioControl.startDone (error t err) { // First we set the current address of this mote call AMA.setAddress (sensorgroup, sensoraddress); if self = = source then read (x) ; } readDone( ) :// Note: This is executed only by source node if self == source then { d = data from read operation; for each randomly selected neighbour k, send (to node k, data d); } event void AMSend.sendDone (message t *msg, error t err) { if (err == FAIL) { call Leds.led0On( ); } } receive( ) : if self = = sink then e xtract packet and process; if self = = intermediate &firstTime then { firstTime = false; extract data; for each randomly selected neighbour k, send (to node k, data d); } event void AMSend.sendDone (message t* msg, error t err) { if (err == FAIL) { call Leds.led0On( ); } } async event void AMA.changed( ) {} event void RadioControl.stopDone (error t err) {} } module Tracking { uses interface Boot; uses interface ReadStream as Temperature; uses interface Timer as Timer0; uses interface Timer as Timer1; } XIV TRACKING Đây program-tracking đơn giản viết cho mạng cảm ứng Trong ví dụ này, chương trình sẻ theo dõi nhiệt độ thay đổi theo thời gian { configuration TrackingAppC { } implementation { components TrackingC as App; components MainC; components new TimerMilliC( ) as Timer0 components new TelosbSensorC( ) App.Boot → MainC; App.Timer0 → Timer0; App.ReadStream → TelosbSensorC } } Read Stream đọc nhiệt độ môi trường tự nhiên timerscần thiết để lấy mẫu Đầu tiên lấy giá trị ban đầu để đưa vào vector Sau tiếp tục theo dỏi.Chúng ta đọc giá trị sensor so sánh giát trị với giá trị vector, tìm giá trị có thay đổi đáng kể Chúng ta chọn ReadStream để cài đặt cho TelosB Sử dụng nhữngcài đặt từ giao diện, thực theo bước sau.Đầu tiên,chúng ta khởi động timers, single shot chu kỳ khác Khi cóđám cháynhỏ nhất, cảm nhậnnhiệt độ ban đầuvàlưu làgiá trị tham khảo Đồng hồđịnh kỳ đượcsửdụngđể lấy mẫumôitrườngđịnh kỳ vàkiểm tra xemnhiệt độđã thay đổiđángkể { implementation { define #threshold 0.5 int temp1, temp2; event void Boot.booted() { initialize two timers as Timer0.startOneShot (100) and Timer1.startPeriodic (2000); } event void Timer0.fired() { temp1 = Temperature.read( ); } event void Timer1.fired( ) { temp2 = Temperature.read( ); if (abs (temp1-temp2) > threshold) call led0Toggle( ); } } XV.TRUYVẤNTRONG RUMOR ROUTING Ví dụ, hình.9,4, nútPmuốn biếtsự kiệnxảy ratại nútX, gửi truy vấn Trình tựcủa kiệndiễn ranhư sau: Kỹ thuật cholập trình giao thức NodePchọn ngẫu nhiênQ,và gửicác truy vấn Nếu Q khôngbiết câu trả lời, chuyển tiếp đếnR NodeRchuyển tiếpvào C 4.NodeCtrả lờivớicácchi tiết củasự kiệne, đường dẫn đếncảmbiến X Chương trình phâncác nútthànhbốn loại:các núttruy vấn(P), node đích (X), nút mà có mộtconđườngdẫnđến nútđích(C), nút mà không biếtvề nútđích(Q) Lưuýrằng loại hình phân loại làtiềm ẩnhơn làrõràngbởicông dụng mã nàymàmỗi nút thực mạng.Mỗi nútthựchiệnchức nótrong giao thức, tất các nút nhauthựchiệnlược đồgiaothứctổng thể { wait -for( ), receive-from-neighbour( ), and send-request( ) Node P |originator of query to node X; P does not know the id of X // A node P wants to know about the event e { Table T = build |neighbourhoodtable( ); a = randomly |choose |a |neighbour (from T); packet p = query q++event e; send |request (own |address, to a, packet p); // programming abstraction wait -for (reply r, from node a); event E = extract (r); display (message m); } } { wait -for(), receive-from-neighbour( ), and send-request( ) Node P |originator of query to node X; P does not know the id of X // A node P wants to know about the event e.QUERYING IN RUMOR ROUTING 191 { Table T = build |neighbourhoodtable( ); a = randomly |choose |a |neighbour (from T); packet p = query q++event e; send |(own |address, to a, packet p); // programming abstraction wait -for (reply r, from node a); event E = extract (r); display (message m); } Node Q | a node that does not know anything about X, so only forwards the request to a random neighbour like node R { flag = 0; Table T = build |neighbourhoodtable( ); if (flag == 1) display ("Already forwarded"); else { // programming abstraction receive |from |neighbour (query packet p); sender P = extract |id |of |sender (p); event E = extract |event (p); a = randomly |choose |a | neighbour (from T) such that the neighbour is not the sender node P; // programming abstraction send |request (own |address, to a, event E); // wait for reply.// programming abstraction wait -for (packet p, from node a); send |reply (to P, packet p); flag = 1; } } Node C192 | a node that knows about the event node X via a neighbour { // I have not forwarded this message before flag = 0; Table T = build |neighbourhoodtable( ); if (flag == 1) display ("Already forwarded"); else { receive |from |neighbour (query packet p); sender P = extract |id |of |sender (p); // I already have a pointer to B neighbour B = lookup |local |memory( ); send (packet p, to node B); wait -for-reply (from node B, reply packet q); send |received |reply (to P, reply packet q); } } Node D // Destination node D that reports event e { receive |from |neighbour (query packet p); sender P = extract |id |of |sender (p); extract |original | sender (node S, from packet p); new packet p = sender S++event e send (packet p, to P); } } Mỗi trừu tượng hóa xácđịnhmột cách xử lýcơ màchúngtathấy hữu íchtrongkinh nghiệm lập trình cảm biến Tất nhữngkhái niệm trừu tượngnàysẽđượcthựchiệnbằng cách sử dụng trạng listening sleeping dựa lịch trình S-MAC.Như đến nay, chúngtôiđãxem xét ví dụmàcác nútphải truyền tảivà nhận liệu thiết lập chung Các nútkhôngbiết nhau.Tuy nhiên, nhiềutìnhhuốngthực tế, nút cómột phần nhận thứcvềnhau.Các mã sau minhhọamột kỹ thuậtnhư vậy, nơicác núttrao đổi thông tin hiệu theomột số giả định.Đoạn chương trình cho thấymãcho nútliên quan đếncác hoạt độngtruy vấn cho rumor routing.Vai tròthực bởimỗi nútquy địnhcụthểtrong mãcó thể đượcsápnhậplại với vàđượccàiđặttrên mỗinode { role - query generator (like P): fired( ): for each randomly generated neighbour q, { store q ’s id; send (query to q); } sendDone( ): { NIL } receive( ): if packet received from one of the neighbours previously randomly neighbour, then extract the answer; halt role - out side rumor domain (like Q): fired( ): NIL receive( ): if query received from a node p then { store address of p; for each randomly generated neighbour q, { store q’ s id; send (query to q); } } if packet received from one of the neighbours previously randomly chosen neighbour, then extract the answer; send the answer to node p; role | inside rumor domain (like C): fired( ): NIL receive( ): if query received from any node r then { obtain answer to query from the local memory; also obtain address of a node (like B) which has path to the event node like E; send to node r; } } Trả lời câu hỏi: Câu 1: theo bạn, nút trung gian có vai trò truyền thông giao thức MEDIATION DEVICE PROTOCOL - Nút trung gian dùng giao thức MEDIATION DEVICE PROTOCOL để thực quảng bá cho nút lân cận biết muốn truyền gói tin - Nút trung gian thông báo cho máy phát biết có máy thu nhận tin - Nút trung gian làm nhiệm vụ kết nối, trì kết nối kiểm tra lỗi trình truyền tin Câu 2: Flooding gì, trình bày lợi ích hạn chế mạng cảm biến ? - Flooding thử tục định tuyến dễ dàng, thủ tục nút quảng bá thông tin nhận đến nút hàng xóm cách dễ dàng mà nhận biết cấu trúc liên kết mạng - Trong flooding nút truyền đến tất nút láng giềng, truyền mạng có thay đổi gì, liệu truyền theo kiểu tràn đầy miễn có tồn nút nguồn đến nút đích Tuy nhiên, hạn chế thủ tục tiêu tốn nhiều lượng với gói liệu thị tất nút miền quảng bá nhận gói chuyển tiếp đến nút mạng hàng xóm Và phải làm công suất lớn nên làm giảm thời gian sống mạng [...]... khi gửi các gói tin nếu có bất kì báo cáo về lỗi gửi thì chúng ta sẽ bật một đèn LED, sau này ta sẽ không cố gắng gửi lại gói tin nữa mà nếu nhận được mốt gói tin bất kì thì ta sẽ tách lấy địa chỉ của người gửi rồi so sánh với địa chỉ của mình để xem có bị trùng lặp không Nếu không có trùng lặp ta sẽ tự thiết lập và nhớ địa chỉ của mình và đánh dấu bằng cách đặt một cờ báo( từ giờ trở đi sẽ không trả... (-ve ack, i); } nesC code: booted( ): i = 0; receive( ): } Trong một số ứng dụng thực tế, phương pháp này tỏ ra có lợi hơn VIII NAMING AND ADDRESSING Trong môi trường bên ngoài thì các nút trong mạng cảm biến có thể hư hỏng bất cứ khi nào.Vì vậy trong một WSN thì các nút phân bố trong mạng phải được gán một địa chỉ duy nhất, việc này để dể dàng trong việc quản lí các nút trong khi phát sinh các trường... AMA.setAddress (my group, my address); } Địa chỉ của tôi là một biến số toàn cục trong các địa chỉ ngẫu nhiên được lưu trữ, sau đó được phát ra cho các nút lân cận Ngay sau khi các thành phần được nêu trên được bật bởi lệnh RadioControl.start() thì chúng ta sẽ thực hiện các nhiệm vụ sau đây Đầu tiên sẽ tạo ra một địa chỉ ngẫu nhiên và đặt vào trong biến toàn cục của tôi.Chúng ta sẽ kiểm tra tất cả các nút... các giá trị được gửi đến mà chưa kịp truyền đi, hay nhớ các báo nhận ACK gửi đến… Các máy phát gửi liên tiếp các gói tin cho máy thu, máy thu kết thúc nhận dữ liệu khi có tín hiệu +ACK (ACK dương) và nếu gói bị hỏng hoặc gửi thiếu nó sẻ gửi cho máy phát một – ACK(ACK âm), từ đó máy phát sẽ so sánh và gửi lại cái gói tin bị hỏng theo chỉ số của báo nhận ACK tương ứng Phương pháp này có lợi thế hơn các... trở đi sẽ không trả lời tin nhắn từ các nút khác gửi đến và cũng không thay đổi địa chỉ của mình nữa Điều này đạt được bằng thiết lập cờ báo TRUE) Tuy nhiên nếu ta nhận thấy địa chỉ bị trùng lặp thì ta sẽ tạo ra một địa chỉ và gán đó là địa chỉ của mình, sau đó phát đi báo cho các nút lân cận và chờ các nút đó trả lời Ta cứ tiếp tục như thế cho đến khi tìm thấy địa chỉ của mình Trước khi làm xong công

Ngày đăng: 12/07/2016, 16:03

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan