func HandleInit(conn *net.TCPConn, pkt *packet.Pkt) *Client { log.Printf("Handling packet type: Regist") var dataInit = packet.PktDataInit{} err := packet.Unpack(pkt, &dataInit) if err != nil { log.Printf("Failed to Unpack: %s", err.Error()) return nil } // TODO: check if the Id already exist client := Client{ Conn: conn, Id: dataInit.DevId, PktChan: make(chan *packet.Pkt), LastHeartbeat: time.Now(), } log.Printf("New Device is online, Id: %s", client.Id) go func() { for { select { case pkt := <-client.PktChan: log.Printf("pkt to send") b, err := pkt.Serialize() if err != nil { log.Printf("Error on serializing pkt: %s", err.Error()) continue } var n int n, err = conn.Write(b) if err != nil { log.Printf("Error on sending pkt: %s", err.Error()) continue } log.Printf("Write successfully: %d", n) } } }() // send Response for the Init packet dataInitResp := packet.PktDataInitResp{ Result: 0, } initRespPkt, err := packet.Pack(packet.PKT_Init_Resp, 0, &dataInitResp) if err != nil { log.Printf("Pack error: %s", err.Error()) return nil } b, err := initRespPkt.Serialize() if err != nil { log.Printf("Serialize error: %s", err.Error()) return nil } conn.Write(b) ClientMapLock.Lock() ClientMap[client.Id] = &client ClientMapLock.Unlock() return &client }