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�_rug (cڡ * pid_f�e ); -36 +34 ��_d�m�_rug (cڡ * pid_f�e ); -37 +35 �t_d�m�_rug (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