From 90025642ce97002910ace4654c64035bb91ad4a8 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Wed, 29 Apr 2020 23:48:37 +0800
Subject: [PATCH] update prj1_tlv source code, test socket client connect ok

---
 prj1_tlv/lylib/tlv_pack.c    |  338 +++
 prj1_tlv/lylib/cscope.po.out |    0 
 prj1_tlv/lylib/tags          |  100 
 prj1_tlv/lylib/logger.c      |    1 
 prj1_tlv/lylib/crc-itu-t.h   |    2 
 prj1_tlv/lylib/cscope.out    | 4307 ++++++++++++++++++++++++++++++++++++-----
 prj1_tlv/lylib/socket.h      |  176 +
 prj1_tlv/tlv_client.log      |   25 
 prj1_tlv/tlv_client.c        |  202 +
 prj1_tlv/lylib/socket.c      |  789 +++++++
 prj1_tlv/lylib/ds18b20.h     |   28 
 prj1_tlv/lylib/ds18b20.c     |  113 +
 prj1_tlv/lylib/cscope.in.out |    0 
 prj1_tlv/lylib/tlv_pack.h    |   77 
 14 files changed, 5,539 insertions(+), 619 deletions(-)

diff --git a/prj1_tlv/lylib/crc-itu-t.h b/prj1_tlv/lylib/crc-itu-t.h
index e054724..d47888e 100644
--- a/prj1_tlv/lylib/crc-itu-t.h
+++ b/prj1_tlv/lylib/crc-itu-t.h
@@ -13,7 +13,7 @@
 #ifndef CRC_ITU_T_H
 #define CRC_ITU_T_H
 
-#define MAGIC_CRC           0x1E50
+#define MAGIC_CRC           0x0107
 
 extern const unsigned short  crc_itu_t_table[256];
 
diff --git a/prj1_tlv/lylib/cscope.in.out b/prj1_tlv/lylib/cscope.in.out
index 564f270..c26f21a 100644
--- a/prj1_tlv/lylib/cscope.in.out
+++ b/prj1_tlv/lylib/cscope.in.out
Binary files differ
diff --git a/prj1_tlv/lylib/cscope.out b/prj1_tlv/lylib/cscope.out
index 1fa0228..25ef2c8 100644
--- a/prj1_tlv/lylib/cscope.out
+++ b/prj1_tlv/lylib/cscope.out
@@ -1,4 +1,4 @@
-cscope 15 $HOME/.project/master.iot-yun.com/apue/prj1_tlv/lylib -q 0000004624 0000458102
+cscope 15 $HOME/.project/master.iot-yun.com/apue/prj1_tlv/lylib -q 0000004868 0000475994
 	@crc-itu-t.c
 
 8 
@@ -201,6 +201,318 @@
 	}
 }
 
+	@ds18b20.c
+
+14 
+	~<�dio.h
+>
+
+15 
+	~<�dlib.h
+>
+
+16 
+	~<uni�d.h
+>
+
+17 
+	~<�d�t.h
+>
+
+18 
+	~<f��.h
+>
+
+19 
+	~<d��t.h
+>
+
+20 
+	~<�r�g.h
+>
+
+21 
+	~<time.h
+>
+
+22 
+	~<��o.h
+>
+
+24 
+	~"logg�.h
+"
+
+32 
+	$ds18b20_g�_�m��tu�
+(
+u�t16_t
+ *
+�mp
+)
+
+34 
+w1_�th
+[50] = "/sys/bus/w1/devices/";
+
+35 
+ch�
+[20];
+
+36 
+buf
+[128];
+
+37 
+DIR
+ *
+d�p
+;
+
+38 
+d��t
+ *
+d���
+;
+
+39 
+fd
+ =-1;
+
+40 *
+�r
+;
+
+41 
+u�t8_t
+ *
+by�
+;
+
+42 
+v�ue
+;
+
+43 
+found
+ = 0;
+
+45 if�!
+�mp
+ )
+
+47 
+	`log_�r
+("ERROR: Invalid input�rguments\n");
+
+54 if((
+d�p
+ = 
+	`ݒd�
+(
+w1_�th
+)�=�
+NULL
+)
+
+56 
+	`log_�r
+("ݒd����: %s\n", 
+	`����
+(
+��o
+));
+
+60 (
+d���
+ = 
+	`�add�
+(
+d�p
+)�!�
+NULL
+)
+
+62 if(
+	`�r�r
+(
+d���
+->
+d_�me
+,"28-"))
+
+65 
+	`�r�y
+(
+ch�
+,
+d���
+->
+d_�me
+);
+
+66 
+found
+ = 1;
+
+70 
+	`�o�d�
+(
+d�p
+);
+
+72 if�!
+found
+ )
+
+74 
+	`log_�r
+("C��� f�d ds18b20 i�%s\n", 
+w1_�th
+);
+
+79 
+	`���t
+(
+w1_�th
+, 
+ch�
+, (w1_�th)-
+	`���
+(w1_path));
+
+80 
+	`���t
+(
+w1_�th
+, "/w1_�ave", (w1_�th)-
+	`���
+(w1_path));
+
+83 if�(
+fd
+=
+	`ݒ
+(
+w1_�th
+, 
+O_RDONLY
+)) < 0 )
+
+85 
+	`log_�r
+("ݒ %��r�: %s\n", 
+w1_�th
+, 
+	`����
+(
+��o
+));
+
+89 if(
+	`�ad
+(
+fd
+, 
+buf
+, (buf)) < 0)
+
+91 
+	`log_�r
+("�ad %��r�: %s\n", 
+w1_�th
+, 
+	`����
+(
+��o
+));
+
+92 
+	`�o�
+(
+fd
+);
+
+96 
+�r
+ = 
+	`�r�r
+(
+buf
+, "t=");
+
+97 if�!
+�r
+ )
+
+99 
+	`log_�r
+("ERROR: Can�ot get�emperature\n");
+
+100 
+	`�o�
+(
+fd
+);
+
+104 
+�r
++=2;
+
+107 
+by�
+ = (
+u�t8_t
+ *)
+�mp
+;
+
+108 
+by�
+[0] = 
+	`�oi
+(
+�r
+)/1000;
+
+109 
+by�
+[1] = (
+	`�oi
+(
+�r
+)%1000)/10;
+
+111 
+	`�o�
+(
+fd
+);
+
+113 
+	}
+}
+
+	@ds18b20.h
+
+14 #i�de� 
+_DS18B20_H_
+
+
+15 
+	#_DS18B20_H_
+
+
+	)
+
+23 
+ds18b20_g�_�m��tu�
+(
+u�t16_t
+ *
+�mp
+);
+
 	@logger.c
 
 14 
@@ -219,7 +531,7 @@
 LOG_ROLLBACK_NONE
 ;
 
-20 
+21 
 logg�_t
  *
 	glogg�
@@ -227,35 +539,35 @@
 NULL
 ;
 
-22 *
+23 *
 	glog_�r
 [
 LOG_LEVEL_MAX
  + 1] = { "", "F", "E", "W", "N", "D", "I", "T", "M" };
 
-24 
+25 
 	#LOG_TIME_FMT
  "%Y-%m-%d %H:%M:%S"
 
 	)
 
-26 
+27 
 	$log_sig�l_h�d�r
 (
 sig
 )
 
-28 if(!
+29 if(!
 logg�
 )
 
-31 i�(
+32 i�(
 sig
  =�
 SIGHUP
 )
 
-33 
+34 
 	`sig�l
 (
 SIGHUP
@@ -263,7 +575,7 @@
 log_sig�l_h�d�r
 );
 
-34 
+35 
 	`log_�l
 ("SIGHUP�e�ived -�eݒn�g�og f��[%s]", 
 logg�
@@ -271,25 +583,25 @@
 f�e
 );
 
-35 
+36 
 	`logg�_�ݒ
 ();
 
-37 
+38 
 	}
 }
 
-39 
+40 
 	$logg�_b��r
 (*
 �efix
 )
 
-41 if(!
+42 if(!
 logg�
 )
 
-44 
+45 
 	`�r�tf
 (
 logg�
@@ -297,7 +609,7 @@
 �
 , "%s�og \"%s\" on�evel [%s] size [%lu] KiB,�og system version %s\n",
 
-45 
+46 
 �efix
 , 
 logg�
@@ -313,27 +625,27 @@
 LOG_VERSION_STR
 );
 
-46 #ifde�
+47 #ifde�
 LOG_FILE_LINE
 
 
-47 
+48 
 	`�r�tf
 (
 logg�
 ->
 �
-, " [Date] [Time] [Level] [PID] [File/Line] [Content]\n");
+, " [ Date ] [ Time ] [ Level ] [ File/Line ] [ Message ]\n");
 
-49 
+50 
 	`�r�tf
 (
 logg�
 ->
 �
-, " [Date] [Time] [Level] [PID] [Content]\n");
+, " [ Date ] [ Time ] [ Level ] [ Message ]\n");
 
-51 
+52 
 	`�r�tf
 (
 logg�
@@ -341,25 +653,25 @@
 �
 , "-------------------------------------------------------------\n");
 
-52 
+53 
 	}
 }
 
-54 
+55 
 	$check_�d_r�lback
 ()
 
-56 if(!
+57 if(!
 logg�
 )
 
-59 i�(
+60 i�(
 log_r�lback_size
  !�
 LOG_ROLLBACK_NONE
 )
 
-61 
+62 
 _curOff�t
  = 
 	`�l
@@ -369,17 +681,17 @@
 �
 );
 
-63 i�((
+64 i�((
 _curOff�t
  !�-1�&& (_curOff��>�
 log_r�lback_size
 ))
 
-65 
+66 
 cmd
 [512];
 
-67 
+68 
 	`���tf
 (
 cmd
@@ -389,13 +701,13 @@
 f�e
 ,�ogger->file);
 
-68 
+69 
 	`sy�em
 (
 cmd
 );
 
-70 i�(-1 =�
+71 i�(-1 =�
 	`f�ek
 (
 logg�
@@ -405,7 +717,7 @@
 SEEK_SET
 ))
 
-71 
+72 
 	`�r�tf
 (
 logg�
@@ -413,7 +725,7 @@
 �
 , "log�ollback fseek failed \n");
 
-73 
+74 
 	`�w�d
 (
 logg�
@@ -421,7 +733,7 @@
 �
 );
 
-75 
+76 
 	`�un��
 (
 logg�
@@ -429,15 +741,15 @@
 f�e
 , 0);
 
-76 
+77 
 	`logg�_b��r
 ("Already�ollback");
 
-79 
+80 
 	}
 }
 
-83 
+84 
 	$logg�_��
 (
 logg�_t
@@ -451,19 +763,19 @@
 log_size
 )
 
-85 if�!
+86 if�!
 log
  )
 
-87 
+88 
 	`��tf
 ("ERROR: Invalid input�rguments\n");
 
-91 if�
+92 if�
 log_f�e
  )
 
-93 
+94 
 	`���y
 (
 log
@@ -475,7 +787,7 @@
 FILENAME_LEN
 );
 
-94 
+95 
 log
 ->
 �ag
@@ -483,7 +795,7 @@
 FLAG_LOGGER_FILE
 ;
 
-98 
+99 
 	`���y
 (
 log
@@ -495,7 +807,7 @@
 FILENAME_LEN
 );
 
-99 
+100 
 log
 ->
 �ag
@@ -503,13 +815,13 @@
 FLAG_LOGGER_CONSOLE
 ;
 
-102 
+103 
 log
 ->
 �v�
  =�evel;
 
-103 
+104 
 log
 ->
 size
@@ -517,35 +829,35 @@
 log_size
 ;
 
-106 
+107 
 logg�
  = 
 log
 ;
 
-109 
+110 
 	}
 }
 
-111 
+112 
 	$logg�_ݒ
 ()
 
-113 
+114 
 siga�i�
  
 a�
 ;
 
-114 *
+115 *
 f�emode
 ;
 
-116 if(!
+117 if(!
 logg�
 )
 
-121 
+122 
 log_r�lback_size
  = 
 logg�
@@ -555,13 +867,13 @@
 LOG_ROLLBACK_NONE
  :�ogger->size*1024;
 
-123 i�('\0' =�
+124 i�('\0' =�
 logg�
 ->
 f�e
 )
 
-126 i�(!
+127 i�(!
 	`�rcmp
 (
 logg�
@@ -571,7 +883,7 @@
 DBG_LOG_FILE
 ))
 
-128 
+129 
 logg�
 ->
 �
@@ -579,13 +891,13 @@
 �d�r
 ;
 
-129 
+130 
 log_r�lback_size
  = 
 LOG_ROLLBACK_NONE
 ;
 
-130 
+131 
 logg�
 ->
 �ag
@@ -593,11 +905,11 @@
 FLAG_LOGGER_CONSOLE
 ;
 
-131 
+132 
 OUT
 ;
 
-134 
+135 
 f�emode
  = (
 log_r�lback_size
@@ -605,7 +917,7 @@
 LOG_ROLLBACK_NONE
 ) ? "a+" : "w+";
 
-136 
+137 
 logg�
 ->
 �
@@ -617,7 +929,7 @@
 f�emode
 );
 
-137 i�(
+138 i�(
 NULL
  =�
 logg�
@@ -625,7 +937,7 @@
 �
 )
 
-139 
+140 
 	`�r�tf
 (
 �d�r
@@ -637,7 +949,7 @@
 f�emode
 );
 
-143 
+144 
 a�
 .
 �_h�d�r
@@ -645,7 +957,7 @@
 log_sig�l_h�d�r
 ;
 
-144 
+145 
 	`sigem�y�t
 (&
 a�
@@ -653,13 +965,13 @@
 �_mask
 );
 
-145 
+146 
 a�
 .
 �_�ags
  = 0;
 
-146 
+147 
 	`siga�i�
 (
 SIGHUP
@@ -669,37 +981,37 @@
 NULL
 );
 
-148 
+149 
 OUT
 :
 
-149 
+150 
 	`logg�_b��r
 ("Initialize");
 
-152 
+153 
 	}
 }
 
-154 
+155 
 	$logg�_�o�
 ()
 
-156 i�(!
+157 i�(!
 logg�
  || !logg�->
 �
  )
 
-159 
+160 
 	`logg�_b��r
 ("\nTerminate");
 
-160 
+161 
 	`logg�_�w
 ("\n\n\n\n");
 
-162 
+163 
 	`f�ush
 (
 logg�
@@ -707,7 +1019,7 @@
 �
 );
 
-164 
+165 
 	`f�o�
 (
 logg�
@@ -715,7 +1027,7 @@
 �
 );
 
-165 
+166 
 logg�
 ->
 �
@@ -723,27 +1035,27 @@
 NULL
 ;
 
-168 
+169 
 	}
 }
 
-170 
+171 
 	$logg�_�ݒ
 ()
 
-172 
+173 
 rc
  = 0;
 
-173 *
+174 *
 f�emode
 ;
 
-175 if�!
+176 if�!
 logg�
  )
 
-178 
+179 
 log_r�lback_size
  = 
 logg�
@@ -753,7 +1065,7 @@
 LOG_ROLLBACK_NONE
  :�ogger->size*1024;
 
-180 i�(
+181 i�(
 logg�
 ->
 �ag
@@ -761,7 +1073,7 @@
 FLAG_LOGGER_CONSOLE
  )
 
-182 
+183 
 	`f�ush
 (
 logg�
@@ -769,7 +1081,7 @@
 �
 );
 
-183 
+184 
 logg�
 ->
 �
@@ -777,17 +1089,17 @@
 �d�r
 ;
 
-187 i�(
+188 i�(
 logg�
 ->
 �
 )
 
-189 
+190 
 	`logg�_�o�
 ();
 
-190 
+191 
 f�emode
  = 
 log_r�lback_size
@@ -795,7 +1107,7 @@
 LOG_ROLLBACK_NONE
  ? "a+" : "w+";
 
-191 
+192 
 logg�
 ->
 �
@@ -807,7 +1119,7 @@
 f�emode
 );
 
-193 i�(
+194 i�(
 logg�
 ->
 �
@@ -815,75 +1127,75 @@
 NULL
 )
 
-194 
+195 
 rc
  = -2;
 
-198 
+199 
 rc
  = -3;
 
-201 i�(!
+202 i�(!
 rc
 )
 
-203 
+204 
 	`logg�_b��r
 ("\nReopen");
 
-205  
+206  
 rc
 ;
 
-206 
+207 
 	}
 }
 
-208 
+209 
 	$logg�_�rm
 ()
 
-210 if(!
+211 if(!
 logg�
 )
 
-213 
+214 
 	`logg�_�o�
 ();
 
-215 
+216 
 logg�
  = 
 NULL
 ;
 
-216 
+217 
 	}
 }
 
-218 
+219 
 	$logg�_�w
 (cڡ *
 fmt
 , ...)
 
-220 
+221 
 va_li�
  
 �gp
 ;
 
-222 i�(!
+223 i�(!
 logg�
  || !logg�->
 �
 )
 
-225 
+226 
 	`check_�d_r�lback
 ();
 
-227 
+228 
 	`va_��t
 (
 �gp
@@ -891,7 +1203,7 @@
 fmt
 );
 
-228 
+229 
 	`v�r�tf
 (
 logg�
@@ -903,17 +1215,17 @@
 �gp
 );
 
-229 
+230 
 	`va_�d
 (
 �gp
 );
 
-230 
+231 
 	}
 }
 
-232 
+233 
 	$�_��tout
 (*
 �v�
@@ -925,37 +1237,37 @@
 �gp
 )
 
-234 
+235 
 buf
 [
 MAX_LOG_MESSAGE_LEN
 ];
 
-235 
+236 
 tm
  *
 lo�l
 ;
 
-236 
+237 
 timev�
  
 now
 ;
 
-237 
+238 
 time�r
 [256];
 
-239 if(!
+240 if(!
 logg�
 )
 
-242 
+243 
 	`check_�d_r�lback
 ();
 
-244 
+245 
 	`g�timeofday
 (&
 now
@@ -963,7 +1275,7 @@
 NULL
 );
 
-245 
+246 
 lo�l
  = 
 	`lo��ime
@@ -973,7 +1285,7 @@
 tv_�c
 );
 
-247 
+248 
 	`�r�ime
 (
 time�r
@@ -983,7 +1295,7 @@
 lo�l
 );
 
-248 
+249 
 	`v���tf
 (
 buf
@@ -995,15 +1307,15 @@
 �gp
 );
 
-250 #ifde�
+251 #ifde�
 DUMPLICATE_OUTPUT
 
 
-251 
+252 
 	`��tf
 ("%s.%03ld [%s] : %s",
 
-252 
+253 
 time�r
 , 
 now
@@ -1017,13 +1329,13 @@
 buf
 );
 
-255 i�(
+256 i�(
 logg�
 ->
 �
 )
 
-256 
+257 
 	`�r�tf
 (
 logg�
@@ -1043,13 +1355,13 @@
 buf
 );
 
-258 i�(
+259 i�(
 logg�
 ->
 �
 )
 
-259 
+260 
 	`f�ush
 (
 logg�
@@ -1057,11 +1369,11 @@
 �
 );
 
-260 
+261 
 	}
 }
 
-262 
+263 
 	$�_��tout_l�e
 (*
 �v�
@@ -1077,37 +1389,37 @@
 �gp
 )
 
-264 
+265 
 buf
 [
 MAX_LOG_MESSAGE_LEN
 ];
 
-265 
+266 
 tm
  *
 lo�l
 ;
 
-266 
+267 
 timev�
  
 now
 ;
 
-267 
+268 
 time�r
 [256];
 
-269 if(!
+270 if(!
 logg�
 )
 
-272 
+273 
 	`check_�d_r�lback
 ();
 
-274 
+275 
 	`g�timeofday
 (&
 now
@@ -1115,7 +1427,7 @@
 NULL
 );
 
-275 
+276 
 lo�l
  = 
 	`lo��ime
@@ -1125,7 +1437,7 @@
 tv_�c
 );
 
-277 
+278 
 	`�r�ime
 (
 time�r
@@ -1135,7 +1447,7 @@
 lo�l
 );
 
-278 
+279 
 	`v���tf
 (
 buf
@@ -1147,15 +1459,15 @@
 �gp
 );
 
-280 #ifde�
+281 #ifde�
 DUMPLICATE_OUTPUT
 
 
-281 
-	`��tf
-("%s.%03ld [%s] (%s [%04d]) : %s",
-
 282 
+	`��tf
+("[%s.%03ld] <%s> <%s:%04d> : %s",
+
+283 
 time�r
 , 
 now
@@ -1173,21 +1485,21 @@
 buf
 );
 
-285 i�(
+286 i�(
 logg�
 ->
 �
 )
 
-287 
+288 
 	`�r�tf
 (
 logg�
 ->
 �
-, "%s.%03ld [%s] (%s [%04d]) : %s",
+, "[%s.%03ld] <%s> <%s:%04d> : %s",
 
-288 
+289 
 time�r
 , 
 now
@@ -1205,7 +1517,7 @@
 buf
 );
 
-290 
+291 
 	`f�ush
 (
 logg�
@@ -1213,11 +1525,11 @@
 �
 );
 
-292 
+293 
 	}
 }
 
-294 
+295 
 	$logg�_�r
 (
 �v�
@@ -1225,23 +1537,23 @@
 msg
 )
 
-296 i�(!
+297 i�(!
 logg�
  || 
 �v�
 >logger->level)
 
-299 
+300 
 	`check_�d_r�lback
 ();
 
-301 i�(
+302 i�(
 logg�
 ->
 �
 )
 
-302 
+303 
 	`fwr�e
 (
 msg
@@ -1253,13 +1565,13 @@
 �
 );
 
-304 if(
+305 if(
 logg�
 ->
 �
 )
 
-305 
+306 
 	`f�ush
 (
 logg�
@@ -1267,11 +1579,11 @@
 �
 );
 
-306 
+307 
 	}
 }
 
-308 
+309 
 	$logg�_m�
 (
 �v�
@@ -1279,19 +1591,19 @@
 fmt
 , ...)
 
-310 
+311 
 va_li�
  
 �gp
 ;
 
-312 i�(!
+313 i�(!
 logg�
  || 
 �v�
 >logger->level)
 
-315 
+316 
 	`va_��t
 (
 �gp
@@ -1299,7 +1611,7 @@
 fmt
 );
 
-316 
+317 
 	`�_��tout
 (
 log_�r
@@ -1311,17 +1623,17 @@
 �gp
 );
 
-317 
+318 
 	`va_�d
 (
 �gp
 );
 
-318 
+319 
 	}
 }
 
-320 
+321 
 	$logg�_l�e
 (
 �v�
@@ -1333,19 +1645,19 @@
 fmt
 , ...)
 
-322 
+323 
 va_li�
  
 �gp
 ;
 
-324 i�(!
+325 i�(!
 logg�
  || 
 �v�
 >logger->level)
 
-327 
+328 
 	`va_��t
 (
 �gp
@@ -1353,7 +1665,7 @@
 fmt
 );
 
-328 
+329 
 	`�_��tout_l�e
 (
 log_�r
@@ -1369,33 +1681,33 @@
 �gp
 );
 
-330 
+331 
 	`va_�d
 (
 �gp
 );
 
-331 
+332 
 	}
 }
 
-333 
+334 
 	#LINELEN
  81
 
 	)
 
-334 
+335 
 	#CHARS_PER_LINE
  16
 
 	)
 
-335 *
+336 *
 	g��t_ch�
  =
 
-353 
+354 
 	$logg�_dump
 (
 �v�
@@ -1405,65 +1717,65 @@
 �n
 )
 
-355 
+356 
 rc
 ;
 
-356 
+357 
 idx
 ;
 
-357 
+358 
 �n
 [
 LINELEN
 ];
 
-358 
+359 
 l�
 [
 CHARS_PER_LINE
  + 2];
 
-359 
+360 
 hc
 [4];
 
-360 
+361 
 l�e_d�e
  = 1;
 
-362 i�(!
+363 i�(!
 logg�
  || 
 �v�
 >logger->level)
 
-365 
+366 
 rc
  = 
 �n
 ;
 
-366 
+367 
 idx
  = 0;
 
-367 
+368 
 l�
 [
 CHARS_PER_LINE
 ] = '\0';
 
-369 
+370 
 rc
  > 0)
 
-371 i�(
+372 i�(
 l�e_d�e
 )
 
-372 
+373 
 	`���tf
 (
 �n
@@ -1473,7 +1785,7 @@
 idx
 );
 
-376 
+377 
 c
  = 
 buf
@@ -1481,7 +1793,7 @@
 idx
 ];
 
-377 
+378 
 	`���tf
 (
 hc
@@ -1489,7 +1801,7 @@
 c
 );
 
-378 
+379 
 	`���t
 (
 �n
@@ -1499,7 +1811,7 @@
 LINELEN
 );
 
-380 
+381 
 l�
 [
 idx
@@ -1511,7 +1823,7 @@
 c
 ];
 
-382 --
+383 --
 rc
  > 0 && (++
 idx
@@ -1519,7 +1831,7 @@
 CHARS_PER_LINE
  != 0));
 
-384 
+385 
 l�e_d�e
  = (
 idx
@@ -1527,15 +1839,15 @@
 CHARS_PER_LINE
 ) == 0;
 
-385 i�(
+386 i�(
 l�e_d�e
 )
 
-387 #ifde�
+388 #ifde�
 DUMPLICATE_OUTPUT
 
 
-388 
+389 
 	`��tf
 ("%� %s\n", 
 �n
@@ -1543,13 +1855,13 @@
 l�
 );
 
-390 i�(
+391 i�(
 logg�
 ->
 �
 )
 
-391 
+392 
 	`�r�tf
 (
 logg�
@@ -1561,11 +1873,11 @@
 l�
 );
 
-395 i�(!
+396 i�(!
 l�e_d�e
 )
 
-397 
+398 
 ldx
  = 
 idx
@@ -1573,7 +1885,7 @@
 CHARS_PER_LINE
 ;
 
-398 
+399 
 l�
 [
 ldx
@@ -1585,19 +1897,19 @@
 idx
 ]];
 
-399 
+400 
 l�
 [
 ldx
 ] = '\0';
 
-401 (++
+402 (++
 idx
  % 
 CHARS_PER_LINE
 ) != 0)
 
-402 
+403 
 	`���t
 (
 �n
@@ -1605,11 +1917,11 @@
 LINELEN
 );
 
-404 #ifde�
+405 #ifde�
 DUMPLICATE_OUTPUT
 
 
-405 
+406 
 	`��tf
 ("%� %s\n", 
 �n
@@ -1617,13 +1929,13 @@
 l�
 );
 
-407 i�(
+408 i�(
 logg�
 ->
 �
 )
 
-408 
+409 
 	`�r�tf
 (
 logg�
@@ -1635,7 +1947,7 @@
 l�
 );
 
-411 
+412 
 	}
 }
 
@@ -2190,7 +2502,7 @@
 ={0};
 
 28 
-	$�_�oc_sigh�d�r
+	$�oc_sigh�d�r
 (
 sig
 )
@@ -2248,7 +2560,7 @@
 }
 
 55 
-	$�_���l_�oc_sig�l
+	$���l_�oc_sig�l
 ()
 
 57 
@@ -2282,7 +2594,7 @@
 .
 �_h�d�r
  = 
-�_�oc_sigh�d�r
+�oc_sigh�d�r
 ;
 
 67 
@@ -3149,23 +3461,17 @@
 	t�oc_sig�l_t
 ;
 
-27 *(* 
-	tth�ad_body
-�(*
-	tth�ad_�g
-);
-
-29 
+27 
 �oc_sig�l_t
  
 g_sig�l
 ;
 
-30 

-�_���l_�oc_sig�l
+28 

+���l_�oc_sig�l
 ();
 
-32 

+30 

 d�m�ize
 (
 nochd�
@@ -3173,13 +3479,13 @@
 no�o�
 );
 
-33 

+31 

 �c�d_d�m�_pid
 (cڡ *
 pid_f�e
 );
 
-34 
+32 
 pid_t
  
 g�_d�m�_pid
@@ -3187,31 +3493,37 @@
 pid_f�e
 );
 
-35 

+33 

 check_d�m�_rušg
 (cڡ *
 pid_f�e
 );
 
-36 

+34 

 ��_d�m�_rušg
 (cڡ *
 pid_f�e
 );
 
-37 

+35 

 �t_d�m�_rušg
 (cڡ *
 pid_f�e
 );
 
-39 

+37 

 exec_sy�em_cmd
 (cڡ *
 f�m�
 , ...);
 
-41 

+39 *(* 
+	tth�ad_body
+)(*
+	tth�ad_�g
+);
+
+40 

 th�ad_��t
 (
 �h�ad_t
@@ -3231,7 +3543,7 @@
 �om�
 );
 
-	@tlv_sample.c
+	@tlv_pack.c
 
 14 
 	~<�dio.h
@@ -3241,185 +3553,49 @@
 	~<�r�g.h
 >
 
-16 
+17 
+	~"�v_�ck.h
+"
+
+18 
 	~"�c-�u-t.h
 "
 
-18 
-	#OFF
- 0
-
-	)
-
-19 
-	#ON
- 1
-
-	)
-
-21 
-	#BUFSIZE
- 128
-
-	)
-
-30 
-	#PACK_HEADER
- 0xFD
-
-	)
-
-35 
-	mTAG_LOGON
-=1,
-
-36 
-	mTAG_CAMERA
-,
-
-37 
-	mTAG_LED
-,
-
-41 
-	#TLV_FIXED_SIZE
- 5
-
-	)
-
-44 
-	#TLV_MIN_SIZE
- (
-TLV_FIXED_SIZE
-+1)
-
-	)
-
-46 
-�ck�v_log�
-(*
-buf
-, 
-size
-, *
-pwd
-);
-
-47 
-�ck�v_�d
+21 
+	$�ck�v_ack
 (*
 buf
 , 
 size
 , 
-cmd
-);
-
-48 
-dump_buf
-(*
-d�a
-, 
-�n
-);
-
-50 
-	$ma�
-(
-�gc
-, **
-�gv
+ack
 )
 
-52 
-buf
-[
-BUFSIZE
-];
-
-53 
-by�s
-;
-
-55 
-by�s
- = 
-	`�ck�v_�d
-(
-buf
-, (buf), 
-ON
-);
-
-59 
-	`dump_buf
-(
-buf
-, 
-by�s
-);
-
-61 
-by�s
- = 
-	`�ck�v_log�
-(
-buf
-, (buf), "iot@yun");
-
-63 
-	`dump_buf
-(
-buf
-, 
-by�s
-);
-
-66 
-	}
-}
-
-69 
-	$�ck�v_log�
-(*
-buf
-, 
-size
-, *
-pwd
-)
-
-71 
+23 
 �c16
  = 0;
 
-72 
+24 
 �ck_�n
  = 0;
 
-73 
-d�a_�n
- = 0;
-
-74 
+25 
 of�t
  = 0;
 
-76 if(!
+27 if(!
 buf
- || !
-pwd
  || 
 size
 <
 TLV_MIN_SIZE
  )
 
-78 
+29 
 	`��tf
 ("Invalid input�rguments\n");
 
-83 
+34 
 buf
 [
 of�t
@@ -3427,87 +3603,57 @@
 PACK_HEADER
 ;
 
-84 
+35 
 of�t
  += 1;
 
-87 
+38 
 buf
 [
 of�t
 ] = 
-TAG_LOGON
+TAG_ACK
 ;
 
-88 
+39 
 of�t
  += 1;
 
-92 if�
-	`���
-(
-pwd
-�<�
-size
--
+42 
+�ck_�n
+ = 
 TLV_FIXED_SIZE
+ + 1;
+
+44 
+buf
+[
+of�t
+] = 
+�ck_�n
+;
+
+45 
+of�t
+ += 1;
+
+47 if�
+ack
  )
 
-93 
-d�a_�n
- = 
-	`���
-(
-pwd
-);
-
-95 
-d�a_�n
- = 
-size
--
-TLV_FIXED_SIZE
-;
-
-98 
-�ck_�n
- = 
-d�a_�n
- + 
-TLV_FIXED_SIZE
-;
-
-100 
+48 
 buf
 [
 of�t
-] = 
-�ck_�n
-;
+++] = 1;
 
-101 
-of�t
- += 1;
-
-103 
-	`mem�y
-(&
+50 
 buf
 [
 of�t
-], 
-pwd
-, 
-d�a_�n
-);
+++] = 0;
 
-104 
-of�t
- +�
-d�a_�n
-;
-
-107 
+53 
 �c16
  = 
 	`�c_�u_t
@@ -3519,7 +3665,7 @@
 of�t
 );
 
-110 
+56 
 	`ush�t_to_by�s
 (&
 buf
@@ -3529,19 +3675,19 @@
 �c16
 );
 
-111 
+57 
 of�t
  += 2;
 
-113  
+59  
 of�t
 ;
 
-114 
+60 
 	}
 }
 
-118 
+64 
 	$�ck�v_�d
 (*
 buf
@@ -3551,17 +3697,17 @@
 cmd
 )
 
-120 
+66 
 �c16
 ;
 
-121 
+67 
 �ck_�n
  = 
 TLV_FIXED_SIZE
 +1;
 
-123 if(!
+69 if(!
 buf
  || 
 size
@@ -3569,29 +3715,29 @@
 TLV_MIN_SIZE
  )
 
-125 
+71 
 	`��tf
 ("Invalid input�rguments\n");
 
-130 
+76 
 buf
 [0] = 
 PACK_HEADER
 ;
 
-133 
+79 
 buf
 [1] = 
 TAG_LED
 ;
 
-136 
+82 
 buf
 [2] = 
 �ck_�n
 ;
 
-139 
+85 
 buf
 [3] = (
 OFF
@@ -3599,7 +3745,7 @@
 cmd
 ) ? 0x00 : 0x01;
 
-142 
+88 
 �c16
  = 
 	`�c_�u_t
@@ -3609,7 +3755,7 @@
 buf
 , 4);
 
-145 
+91 
 	`ush�t_to_by�s
 (&
 buf
@@ -3617,31 +3763,31 @@
 �c16
 );
 
-147  
+93  
 �ck_�n
 ;
 
-148 
+94 
 	}
 }
 
-155 
+101 
 	#LINELEN
  81
 
 	)
 
-156 
+102 
 	#CHARS_PER_LINE
  16
 
 	)
 
-158 *
+104 *
 	g��t_ch�
  =
 
-177 
+123 
 	$dump_buf
 (*
 d�a
@@ -3649,59 +3795,59 @@
 �n
 )
 
-179 
+125 
 rc
 ;
 
-180 
+126 
 idx
 ;
 
-181 
+127 
 �n
 [
 LINELEN
 ];
 
-182 
+128 
 l�
 [
 CHARS_PER_LINE
  + 1];
 
-183 
+129 
 hc
 [4];
 
-184 
+130 
 l�e_d�e
  = 1;
 
-186 
+132 
 rc
  = 
 �n
 ;
 
-187 
+133 
 idx
  = 0;
 
-188 
+134 
 l�
 [
 CHARS_PER_LINE
 ] = '\0';
 
-190 
+136 
 rc
  > 0)
 
-192 i�(
+138 i�(
 l�e_d�e
 )
 
-193 
+139 
 	`���tf
 (
 �n
@@ -3711,7 +3857,7 @@
 idx
 );
 
-196 
+142 
 c
  = 
 d�a
@@ -3719,7 +3865,7 @@
 idx
 ];
 
-197 
+143 
 	`���tf
 (
 hc
@@ -3727,7 +3873,7 @@
 c
 );
 
-198 
+144 
 	`���t
 (
 �n
@@ -3735,7 +3881,7 @@
 hc
 , 4);
 
-199 
+145 
 l�
 [
 idx
@@ -3747,11 +3893,11 @@
 c
 ];
 
-200 ++
+146 ++
 idx
 ;
 
-201 } --
+147 } --
 rc
  > 0 && (
 idx
@@ -3759,7 +3905,7 @@
 CHARS_PER_LINE
  != 0));
 
-203 
+149 
 l�e_d�e
  = (
 idx
@@ -3767,11 +3913,11 @@
 CHARS_PER_LINE
 ) == 0;
 
-205 i�(
+151 i�(
 l�e_d�e
 )
 
-206 
+152 
 	`��tf
 ("%� %s\n", 
 �n
@@ -3779,11 +3925,11 @@
 l�
 );
 
-207 i�(
+153 i�(
 rc
  == 0)
 
-208 
+154 
 	`���t
 (
 �n
@@ -3791,11 +3937,11 @@
 LINELEN
 );
 
-211 i�(!
+157 i�(!
 l�e_d�e
 )
 
-213 
+159 
 l�
 [(
 idx
@@ -3803,13 +3949,13 @@
 CHARS_PER_LINE
 )] = '\0';
 
-215 (++
+161 (++
 idx
  % 
 CHARS_PER_LINE
 ) != 0)
 
-216 
+162 
 	`���t
 (
 �n
@@ -3817,7 +3963,7 @@
 LINELEN
 );
 
-218 
+164 
 	`��tf
 ("%� %s\n", 
 �n
@@ -3825,9 +3971,1407 @@
 l�
 );
 
-221 
+167 
 	}
 }
+
+	@tlv_pack.h
+
+13 #i�de� 
+_TLV_PACK_H_
+
+
+14 
+	#_TLV_PACK_H_
+
+
+	)
+
+16 
+	~<�d�t.h
+>
+
+17 
+	~<time.h
+>
+
+26 
+	#PACK_HEADER
+ 0xFD
+
+	)
+
+29 
+	#TLV_FIXED_SIZE
+ 5
+
+	)
+
+32 
+	#TLV_MIN_SIZE
+ (
+TLV_FIXED_SIZE
++1)
+
+	)
+
+38 
+	mTAG_ACK
+=1,
+
+39 
+	mTAG_SN
+,
+
+40 
+	mTAG_TEMP
+,
+
+41 
+	mTAG_TIME
+,
+
+44 
+	#TLV_BUFSIZE
+ 256
+
+	)
+
+45 
+	s�v_buf_s
+
+
+47 
+	mbuf
+[
+TLV_BUFSIZE
+];
+
+48 
+	m�n
+;
+
+49 } 
+	t�v_buf_t
+;
+
+52 
+�ck�v_ack
+ (*
+buf
+, 
+size
+, 
+ack
+);
+
+55 
+�ck�v_�
+ (*
+buf
+, 
+size
+, *
+�
+);
+
+58 
+�ck�v_�mp
+(*
+buf
+, 
+size
+, 
+u�t16_t
+ 
+�mp
+);
+
+61 
+�ck�v_time
+(*
+buf
+, 
+size
+, 
+tm
+ *tm);
+
+64 
+�ck�v_msg
+(
+�v_buf_t
+ *
+�v
+, *
+�
+, 
+u�t16_t
+ 
+�mp
+, 
+tm
+ *tm);
+
+67 
+dump_buf
+(*
+d�a
+, 
+�n
+);
+
+	@/usr/include/dirent.h
+
+22 #i�def 
+_DIRENT_H
+
+
+23 
+	#_DIRENT_H
+ 1
+
+	)
+
+25 
+	~<�u�s.h
+>
+
+27 
+	g__BEGIN_DECLS
+
+
+29 
+	~<b�s/ty�s.h
+>
+
+31 #ifde�
+__USE_XOPEN
+
+
+32 #i�de�
+__�o_t_def�ed
+
+
+33 #i�de�
+__USE_FILE_OFFSET64
+
+
+34 
+__�o_t
+ 
+	t�o_t
+;
+
+36 
+__�o64_t
+ 
+	t�o_t
+;
+
+38 
+	#__�o_t_def�ed
+
+
+	)
+
+40 #i�
+def�ed
+ 
+__USE_LARGEFILE64
+ && !def�ed 
+__�o64_t_def�ed
+
+
+41 
+__�o64_t
+ 
+	t�o64_t
+;
+
+42 
+	#__�o64_t_def�ed
+
+
+	)
+
+61 
+	~<b�s/d��t.h
+>
+
+63 #i�(
+def�ed
+ 
+__USE_BSD
+ || def�ed 
+__USE_MISC
+�&& !def�ed 
+d_f��o
+
+
+64 
+	#d_�o
+ 
+d_f��o
+
+
+	)
+
+81 #ifde�
+_DIRENT_HAVE_D_NAMLEN
+
+
+82 
+	#_D_EXACT_NAMLEN
+(
+d
+�((d)->
+d_�m�n
+)
+
+	)
+
+83 
+	#_D_ALLOC_NAMLEN
+(
+d
+�(
+	`_D_EXACT_NAMLEN
+ (d�+ 1)
+
+	)
+
+85 
+	#_D_EXACT_NAMLEN
+(
+d
+�(
+	`���
+ ((d)->
+d_�me
+))
+
+	)
+
+86 #ifde�
+_DIRENT_HAVE_D_RECLEN
+
+
+87 
+	#_D_ALLOC_NAMLEN
+(
+d
+�(((*�(d�+ (d)->
+d_���
+�- &(d)->
+d_�me
+[0])
+
+	)
+
+89 
+	#_D_ALLOC_NAMLEN
+(
+d
+�( (d)->
+d_�me
+ > 1 ?  (d)->d_name : \
+
+90 
+	`_D_EXACT_NAMLEN
+ (
+d
+�+ 1)
+
+	)
+
+95 #ifde�
+__USE_BSD
+
+
+99 
+	mDT_UNKNOWN
+ = 0,
+
+100 
+	#DT_UNKNOWN
+ 
+DT_UNKNOWN
+
+
+	)
+
+101 
+	mDT_FIFO
+ = 1,
+
+102 
+	#DT_FIFO
+ 
+DT_FIFO
+
+
+	)
+
+103 
+	mDT_CHR
+ = 2,
+
+104 
+	#DT_CHR
+ 
+DT_CHR
+
+
+	)
+
+105 
+	mDT_DIR
+ = 4,
+
+106 
+	#DT_DIR
+ 
+DT_DIR
+
+
+	)
+
+107 
+	mDT_BLK
+ = 6,
+
+108 
+	#DT_BLK
+ 
+DT_BLK
+
+
+	)
+
+109 
+	mDT_REG
+ = 8,
+
+110 
+	#DT_REG
+ 
+DT_REG
+
+
+	)
+
+111 
+	mDT_LNK
+ = 10,
+
+112 
+	#DT_LNK
+ 
+DT_LNK
+
+
+	)
+
+113 
+	mDT_SOCK
+ = 12,
+
+114 
+	#DT_SOCK
+ 
+DT_SOCK
+
+
+	)
+
+115 
+	mDT_WHT
+ = 14
+
+116 
+	#DT_WHT
+ 
+DT_WHT
+
+
+	)
+
+120 
+	#IFTODT
+(
+mode
+�(((mode�& 0170000�>> 12)
+
+	)
+
+121 
+	#DTTOIF
+(
+d�ty�
+�((d�ty��<< 12)
+
+	)
+
+127 
+__d���am
+ 
+	tDIR
+;
+
+134 
+DIR
+ *
+	$ݒd�
+ (cڡ *
+__�me
+�
+	`__n�nu�
+ ((1));
+
+136 #ifde�
+__USE_XOPEN2K8
+
+
+141 
+DIR
+ *
+	`fdݒd�
+ (
+__fd
+);
+
+149 

+	$�o�d�
+ (
+DIR
+ *
+__d�p
+�
+	`__n�nu�
+ ((1));
+
+161 #i�de�
+__USE_FILE_OFFSET64
+
+
+162 

+d��t
+ *
+	$�add�
+ (
+DIR
+ *
+__d�p
+�
+	`__n�nu�
+ ((1));
+
+164 #ifde�
+__REDIRECT
+
+
+165 

+d��t
+ *
+	`__REDIRECT
+ (
+�add�
+, (
+DIR
+ *
+__d�p
+), 
+�add�64
+)
+
+166 
+	`__n�nu�
+ ((1));
+
+168 
+	#�add�
+ 
+�add�64
+
+
+	)
+
+172 #ifde�
+__USE_LARGEFILE64
+
+
+173 

+d��t64
+ *
+	$�add�64
+ (
+DIR
+ *
+__d�p
+�
+	`__n�nu�
+ ((1));
+
+176 #i�
+def�ed
+ 
+__USE_POSIX
+ || def�ed 
+__USE_MISC
+
+
+182 #i�de�
+__USE_FILE_OFFSET64
+
+
+183 

+	$�add�_r
+ (
+DIR
+ *
+__��ri�
+ 
+__d�p
+,
+
+184 
+d��t
+ *
+__��ri�
+ 
+__��y
+,
+
+185 
+d��t
+ **
+__��ri�
+ 
+__�su�
+)
+
+186 
+	`__n�nu�
+ ((1, 2, 3));
+
+188 #ifde�
+__REDIRECT
+
+
+189 

+	`__REDIRECT
+ (
+�add�_r
+,
+
+190 (
+DIR
+ *
+__��ri�
+ 
+__d�p
+,
+
+191 
+d��t
+ *
+__��ri�
+ 
+__��y
+,
+
+192 
+d��t
+ **
+__��ri�
+ 
+__�su�
+),
+
+193 
+�add�64_r
+�
+	`__n�nu�
+ ((1, 2, 3));
+
+195 
+	#�add�_r
+ 
+�add�64_r
+
+
+	)
+
+199 #ifde�
+__USE_LARGEFILE64
+
+
+200 

+	$�add�64_r
+ (
+DIR
+ *
+__��ri�
+ 
+__d�p
+,
+
+201 
+d��t64
+ *
+__��ri�
+ 
+__��y
+,
+
+202 
+d��t64
+ **
+__��ri�
+ 
+__�su�
+)
+
+203 
+	`__n�nu�
+ ((1, 2, 3));
+
+208 

+	$�w�dd�
+ (
+DIR
+ *
+__d�p
+�
+__THROW
+ 
+	`__n�nu�
+ ((1));
+
+210 #i�
+def�ed
+ 
+__USE_BSD
+ || def�ed 
+__USE_MISC
+ || def�ed 
+__USE_XOPEN
+
+
+211 
+	~<b�s/ty�s.h
+>
+
+214 

+	$�ekd�
+ (
+DIR
+ *
+__d�p
+, 
+__pos
+�
+__THROW
+ 
+	`__n�nu�
+ ((1));
+
+217 

+	$��d�
+ (
+DIR
+ *
+__d�p
+�
+__THROW
+ 
+	`__n�nu�
+ ((1));
+
+220 #i�
+def�ed
+ 
+__USE_BSD
+ || def�ed 
+__USE_MISC
+ || def�ed 
+__USE_XOPEN2K8
+
+
+223 

+	$d�fd
+ (
+DIR
+ *
+__d�p
+�
+__THROW
+ 
+	`__n�nu�
+ ((1));
+
+225 #i�
+def�ed
+ 
+__OPTIMIZE__
+ && def�ed 
+_DIR_d�fd
+
+
+226 
+	#d�fd
+(
+d�p
+�
+	`_DIR_d�fd
+ (d�p)
+
+	)
+
+229 #i�
+def�ed
+ 
+__USE_BSD
+ || def�ed 
+__USE_MISC
+
+
+230 #i�de�
+MAXNAMLEN
+
+
+232 
+	~<b�s/posix1_lim.h
+>
+
+235 #ifde�
+NAME_MAX
+
+
+236 
+	#MAXNAMLEN
+ 
+NAME_MAX
+
+
+	)
+
+238 
+	#MAXNAMLEN
+ 255
+
+	)
+
+243 
+	#__�ed_size_t
+
+
+	)
+
+244 
+	~<�ddef.h
+>
+
+253 #i�de�
+__USE_FILE_OFFSET64
+
+
+254 

+	`s�nd�
+ (cڡ *
+__��ri�
+ 
+__d�
+,
+
+255 
+d��t
+ ***
+__��ri�
+ 
+__�m�i�
+,
+
+256 (*
+__����
+�(cڡ 
+d��t
+ *),
+
+257 (*
+__cmp
+�(cڡ 
+d��t
+ **,
+
+258 cڡ 
+d��t
+ **))
+
+259 
+	`__n�nu�
+ ((1, 2));
+
+261 #ifde�
+__REDIRECT
+
+
+262 

+	`__REDIRECT
+ (
+s�nd�
+,
+
+263 (cڡ *
+__��ri�
+ 
+__d�
+,
+
+264 
+d��t
+ ***
+__��ri�
+ 
+__�m�i�
+,
+
+265 (*
+__����
+�(cڡ 
+d��t
+ *),
+
+266 (*
+__cmp
+�(cڡ 
+d��t
+ **,
+
+267 cڡ 
+d��t
+ **)),
+
+268 
+s�nd�64
+�
+	`__n�nu�
+ ((1, 2));
+
+270 
+	#s�nd�
+ 
+s�nd�64
+
+
+	)
+
+274 #i�
+def�ed
+ 
+__USE_GNU
+ && def�ed 
+__USE_LARGEFILE64
+
+
+277 

+	`s�nd�64
+ (cڡ *
+__��ri�
+ 
+__d�
+,
+
+278 
+d��t64
+ ***
+__��ri�
+ 
+__�m�i�
+,
+
+279 (*
+__����
+�(cڡ 
+d��t64
+ *),
+
+280 (*
+__cmp
+�(cڡ 
+d��t64
+ **,
+
+281 cڡ 
+d��t64
+ **))
+
+282 
+	`__n�nu�
+ ((1, 2));
+
+285 #ifde�
+__USE_GNU
+
+
+291 #i�de�
+__USE_FILE_OFFSET64
+
+
+292 

+	`s�nd��
+ (
+__dfd
+, cڡ *
+__��ri�
+ 
+__d�
+,
+
+293 
+d��t
+ ***
+__��ri�
+ 
+__�m�i�
+,
+
+294 (*
+__����
+�(cڡ 
+d��t
+ *),
+
+295 (*
+__cmp
+�(cڡ 
+d��t
+ **,
+
+296 cڡ 
+d��t
+ **))
+
+297 
+	`__n�nu�
+ ((2, 3));
+
+299 #ifde�
+__REDIRECT
+
+
+300 

+	`__REDIRECT
+ (
+s�nd��
+,
+
+301 (
+__dfd
+, cڡ *
+__��ri�
+ 
+__d�
+,
+
+302 
+d��t
+ ***
+__��ri�
+ 
+__�m�i�
+,
+
+303 (*
+__����
+�(cڡ 
+d��t
+ *),
+
+304 (*
+__cmp
+�(cڡ 
+d��t
+ **,
+
+305 cڡ 
+d��t
+ **)),
+
+306 
+s�nd��64
+�
+	`__n�nu�
+ ((2, 3));
+
+308 
+	#s�nd��
+ 
+s�nd��64
+
+
+	)
+
+314 

+	`s�nd��64
+ (
+__dfd
+, cڡ *
+__��ri�
+ 
+__d�
+,
+
+315 
+d��t64
+ ***
+__��ri�
+ 
+__�m�i�
+,
+
+316 (*
+__����
+�(cڡ 
+d��t64
+ *),
+
+317 (*
+__cmp
+�(cڡ 
+d��t64
+ **,
+
+318 cڡ 
+d��t64
+ **))
+
+319 
+	`__n�nu�
+ ((2, 3));
+
+323 #i�de�
+__USE_FILE_OFFSET64
+
+
+324 

+	$�phas�t
+ (cڡ 
+d��t
+ **
+__e1
+,
+
+325 cڡ 
+d��t
+ **
+__e2
+)
+
+326 
+__THROW
+ 
+__��ibu�_pu�__
+ 
+	`__n�nu�
+ ((1, 2));
+
+328 #ifde�
+__REDIRECT
+
+
+329 

+	`__REDIRECT_NTH
+ (
+�phas�t
+,
+
+330 (cڡ 
+d��t
+ **
+__e1
+,
+
+331 cڡ 
+d��t
+ **
+__e2
+),
+
+332 
+�phas�t64
+�
+__��ibu�_pu�__
+ 
+	`__n�nu�
+ ((1, 2));
+
+334 
+	#�phas�t
+ 
+�phas�t64
+
+
+	)
+
+338 #i�
+def�ed
+ 
+__USE_GNU
+ && def�ed 
+__USE_LARGEFILE64
+
+
+339 

+	$�phas�t64
+ (cڡ 
+d��t64
+ **
+__e1
+,
+
+340 cڡ 
+d��t64
+ **
+__e2
+)
+
+341 
+__THROW
+ 
+__��ibu�_pu�__
+ 
+	`__n�nu�
+ ((1, 2));
+
+346 #i�
+def�ed
+ 
+__USE_BSD
+ || def�ed 
+__USE_MISC
+
+
+351 #i�de�
+__USE_FILE_OFFSET64
+
+
+352 
+__ssize_t
+ 
+	$g�d����s
+ (
+__fd
+, *
+__��ri�
+ 
+__buf
+,
+
+353 
+size_t
+ 
+__nby�s
+,
+
+354 
+__off_t
+ *
+__��ri�
+ 
+__ba�p
+)
+
+355 
+__THROW
+ 
+	`__n�nu�
+ ((2, 4));
+
+357 #ifde�
+__REDIRECT
+
+
+358 
+__ssize_t
+ 
+	`__REDIRECT_NTH
+ (
+g�d����s
+,
+
+359 (
+__fd
+, *
+__��ri�
+ 
+__buf
+,
+
+360 
+size_t
+ 
+__nby�s
+,
+
+361 
+__off64_t
+ *
+__��ri�
+ 
+__ba�p
+),
+
+362 
+g�d����s64
+�
+	`__n�nu�
+ ((2, 4));
+
+364 
+	#g�d����s
+ 
+g�d����s64
+
+
+	)
+
+368 #ifde�
+__USE_LARGEFILE64
+
+
+369 
+__ssize_t
+ 
+	$g�d����s64
+ (
+__fd
+, *
+__��ri�
+ 
+__buf
+,
+
+370 
+size_t
+ 
+__nby�s
+,
+
+371 
+__off64_t
+ *
+__��ri�
+ 
+__ba�p
+)
+
+372 
+__THROW
+ 
+	`__n�nu�
+ ((2, 4));
+
+376 #ifde�
+__USE_GNU
+
+
+378 #i�de�
+__USE_FILE_OFFSET64
+
+
+379 

+	$v�si�s�t
+ (cڡ 
+d��t
+ **
+__e1
+,
+
+380 cڡ 
+d��t
+ **
+__e2
+)
+
+381 
+__THROW
+ 
+__��ibu�_pu�__
+ 
+	`__n�nu�
+ ((1, 2));
+
+383 #ifde�
+__REDIRECT
+
+
+384 

+	`__REDIRECT_NTH
+ (
+v�si�s�t
+,
+
+385 (cڡ 
+d��t
+ **
+__e1
+,
+
+386 cڡ 
+d��t
+ **
+__e2
+),
+
+387 
+v�si�s�t64
+)
+
+388 
+__��ibu�_pu�__
+ 
+	`__n�nu�
+ ((1, 2));
+
+390 
+	#v�si�s�t
+ 
+v�si�s�t64
+
+
+	)
+
+394 #ifde�
+__USE_LARGEFILE64
+
+
+395 

+	$v�si�s�t64
+ (cڡ 
+d��t64
+ **
+__e1
+,
+
+396 cڡ 
+d��t64
+ **
+__e2
+)
+
+397 
+__THROW
+ 
+__��ibu�_pu�__
+ 
+	`__n�nu�
+ ((1, 2));
+
+401 
+__END_DECLS
+
 
 	@/usr/include/errno.h
 
@@ -9340,6 +10884,922 @@
 401 
 __END_DECLS
 
+
+	@/usr/include/stdint.h
+
+22 #i�de�
+_STDINT_H
+
+
+23 
+	#_STDINT_H
+ 1
+
+	)
+
+25 
+	~<�u�s.h
+>
+
+26 
+	~<b�s/wch�.h
+>
+
+27 
+	~<b�s/w�dsize.h
+>
+
+34 #i�de�
+__�t8_t_def�ed
+
+
+35 
+	#__�t8_t_def�ed
+
+
+	)
+
+36 sig�d 
+	t�t8_t
+;
+
+37 
+	t�t16_t
+;
+
+38 
+	t�t32_t
+;
+
+39 #i�
+__WORDSIZE
+ == 64
+
+40 
+	t�t64_t
+;
+
+42 
+__ex�nsi�__
+
+
+43 
+	t�t64_t
+;
+
+48 
+	tu�t8_t
+;
+
+49 
+	tu�t16_t
+;
+
+50 #i�de�
+__u�t32_t_def�ed
+
+
+51 
+	tu�t32_t
+;
+
+52 
+	#__u�t32_t_def�ed
+
+
+	)
+
+54 #i�
+__WORDSIZE
+ == 64
+
+55 
+	tu�t64_t
+;
+
+57 
+__ex�nsi�__
+
+
+58 
+	tu�t64_t
+;
+
+65 sig�d 
+	t�t_�a�8_t
+;
+
+66 
+	t�t_�a�16_t
+;
+
+67 
+	t�t_�a�32_t
+;
+
+68 #i�
+__WORDSIZE
+ == 64
+
+69 
+	t�t_�a�64_t
+;
+
+71 
+__ex�nsi�__
+
+
+72 
+	t�t_�a�64_t
+;
+
+76 
+	tu�t_�a�8_t
+;
+
+77 
+	tu�t_�a�16_t
+;
+
+78 
+	tu�t_�a�32_t
+;
+
+79 #i�
+__WORDSIZE
+ == 64
+
+80 
+	tu�t_�a�64_t
+;
+
+82 
+__ex�nsi�__
+
+
+83 
+	tu�t_�a�64_t
+;
+
+90 sig�d 
+	t�t_�8_t
+;
+
+91 #i�
+__WORDSIZE
+ == 64
+
+92 
+	t�t_�16_t
+;
+
+93 
+	t�t_�32_t
+;
+
+94 
+	t�t_�64_t
+;
+
+96 
+	t�t_�16_t
+;
+
+97 
+	t�t_�32_t
+;
+
+98 
+__ex�nsi�__
+
+
+99 
+	t�t_�64_t
+;
+
+103 
+	tu�t_�8_t
+;
+
+104 #i�
+__WORDSIZE
+ == 64
+
+105 
+	tu�t_�16_t
+;
+
+106 
+	tu�t_�32_t
+;
+
+107 
+	tu�t_�64_t
+;
+
+109 
+	tu�t_�16_t
+;
+
+110 
+	tu�t_�32_t
+;
+
+111 
+__ex�nsi�__
+
+
+112 
+	tu�t_�64_t
+;
+
+117 #i�
+__WORDSIZE
+ == 64
+
+118 #i�de�
+__���_t_def�ed
+
+
+119 
+	t���_t
+;
+
+120 
+	#__���_t_def�ed
+
+
+	)
+
+122 
+	tu���_t
+;
+
+124 #i�de�
+__���_t_def�ed
+
+
+125 
+	t���_t
+;
+
+126 
+	#__���_t_def�ed
+
+
+	)
+
+128 
+	tu���_t
+;
+
+133 #i�
+__WORDSIZE
+ == 64
+
+134 
+	t�tmax_t
+;
+
+135 
+	tu�tmax_t
+;
+
+137 
+__ex�nsi�__
+
+
+138 
+	t�tmax_t
+;
+
+139 
+__ex�nsi�__
+
+
+140 
+	tu�tmax_t
+;
+
+144 #i�
+__WORDSIZE
+ == 64
+
+145 
+	#__INT64_C
+(
+c
+��## 
+L
+
+
+	)
+
+146 
+	#__UINT64_C
+(
+c
+��## 
+UL
+
+
+	)
+
+148 
+	#__INT64_C
+(
+c
+��## 
+LL
+
+
+	)
+
+149 
+	#__UINT64_C
+(
+c
+��## 
+ULL
+
+
+	)
+
+155 
+	#INT8_MIN
+ (-128)
+
+	)
+
+156 
+	#INT16_MIN
+ (-32767-1)
+
+	)
+
+157 
+	#INT32_MIN
+ (-2147483647-1)
+
+	)
+
+158 
+	#INT64_MIN
+ (-
+	`__INT64_C
+(9223372036854775807)-1)
+
+	)
+
+160 
+	#INT8_MAX
+ (127)
+
+	)
+
+161 
+	#INT16_MAX
+ (32767)
+
+	)
+
+162 
+	#INT32_MAX
+ (2147483647)
+
+	)
+
+163 
+	#INT64_MAX
+ (
+	`__INT64_C
+(9223372036854775807))
+
+	)
+
+166 
+	#UINT8_MAX
+ (255)
+
+	)
+
+167 
+	#UINT16_MAX
+ (65535)
+
+	)
+
+168 
+	#UINT32_MAX
+ (4294967295U)
+
+	)
+
+169 
+	#UINT64_MAX
+ (
+	`__UINT64_C
+(18446744073709551615))
+
+	)
+
+173 
+	#INT_LEAST8_MIN
+ (-128)
+
+	)
+
+174 
+	#INT_LEAST16_MIN
+ (-32767-1)
+
+	)
+
+175 
+	#INT_LEAST32_MIN
+ (-2147483647-1)
+
+	)
+
+176 
+	#INT_LEAST64_MIN
+ (-
+	`__INT64_C
+(9223372036854775807)-1)
+
+	)
+
+178 
+	#INT_LEAST8_MAX
+ (127)
+
+	)
+
+179 
+	#INT_LEAST16_MAX
+ (32767)
+
+	)
+
+180 
+	#INT_LEAST32_MAX
+ (2147483647)
+
+	)
+
+181 
+	#INT_LEAST64_MAX
+ (
+	`__INT64_C
+(9223372036854775807))
+
+	)
+
+184 
+	#UINT_LEAST8_MAX
+ (255)
+
+	)
+
+185 
+	#UINT_LEAST16_MAX
+ (65535)
+
+	)
+
+186 
+	#UINT_LEAST32_MAX
+ (4294967295U)
+
+	)
+
+187 
+	#UINT_LEAST64_MAX
+ (
+	`__UINT64_C
+(18446744073709551615))
+
+	)
+
+191 
+	#INT_FAST8_MIN
+ (-128)
+
+	)
+
+192 #i�
+__WORDSIZE
+ == 64
+
+193 
+	#INT_FAST16_MIN
+ (-9223372036854775807L-1)
+
+	)
+
+194 
+	#INT_FAST32_MIN
+ (-9223372036854775807L-1)
+
+	)
+
+196 
+	#INT_FAST16_MIN
+ (-2147483647-1)
+
+	)
+
+197 
+	#INT_FAST32_MIN
+ (-2147483647-1)
+
+	)
+
+199 
+	#INT_FAST64_MIN
+ (-
+	`__INT64_C
+(9223372036854775807)-1)
+
+	)
+
+201 
+	#INT_FAST8_MAX
+ (127)
+
+	)
+
+202 #i�
+__WORDSIZE
+ == 64
+
+203 
+	#INT_FAST16_MAX
+ (9223372036854775807L)
+
+	)
+
+204 
+	#INT_FAST32_MAX
+ (9223372036854775807L)
+
+	)
+
+206 
+	#INT_FAST16_MAX
+ (2147483647)
+
+	)
+
+207 
+	#INT_FAST32_MAX
+ (2147483647)
+
+	)
+
+209 
+	#INT_FAST64_MAX
+ (
+	`__INT64_C
+(9223372036854775807))
+
+	)
+
+212 
+	#UINT_FAST8_MAX
+ (255)
+
+	)
+
+213 #i�
+__WORDSIZE
+ == 64
+
+214 
+	#UINT_FAST16_MAX
+ (18446744073709551615UL)
+
+	)
+
+215 
+	#UINT_FAST32_MAX
+ (18446744073709551615UL)
+
+	)
+
+217 
+	#UINT_FAST16_MAX
+ (4294967295U)
+
+	)
+
+218 
+	#UINT_FAST32_MAX
+ (4294967295U)
+
+	)
+
+220 
+	#UINT_FAST64_MAX
+ (
+	`__UINT64_C
+(18446744073709551615))
+
+	)
+
+224 #i�
+__WORDSIZE
+ == 64
+
+225 
+	#INTPTR_MIN
+ (-9223372036854775807L-1)
+
+	)
+
+226 
+	#INTPTR_MAX
+ (9223372036854775807L)
+
+	)
+
+227 
+	#UINTPTR_MAX
+ (18446744073709551615UL)
+
+	)
+
+229 
+	#INTPTR_MIN
+ (-2147483647-1)
+
+	)
+
+230 
+	#INTPTR_MAX
+ (2147483647)
+
+	)
+
+231 
+	#UINTPTR_MAX
+ (4294967295U)
+
+	)
+
+236 
+	#INTMAX_MIN
+ (-
+	`__INT64_C
+(9223372036854775807)-1)
+
+	)
+
+238 
+	#INTMAX_MAX
+ (
+	`__INT64_C
+(9223372036854775807))
+
+	)
+
+241 
+	#UINTMAX_MAX
+ (
+	`__UINT64_C
+(18446744073709551615))
+
+	)
+
+247 #i�
+__WORDSIZE
+ == 64
+
+248 
+	#PTRDIFF_MIN
+ (-9223372036854775807L-1)
+
+	)
+
+249 
+	#PTRDIFF_MAX
+ (9223372036854775807L)
+
+	)
+
+251 
+	#PTRDIFF_MIN
+ (-2147483647-1)
+
+	)
+
+252 
+	#PTRDIFF_MAX
+ (2147483647)
+
+	)
+
+256 
+	#SIG_ATOMIC_MIN
+ (-2147483647-1)
+
+	)
+
+257 
+	#SIG_ATOMIC_MAX
+ (2147483647)
+
+	)
+
+260 #i�
+__WORDSIZE
+ == 64
+
+261 
+	#SIZE_MAX
+ (18446744073709551615UL)
+
+	)
+
+263 
+	#SIZE_MAX
+ (4294967295U)
+
+	)
+
+267 #i�de�
+WCHAR_MIN
+
+
+269 
+	#WCHAR_MIN
+ 
+__WCHAR_MIN
+
+
+	)
+
+270 
+	#WCHAR_MAX
+ 
+__WCHAR_MAX
+
+
+	)
+
+274 
+	#WINT_MIN
+ (0u)
+
+	)
+
+275 
+	#WINT_MAX
+ (4294967295u)
+
+	)
+
+278 
+	#INT8_C
+(
+c
+�
+	)
+c
+
+279 
+	#INT16_C
+(
+c
+�
+	)
+c
+
+280 
+	#INT32_C
+(
+c
+�
+	)
+c
+
+281 #i�
+__WORDSIZE
+ == 64
+
+282 
+	#INT64_C
+(
+c
+��## 
+L
+
+
+	)
+
+284 
+	#INT64_C
+(
+c
+��## 
+LL
+
+
+	)
+
+288 
+	#UINT8_C
+(
+c
+�
+	)
+c
+
+289 
+	#UINT16_C
+(
+c
+�
+	)
+c
+
+290 
+	#UINT32_C
+(
+c
+��## 
+U
+
+
+	)
+
+291 #i�
+__WORDSIZE
+ == 64
+
+292 
+	#UINT64_C
+(
+c
+��## 
+UL
+
+
+	)
+
+294 
+	#UINT64_C
+(
+c
+��## 
+ULL
+
+
+	)
+
+298 #i�
+__WORDSIZE
+ == 64
+
+299 
+	#INTMAX_C
+(
+c
+��## 
+L
+
+
+	)
+
+300 
+	#UINTMAX_C
+(
+c
+��## 
+UL
+
+
+	)
+
+302 
+	#INTMAX_C
+(
+c
+��## 
+LL
+
+
+	)
+
+303 
+	#UINTMAX_C
+(
+c
+��## 
+ULL
+
+
+	)
 
 	@/usr/include/stdio.h
 
@@ -29249,6 +31709,132 @@
 
 	)
 
+	@/usr/include/bits/dirent.h
+
+18 #i�de�
+_DIRENT_H
+
+
+22 
+	sd��t
+
+
+24 #i�de�
+__USE_FILE_OFFSET64
+
+
+25 
+__�o_t
+ 
+	md_�o
+;
+
+26 
+__off_t
+ 
+	md_off
+;
+
+28 
+__�o64_t
+ 
+	md_�o
+;
+
+29 
+__off64_t
+ 
+	md_off
+;
+
+31 
+	md_���
+;
+
+32 
+	md_ty�
+;
+
+33 
+	md_�me
+[256];
+
+36 #ifde�
+__USE_LARGEFILE64
+
+
+37 
+	sd��t64
+
+
+39 
+__�o64_t
+ 
+	md_�o
+;
+
+40 
+__off64_t
+ 
+	md_off
+;
+
+41 
+	md_���
+;
+
+42 
+	md_ty�
+;
+
+43 
+	md_�me
+[256];
+
+47 
+	#d_f��o
+ 
+d_�o
+
+
+	)
+
+49 #unde�
+_DIRENT_HAVE_D_NAMLEN
+
+
+50 
+	#_DIRENT_HAVE_D_RECLEN
+
+
+	)
+
+51 
+	#_DIRENT_HAVE_D_OFF
+
+
+	)
+
+52 
+	#_DIRENT_HAVE_D_TYPE
+
+
+	)
+
+54 #i�
+def�ed
+ 
+__OFF_T_MATCHES_OFF64_T
+ && def�ed 
+__INO_T_MATCHES_INO64_T
+
+
+56 
+	#_DIRENT_MATCHES_DIRENT64
+ 1
+
+	)
+
 	@/usr/include/bits/environments.h
 
 18 #i�de�
@@ -30262,6 +32848,308 @@
 170 
 	}
 }
+
+	@/usr/include/bits/posix1_lim.h
+
+24 #i�def 
+_BITS_POSIX1_LIM_H
+
+
+25 
+	#_BITS_POSIX1_LIM_H
+ 1
+
+	)
+
+31 
+	#_POSIX_AIO_LISTIO_MAX
+ 2
+
+	)
+
+34 
+	#_POSIX_AIO_MAX
+ 1
+
+	)
+
+37 
+	#_POSIX_ARG_MAX
+ 4096
+
+	)
+
+40 #ifde�
+__USE_XOPEN2K
+
+
+41 
+	#_POSIX_CHILD_MAX
+ 25
+
+	)
+
+43 
+	#_POSIX_CHILD_MAX
+ 6
+
+	)
+
+47 
+	#_POSIX_DELAYTIMER_MAX
+ 32
+
+	)
+
+51 
+	#_POSIX_HOST_NAME_MAX
+ 255
+
+	)
+
+54 
+	#_POSIX_LINK_MAX
+ 8
+
+	)
+
+57 
+	#_POSIX_LOGIN_NAME_MAX
+ 9
+
+	)
+
+60 
+	#_POSIX_MAX_CANON
+ 255
+
+	)
+
+64 
+	#_POSIX_MAX_INPUT
+ 255
+
+	)
+
+67 
+	#_POSIX_MQ_OPEN_MAX
+ 8
+
+	)
+
+70 
+	#_POSIX_MQ_PRIO_MAX
+ 32
+
+	)
+
+73 
+	#_POSIX_NAME_MAX
+ 14
+
+	)
+
+76 #ifde�
+__USE_XOPEN2K
+
+
+77 
+	#_POSIX_NGROUPS_MAX
+ 8
+
+	)
+
+79 
+	#_POSIX_NGROUPS_MAX
+ 0
+
+	)
+
+83 #ifde�
+__USE_XOPEN2K
+
+
+84 
+	#_POSIX_OPEN_MAX
+ 20
+
+	)
+
+86 
+	#_POSIX_OPEN_MAX
+ 16
+
+	)
+
+89 #i�!
+def�ed
+ 
+__USE_XOPEN2K
+ || def�ed 
+__USE_GNU
+
+
+92 
+	#_POSIX_FD_SETSIZE
+ 
+_POSIX_OPEN_MAX
+
+
+	)
+
+96 
+	#_POSIX_PATH_MAX
+ 256
+
+	)
+
+99 
+	#_POSIX_PIPE_BUF
+ 512
+
+	)
+
+103 
+	#_POSIX_RE_DUP_MAX
+ 255
+
+	)
+
+106 
+	#_POSIX_RTSIG_MAX
+ 8
+
+	)
+
+109 
+	#_POSIX_SEM_NSEMS_MAX
+ 256
+
+	)
+
+112 
+	#_POSIX_SEM_VALUE_MAX
+ 32767
+
+	)
+
+115 
+	#_POSIX_SIGQUEUE_MAX
+ 32
+
+	)
+
+118 
+	#_POSIX_SSIZE_MAX
+ 32767
+
+	)
+
+121 
+	#_POSIX_STREAM_MAX
+ 8
+
+	)
+
+124 
+	#_POSIX_SYMLINK_MAX
+ 255
+
+	)
+
+128 
+	#_POSIX_SYMLOOP_MAX
+ 8
+
+	)
+
+131 
+	#_POSIX_TIMER_MAX
+ 32
+
+	)
+
+134 
+	#_POSIX_TTY_NAME_MAX
+ 9
+
+	)
+
+137 #ifde�
+__USE_XOPEN2K
+
+
+138 
+	#_POSIX_TZNAME_MAX
+ 6
+
+	)
+
+140 
+	#_POSIX_TZNAME_MAX
+ 3
+
+	)
+
+143 #i�!
+def�ed
+ 
+__USE_XOPEN2K
+ || def�ed 
+__USE_GNU
+
+
+145 
+	#_POSIX_QLIMIT
+ 1
+
+	)
+
+149 
+	#_POSIX_HIWAT
+ 
+_POSIX_PIPE_BUF
+
+
+	)
+
+152 
+	#_POSIX_UIO_MAXIOV
+ 16
+
+	)
+
+156 
+	#_POSIX_CLOCKRES_MIN
+ 20000000
+
+	)
+
+160 
+	~<b�s/lo�l_lim.h
+>
+
+163 #i�def 
+SSIZE_MAX
+
+
+164 
+	#SSIZE_MAX
+ 
+LONG_MAX
+
+
+	)
+
+171 #i�def 
+NGROUPS_MAX
+
+
+172 
+	#NGROUPS_MAX
+ 8
+
+	)
 
 	@/usr/include/bits/posix_opt.h
 
@@ -56217,6 +59105,82 @@
 
 	)
 
+	@/usr/include/bits/wchar.h
+
+19 #i�de�
+_BITS_WCHAR_H
+
+
+20 
+	#_BITS_WCHAR_H
+ 1
+
+	)
+
+33 #ifde�
+__WCHAR_MAX__
+
+
+34 
+	#__WCHAR_MAX
+ 
+__WCHAR_MAX__
+
+
+	)
+
+35 #�i�
+L
+'\0' - 1 > 0
+
+36 
+	#__WCHAR_MAX
+ (0xffffffffu + 
+L
+'\0')
+
+	)
+
+38 
+	#__WCHAR_MAX
+ (0x7ffffff�+ 
+L
+'\0')
+
+	)
+
+41 #ifde�
+__WCHAR_MIN__
+
+
+42 
+	#__WCHAR_MIN
+ 
+__WCHAR_MIN__
+
+
+	)
+
+43 #�i�
+L
+'\0' - 1 > 0
+
+44 
+	#__WCHAR_MIN
+ (
+L
+'\0' + 0)
+
+	)
+
+46 
+	#__WCHAR_MIN
+ (-
+__WCHAR_MAX
+ - 1)
+
+	)
+
 	@/usr/include/bits/wordsize.h
 
 3 #i�
@@ -64011,6 +66975,184 @@
 _IO_v�r�tf
 )
 
+	@/usr/include/bits/local_lim.h
+
+24 #i�de�
+NR_OPEN
+
+
+25 
+	#__undef_NR_OPEN
+
+
+	)
+
+27 #i�de�
+LINK_MAX
+
+
+28 
+	#__undef_LINK_MAX
+
+
+	)
+
+30 #i�de�
+OPEN_MAX
+
+
+31 
+	#__undef_OPEN_MAX
+
+
+	)
+
+33 #i�de�
+ARG_MAX
+
+
+34 
+	#__undef_ARG_MAX
+
+
+	)
+
+38 
+	~<l�ux/lim�s.h
+>
+
+41 #ifde�
+__undef_NR_OPEN
+
+
+42 #unde�
+NR_OPEN
+
+
+43 #unde�
+__undef_NR_OPEN
+
+
+46 #ifde�
+__undef_LINK_MAX
+
+
+47 #unde�
+LINK_MAX
+
+
+48 #unde�
+__undef_LINK_MAX
+
+
+51 #ifde�
+__undef_OPEN_MAX
+
+
+52 #unde�
+OPEN_MAX
+
+
+53 #unde�
+__undef_OPEN_MAX
+
+
+56 #ifde�
+__undef_ARG_MAX
+
+
+57 #unde�
+ARG_MAX
+
+
+58 #unde�
+__undef_ARG_MAX
+
+
+62 
+	#_POSIX_THREAD_KEYS_MAX
+ 128
+
+	)
+
+64 
+	#PTHREAD_KEYS_MAX
+ 1024
+
+	)
+
+67 
+	#_POSIX_THREAD_DESTRUCTOR_ITERATIONS
+ 4
+
+	)
+
+69 
+	#PTHREAD_DESTRUCTOR_ITERATIONS
+ 
+_POSIX_THREAD_DESTRUCTOR_ITERATIONS
+
+
+	)
+
+72 
+	#_POSIX_THREAD_THREADS_MAX
+ 64
+
+	)
+
+74 #unde�
+PTHREAD_THREADS_MAX
+
+
+78 
+	#AIO_PRIO_DELTA_MAX
+ 20
+
+	)
+
+81 
+	#PTHREAD_STACK_MIN
+ 16384
+
+	)
+
+84 
+	#DELAYTIMER_MAX
+ 2147483647
+
+	)
+
+87 
+	#TTY_NAME_MAX
+ 32
+
+	)
+
+90 
+	#LOGIN_NAME_MAX
+ 256
+
+	)
+
+93 
+	#HOST_NAME_MAX
+ 64
+
+	)
+
+96 
+	#MQ_PRIO_MAX
+ 32768
+
+	)
+
+99 
+	#SEM_VALUE_MAX
+ (2147483647)
+
+	)
+
 	@/usr/include/bits/sched.h
 
 20 #i�de�
@@ -71105,6 +74247,96 @@
 
 	)
 
+	@/usr/include/linux/limits.h
+
+1 #i�de�
+_LINUX_LIMITS_H
+
+
+2 
+	#_LINUX_LIMITS_H
+
+
+	)
+
+4 
+	#NR_OPEN
+ 1024
+
+	)
+
+6 
+	#NGROUPS_MAX
+ 65536
+
+	)
+
+7 
+	#ARG_MAX
+ 131072
+
+	)
+
+8 
+	#LINK_MAX
+ 127
+
+	)
+
+9 
+	#MAX_CANON
+ 255
+
+	)
+
+10 
+	#MAX_INPUT
+ 255
+
+	)
+
+11 
+	#NAME_MAX
+ 255
+
+	)
+
+12 
+	#PATH_MAX
+ 4096
+
+	)
+
+13 
+	#PIPE_BUF
+ 4096
+
+	)
+
+14 
+	#XATTR_NAME_MAX
+ 255
+
+	)
+
+15 
+	#XATTR_SIZE_MAX
+ 65536
+
+	)
+
+16 
+	#XATTR_LIST_MAX
+ 65536
+
+	)
+
+18 
+	#RTSIG_MAX
+ 32
+
+	)
+
 	@/usr/include/wchar.h
 
 23 #i�de�
@@ -75296,82 +78528,6 @@
  (
 __vw��tf_chk
 )
-
-	@/usr/include/bits/wchar.h
-
-19 #i�de�
-_BITS_WCHAR_H
-
-
-20 
-	#_BITS_WCHAR_H
- 1
-
-	)
-
-33 #ifde�
-__WCHAR_MAX__
-
-
-34 
-	#__WCHAR_MAX
- 
-__WCHAR_MAX__
-
-
-	)
-
-35 #�i�
-L
-'\0' - 1 > 0
-
-36 
-	#__WCHAR_MAX
- (0xffffffffu + 
-L
-'\0')
-
-	)
-
-38 
-	#__WCHAR_MAX
- (0x7ffffff�+ 
-L
-'\0')
-
-	)
-
-41 #ifde�
-__WCHAR_MIN__
-
-
-42 
-	#__WCHAR_MIN
- 
-__WCHAR_MIN__
-
-
-	)
-
-43 #�i�
-L
-'\0' - 1 > 0
-
-44 
-	#__WCHAR_MIN
- (
-L
-'\0' + 0)
-
-	)
-
-46 
-	#__WCHAR_MIN
- (-
-__WCHAR_MAX
- - 1)
-
-	)
 
 	@/usr/include/bits/wchar2.h
 
@@ -80354,20 +83510,25 @@
 .
 1
 /usr/include
-96
-2463
+105
+2652
 crc-itu-t.c
 crc-itu-t.h
+ds18b20.c
+ds18b20.h
 logger.c
 logger.h
 proc.c
 proc.h
-tlv_sample.c
+tlv_pack.c
+tlv_pack.h
+/usr/include/dirent.h
 /usr/include/errno.h
 /usr/include/fcntl.h
 /usr/include/libgen.h
 /usr/include/pthread.h
 /usr/include/signal.h
+/usr/include/stdint.h
 /usr/include/stdio.h
 /usr/include/stdlib.h
 /usr/include/string.h
@@ -80378,10 +83539,12 @@
 /usr/include/unistd.h
 /usr/include/alloca.h
 /usr/include/bits/confname.h
+/usr/include/bits/dirent.h
 /usr/include/bits/environments.h
 /usr/include/bits/errno.h
 /usr/include/bits/fcntl.h
 /usr/include/bits/fcntl2.h
+/usr/include/bits/posix1_lim.h
 /usr/include/bits/posix_opt.h
 /usr/include/bits/pthreadtypes.h
 /usr/include/bits/setjmp.h
@@ -80410,6 +83573,7 @@
 /usr/include/bits/unistd.h
 /usr/include/bits/waitflags.h
 /usr/include/bits/waitstatus.h
+/usr/include/bits/wchar.h
 /usr/include/bits/wordsize.h
 /usr/include/endian.h
 /usr/include/features.h
@@ -80425,6 +83589,7 @@
 /usr/include/bits/endian.h
 /usr/include/bits/fcntl-linux.h
 /usr/include/bits/libio-ldbl.h
+/usr/include/bits/local_lim.h
 /usr/include/bits/sched.h
 /usr/include/bits/select.h
 /usr/include/bits/select2.h
@@ -80444,10 +83609,10 @@
 /usr/include/gnu/stubs-32.h
 /usr/include/gnu/stubs-64.h
 /usr/include/gnu/stubs-x32.h
+/usr/include/linux/limits.h
 /usr/include/wchar.h
 /usr/include/asm-generic/errno.h
 /usr/include/bits/wchar-ldbl.h
-/usr/include/bits/wchar.h
 /usr/include/bits/wchar2.h
 /usr/include/gnu/option-groups.h
 /usr/include/wctype.h
diff --git a/prj1_tlv/lylib/cscope.po.out b/prj1_tlv/lylib/cscope.po.out
index d0c36b2..951c5bb 100644
--- a/prj1_tlv/lylib/cscope.po.out
+++ b/prj1_tlv/lylib/cscope.po.out
Binary files differ
diff --git a/prj1_tlv/lylib/ds18b20.c b/prj1_tlv/lylib/ds18b20.c
new file mode 100644
index 0000000..5ee0943
--- /dev/null
+++ b/prj1_tlv/lylib/ds18b20.c
@@ -0,0 +1,113 @@
+/*********************************************************************************
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  ds18b20.c
+ *    Description:  This file is get temperature by DS18B20 on RaspberryPi
+ *               
+ *        Version:  1.0.0(2020年04月15日)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2020年04月15日 23时14分21秒"
+ *                 
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+
+#include "logger.h"
+
+/* File Content:
+   pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave 
+   3a 01 4b 46 7f ff 0c 10 a5 : crc=a5 YES
+   3a 01 4b 46 7f ff 0c 10 a5 t=19625
+ */
+
+int ds18b20_get_temperature(uint16_t *temp)
+{
+    char            w1_path[50] = "/sys/bus/w1/devices/";
+    char            chip[20];
+    char            buf[128];
+    DIR            *dirp;
+    struct dirent  *direntp;
+    int             fd =-1;
+    char           *ptr;
+    uint8_t        *byte;
+    float           value;
+    int             found = 0;
+
+    if( !temp )
+    {
+        log_err("ERROR: Invalid input arguments\n"); 
+        return -1;
+    }
+
+    /*+-------------------------------------------------------------------+
+     *|  open dierectory /sys/bus/w1/devices to get chipset Serial Number |
+     *+-------------------------------------------------------------------+*/
+    if((dirp = opendir(w1_path)) == NULL)
+    {
+        log_err("opendir error: %s\n", strerror(errno));
+        return -2;
+    }
+
+    while((direntp = readdir(dirp)) != NULL)
+    {
+        if(strstr(direntp->d_name,"28-"))
+        {
+            /* find and get the chipset SN filename */
+            strcpy(chip,direntp->d_name);
+            found = 1; 
+            break;
+        }
+    }
+    closedir(dirp);
+
+    if( !found )
+    {
+        log_err("Can not find ds18b20 in %s\n", w1_path);
+        return -2;
+    }
+
+    /* get DS18B20 sample file full path: /sys/bus/w1/devices/28-xxxx/w1_slave */
+    strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path));
+    strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path));
+
+    /* open file /sys/bus/w1/devices/28-xxxx/w1_slave to get temperature */
+    if( (fd=open(w1_path, O_RDONLY)) < 0 ) 
+    { 
+        log_err("open %s error: %s\n", w1_path, strerror(errno)); 
+        return -2;
+    } 
+    
+    if(read(fd, buf, sizeof(buf)) < 0)
+    { 
+        log_err("read %s error: %s\n", w1_path, strerror(errno)); 
+        close(fd);
+        return -2;
+    } 
+    
+    ptr = strstr(buf, "t=");
+    if( !ptr )
+    {
+        log_err("ERROR: Can not get temperature\n");
+        close(fd);
+        return -2;
+    }
+
+    ptr+=2;
+
+    /* use two bytes to save temperature value */
+    byte = (uint8_t *)temp;
+    byte[0] = atoi(ptr)/1000;      /* integer part */
+    byte[1] = (atoi(ptr)%1000)/10; /* fractional part, two digits after */
+   
+    close(fd);
+    return 0;
+}
diff --git a/prj1_tlv/lylib/ds18b20.h b/prj1_tlv/lylib/ds18b20.h
new file mode 100644
index 0000000..1702acf
--- /dev/null
+++ b/prj1_tlv/lylib/ds18b20.h
@@ -0,0 +1,28 @@
+/********************************************************************************
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  ds18b20.h
+ *    Description:  This head file is get temperature by DS18B20 on RaspberryPi
+ *
+ *        Version:  1.0.0(2020年04月15日)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2020年04月15日 23时37分38秒"
+ *                 
+ ********************************************************************************/
+
+#ifndef  _DS18B20_H_
+#define  _DS18B20_H_
+
+#include <stdint.h>
+
+/*  description: get temperature by DS18B20 on RaspberryPi
+ * return value: 0: Successfully   <0: Failure
+ * output value: $temp: temperature value saved in two bytes:
+ *                     byte[0]: integer part
+ *                     byte[1]: fractional part, two digits after
+ */
+int ds18b20_get_temperature(uint16_t *temp);
+
+#endif   /* ----- #ifndef _DS18B20_H_  ----- */
+
diff --git a/prj1_tlv/lylib/logger.c b/prj1_tlv/lylib/logger.c
index fa9143a..9763d7b 100644
--- a/prj1_tlv/lylib/logger.c
+++ b/prj1_tlv/lylib/logger.c
@@ -17,6 +17,7 @@
 
 static unsigned long log_rollback_size = LOG_ROLLBACK_NONE;
 
+/* This library is not thread safe */
 static logger_t *logger = NULL;
 
 char *log_str[LOG_LEVEL_MAX + 1] = { "", "F", "E", "W", "N", "D", "I", "T", "M" };
diff --git a/prj1_tlv/lylib/socket.c b/prj1_tlv/lylib/socket.c
new file mode 100644
index 0000000..1d7b0be
--- /dev/null
+++ b/prj1_tlv/lylib/socket.c
@@ -0,0 +1,789 @@
+/*********************************************************************************
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  socket.c
+ *    Description:  This file is for socket API
+ *                 
+ *        Version:  1.0.0(2020年04月16日)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2020年04月16日 13时43分28秒"
+ *                 
+ ********************************************************************************/
+
+#include "socket.h"
+#include "logger.h"
+
+static int proc_sock_connect(socket_t *sock);
+
+/*  description: initialise socket context and create socket fd 
+ *   input args: $sock: socket context 
+ *               $type: SOCK_TYPE_LISTEN, SOCK_TYPE_ACCEPT or SOCK_TYPE_CONNEC
+ *               $create: call socket() create or not
+ * return value: <0: failure  0: successfully
+ */                           
+int socket_ctx_init(socket_t *sock, uint8_t type, int create)
+{
+    int        fd = -1;
+
+    if( !sock )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    memset(sock, 0, sizeof(*sock));
+    sock->type = type;
+
+    sock->keepintvl=600;
+    sock->keepcnt = 3;
+
+    if( create )
+    {
+        fd = socket(AF_INET, SOCK_STREAM, 0);
+        if( fd < 0 )
+        {
+            log_err("Create socket failure: %s\n", strerror(errno));
+            return -2;
+        }
+
+        sock->fd = fd;
+    }
+    else
+    {
+        sock->fd = -1;
+    }
+
+    sock->status = SOCK_STAT_INIT;
+
+    return 0;
+}
+
+/*  description: close socket 
+ *   input args: $sock: socket context
+ * return value: <0: failure  0: successfully
+ */                           
+int socket_close(socket_t *sock)
+{
+    int           force = 0;
+
+    if( !sock )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    if(sock->fd < 0)
+    {
+        log_nrml("socket already closed\n");
+        return 0;
+    }
+
+    log_nrml("start close socket[%d] on port[%d] to [%s:%d]\n", sock->fd, sock->lport, sock->raddr, sock->rport);
+
+    if(force)
+    {
+        /* If l_onoff is nonzero and l_linger is zero, TCP aborts the connection when it is closed.  
+         * That is, TCP discards any data still remaining in the socket send buffer and sends an RST 
+         * to the peer, not the normal four-packet connection termination sequence.  */
+
+        struct linger so_linger;
+        so_linger.l_onoff = 1;  /*  Turn on linger */ 
+        so_linger.l_linger = 0; /*  Set the timeout to 0 */
+
+        setsockopt (sock->fd, SOL_SOCKET, SO_LINGER, (char *) &so_linger, sizeof (struct linger));
+    }
+
+    if( SOCK_TYPE_ACCEPT==sock->type || SOCK_TYPE_CONNECT==sock->type )
+    {
+        shutdown(sock->fd, SHUT_RDWR);
+    }
+
+    close(sock->fd);
+
+    sock->fd = -1;
+    sock->status = SOCK_STAT_INIT;
+
+    return 0;
+}
+
+/*  description: create socket and listen on port $port
+ *   input args: $sock: socket context
+ *             $ipaddr: listen IP address, NULL for any address
+ *               $port: listen port
+ * return value: <0: failure  0: successfully
+ */
+int socket_listen(socket_t *sock, char *ipaddr, int port)
+{
+    int                 rv = 0; 
+    int                 fd = -1; 
+    struct sockaddr_in  addr;
+    int                 backlog = 13;
+
+    if( !sock )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    if( sock->status != SOCK_STAT_INIT )
+    {
+        socket_close(sock);
+    }
+
+    /* initial listen socket bind address  */
+    memset(&addr, 0, sizeof(addr));
+    addr.sin_family = AF_INET;
+    addr.sin_port = htons(port);
+    if( !ipaddr )
+    {
+        addr.sin_addr.s_addr = htons(INADDR_ANY);
+    }
+    else
+    {
+        if( !inet_pton(AF_INET, ipaddr, &addr.sin_addr) )
+        {
+            log_err("Listen IP address '%s' not valid\n");
+            return -2;
+        }
+    }
+
+    /* initial socket context and create socket fd  */
+    if( socket_ctx_init(sock, SOCK_TYPE_LISTEN, SOCK_CREATE) < 0)
+    {
+        log_err("socket context initial failure\n");
+        return -2;
+    }
+
+    strncpy(sock->laddr, (!ipaddr?"0.0.0.0":ipaddr), sizeof(sock->laddr));
+    sock->lport = port;
+    memset(&sock->raddr, 0, sizeof(sock->raddr));
+    sock->rport = 0;
+
+    log_dbg("initial listen socket context ok\n");
+
+    /* set listen port reuseable  */
+    socket_set_reuseaddr(sock->fd);
+
+    if( bind(sock->fd, (struct sockaddr*)&addr, sizeof(addr)) < 0)
+    {
+        log_err("bind listen socket failure: %s\n", strerror(errno));
+        rv = -3;
+        goto cleanup;
+    }
+
+    if( listen(sock->fd, backlog) < 0 )
+    {
+        log_err("Listen on socket[%d] failed: %s\n", sock->fd, strerror(errno));
+        rv = -4;
+        goto cleanup;
+    }
+
+    log_nrml("create socket and listen on [%s:%d] already\n", sock->laddr, sock->lport);
+
+cleanup: 
+    if( rv ) 
+    { 
+        log_err("Create socket listen on [%s:%d] failed\n", sock->laddr, sock->lport);
+        socket_close(sock);
+    }
+    else 
+    { 
+        sock->status = SOCK_STAT_LISTENED; 
+        log_nrml("Create socket[%p:%d] listen [%s:%d] ok\n", sock, sock->fd, sock->laddr, sock->lport); 
+    }
+
+    return rv; 
+}
+
+
+
+/*  description: create socket and connect to server
+ *   input args: $sock: socket context
+ *               $host: IP address and port, format as "host:port", such as "127.0.0.1:8000"
+ *               $block: block mode(1) or non-block(0)
+ *return value:  <0: error   0: connecing in non-block mode   1:connected
+ */
+int socket_connect(socket_t *sock, int lport, char *host, int block)
+{
+    int                 rv = 0;
+    char                service[20];
+    struct addrinfo     hints, *rp;
+    struct addrinfo    *res = NULL;
+    struct in_addr      inaddr;
+    struct sockaddr_in  addr;
+    int                 len = sizeof(addr);
+
+    if( !sock )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    /* socket already connected */
+    if( SOCK_STAT_CONNECTED == sock->status )
+    {
+        return 1;
+    }
+    /* socket connecting in none-block mode */
+    else if( SOCK_STAT_CONNECTING == sock->status )
+    {
+        log_dbg("socket continue connect to remote server [%s:%d]\n", sock->raddr, sock->rport);
+        rv = proc_sock_connect(sock);
+        goto out;
+    }
+
+    /* socket not initial before */
+    if( SOCK_STAT_UNINIT== sock->status ) 
+    {
+        if( socket_ctx_init(sock, SOCK_TYPE_LISTEN, SOCK_NOT_CREATE) < 0)
+        {
+            log_err("ERROR: initial socket context failure\n");
+            return -2;
+        }
+
+        if( parser_host_port(sock, host)<0 || sock->rport<=0 )
+        {
+            log_err("parser connect server hostname and port [%s] failure\n", host);
+            return -3;
+        }
+
+        if( lport>0 )
+        {
+            sock->lport = lport;
+        }
+
+        log_dbg("initial socket context ok\n");
+    }
+
+    log_nrml("start create socket connect to server [%s:%d] now\n", sock->raddr, sock->rport);
+
+
+    /*+--------------------------------------------------+  
+     *| use getaddrinfo() to do domain name translation  |
+     *+--------------------------------------------------+*/
+
+    memset(&hints, 0, sizeof(struct addrinfo));
+    hints.ai_family = AF_INET; /* Only support IPv4 */
+    hints.ai_socktype = SOCK_STREAM;
+    hints.ai_protocol = IPPROTO_TCP; /* TCP protocol */
+
+    /* If 'raddr' is a valid IP address, then don't use name resolution */
+    if( inet_aton(sock->raddr, &inaddr) )
+    {
+        log_info("%s is a valid IP address, don't use domain name resolution.\n", sock->raddr);
+        hints.ai_flags |= AI_NUMERICHOST;
+    }
+
+    /* Obtain address(es) matching host/port */
+    snprintf(service, sizeof(service), "%d", sock->rport);
+    if( (rv=getaddrinfo(sock->raddr, service, &hints, &res)) )
+    {
+        log_err("getaddrinfo() parser [%s:%s] failed: %s\n", sock->raddr, service, gai_strerror(rv));
+        return -3;
+    }
+
+    /* close any opened socket on it */ 
+    socket_close(sock); 
+
+    /* getaddrinfo() returns a list of address structures. Try each 
+       address until we successfully connect or bind */
+    for (rp=res; rp!=NULL; rp=rp->ai_next)
+    {
+        char                  ipaddr[INET_ADDRSTRLEN];
+        struct sockaddr_in   *sp = (struct sockaddr_in *) rp->ai_addr; 
+
+
+        /* check and print domain name translation result  */
+        memset( ipaddr, 0, sizeof(ipaddr) );
+        if( inet_ntop(AF_INET, &sp->sin_addr, ipaddr, sizeof(ipaddr)) )  
+        {
+            log_nrml("domain name resolution [%s->%s]\n", sock->raddr, ipaddr);
+        }
+
+        memcpy(&sock->saddr, rp->ai_addr, sizeof(sock->saddr));
+
+        /*  Create the socket */
+        sock->fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+        if( sock->fd < 0)
+        {
+            log_err("socket() create failed: %s\n", strerror(errno));
+            rv = -3;
+            continue;
+        }
+
+        log_info("socket[%d] for connect create ok\n", sock->fd);
+
+        /*  bind local port to socket if needed */ 
+        if(sock->lport > 0)
+        {
+            memset(&addr, 0, len);
+            addr.sin_family = AF_INET;
+            addr.sin_port = htons ((u_short) sock->lport);
+
+            if ( bind(sock->fd, (struct sockaddr *)&addr, len) )
+            {
+                rv = -4;
+                close(sock->fd);
+                log_err("Bind port[%d] to connect socket [%d] failed: %s\n", sock->lport, sock->fd, strerror(errno));
+                continue;
+            }
+            else
+            {
+                rv = 0;
+                log_dbg("Bind local port[%d] to connect socket [%d] OK\n", lport, sock->fd);
+            }
+        }
+
+        /* Set socket options */
+        if( !block ) 
+        {
+            socket_set_nonblock(sock->fd);
+        }
+        socket_set_keepalive(sock->fd, sock->keepintvl, sock->keepcnt);
+
+        if( (rv=proc_sock_connect(sock)) >= 0 )
+        {
+            /* connecting or connected already */
+            break;
+        }
+        else 
+        {
+            /* socket connect get error, try another IP address */
+            close(sock->fd);
+            continue;
+        }
+    }
+
+    freeaddrinfo(res);
+
+out:
+    return rv;
+}
+
+/*  description: connect() server and check the connect result
+ *   input args: $sock: socket context
+ *return value:  <0: Error   0: Connecing in non-block mode   1:Connected
+ */
+static int proc_sock_connect(socket_t *sock)
+{
+    int          rv; 
+    int          len = sizeof(struct sockaddr);
+
+    if( !sock || sock->fd<0 )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    log_nrml("socket[%d] try to connect to server [%s:%d] now...\n", sock->fd, sock->raddr, sock->rport);
+
+    rv = connect(sock->fd, &sock->saddr, len);
+    if( 0 == rv )
+    {
+        sock->status = SOCK_STAT_CONNECTED;
+        rv = 1;
+        goto out;
+    }
+
+    /* rv < 0, connect failure will continue to check */ 
+    switch (errno)
+    {
+        case EISCONN:
+            sock->status = SOCK_STAT_CONNECTED; 
+            rv = 1;      
+            break;
+
+        case EALREADY:   
+        case EINPROGRESS:
+            sock->status = SOCK_STAT_CONNECTING;
+            rv = 0;
+            break;
+
+        default:
+            sock->status = SOCK_STAT_UNINIT; 
+            rv = -7;
+            break;
+    }
+
+out:
+    if( rv > 0 )
+    {
+        log_nrml("socket[%d] connected to remote server [%s:%d]\n", sock->fd, sock->raddr, sock->rport);
+    }
+    else if ( rv == 0 )
+    {
+        log_nrml("socket[%d] connect to remote server [%s:%d] in progressing\n", sock->fd, sock->raddr, sock->rport);
+    }
+    else 
+    {
+        log_err("socket[%d] connect to remote [%s:%d] failed: %s\n", sock->fd, sock->raddr, sock->rport, strerror(errno)); 
+        socket_close(sock);
+    }
+
+    return rv;
+}
+
+
+/*  description: accept a new client socket
+ *   input args: $sock: socket context
+ *               $listenfd: listen socket fd
+ * return value: <0: failure  0: successfully
+ */
+int socket_accept(socket_t *sock, int listenfd)
+{
+    if( !sock )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+}
+
+
+/*  description: send data to the socket, make sure all data send over. 
+ *   input args: $sock: socket context
+ *               $data: send data
+ *               $bytes: data size
+ * return value: <0: failure  0: successfully
+ */
+int socket_send(socket_t *sock, char *data, int bytes)
+{
+    int            rv = 0;
+    int            i = 0;
+    int            left_bytes = bytes;
+
+    if( !sock || !data || bytes<=0 )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    while( left_bytes > 0 )
+    {
+        rv=write(sock->fd, &data[i], left_bytes);
+        if( rv < 0 )
+        {
+            log_info("socket[%d] write() failure: %s, close socket now\n", sock->fd, strerror(errno));
+            socket_close(sock);
+            return -2;
+        }
+        else if( rv == left_bytes )
+        {
+            log_info("socket send %d bytes data over\n", bytes);
+            return 0;
+        }
+        else 
+        {
+            /* not send over this time, continue to send left data  */
+            i += rv;
+            left_bytes -= rv;
+            continue;
+        }
+    }
+}
+
+/*  description: receive data from the socket in some time
+ *   input args: $sock: socket context
+ *               $data: send data
+ *               $bytes: data size
+ *               $timeout: receive data time, <=0 will don't timeout
+ * return value: <0: error  >=0: receive data bytes;
+ */
+int socket_recv(socket_t *sock, char *buf, int size, int timeout)
+{
+    int               rv = 0;
+    int               i = 0;
+    fd_set            fdsr;
+    int               maxsock;
+
+    if( !sock || sock->fd<0 || !buf ||size<=0 )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    memset(buf, 0, size);
+
+    maxsock = sock->fd;
+
+    FD_ZERO(&fdsr);
+    FD_SET(sock->fd, &fdsr);
+
+    if( timeout <= 0 ) /* no timeout  */
+    {
+        rv=select(maxsock+1, &fdsr, NULL, NULL, NULL);
+    }
+    else
+    {
+        struct timeval    tv;
+
+        tv.tv_sec = timeout; 
+        tv.tv_usec = 0; 
+        rv=select(maxsock+1, &fdsr, NULL, NULL, &tv);
+    }
+
+
+    if( rv < 0 )
+    {
+        log_err("select() read from socket[%d] failure: %s\n", sock->fd, strerror(errno));
+        return -2;
+    }
+    else if( rv == 0 ) 
+    {
+        log_err("select() read from socket[%d] get timeout\n", sock->fd);
+        return 0;
+    }
+    else
+    {
+        rv = read(sock->fd, buf, size);
+        if( rv < 0 )
+        {
+            log_err("socket[%d] read() failure: %s, close socket now\n", sock->fd, strerror(errno));
+            socket_close(sock);
+            return -2;
+        }
+        else if( rv == 0 )
+        {
+            log_err("socket[%d] read() get peer disconnect, close socket now\n", sock->fd);
+            socket_close(sock);
+            return -2;
+        }
+        else
+        {
+            log_dbg("socket[%d] receive %d bytes data\n", sock->fd, rv);
+            logger_dump(LOG_LEVEL_INFO, buf, rv);
+            return rv;
+        }
+    }
+}
+
+
+
+/*  description: parser hostname and port from $host and set it into $sock 
+ *   input args: $sock: socket context
+ *               $host: connect hostname, format as "hostname:port"
+ */
+int parser_host_port(socket_t *sock, char *host)
+{
+    char          *ptr = NULL;
+    int            len = 0;
+
+    if( !sock || !host ) 
+    {               
+        log_err("Invalid input arguments\n");
+        return -1;  
+    }
+
+    ptr = strchr(host, ':');
+
+    if( !ptr )
+    {
+        log_err("Invalid arguments for host, format should be 'hostname:port'\n");
+        return -1;
+    }
+
+    len = ptr-host;
+    if( len >  sizeof(sock->raddr) )
+        len = sizeof(sock->raddr);
+
+    memcpy(sock->raddr, host, ptr-host);
+    sock->rport = atoi(ptr+1);
+
+    log_info("paser host[%s] to '%s:%d'\n", host, sock->raddr, sock->rport);
+
+    return 0;
+}
+
+
+int socket_set_reuseaddr(int sockfd)
+{
+    int opt = 1;
+    int len = sizeof (int);
+
+    if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, (void *) &opt, len)) 
+    {
+        log_err("Set socket[%d] option SO_REUSEADDR failed:%s\n", sockfd, strerror(errno));
+        return -1;
+    } 
+    log_dbg("Set socket[%d] option SO_REUSEADDR ok\n", sockfd);
+
+    return 0;
+}
+
+
+int socket_set_nonblock(int sockfd)
+{
+    int opts;
+    /*
+     * fcntl may set: 
+     *
+     * EACCES, EAGAIN: Operation is prohibited by locks held by other 
+     *          processes. Or, operation is prohibited because the file has 
+     *          been memory-mapped by another process. 
+     * EBADF:   fd is not an open file descriptor, or the command was F_SETLK 
+     *          or F_SETLKW and the file descriptor open mode doesn't match 
+     *          with the type of lock requested.
+     * EDEADLK: It was detected that the specified F_SETLKW command would 
+     *          cause a deadlock.
+     * EFAULT:  lock is outside your accessible address space.
+     * EINTR:   For F_SETLKW, the command was interrupted by a signal. For 
+     *          F_GETLK and F_SETLK, the command was interrupted by a signal 
+     *          before the lock was checked or acquired. Most likely when 
+     *          locking a remote file (e.g. locking over NFS), but can 
+     *          sometimes happen locally.
+     * EINVAL:  For F_DUPFD, arg is negative or is greater than the maximum 
+     *          allowable value. For F_SETSIG, arg is not an allowable signal 
+     *          number.
+     * EMFILE:  For F_DUPFD, the process already has the maximum number of 
+     *          file descriptors open. 
+     * ENOLCK:  Too many segment locks open, lock table is full, or a remote 
+     *          locking protocol failed (e.g. locking over NFS).
+     * EPERM:   Attempted to clear the O_APPEND flag on a file that has the 
+     *          append-only attribute set.
+     */
+    opts = fcntl(sockfd, F_GETFL);
+    if (opts < 0)
+    {
+        log_warn("fcntl() get socket options failure: %s\n", strerror(errno));
+        return -1;
+    } 
+
+    opts |= O_NONBLOCK;
+
+    if (fcntl(sockfd, F_SETFL, opts) < 0)
+    {
+        log_warn("fcntl() set socket options failure: %s\n", strerror(errno));
+        return -1;
+    }
+
+    log_dbg("Set socket[%d] none blocking\n", sockfd);
+    return opts;
+}
+
+int socket_set_buffer(int sockfd, int rsize, int ssize)
+{
+    int        opt;
+    socklen_t  optlen = sizeof(opt);
+
+    if(sockfd < 0)
+        return -1;
+
+    /* Get system default receive buffer size, Linux X86: 85K */
+    if (getsockopt (sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &opt, &optlen)) 
+    {
+        log_warn("getsockopt() get receive buffer failure: %s\n", strerror(errno));
+        return -2;
+    }
+
+    /* Only when current receive buffer size larger than the default one will change it  */
+    if(rsize > opt)
+    {
+        opt = (int) rsize;
+        if (setsockopt (sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &opt, optlen)) 
+        {
+            log_warn("setsockopt() set receive buffer to %d failure: %s\n", opt, strerror(errno));
+            return -2;
+        }
+    }
+
+    /* Get system default send buffer size, Linux X86: 16K */
+    if (getsockopt (sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, &optlen)) 
+    {
+        log_warn("getsockopt() get send buffer failure: %s\n", strerror(errno));
+        return -3;
+    }
+
+    /* Only when current receive buffer size larger than the default one will change it  */
+    if(ssize > opt)
+    {
+        opt = (int) ssize;
+        if (setsockopt (sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, optlen)) 
+        {
+            log_warn("setsockopt() set send buffer to %d failure: %s\n", opt, strerror(errno));
+            return -3;
+        }
+    }
+
+    log_info("Set socket[%d] RCVBUF size:%d  SNDBUF size:%d\n", sockfd, rsize, ssize);
+    return 0;
+}
+
+/*
+ * Enable socket SO_KEEPALIVE, if the connection disconnected, any system call on socket
+ * will return immediately and errno will be set to "WSAENOTCONN"
+ *
+ * keepalive is not program related, but socket related, * so if you have multiple sockets, 
+ * you can handle keepalive for each of them separately.
+ *
+ * Reference: http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/
+ */
+int socket_set_keepalive(int sockfd, int keepintvl, int keepcnt)
+{
+    int  opt;
+
+    if(sockfd < 0)
+        return -1;
+
+    /* Enable the KEEPALIVE flag */
+    opt = 1;
+    if (setsockopt (sockfd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof (opt))) 
+    {
+        log_warn("setsockopt() enable SO_KEEPALIVE failure: %s\n", strerror(errno));
+        return -2;
+    }
+
+    if(keepintvl || keepcnt)
+    {
+        /*
+         *  The tcp_keepidle parameter specifies the interval between the last data packet sent 
+         *  (simple ACKs are not considered data) and the first keepalive probe; after the 
+         *  connection is marked to need keepalive, this counter is not used any further. 
+         *  ~ >: cat /proc/sys/net/ipv4/tcp_keepalive_time 
+         *  7200
+         */
+        opt = 3; /* 3 seconds  */
+        if (setsockopt (sockfd, SOL_TCP, TCP_KEEPIDLE, (char *) &opt, sizeof (opt))) 
+        {
+            log_err("setsockopt() set TCP_KEEPIDLE to %d seconds failure: %s\n", opt, strerror(errno));
+            return -3;
+        }
+
+        if((opt=keepintvl) > 0)
+        {
+            /*
+             * The tcp_keepintvl parameter specifies the interval between subsequential keepalive 
+             * probes, regardless of what the connection has exchanged in the meantime.
+             * ~ >: cat /proc/sys/net/ipv4/tcp_keepalive_intvl 
+             * 75
+             */
+            if (setsockopt (sockfd, SOL_TCP, TCP_KEEPINTVL, (char *) &opt, sizeof (opt))) 
+            {
+                log_err("setsockopt() set TCP_KEEPINTVL to %d failure: %s\n", opt, strerror(errno));
+                return -4;
+            }
+        }
+
+        if((opt=keepcnt) > 0)
+        {
+            /*
+             * The TCP_KEEPCNT option specifies the maximum number of unacknowledged probes to 
+             * send before considering the connection dead and notifying the application layer
+             * probes to be sent. The value of TCP_KEEPCNT is an integer value between 1 and n, 
+             * where n is the value of the systemwide tcp_keepcnt parameter. 
+             * ~ >: cat /proc/sys/net/ipv4/tcp_keepalive_probes 
+             * 9
+             */
+            if (setsockopt (sockfd, SOL_TCP, TCP_KEEPCNT, (char *) &opt, sizeof (opt)))
+            {
+                log_err("setsockopt() set TCP_KEEPCNT to %d failure: %s\n", opt, strerror(errno));
+                return -5;
+            }
+        }
+    }
+
+    log_dbg("Set socket[%d] KEEPINTVL:%d  KEEPCNT:%d\n", sockfd, keepintvl, keepcnt);
+    return 0;
+}
+
+
diff --git a/prj1_tlv/lylib/socket.h b/prj1_tlv/lylib/socket.h
new file mode 100644
index 0000000..1b5a043
--- /dev/null
+++ b/prj1_tlv/lylib/socket.h
@@ -0,0 +1,176 @@
+/********************************************************************************
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  socket.h
+ *    Description:  This head file is for socket API
+ *
+ *        Version:  1.0.0(2020年04月16日)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2020年04月16日 13时45分33秒"
+ *                 
+ ********************************************************************************/
+#ifndef  _SOCKET_H_
+#define  _SOCKET_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/un.h>
+#include <poll.h>
+#include <errno.h> 
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <linux/sockios.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+#define HOSTNAME_LEN         128
+
+enum
+{
+    SOCK_TYPE_LISTEN,  /* listen  socket */
+    SOCK_TYPE_ACCEPT,  /* accept  socket */
+    SOCK_TYPE_CONNECT, /* connect socket */
+};
+
+enum
+{
+    SOCK_STAT_UNINIT     = 0,  /* socket not initial */
+    SOCK_STAT_INIT       = 1,  /* socket initialed */
+
+    SOCK_STAT_CONNECTING = 2,  /* socket connecting in non-block mode */
+
+    SOCK_STAT_CONNECTED  = 3,  /* socket connected in client mdoe */
+    SOCK_STAT_LISTENED   = 3,  /* socket listened  in server mode */
+    SOCK_STAT_ACCEPTED   = 3,  /* socket already accepted */
+};
+
+typedef struct socket_s
+{
+    int            fd;          /* socket fd  */ 
+    uint8_t        type;        /* socket type: listen, accept or accept */
+    uint8_t        status;      /* socket status: SOCK_STAT_INIT,SOCK_STAT_CONNECTED... */
+    
+    /* socket server/client IP address and port */
+    char           raddr[HOSTNAME_LEN];  /* remote IP address or domain name */ 
+    char           laddr[HOSTNAME_LEN];  /* local IP address */ 
+    uint16_t       lport;                /* local listen port */ 
+    uint16_t       rport;                /* remote connected port */ 
+
+    /* socket heartbeat settings  */
+    int            keepintvl;   /* keepalive detect interval */ 
+    int            keepcnt;     /* keepalive count */ 
+
+    struct sockaddr  saddr;              /*  sockaddr for connect */ 
+} socket_t;
+
+
+/*+-------------------------------------------------------------------+
+ *|           client/server  socket API functions                     |
+ *+-------------------------------------------------------------------+*/
+
+/*  description: initialise socket context and create socket fd if sepecified
+ *   input args: $sock: socket context 
+ *               $type: SOCK_TYPE_LISTEN, SOCK_TYPE_ACCEPT or SOCK_TYPE_CONNEC
+ *               $create: call socket() create or not
+ * return value: <0: failure  0: successfully
+ */                           
+enum 
+{
+    SOCK_NOT_CREATE,
+    SOCK_CREATE,
+};
+int socket_ctx_init(socket_t *sock, uint8_t type, int create);
+
+
+/*  description: close socket and set socket status as SOCK_STAT_INIT 
+ *   input args: $sock: socket context
+ * return value: <0: failure  0: successfully
+ */
+int socket_close(socket_t *sock);
+
+
+/*  description: close socket
+ *   input args: $sock: socket context
+ *               $lport: specify use local port $lport to connect remote server
+ *               $host: IP address and port, format as "host:port", such as "127.0.0.1:8000"
+ *              $block: block mode(1) or none-block(0)
+ *return value:  <0: error   0: connecing in non-block mode   1:connected
+ */
+enum 
+{
+    MODE_NONBLOCK,
+    MODE_BLOCK,
+};
+int socket_connect(socket_t *sock, int lport, char *host, int block);
+
+
+/*  description: create socket and listen on port $port
+ *   input args: $sock: socket context
+ *                 $ip: listen IP address, NULL for any address
+ *               $port: listen port
+ * return value: <0: failure  0: successfully
+ */
+int socket_listen(socket_t *sock, char *ipaddr, int port);
+
+
+/*  description: accept a new client socket
+ *   input args: $sock: socket context
+ *               $listenfd: listen socket fd
+ * return value: <0: failure  0: successfully
+ */
+int socket_accept(socket_t *sock, int listenfd);
+
+/*  description: send data to the socket, make sure all data send over. 
+ *   input args: $sock: socket context
+ *               $data: send data
+ *               $bytes: data size
+ * return value: <0: failure  0: successfully
+ */
+int socket_send(socket_t *sock, char *data, int bytes);
+
+
+/*  description: receive data from the socket in some time
+ *   input args: $sock: socket context
+ *               $data: send data
+ *               $bytes: data size
+ *               $timeout: receive data time, <=0 will don't timeout
+ * return value: <0: error  >=0: receive data bytes;
+ */
+int socket_recv(socket_t *sock, char *buf, int size, int timeout);
+
+
+/*+-------------------------------------------------------------------+
+ *|                socket utils function                              |
+ *+-------------------------------------------------------------------+*/
+
+/*  description: parser hostname and port from $host and set it into $sock 
+ *   input args: $sock: socket context
+ *               $host: connect hostname, format as "hostname:port"
+ */
+int parser_host_port(socket_t *sock, char *host);
+
+
+/* description: set socket listen port as reusable, fix port already used bug  */
+int socket_set_reuseaddr(int sockfd);
+
+/* set socket as non-block mode, common socket default work as block mode */
+int socket_set_nonblock(int sockfd);
+
+/* set socket receive and send buffer size in linux kernel space */
+int socket_set_buffer(int sockfd, int rsize, int ssize);
+
+/* set heartbeat keepalive  */
+int socket_set_keepalive(int sockfd, int keepintvl, int keepcnt);
+
+
+#endif   /* ----- #ifndef _SOCKET_H_  ----- */
+
diff --git a/prj1_tlv/lylib/tags b/prj1_tlv/lylib/tags
index 6f6b962..1796b02 100644
--- a/prj1_tlv/lylib/tags
+++ b/prj1_tlv/lylib/tags
@@ -4,9 +4,8 @@
 !_TAG_PROGRAM_NAME	Exuberant Ctags	//
 !_TAG_PROGRAM_URL	http://ctags.sourceforge.net	/official site/
 !_TAG_PROGRAM_VERSION	5.9~svn20110310	//
-BUFSIZE	tlv_sample.c	21;"	d	file:
-CHARS_PER_LINE	logger.c	334;"	d	file:
-CHARS_PER_LINE	tlv_sample.c	156;"	d	file:
+CHARS_PER_LINE	logger.c	335;"	d	file:
+CHARS_PER_LINE	tlv_pack.c	102;"	d	file:
 CRC_ITU_T_H	crc-itu-t.h	14;"	d
 DBG_LOG_FILE	logger.h	35;"	d
 DEFAULT_TIME_FORMAT	logger.h	40;"	d
@@ -14,8 +13,8 @@
 FLAG_LOGGER_CONSOLE	logger.h	63;"	d
 FLAG_LOGGER_FILE	logger.h	64;"	d
 FLAG_LOGGER_LEVEL_OPT	logger.h	61;"	d
-LINELEN	logger.c	333;"	d	file:
-LINELEN	tlv_sample.c	155;"	d	file:
+LINELEN	logger.c	334;"	d	file:
+LINELEN	tlv_pack.c	101;"	d	file:
 LOG_FILE_LINE	logger.h	92;"	d
 LOG_LEVEL_DEBUG	logger.h	/^    LOG_LEVEL_DEBUG,                  \/*  Debug Level "Debug" *\/$/;"	e	enum:__anon1
 LOG_LEVEL_DISB	logger.h	/^    LOG_LEVEL_DISB = 0,               \/*  Disable "Debug" *\/$/;"	e	enum:__anon1
@@ -28,46 +27,47 @@
 LOG_LEVEL_WARN	logger.h	/^    LOG_LEVEL_WARN,                   \/*  Debug Level "warnning" *\/$/;"	e	enum:__anon1
 LOG_ROLLBACK_NONE	logger.h	38;"	d
 LOG_ROLLBACK_SIZE	logger.h	37;"	d
-LOG_TIME_FMT	logger.c	24;"	d	file:
+LOG_TIME_FMT	logger.c	25;"	d	file:
 LOG_VERSION_STR	logger.h	29;"	d
 MAGIC_CRC	crc-itu-t.h	16;"	d
 MAX_LOG_MESSAGE_LEN	logger.h	41;"	d
-OFF	tlv_sample.c	18;"	d	file:
-ON	tlv_sample.c	19;"	d	file:
-PACK_HEADER	tlv_sample.c	30;"	d	file:
+PACK_HEADER	tlv_pack.h	26;"	d
 PID_ASCII_SIZE	proc.h	18;"	d
 PRECISE_TIME_FACTOR	logger.c	16;"	d	file:
-TAG_CAMERA	tlv_sample.c	/^	TAG_CAMERA,$/;"	e	enum:__anon2	file:
-TAG_LED	tlv_sample.c	/^	TAG_LED,$/;"	e	enum:__anon2	file:
-TAG_LOGON	tlv_sample.c	/^	TAG_LOGON=1,$/;"	e	enum:__anon2	file:
-TLV_FIXED_SIZE	tlv_sample.c	41;"	d	file:
-TLV_MIN_SIZE	tlv_sample.c	44;"	d	file:
+TAG_ACK	tlv_pack.h	/^    TAG_ACK=1,$/;"	e	enum:__anon2
+TAG_SN	tlv_pack.h	/^    TAG_SN,$/;"	e	enum:__anon2
+TAG_TEMP	tlv_pack.h	/^    TAG_TEMP,$/;"	e	enum:__anon2
+TAG_TIME	tlv_pack.h	/^    TAG_TIME,$/;"	e	enum:__anon2
+TLV_BUFSIZE	tlv_pack.h	44;"	d
+TLV_FIXED_SIZE	tlv_pack.h	29;"	d
+TLV_MIN_SIZE	tlv_pack.h	32;"	d
+_DS18B20_H_	ds18b20.h	15;"	d
 _LOGGER_H_	logger.h	15;"	d
 _PROC_H_	proc.h	15;"	d
+_TLV_PACK_H_	tlv_pack.h	14;"	d
 _curOffset	logger.c	/^        long _curOffset = ftell(logger->fp);$/;"	l
 act	logger.c	/^    struct sigaction act;$/;"	l
 argp	logger.c	/^    va_list argp;$/;"	l
 args	proc.c	/^    va_list             args;$/;"	l
+buf	ds18b20.c	/^    char            buf[128];$/;"	l
 buf	logger.c	/^    char buf[MAX_LOG_MESSAGE_LEN];$/;"	l
-buf	tlv_sample.c	/^	char          buf[BUFSIZE];$/;"	l
-bytes	tlv_sample.c	/^	int           bytes;$/;"	l
+buf	tlv_pack.h	/^    char                   buf[TLV_BUFSIZE];$/;"	m	struct:tlv_buf_s	access:public
+byte	ds18b20.c	/^    uint8_t        *byte;$/;"	l
 bytes_to_ushort	crc-itu-t.c	/^unsigned short bytes_to_ushort(unsigned char *bytes, int len)$/;"	f	signature:(unsigned char *bytes, int len)
 bytes_to_ushort	crc-itu-t.h	/^extern unsigned short bytes_to_ushort(unsigned char *bytes, int len);$/;"	p	signature:(unsigned char *bytes, int len)
 c	logger.c	/^            unsigned char c = buf[idx];$/;"	l
-c	tlv_sample.c	/^            unsigned char c = data[idx];$/;"	l
+c	tlv_pack.c	/^            unsigned char c = data[idx];$/;"	l
 check_and_rollback	logger.c	/^static void check_and_rollback(void)$/;"	f	file:	signature:(void)
 check_daemon_running	proc.c	/^int check_daemon_running(const char *pid_file)$/;"	f	signature:(const char *pid_file)
 check_daemon_running	proc.h	/^extern int check_daemon_running(const char *pid_file);$/;"	p	signature:(const char *pid_file)
+chip	ds18b20.c	/^    char            chip[20];$/;"	l
 chmod	proc.c	/^        (void)chmod(ipc_dir, mode); $/;"	p	file:
 cmd	logger.c	/^            char cmd[512];$/;"	l
 cmd	proc.c	/^    char                cmd[256];$/;"	l
-cp_install_proc_signal	proc.c	/^void cp_install_proc_signal(void)$/;"	f	signature:(void)
-cp_install_proc_signal	proc.h	/^extern void cp_install_proc_signal(void);$/;"	p	signature:(void)
 cp_printout	logger.c	/^static void cp_printout(char *level, char *fmt, va_list argp)$/;"	f	file:	signature:(char *level, char *fmt, va_list argp)
 cp_printout_line	logger.c	/^static void cp_printout_line(char *level, char *fmt, char *file, int line, va_list argp)$/;"	f	file:	signature:(char *level, char *fmt, char *file, int line, va_list argp)
-cp_proc_sighandler	proc.c	/^void cp_proc_sighandler(int sig)$/;"	f	signature:(int sig)
-crc16	tlv_sample.c	/^	unsigned short      crc16 = 0;$/;"	l
-crc16	tlv_sample.c	/^	unsigned short      crc16;$/;"	l
+crc16	tlv_pack.c	/^	unsigned short      crc16 = 0;$/;"	l
+crc16	tlv_pack.c	/^	unsigned short      crc16;$/;"	l
 crc_itu_t	crc-itu-t.c	/^unsigned short crc_itu_t(unsigned short crc, const unsigned char *buffer, unsigned int len)$/;"	f	signature:(unsigned short crc, const unsigned char *buffer, unsigned int len)
 crc_itu_t	crc-itu-t.h	/^extern unsigned short crc_itu_t(unsigned short magic_crc, const unsigned char *buffer, unsigned int len);$/;"	p	signature:(unsigned short magic_crc, const unsigned char *buffer, unsigned int len)
 crc_itu_t_byte	crc-itu-t.h	/^static inline unsigned short crc_itu_t_byte(unsigned short crc, const unsigned char data)$/;"	f	signature:(unsigned short crc, const unsigned char data)
@@ -75,10 +75,13 @@
 crc_itu_t_table	crc-itu-t.h	/^extern const unsigned short  crc_itu_t_table[256];$/;"	x
 daemonize	proc.c	/^void daemonize(int nochdir, int noclose)$/;"	f	signature:(int nochdir, int noclose)
 daemonize	proc.h	/^extern void daemonize(int nochdir, int noclose);$/;"	p	signature:(int nochdir, int noclose)
-data_len	tlv_sample.c	/^	int                 data_len = 0;$/;"	l
+direntp	ds18b20.c	/^    struct dirent  *direntp;$/;"	l
+dirp	ds18b20.c	/^    DIR            *dirp;$/;"	l
 done	proc.c	/^    int                 done; $/;"	l
-dump_buf	tlv_sample.c	/^void dump_buf(char *data, int len)$/;"	f	signature:(char *data, int len)
-dump_buf	tlv_sample.c	/^void dump_buf(char *data, int len);$/;"	p	file:	signature:(char *data, int len)
+ds18b20_get_temperature	ds18b20.c	/^int ds18b20_get_temperature(uint16_t *temp)$/;"	f	signature:(uint16_t *temp)
+ds18b20_get_temperature	ds18b20.h	/^int ds18b20_get_temperature(uint16_t *temp);$/;"	p	signature:(uint16_t *temp)
+dump_buf	tlv_pack.c	/^void dump_buf(char *data, int len)$/;"	f	signature:(char *data, int len)
+dump_buf	tlv_pack.h	/^void dump_buf(char *data, int len);$/;"	p	signature:(char *data, int len)
 exec_system_cmd	proc.c	/^void exec_system_cmd(const char *format, ...)$/;"	f	signature:(const char *format, ...)
 exec_system_cmd	proc.h	/^extern void exec_system_cmd(const char *format, ...);$/;"	p	signature:(const char *format, ...)
 f	proc.c	/^    FILE *f; $/;"	l
@@ -86,31 +89,36 @@
 fStatBuf	proc.c	/^    struct stat fStatBuf; $/;"	l
 fStatBuf	proc.c	/^    struct stat fStatBuf;$/;"	l
 fclose	proc.c	/^        (void)fclose(f); $/;"	p	file:
+fd	ds18b20.c	/^    int             fd =-1;$/;"	l
 fd	proc.c	/^    int fd = -1; $/;"	l
 fd	proc.c	/^    int retval, fd; $/;"	l
 fgets	proc.c	/^        (void)fgets(pid_ascii, PID_ASCII_SIZE, f); $/;"	p	file:
 file	logger.h	/^    char               file[FILENAME_LEN];$/;"	m	struct:logger_s	access:public
 filemode	logger.c	/^    char *filemode;$/;"	l
 flag	logger.h	/^    unsigned char      flag;$/;"	m	struct:logger_s	access:public
+found	ds18b20.c	/^    int             found = 0;$/;"	l
 fp	logger.h	/^    FILE               *fp;$/;"	m	struct:logger_s	access:public
 g_signal	proc.c	/^proc_signal_t     g_signal={0};$/;"	v
 g_signal	proc.h	/^extern proc_signal_t     g_signal;$/;"	x
 get_daemon_pid	proc.c	/^pid_t get_daemon_pid(const char *pid_file)$/;"	f	signature:(const char *pid_file)
 get_daemon_pid	proc.h	/^extern pid_t get_daemon_pid(const char *pid_file);$/;"	p	signature:(const char *pid_file)
 hc	logger.c	/^    char hc[4];$/;"	l
-hc	tlv_sample.c	/^    char hc[4];$/;"	l
+hc	tlv_pack.c	/^    char hc[4];$/;"	l
 i	crc-itu-t.c	/^    int              i = 0;$/;"	l
 i	crc-itu-t.c	/^    int            i = 0;$/;"	l
 i	proc.c	/^    int i; $/;"	l
 idx	logger.c	/^    int idx;$/;"	l
-idx	tlv_sample.c	/^    int idx;$/;"	l
+idx	tlv_pack.c	/^    int idx;$/;"	l
+install_proc_signal	proc.c	/^void install_proc_signal(void)$/;"	f	signature:(void)
+install_proc_signal	proc.h	/^extern void install_proc_signal(void);$/;"	p	signature:(void)
 ipc_dir	proc.c	/^    char ipc_dir[64] = { 0 }; $/;"	l
 ldx	logger.c	/^        int ldx = idx % CHARS_PER_LINE;$/;"	l
+len	tlv_pack.h	/^    int                    len;$/;"	m	struct:tlv_buf_s	access:public
 level	logger.h	/^    int                level;$/;"	m	struct:logger_s	access:public
 line_done	logger.c	/^    short line_done = 1;$/;"	l
-line_done	tlv_sample.c	/^    short line_done = 1;$/;"	l
+line_done	tlv_pack.c	/^    short line_done = 1;$/;"	l
 lit	logger.c	/^    char lit[CHARS_PER_LINE + 2];$/;"	l
-lit	tlv_sample.c	/^    char lit[CHARS_PER_LINE + 1];$/;"	l
+lit	tlv_pack.c	/^    char lit[CHARS_PER_LINE + 1];$/;"	l
 local	logger.c	/^    struct tm *local;$/;"	l
 log_dbg	logger.h	105;"	d
 log_dbg	logger.h	97;"	d
@@ -160,33 +168,37 @@
 logger_t	logger.h	/^} logger_t;$/;"	t	typeref:struct:logger_s
 logger_term	logger.c	/^void logger_term(void)$/;"	f	signature:(void)
 logger_term	logger.h	/^extern void logger_term(void);$/;"	p	signature:(void)
-main	tlv_sample.c	/^int main(int argc, char **argv)$/;"	f	signature:(int argc, char **argv)
 mode	proc.c	/^    int mode = S_IROTH | S_IXOTH | S_IRGRP | S_IXGRP | S_IRWXU;$/;"	l
 now	logger.c	/^    struct timeval now;$/;"	l
-ofset	tlv_sample.c	/^	int                 ofset = 0; \/* index position for the buf *\/$/;"	l
-pack_len	tlv_sample.c	/^	int                 pack_len = 0;$/;"	l
-pack_len	tlv_sample.c	/^	int                 pack_len = TLV_FIXED_SIZE+1; \/* Only 1 byte data *\/$/;"	l
-packtlv_led	tlv_sample.c	/^int packtlv_led(char *buf, int size, int cmd)$/;"	f	signature:(char *buf, int size, int cmd)
-packtlv_led	tlv_sample.c	/^int packtlv_led(char *buf, int size, int cmd);$/;"	p	file:	signature:(char *buf, int size, int cmd)
-packtlv_logon	tlv_sample.c	/^int packtlv_logon(char *buf, int size, char *pwd)$/;"	f	signature:(char *buf, int size, char *pwd)
-packtlv_logon	tlv_sample.c	/^int packtlv_logon(char *buf, int size, char *pwd);$/;"	p	file:	signature:(char *buf, int size, char *pwd)
+ofset	tlv_pack.c	/^	int                 ofset = 0; \/* index position for the buf *\/$/;"	l
+pack_len	tlv_pack.c	/^	int                 pack_len = 0;$/;"	l
+pack_len	tlv_pack.c	/^	int                 pack_len = TLV_FIXED_SIZE+1; \/* Only 1 byte data *\/$/;"	l
+packtlv_ack	tlv_pack.c	/^int packtlv_ack(char *buf, int size, int ack)$/;"	f	signature:(char *buf, int size, int ack)
+packtlv_ack	tlv_pack.h	/^int packtlv_ack (char *buf, int size, int ack);$/;"	p	signature:(char *buf, int size, int ack)
+packtlv_led	tlv_pack.c	/^int packtlv_led(char *buf, int size, int cmd)$/;"	f	signature:(char *buf, int size, int cmd)
+packtlv_msg	tlv_pack.h	/^int packtlv_msg(tlv_buf_t *tlv, char *sn, uint16_t temp, struct tm *tm);$/;"	p	signature:(tlv_buf_t *tlv, char *sn, uint16_t temp, struct tm *tm)
+packtlv_sn	tlv_pack.h	/^int packtlv_sn  (char *buf, int size, char *sn);$/;"	p	signature:(char *buf, int size, char *sn)
+packtlv_temp	tlv_pack.h	/^int packtlv_temp(char *buf, int size, uint16_t temp);$/;"	p	signature:(char *buf, int size, uint16_t temp)
+packtlv_time	tlv_pack.h	/^int packtlv_time(char *buf, int size, struct tm *tm);$/;"	p	signature:(char *buf, int size, struct tm *tm)
 pid	proc.c	/^        char pid[PID_ASCII_SIZE]; $/;"	l
 pid	proc.c	/^        pid_t pid = -1; $/;"	l
 pid	proc.c	/^    pid_t            pid = -1; $/;"	l
 pid	proc.c	/^    pid_t pid; $/;"	l
 pid_ascii	proc.c	/^        char pid_ascii[PID_ASCII_SIZE]; $/;"	l
 print_char	logger.c	/^static char *print_char =$/;"	v	file:
-print_char	tlv_sample.c	/^static char *print_char =$/;"	v	file:
+print_char	tlv_pack.c	/^static char *print_char =$/;"	v	file:
 prn	logger.c	/^    char prn[LINELEN];$/;"	l
-prn	tlv_sample.c	/^    char prn[LINELEN];$/;"	l
+prn	tlv_pack.c	/^    char prn[LINELEN];$/;"	l
+proc_sighandler	proc.c	/^void proc_sighandler(int sig)$/;"	f	signature:(int sig)
 proc_signal_s	proc.h	/^typedef struct proc_signal_s$/;"	s
 proc_signal_s::signal	proc.h	/^    int       signal;$/;"	m	struct:proc_signal_s	access:public
 proc_signal_s::stop	proc.h	/^    unsigned  stop;     \/* 0: Not term  1: Stop  *\/$/;"	m	struct:proc_signal_s	access:public
 proc_signal_s::threads	proc.h	/^    int       threads;  \/* threads counter *\/$/;"	m	struct:proc_signal_s	access:public
 proc_signal_t	proc.h	/^}  proc_signal_t;$/;"	t	typeref:struct:proc_signal_s
+ptr	ds18b20.c	/^    char           *ptr;$/;"	l
 rc	logger.c	/^    int rc = 0;$/;"	l
 rc	logger.c	/^    int rc;$/;"	l
-rc	tlv_sample.c	/^    int rc;$/;"	l
+rc	tlv_pack.c	/^    int rc;$/;"	l
 record_daemon_pid	proc.c	/^int record_daemon_pid(const char *pid_file)$/;"	f	signature:(const char *pid_file)
 record_daemon_pid	proc.h	/^extern int record_daemon_pid(const char *pid_file);$/;"	p	signature:(const char *pid_file)
 retVal	proc.c	/^    int retVal = -1; $/;"	l
@@ -203,13 +215,19 @@
 stop_daemon_running	proc.c	/^int stop_daemon_running(const char *pid_file)$/;"	f	signature:(const char *pid_file)
 stop_daemon_running	proc.h	/^extern int stop_daemon_running(const char *pid_file);$/;"	p	signature:(const char *pid_file)
 thread_attr	proc.c	/^    pthread_attr_t thread_attr; $/;"	l
-thread_body	proc.h	/^typedef void *(* thread_body) (void *thread_arg);$/;"	t
+thread_body	proc.h	/^typedef void *(* thread_body)(void *thread_arg);$/;"	t
 thread_start	proc.c	/^int thread_start(pthread_t * thread_id, thread_body worker_func, void *thread_arg)$/;"	f	signature:(pthread_t * thread_id, thread_body worker_func, void *thread_arg)
 thread_start	proc.h	/^extern int thread_start(pthread_t * thread_id, thread_body worker_func, void *thread_arg);$/;"	p	signature:(pthread_t * thread_id, thread_body worker_func, void *thread_arg)
 thread_stop	proc.c	/^void thread_stop(char *prompt)$/;"	f	signature:(char *prompt)
 thread_stop	proc.h	/^extern void thread_stop(char *prompt);$/;"	p	signature:(char *prompt)
 threads	proc.h	/^    int       threads;  \/* threads counter *\/$/;"	m	struct:proc_signal_s	access:public
 timestr	logger.c	/^    char timestr[256];$/;"	l
+tlv_buf_s	tlv_pack.h	/^typedef struct tlv_buf_s $/;"	s
+tlv_buf_s::buf	tlv_pack.h	/^    char                   buf[TLV_BUFSIZE];$/;"	m	struct:tlv_buf_s	access:public
+tlv_buf_s::len	tlv_pack.h	/^    int                    len;$/;"	m	struct:tlv_buf_s	access:public
+tlv_buf_t	tlv_pack.h	/^} tlv_buf_t;  $/;"	t	typeref:struct:tlv_buf_s
 ushort_to_bytes	crc-itu-t.c	/^int ushort_to_bytes(unsigned char *bytes, unsigned short val)$/;"	f	signature:(unsigned char *bytes, unsigned short val)
 ushort_to_bytes	crc-itu-t.h	/^extern int ushort_to_bytes(unsigned char *bytes, unsigned short val);$/;"	p	signature:(unsigned char *bytes, unsigned short val)
 val	crc-itu-t.c	/^    unsigned short val = 0;$/;"	l
+value	ds18b20.c	/^    float           value;$/;"	l
+w1_path	ds18b20.c	/^    char            w1_path[50] = "\/sys\/bus\/w1\/devices\/";$/;"	l
diff --git a/prj1_tlv/lylib/tlv_pack.c b/prj1_tlv/lylib/tlv_pack.c
new file mode 100644
index 0000000..84db1af
--- /dev/null
+++ b/prj1_tlv/lylib/tlv_pack.c
@@ -0,0 +1,338 @@
+/*********************************************************************************
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  tlv_pack.h
+ *    Description:  This head file is for TLV packet
+ *                 
+ *        Version:  1.0.0(2020年04月14日)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2020年04月14日 00时52分56秒"
+ *                 
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "tlv_pack.h"
+#include "crc-itu-t.h"
+
+
+int packtlv_ack(char *buf, int size, int ack)
+{
+	unsigned short      crc16 = 0;
+	int                 pack_len = 0;
+	int                 ofset = 0; /* index position for the buf */
+
+	if(!buf || size<TLV_MIN_SIZE )
+	{
+		printf("Invalid input arguments\n");
+		return 0;
+	}
+
+	/*+-------------------------+
+     *|   1.fill packet Header  | 
+	 *+-------------------------+*/
+
+	buf[ofset] = PACK_HEADER;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   2.fill packet Tag     | 
+	 *+-------------------------+*/
+
+	buf[ofset] = TAG_ACK;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   3.fill packet Length  | 
+	 *+-------------------------+*/
+
+    /* ACK message only get 1B payload data */
+	pack_len = TLV_FIXED_SIZE + 1;
+	buf[ofset] = pack_len;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   4.fill packet Value   | 
+	 *+-------------------------+*/
+
+    if( ack )
+        buf[ofset++] = 1; /* 1 for ACK */
+    else
+        buf[ofset++] = 0; /* 0 for NAK */
+
+	/*+-------------------------+
+     *|   5.fill packet CRC     | 
+	 *+-------------------------+*/
+
+	/* Calc CRC16 checksum value from Packet Head(buf[0]) ~ Value(buf[ofset]) */
+	crc16 = crc_itu_t(MAGIC_CRC, buf, ofset);
+
+	/* Append the 2 Bytes CRC16 checksum value into the last two bytes in packet buffer */
+	ushort_to_bytes(&buf[ofset], crc16);
+	ofset += 2;
+
+    /* ofset value is the TLV packet length  */
+	return ofset;
+}
+
+
+int packtlv_sn(char *buf, int size, char *sn)
+{
+	unsigned short      crc16 = 0;
+    int                 payload_len = 0;
+	int                 pack_len = 0;
+	int                 ofset = 0; /* index position for the buf */
+
+	if(!buf || size<TLV_MIN_SIZE )
+	{
+		printf("Invalid input arguments\n");
+		return 0;
+	}
+
+	/*+-------------------------+
+     *|   1.fill packet Header  | 
+	 *+-------------------------+*/
+	buf[ofset] = PACK_HEADER;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   2.fill packet Tag     | 
+	 *+-------------------------+*/
+	buf[ofset] = TAG_SN;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   3.fill packet Length  | 
+	 *+-------------------------+*/
+
+    /* $sn too long maybe result buffer overflow, so we need check the buffer 
+     * is large enuf or not. If not enuf we will truncate $sn string 
+     */
+    if( strlen(sn) <= size-TLV_FIXED_SIZE )
+        payload_len = strlen(sn);
+    else
+        payload_len = size-TLV_FIXED_SIZE;
+
+    /*  TLV packet length is SN length+5Byte () */ 
+    pack_len = payload_len + TLV_FIXED_SIZE;
+
+	buf[ofset] = pack_len;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   4.fill packet Value   | 
+	 *+-------------------------+*/
+    memcpy(&buf[ofset], sn, payload_len);
+    ofset += payload_len;
+
+	/*+-------------------------+
+     *|   5.fill packet CRC     | 
+	 *+-------------------------+*/
+
+	/* Calc CRC16 checksum value from Packet Head(buf[0]) ~ Value(buf[ofset]) */
+	crc16 = crc_itu_t(MAGIC_CRC, buf, ofset);
+
+	/* Append the 2 Bytes CRC16 checksum value into the last two bytes in packet buffer */
+	ushort_to_bytes(&buf[ofset], crc16);
+	ofset += 2;
+
+    /* ofset value is the TLV packet length  */
+	return ofset;
+}
+
+
+int packtlv_temp(char *buf, int size, uint16_t temp)
+{
+	unsigned short      crc16 = 0;
+	int                 pack_len = 0;
+	int                 ofset = 0; /* index position for the buf */
+
+	if(!buf || size<TLV_FIXED_SIZE+2 )
+	{
+		printf("Invalid input arguments\n");
+		return 0;
+	}
+
+	/*+-------------------------+
+     *|   1.fill packet Header  | 
+	 *+-------------------------+*/
+
+	buf[ofset] = PACK_HEADER;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   2.fill packet Tag     | 
+	 *+-------------------------+*/
+
+	buf[ofset] = TAG_TEMP;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   3.fill packet Length  | 
+	 *+-------------------------+*/
+
+    /* termperature message get 2B payload data */
+	pack_len = TLV_FIXED_SIZE + 2;
+	buf[ofset] = pack_len;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   4.fill packet Value   | 
+	 *+-------------------------+*/
+
+    /* temperature get 2 bytes, byte[0]:integer part, byte[1]:fractional part  */
+    memcpy(&buf[ofset], &temp, 2);
+    ofset += 2;
+
+	/*+-------------------------+
+     *|   5.fill packet CRC     | 
+	 *+-------------------------+*/
+
+	/* Calc CRC16 checksum value from Packet Head(buf[0]) ~ Value(buf[ofset]) */
+	crc16 = crc_itu_t(MAGIC_CRC, buf, ofset);
+
+	/* Append the 2 Bytes CRC16 checksum value into the last two bytes in packet buffer */
+	ushort_to_bytes(&buf[ofset], crc16);
+	ofset += 2;
+
+    /* ofset value is the TLV packet length  */
+	return ofset;
+}
+
+int packtlv_time(char *buf, int size, struct tm *tm)
+{
+	unsigned short      crc16 = 0;
+	int                 pack_len = 0;
+	int                 ofset = 0; /* index position for the buf */
+
+	if(!buf || size<TLV_FIXED_SIZE+6 )
+	{
+		printf("Invalid input arguments\n");
+		return 0;
+	}
+
+	/*+-------------------------+
+     *|   1.fill packet Header  | 
+	 *+-------------------------+*/
+
+	buf[ofset] = PACK_HEADER;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   2.fill packet Tag     | 
+	 *+-------------------------+*/
+
+	buf[ofset] = TAG_TIME;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   3.fill packet Length  | 
+	 *+-------------------------+*/
+
+    /* date time message get 6B payload data */
+	pack_len = TLV_FIXED_SIZE + 6;
+	buf[ofset] = pack_len;
+	ofset += 1;
+
+	/*+-------------------------+
+     *|   4.fill packet Value   | 
+	 *+-------------------------+*/ 
+
+    buf[ofset++] = tm->tm_year-100; /* tm_year is since 1900, we change it it to 2000 */
+    buf[ofset++] = tm->tm_mon+1;    /* tm_mon is from 0~11  */
+    buf[ofset++] = tm->tm_mday;
+    buf[ofset++] = tm->tm_hour;
+    buf[ofset++] = tm->tm_min;
+    buf[ofset++] = tm->tm_sec;
+
+	/*+-------------------------+
+     *|   5.fill packet CRC     | 
+	 *+-------------------------+*/
+
+	/* Calc CRC16 checksum value from Packet Head(buf[0]) ~ Value(buf[ofset]) */
+	crc16 = crc_itu_t(MAGIC_CRC, buf, ofset);
+
+	/* Append the 2 Bytes CRC16 checksum value into the last two bytes in packet buffer */
+	ushort_to_bytes(&buf[ofset], crc16);
+	ofset += 2;
+
+    /* ofset value is the TLV packet length  */
+	return ofset;
+}
+
+
+
+/*+------------------------------+
+ *|  dump_buf() implement code   |
+ *+------------------------------+*/
+
+#define LINELEN 81
+#define CHARS_PER_LINE 16
+
+static char *print_char =
+    "                "
+    "                "
+    " !\"#$%&'()*+,-./"
+    "0123456789:;<=>?"
+    "@ABCDEFGHIJKLMNO"
+    "PQRSTUVWXYZ[\\]^_"
+    "`abcdefghijklmno"
+    "pqrstuvwxyz{|}~ "
+    "                "
+    "                "
+    " ???????????????"
+    "????????????????"
+    "????????????????"
+    "????????????????"
+    "????????????????"
+    "????????????????";
+
+/* print every byte in the buffer as HEX and corresponding charactor, which is not printable charactor will be instead as '?' */
+void dump_buf(char *data, int len)
+{
+    int rc;
+    int idx;
+    char prn[LINELEN];
+    char lit[CHARS_PER_LINE + 1];
+    char hc[4];
+    short line_done = 1;
+
+    rc = len;
+    idx = 0;
+    lit[CHARS_PER_LINE] = '\0';
+
+    while (rc > 0)
+    {
+        if (line_done)
+            snprintf(prn, LINELEN, "%08X: ", idx);
+        do
+        {
+            unsigned char c = data[idx];
+            snprintf(hc, 4, "%02X ", c);
+            strncat(prn, hc, 4);
+            lit[idx % CHARS_PER_LINE] = print_char[c];
+            ++idx;
+        } while (--rc > 0 && (idx % CHARS_PER_LINE != 0));
+
+        line_done = (idx % CHARS_PER_LINE) == 0;
+
+        if (line_done)
+            printf("%s  %s\n", prn, lit);
+        else if (rc == 0)
+            strncat(prn, "   ", LINELEN);
+    }
+
+    if (!line_done)
+    {
+        lit[(idx % CHARS_PER_LINE)] = '\0';
+
+        while ((++idx % CHARS_PER_LINE) != 0)
+            strncat(prn, "   ", LINELEN);
+
+        printf("%s  %s\n", prn, lit);
+
+    }
+}
+
diff --git a/prj1_tlv/lylib/tlv_pack.h b/prj1_tlv/lylib/tlv_pack.h
new file mode 100644
index 0000000..1416fbf
--- /dev/null
+++ b/prj1_tlv/lylib/tlv_pack.h
@@ -0,0 +1,77 @@
+/********************************************************************************
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  tlv_pack.h
+ *    Description:  This head file is for TLV packet
+ *
+ *        Version:  1.0.0(2020年04月15日)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2020年04月15日 23时14分21秒"
+ *                 
+ ********************************************************************************/
+#ifndef  _TLV_PACK_H_
+#define  _TLV_PACK_H_
+
+#include <stdint.h>
+#include <time.h>
+
+/* TLV Packet format: 
+ *
+ *+------------+---------+------------+-----------+-----------+
+ *| Header(1B) | Tag(1B) | Length(1B) | Value(1B) | CRC16(2B) |
+ *+------------+---------+------------+-----------+-----------+
+ */
+
+#define PACK_HEADER        0xFD
+
+/* TLV packet fixed segement size, 1B Head, 1B Tag, 1B length, 2B CRC16, total 5B. */
+#define TLV_FIXED_SIZE     5
+
+/* TLV packet Minimum size is fixed bytes + 1 byte data */
+#define TLV_MIN_SIZE       (TLV_FIXED_SIZE+1)
+
+
+/* Tag definition */
+enum
+{
+    TAG_ACK=1,
+    TAG_SN,
+    TAG_TEMP,
+    TAG_TIME,
+};
+
+#define TLV_BUFSIZE        256
+
+#define TLV_FLAG_TX        1<<0 /* This TLV message need to be sent by socket    */
+#define TLV_FLAG_DB        1<<1 /* This TLV message need to be saved in database */
+typedef struct tlv_buf_s 
+{
+    uint8_t                flag; /* TLV message flags */
+    char                   buf[TLV_BUFSIZE];
+    int                    len;  /* data length */
+    int                    size; /* buffer size */
+} tlv_buf_t;  
+
+/* Packet TLV message for server reply ACK message: ACK(ack=1)/NAK(ack=0) */
+#define ACK         1
+#define NAK         0
+int packtlv_ack (char *buf, int size, int ack);
+
+/* Packet TLV message for SN */
+int packtlv_sn  (char *buf, int size, char *sn);
+
+/* Packet TLV message for temperature */
+int packtlv_temp(char *buf, int size, uint16_t temp);
+
+/* Packet TLV message for date time */
+int packtlv_time(char *buf, int size, struct tm *tm);
+
+/* Packet 3 TLV message together: with SN, temperature, date&time */
+int packtlv_msg(tlv_buf_t *tlv, char *sn, uint16_t temp, struct tm *tm);
+
+/* print buf data in hex and string mode  */
+void dump_buf(char *data, int len);
+
+#endif   /* ----- #ifndef _TLV_PACK_H_  ----- */
+
diff --git a/prj1_tlv/tlv_client.c b/prj1_tlv/tlv_client.c
index 4f00ac2..98c392d 100644
--- a/prj1_tlv/tlv_client.c
+++ b/prj1_tlv/tlv_client.c
@@ -19,10 +19,20 @@
 
 #include "logger.h"
 #include "proc.h"
+#include "ds18b20.h"
+#include "socket.h"
+#include "tlv_pack.h"
 
 #define PROG_VERSION     "1.0.0"
+#define RPI_SN           "RPI00001"
 
 #define DEF_LOG_FILE     "tlv_client.log"
+
+#define DEF_ACK_TIMEOUT  2  /* wait for ACK timeout value */
+#define DEF_RETRYTIMES   3  /* receive ACK timeout or get NAK, retry to send times */
+int socket_send_tlv_pack(socket_t *sock, tlv_buf_t *tlv, int timeout, int retry_times);
+
+int packtlv_msg(tlv_buf_t *tlv, char *sn, uint16_t temp, struct tm *tm);
 
 static void banner(void)
 {
@@ -38,6 +48,7 @@
     printf("This program used to connect to server and send RPi's temperature by TLV protocal.\n");
 
     printf("\nMandatory arguments to long options are mandatory for short options too:\n");
+    printf(" -H[Host    ]  Specify host server address and port, foramt as \"127.0.0.1:9000\"\n");
     printf(" -d[debug   ]  Running in debug mode\n");
     printf(" -l[level   ]  Set the log level as [0..%d]\n", LOG_LEVEL_MAX-1); 
     printf(" -h[help    ]  Display this help information\n"); 
@@ -52,17 +63,27 @@
 { 
     int                   opt; 
     int                   i = 0; 
-    //int                   rv = 0; 
+    int                   rv = 0; 
     int                   debug = 0;
 
     char                  pid_file[64] = { 0 }; /* The file used to record the PID */
     const char           *progname=NULL;
 
+    char                 *host = "192.168.2.110:10086";
+    //char                 *host = "baidu.com:10086";
     int                   log_level = LOG_LEVEL_NRML;
     char                 *log_file = DEF_LOG_FILE;
+
     logger_t              logger;
+    socket_t              sock;
+    tlv_buf_t             tlv;
+
+    uint16_t              temp;
+    struct                tm *tm;
+    time_t                cur_time, last_time = 0;
 
     struct option long_options[] = { 
+        {"Host", required_argument, NULL, 'H'}, 
         {"debug", no_argument, NULL, 'd'}, 
         {"level", required_argument, NULL, 'l'}, 
         {"version", no_argument, NULL, 'v'}, 
@@ -70,15 +91,19 @@
         {NULL, 0, NULL, 0}
     };
 
+    memset(&sock, 0, sizeof(sock));
     memset(&logger, 0, sizeof(logger));
 
     progname = basename(argv[0]); /* get program name */
 
     /* parser the command line parameters */ 
-    while ((opt = getopt_long(argc, argv, "c:dl:vh", long_options, NULL)) != -1) 
+    while ((opt = getopt_long(argc, argv, "H:dl:vh", long_options, NULL)) != -1) 
     { 
         switch (opt) 
         {
+            case 'H':
+                host=optarg;
+                break;
 
             case 'd': /* set debug running */
                 debug = 1;
@@ -105,8 +130,18 @@
         } 
     }
 
+#if 1
+    if( !host )
+    {
+        printf("ERROR: No argument specify host server address and port, please refer to usage\n");
+    //    return 1;
+    }
+
+
+#endif
+
     /* check program already running or not, if already running then exit, or set running as daemon */
-    snprintf(pid_file, sizeof(pid_file), "/var/run/%s.pid", progname);
+    snprintf(pid_file, sizeof(pid_file), "/tmp/%s.pid", progname);
     if( !debug )
     {
         if( check_daemon_running(pid_file) )
@@ -114,13 +149,17 @@
             printf("Programe already running, exit now.\n");
             return -1;
         }
+
+        daemon(1, 1);
     }
+
+    record_daemon_pid(pid_file);
 
     /* initial and open logger system */
     if( logger_init(&logger, log_file, log_level, 512)<0 || logger_open()<0 )
     {
         printf("ERROR: Initialise logger system failure\n");
-        return -1;
+        return 2;
     }
 
     /* install signal proc handler */
@@ -128,15 +167,166 @@
 
     log_nrml("Program start running\n");
 
+#if 0
+    if( initial_db(&sqldb, db_file) < 0)
+    {
+        log_err("initialise sqlite database failure\n");
+        return 3;
+    }
+#endif
+
+    last_time = 0;
+
     /* g_signal.stop defined in proc.c, and will be set when catch stop signal */
     while( !g_signal.stop )
     {
-        log_dbg("Program still running\n");
-        sleep(3);
+        time(&cur_time);
+        if( cur_time-last_time > 3)
+        {
+            log_nrml("start sample temperature now.\n");
+            rv = 0;
+            temp = 0x1122;
+            //rv = ds18b20_get_temperature(&temp);
+            if( 0 == rv )
+            {
+                /* convert time_t to tm format  */ 
+                tm=localtime(&cur_time);
+                last_time = cur_time;
+
+                packtlv_msg(&tlv, RPI_SN, temp, tm);
+                logger_dump(LOG_LEVEL_DEBUG, tlv.buf, tlv.len);
+
+                /* this message need to be transmit and saved in database if send failure */
+                tlv.flag = TLV_FLAG_TX | TLV_FLAG_DB;
+            }
+            else
+            {
+                log_err("DS18B20 get temperature failure\n");
+            }
+        }
+
+        if( SOCK_STAT_CONNECTED != sock.status )
+        {
+            if( socket_connect(&sock, -1, host, MODE_NONBLOCK) < 0)
+            {
+                log_err("connect to server [%s:%d] failure\n", sock.raddr, sock.rport);
+            }
+        }
+
+        if( (tlv.flag&TLV_FLAG_TX) && SOCK_STAT_CONNECTED==sock.status )
+        {
+            if(0 == socket_send_tlv_pack(&sock, &tlv, DEF_ACK_TIMEOUT, DEF_RETRYTIMES) )
+            {
+                tlv.flag = 0;
+            }
+        }
+
+#if 0
+        /* need to send TLV packet in database now  */ 
+        for(i=0; i<5; i++)
+        {
+            /* get a TLV record from DB and send it by socket  */ 
+            /* rv<0: Erorr  rv=0: No record  >0: record count  */
+            rv = get_db_tlv_pack(sqldb, tlv, size) ; 
+            if( rv <= 0)
+                break;
+
+            if( 0 == socket_send_tlv_pack() ) 
+            {
+                /* delete the record from DB */
+                del_db_tlv_pack();
+            }
+        }
+
+SAVE_DB:
+        if( tlv_buf.flag & TLV_FLAG_DB)
+        {
+            record_db_tlv(sqldb, tlv_buf, tlv_len);
+        }
+#endif
+
+        sleep(1);
     }
 
     logger_term();
 
+    //db_term();
+
     return 0;
 } 
 
+/*  Packet 3 TLV message together: with SN, temperature, date&time */ 
+int packtlv_msg(tlv_buf_t *tlv, char *sn, uint16_t temp, struct tm *tm)
+{
+    int               rv;
+
+    if( !tlv )
+    {
+        log_err("Invalid input arguments\n");
+        return -1;
+    }
+
+    memset(tlv->buf, 0, sizeof(tlv->buf)); /* clear data in buffer */
+    tlv->size = sizeof(tlv->buf); /* buffer free space size */
+    tlv->len = 0; /* buffer data length */
+
+    if( sn )
+    {
+        rv = packtlv_sn(&tlv->buf[tlv->len], tlv->size, sn);
+        if( rv > 0 )
+        {
+            tlv->len += rv;
+            tlv->size -= rv;
+        }
+    }
+
+    if( temp )
+    {
+        rv = packtlv_temp(&tlv->buf[tlv->len], tlv->size, temp);
+        if( rv > 0 )
+        {
+            tlv->len += rv;
+            tlv->size -= rv;
+        }
+    }
+
+    if( tm )
+    {
+        rv = packtlv_time(&tlv->buf[tlv->len], tlv->size, tm);
+        if( rv > 0 )
+        {
+            tlv->len += rv;
+            tlv->size -= rv;
+        }
+    }
+
+    return 0;
+}
+
+int socket_send_tlv_pack(socket_t *sock, tlv_buf_t *tlv, int timeout, int retry_times)
+{
+    int            i;
+    int            rv = 0; 
+    char           buf[128];
+
+    log_info("start to send tlv packet from socket now\n");
+
+    for(i=0; i<retry_times; i++)
+    { 
+        if( (rv=socket_send(sock, tlv->buf, tlv->len)) < 0 )
+        {
+            log_err("send tlv packet failure, rv=%d\n", rv);
+            return -1; 
+        }
+
+        if( (rv=socket_recv(sock, buf, sizeof(buf), timeout)) < 0 )
+        {
+            log_err("read ACK from server failure, rv=%d\n");
+            return -2;
+        }
+    }
+
+    return 0;
+}
+
+
diff --git a/prj1_tlv/tlv_client.log b/prj1_tlv/tlv_client.log
new file mode 100644
index 0000000..e1210e0
--- /dev/null
+++ b/prj1_tlv/tlv_client.log
@@ -0,0 +1,25 @@
+Initialize log "tlv_client.log" on level [N] size [512] KiB, log system version 1.0.0
+ [ Date ]    [ Time ]   [ Level ]  [ File/Line ]  [ Message ]
+-------------------------------------------------------------
+[2020-04-28 20:52:49.352] <N> <proc.c:0059> : Install default signal handler.
+[2020-04-28 20:52:49.352] <N> <tlv_client.c:0164> : Program start running
+[2020-04-28 20:52:49.352] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:52:53.353] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:52:57.353] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:01.353] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:05.354] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:09.354] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:13.354] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:17.355] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:21.355] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:25.356] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:29.356] <N> <tlv_client.c:0182> : start sample temperature now.
+[2020-04-28 20:53:30.815] <W> <proc.c:0038> : SIGTERM - stopping
+
+Terminate log "tlv_client.log" on level [N] size [512] KiB, log system version 1.0.0
+ [ Date ]    [ Time ]   [ Level ]  [ File/Line ]  [ Message ]
+-------------------------------------------------------------
+
+
+
+

--
Gitblit v1.9.1