Example #1
0
    def toBeCH(self):
        listNodeNoCH = []
        for i in range(len(self.network)):
            NodeCH = False
            for j in range(len(self.clusterH)):
                if self.network[i][0][0] == self.clusterH[j][0]:
                    NodeCH = True
            if NodeCH == False and self.alive(self.network[i][0][0]) == 1:
                listNodeNoCH.append(self.network[i])

        if len(listNodeNoCH) == 0:
            listNodeNoCH = copy.deepcopy(self.network)
            self.clusterH[:] = []
        print('lisnoch')
        print(listNodeNoCH)

        e = listNodeNoCH[0][0][1]
        print("ener", e)
        coorCH = listNodeNoCH[0][0][2]
        for i in range(len(listNodeNoCH)):
            if listNodeNoCH[i][0][1] >= e:
                self.adrrCH = listNodeNoCH[i][0][0]
                e = listNodeNoCH[i][0][1]
                coorCH = listNodeNoCH[i][0][2]
        self.clusterH.append([self.adrrCH, e])
        print(self.clusterH)
        msgHandler = MsgHandler()
        print(coorCH)
        msgCH = msgHandler.Encode_CH_Change_Msg(self.adrrCH, e, coorCH)
        print("New Cluster Head :", self.adrrCH, e)

        return self.adrrCH, msgCH
    def receive(self,addr_source, port_source):
        code=0
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        s.bind((addr_source, port_source)) 
	s.setblocking(0)
        msgHandler=MsgHandler()
        #a=time.time() 
        #time.sleep(5)
        #b=time.time()
        #print b-a
        lastSend=time.time()
	start_time=lastSend
        number_node_activated=0
        while True:
		try:
		    #time.sleep(1)
		    #print str(time.time()-lastSend)
		    if (time.time()-lastSend)>COMMUNICATION_TIMEOUT and self.HasInit==True and lastSend!=start_time:
			print 'lost connection with cluster head for : ' + str(time.time()-lastSend)
		        self.Change_to_spare_CH()
			print 'change to spare cluster head: '+ str(self.clusterHead)
		        msg=msgHandler.Encode_CH_Change_Msg(self.clusterHead[0],self.clusterHead[1],self.clusterHead[2])
		        for eachNode in self.network:
		            code=self.send(eachNode[0], PORT, msg)
			lastSend=time.time()
                        print 'Reset lastSend time: '  +str (lastSend)
		    data, addr = s.recvfrom(1024)
		    
		    #print 'received' + data
		    type_msg=msgHandler.Decode(data)
		    if type_msg==1:
		        temp,code=msgHandler.Decode_CH_Change_Msg(data)
		        if code==0:
		            self.clusterHead=temp
		            self.RefreshNetwork(temp)
		            print '******************************'
		            print 'received: ' + str(temp)
		            print 'CH changed:'
		            print self.clusterHead
		        else:
		            print "error in decoding CH change msg."
		    elif type_msg==2:
		        temp,code=msgHandler.Decode_List_Info_Msg(data)
		        if code==0:
		            self.network=temp
			        self.clusterHead=temp[0]
                    lastSend=time.time()
		            print 'Received network info: '
                    print str(self.network)
                    print ' '
		        else:
                for tempNode in node.network:
                    if node.calculateCoor(node.clusterHead[2], tempNode[2]):
                        tempNet.append(tempNode)
                node.network = tempNet
                print 'Network after change: '

                print node.network
                print ' '
                
                # tell the BS the information of the network
		
                node.send(BS_addr, BS_port, MS_Handler.Encode_List_Info_Msg(node.network))
                # send information to the new cluster head to let him be the new cluster head
                for eachNode in node.network:

                    code=node.send(eachNode[0], PORT, MS_Handler.Encode_CH_Change_Msg(node.clusterHead[0],node.clusterHead[1],node.clusterHead[2]))
                    #print '++++++++++++++++'
                    #print code
                #timerUpdateHead=
                CH_start=0
        
            
            
            #elif (len(buff)==buffSize):
            #    node.send(BS_addr, BS_port, buff)
            #    lastSend = time.time()
            
           
            '''
            timerUpdateHead = threading.Timer(100, node.selectNextHead)
            timerSendBS = threading.Timer(