UnitProtocol.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. /*
  2. * UnitProtocol.c
  3. *
  4. * Created on: 2019年11月28日
  5. * Author: yt
  6. */
  7. #include <time.h>
  8. #include <sys/time.h>
  9. #include <string.h>
  10. bool set_systime(int year, int mon, int day, int hour, int min, int sec)
  11. {
  12. int i;
  13. time_t t;
  14. struct tm _tm;
  15. struct timeval tv;
  16. _tm.tm_year = year-1900;
  17. _tm.tm_mon = mon-1;
  18. _tm.tm_mday = day;
  19. _tm.tm_hour = hour;
  20. _tm.tm_min = min;
  21. _tm.tm_sec = sec;
  22. t = mktime(&_tm);
  23. tv.tv_sec = t;
  24. tv.tv_usec = 0;
  25. if(settimeofday(&tv,(struct timezone *)0)<0){
  26. return false;
  27. }
  28. system("hwclock -w");
  29. chk_time();
  30. for(i=0;i<16;i++){
  31. if(unitShm->ThreadEnabled[i]==0x01)
  32. unitShm->ThreadUpdatetime[i] = unitShm->dataTime.Time_C;
  33. }
  34. return true;
  35. }
  36. bool chk_frame(unsigned char *data, int len)
  37. {
  38. int i,crc = 0;
  39. unsigned short dataLen;
  40. if((len>=14)&&((data[0]&0xff)==0x7e)&&((data[1]&0xff)==0x10)
  41. &&((data[len-1]&0xff)==0xe7)){
  42. for(i=1;i<(len-2);i++)
  43. crc += (data[i]&0xff);
  44. // printf("chkframe: crc %02x-%02x\n",(crc&0xff),data[len-2]&0xff);
  45. if((data[len-2]&0xff)==(crc&0xff)){
  46. dataLen = ((data[2]&0x00ff)<<8)|(data[3]&0x00ff);
  47. if(len==(dataLen+14))
  48. return true;
  49. }
  50. }
  51. return false;
  52. }
  53. void mkCommCmd(unsigned char *cmd, unsigned char *data, unsigned char cmdCode, int dataLen)
  54. {
  55. int cur=0,crc=0;
  56. int i;
  57. cmd[cur++] = 0x7e;
  58. cmd[cur++] = 0x10;
  59. cmd[cur++] = ((dataLen>>8)&0xff);
  60. cmd[cur++] = dataLen&0xff;
  61. cmd[cur++] = cmdCode;
  62. cmd[cur++] = (((unitShm->dataTime.Year/1000)&0x0f)<<4)
  63. |(((unitShm->dataTime.Year%1000)/100)&0x0f);
  64. cmd[cur++] = ((((unitShm->dataTime.Year%100)/10)&0x0f)<<4)
  65. |((unitShm->dataTime.Year%10)&0x0f);
  66. cmd[cur++] = (((unitShm->dataTime.Month/10)&0x0f)<<4)
  67. |((unitShm->dataTime.Month%10)&0x0f);
  68. cmd[cur++] = (((unitShm->dataTime.Day/10)&0x0f)<<4)
  69. |((unitShm->dataTime.Day%10)&0x0f);
  70. cmd[cur++] = (((unitShm->dataTime.Hour/10)&0x0f)<<4)
  71. |((unitShm->dataTime.Hour%10)&0x0f);
  72. cmd[cur++] = (((unitShm->dataTime.Minute/10)&0x0f)<<4)
  73. |((unitShm->dataTime.Minute%10)&0x0f);
  74. cmd[cur++] = (((unitShm->dataTime.Second/10)&0x0f)<<4)
  75. |((unitShm->dataTime.Second%10)&0x0f);
  76. for(i=0;i<dataLen;i++)
  77. cmd[cur++] = data[i];
  78. cmd[cur] = 0x00;
  79. cmd[cur+1] = 0xe7;
  80. for(i=1;i<cur;i++)
  81. crc += cmd[i];
  82. cmd[cur] = crc&0xff;
  83. }
  84. int mkHeartBeatCmd(unsigned char *cmd)
  85. {
  86. int datalen = 0;
  87. unsigned char data[256];
  88. unsigned char CMD = 0x01;
  89. mkCommCmd(cmd,data,CMD,datalen);
  90. return datalen+14;
  91. }
  92. int mkDeviceIDQryRtn(unsigned char *cmd)
  93. {
  94. int i,cur=0;
  95. unsigned char data[256];
  96. unsigned char CMD = 0x83;
  97. int devidLen = (int)(strlen(unitShm->UnitId));
  98. int datalen = devidLen+4;
  99. data[cur++] = 0x01;
  100. data[cur++] = (devidLen>>8)&0xff;
  101. data[cur++] = devidLen&0xff;
  102. for(i=0;i<devidLen;i++)
  103. data[cur++] = unitShm->UnitId[i];
  104. data[cur] = 0x00;
  105. mkCommCmd(cmd,data,CMD,datalen);
  106. return datalen+14;
  107. }
  108. int mkDeviceIDSetRtn(unsigned char *inData, int inLen, unsigned char *cmd)
  109. {
  110. int i=0;
  111. unsigned char data[256];
  112. unsigned char CMD = 0x83;
  113. int datalen = 1;
  114. unsigned short devidLen = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  115. if((inLen>=(devidLen+18))&&(devidLen<=32)){
  116. for(i=0;i<devidLen;i++)
  117. unitShm->UnitId[i] = inData[15+i];
  118. if(devidLen<32)
  119. unitShm->UnitId[devidLen] = 0x00;
  120. unitShm->UnSavedFalg[OFFSET_UNITID] = 0x01;
  121. data[0] = 0x01;
  122. mkCommCmd(cmd,data,CMD,datalen);
  123. return datalen+14;
  124. }
  125. return 0;
  126. }
  127. int mkTimeSetRtn(unsigned char *inData, int inLen, unsigned char *cmd)
  128. {
  129. int i=0, cur=0;
  130. unsigned char data[256];
  131. unsigned char CMD = 0x83;
  132. int datalen = 0;
  133. bool idchk = true;
  134. unsigned short devidLen = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  135. if((inLen==(devidLen+25))&&(devidLen>0)&&(devidLen<=32)){
  136. for(i=0;i<devidLen;i++){
  137. if(unitShm->UnitId[i]!=inData[15+i]){
  138. idchk = false;
  139. break;
  140. }
  141. }
  142. if(idchk){
  143. int year = ((inData[16+devidLen]>>4)&0x0f)*1000
  144. +(inData[16+devidLen]&0x0f)*100
  145. +((inData[17+devidLen]>>4)&0x0f)*10
  146. +(inData[17+devidLen]&0x0f);
  147. int mon = ((inData[18+devidLen]>>4)&0x0f)*10
  148. +(inData[18+devidLen]&0x0f);
  149. int day = ((inData[19+devidLen]>>4)&0x0f)*10
  150. +(inData[19+devidLen]&0x0f);
  151. int hour = ((inData[20+devidLen]>>4)&0x0f)*10
  152. +(inData[20+devidLen]&0x0f);
  153. int min = ((inData[21+devidLen]>>4)&0x0f)*10
  154. +(inData[21+devidLen]&0x0f);
  155. int sec = ((inData[22+devidLen]>>4)&0x0f)*10
  156. +(inData[22+devidLen]&0x0f);
  157. if(set_systime(year,mon,day,hour,min,sec)){
  158. datalen = devidLen+4;
  159. data[cur++] = 0x0b;
  160. data[cur++] = inData[13];
  161. data[cur++] = inData[14];
  162. for(i=0;i<devidLen;i++)
  163. data[cur++] = inData[15+i];
  164. data[cur] = 0x00;
  165. mkCommCmd(cmd,data,CMD,datalen);
  166. return datalen+14;
  167. }
  168. }
  169. }
  170. return 0;
  171. }
  172. int mkDevResetRtn(unsigned char *inData, int inLen, unsigned char *cmd)
  173. {
  174. int i=0, cur=0;
  175. unsigned char data[256];
  176. unsigned char CMD = 0x83;
  177. int datalen = 0;
  178. bool idchk = true;
  179. unsigned short devidLen = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  180. if((inLen==(devidLen+19))&&(devidLen>0)&&(devidLen<=32)){
  181. for(i=0;i<devidLen;i++){
  182. if(unitShm->UnitId[i]!=inData[15+i]){
  183. idchk = false;
  184. break;
  185. }
  186. }
  187. if(idchk){
  188. if((inData[17+devidLen]==0x01)||(inData[17+devidLen]==0x00)){
  189. datalen = devidLen+4;
  190. data[cur++] = 0x0b;
  191. data[cur++] = inData[13];
  192. data[cur++] = inData[14];
  193. for(i=0;i<devidLen;i++)
  194. data[cur++] = inData[15+i];
  195. data[cur] = 0x00;
  196. mkCommCmd(cmd,data,CMD,datalen);
  197. if(inData[17+devidLen]==0x01)
  198. unitShm->UnSavedFalg[65535] = 0x01;
  199. else
  200. unitShm->UnSavedFalg[65534] = 0x01;
  201. return datalen+14;
  202. }
  203. }
  204. }
  205. return 0;
  206. }
  207. int mkServerQryRtn(unsigned char *inData, int inLen, unsigned char *cmd)
  208. {
  209. int i=0, cur=0;
  210. unsigned char data[256];
  211. unsigned char CMD = 0x83;
  212. int datalen = 0;
  213. bool idchk = true;
  214. unsigned short devidLen = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  215. if((inLen==(devidLen+18))&&(devidLen>0)&&(devidLen<=32)){
  216. for(i=0;i<devidLen;i++){
  217. if(unitShm->UnitId[i]!=inData[15+i]){
  218. idchk = false;
  219. break;
  220. }
  221. }
  222. if(idchk){
  223. datalen = devidLen+10;
  224. data[cur++] = 0x15;
  225. data[cur++] = (devidLen>>8)&0xff;
  226. data[cur++] = devidLen&0xff;
  227. for(i=0;i<devidLen;i++)
  228. data[cur++] = unitShm->UnitId[i];
  229. data[cur++] = 0x00;
  230. data[cur++] = (unitShm->ServerIP>>24)&0xff;
  231. data[cur++] = (unitShm->ServerIP>>16)&0xff;
  232. data[cur++] = (unitShm->ServerIP>>8)&0xff;
  233. data[cur++] = (unitShm->ServerIP&0xff);
  234. data[cur++] = (unitShm->ServerPort>>8)&0xff;
  235. data[cur++] = (unitShm->ServerPort&0xff);
  236. mkCommCmd(cmd,data,CMD,datalen);
  237. return datalen+14;
  238. }
  239. }
  240. return 0;
  241. }
  242. int mkServerSetRtn(unsigned char *inData, int inLen, unsigned char *cmd)
  243. {
  244. int i=0, cur=0;
  245. unsigned char data[256];
  246. unsigned char CMD = 0x83;
  247. int datalen = 0;
  248. bool idchk = true;
  249. unsigned short devidLen = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  250. if((inLen==(devidLen+24))&&(devidLen>0)&&(devidLen<=32)){
  251. for(i=0;i<devidLen;i++){
  252. if(unitShm->UnitId[i]!=inData[15+i]){
  253. idchk = false;
  254. break;
  255. }
  256. }
  257. if(idchk){
  258. unitShm->ServerIP = ((inData[17+devidLen]&0x000000ff)<<24)
  259. |((inData[18+devidLen]&0x000000ff)<<16)
  260. |((inData[19+devidLen]&0x000000ff)<<8)
  261. |(inData[20+devidLen]&0x000000ff);
  262. unitShm->ServerPort = ((inData[21+devidLen]&0x000000ff)<<8)
  263. |(inData[22+devidLen]&0x000000ff);
  264. unitShm->UnSavedFalg[OFFSET_SERVERSET] = 0x01;
  265. datalen = devidLen+4;
  266. data[cur++] = 0x16;
  267. data[cur++] = (devidLen>>8)&0xff;
  268. data[cur++] = devidLen&0xff;
  269. for(i=0;i<devidLen;i++)
  270. data[cur++] = unitShm->UnitId[i];
  271. data[cur++] = 0x00;
  272. mkCommCmd(cmd,data,CMD,datalen);
  273. return datalen+14;
  274. }
  275. }
  276. return 0;
  277. }
  278. int mk_ReportCmd(int idx, unsigned char *cmd)
  279. {
  280. union FC fc;
  281. int i=0, cur=0;
  282. unsigned char data[256];
  283. unsigned char CMD = 0x03;
  284. struct tm *tm_time;
  285. int year,mon,day,hour,min,sec;
  286. int datalen = 0;
  287. int devidLen = 0;
  288. float x = 1.0;
  289. unsigned short pno = 0;
  290. if(idx>2047)
  291. return 0;
  292. pno = unitShm2->report[idx].Pno;
  293. // if(unitShm2->spoint[pno].SensorType=='L')
  294. // x = 0.001;
  295. printf("report: %s %d\n",unitShm2->spoint[pno].ServiceNo,unitShm2->report[idx].Port);
  296. devidLen = (int)(strlen(unitShm2->spoint[pno].ServiceNo))+1;
  297. if(devidLen==0)
  298. return 0;
  299. datalen = devidLen+20;
  300. data[cur++] = 0x41;
  301. data[cur++] = (idx>>8)&0xff;
  302. data[cur++] = idx&0xff;
  303. data[cur++] = (devidLen>>8)&0xff;
  304. data[cur++] = devidLen&0xff;
  305. for(i=0;i<(devidLen-1);i++)
  306. data[cur++] = unitShm2->spoint[pno].ServiceNo[i];
  307. data[cur++] = 0x30+unitShm2->report[idx].Port;
  308. data[cur++] = 0x00;
  309. data[cur++] = 0x00;
  310. data[cur++] = unitShm2->report[idx].Type;
  311. data[cur++] = unitShm2->report[idx].Status;
  312. fc.f = unitShm2->report[idx].RealtimeValue * x;
  313. data[cur++] = fc.c[3];
  314. data[cur++] = fc.c[2];
  315. data[cur++] = fc.c[1];
  316. data[cur++] = fc.c[0];
  317. tm_time = gmtime(&(unitShm2->report[idx].UpdateTime));
  318. year = 1900+tm_time->tm_year;
  319. mon = 1+tm_time->tm_mon;
  320. day = tm_time->tm_mday;
  321. hour = tm_time->tm_hour;
  322. min = tm_time->tm_min;
  323. sec = tm_time->tm_sec;
  324. data[cur++] = (((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f);
  325. data[cur++] = ((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f);
  326. data[cur++] = (((mon/10)&0x0f)<<4)|((mon%10)&0x0f);
  327. data[cur++] = (((day/10)&0x0f)<<4)|((day%10)&0x0f);
  328. data[cur++] = (((hour/10)&0x0f)<<4)|((hour%10)&0x0f);
  329. data[cur++] = (((min/10)&0x0f)<<4)|((min%10)&0x0f);
  330. data[cur++] = (((sec/10)&0x0f)<<4)|((sec%10)&0x0f);
  331. mkCommCmd(cmd,data,CMD,datalen);
  332. return datalen+14;
  333. }
  334. int mk_RealdataCmd(int idx, unsigned char *cmd)
  335. {
  336. union FC fc;
  337. int i=0, cur=0;
  338. int year,mon,day,hour,min,sec;
  339. unsigned char data[256];
  340. unsigned char CMD = 0x03;
  341. int datalen = 0;
  342. int devidLen = 0;
  343. struct tm *tm_time;
  344. float x = 1.0;
  345. // if(((idx>=0)&&(idx<(int)unitShm->UnSavedFalg[OFFSET_MAXNUM+0]))
  346. // ||((idx>=256)&&(idx<(256+(int)unitShm->UnSavedFalg[OFFSET_MAXNUM+1])))
  347. // ||((idx>=512)&&(idx<(512+(int)unitShm->UnSavedFalg[OFFSET_MAXNUM+2])))
  348. // ||((idx>=768)&&(idx<(768+(int)unitShm->UnSavedFalg[OFFSET_MAXNUM+3]))))
  349. {
  350. // if(unitShm2->spoint[idx].SensorType=='L')
  351. // x = 0.001;
  352. devidLen = (int)(strlen(unitShm2->spoint[idx].ServiceNo))+1;
  353. if(devidLen==0)
  354. return 0;
  355. datalen = devidLen+18;
  356. data[cur++] = 0x43;
  357. data[cur++] = (devidLen>>8)&0xff;
  358. data[cur++] = devidLen&0xff;
  359. for(i=0;i<(devidLen-1);i++)
  360. data[cur++] = unitShm2->spoint[idx].ServiceNo[i];
  361. data[cur++] = 0x31;
  362. data[cur++] = 0x00;
  363. data[cur++] = 0x00;
  364. data[cur++] = 0x00;
  365. data[cur++] = 0x00;
  366. fc.f = unitShm2->spoint[idx].CurrentLeak * x;
  367. data[cur++] = fc.c[3];
  368. data[cur++] = fc.c[2];
  369. data[cur++] = fc.c[1];
  370. data[cur++] = fc.c[0];
  371. tm_time = gmtime(&(unitShm2->spoint[idx].UpdateTime));
  372. year = 1900+tm_time->tm_year;
  373. mon = 1+tm_time->tm_mon;
  374. day = tm_time->tm_mday;
  375. hour = tm_time->tm_hour;
  376. min = tm_time->tm_min;
  377. sec = tm_time->tm_sec;
  378. data[cur++] = (((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f);
  379. data[cur++] = ((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f);
  380. data[cur++] = (((mon/10)&0x0f)<<4)|((mon%10)&0x0f);
  381. data[cur++] = (((day/10)&0x0f)<<4)|((day%10)&0x0f);
  382. data[cur++] = (((hour/10)&0x0f)<<4)|((hour%10)&0x0f);
  383. data[cur++] = (((min/10)&0x0f)<<4)|((min%10)&0x0f);
  384. data[cur++] = (((sec/10)&0x0f)<<4)|((sec%10)&0x0f);
  385. mkCommCmd(cmd,data,CMD,datalen);
  386. return datalen+14;
  387. }
  388. return 0;
  389. }
  390. int mk_RecordCmd(int d,int n,int m, unsigned char *cmd)
  391. {
  392. union FC fc;
  393. int i=0, cur=0;
  394. unsigned char data[256];
  395. unsigned char CMD = 0x03;
  396. struct tm *tm_time;
  397. int year,mon,day,hour,min,sec;
  398. int datalen = 0;
  399. int devidLen = 0;
  400. // int d = (idx>>15)&0x01;
  401. // int n = (idx>>10)&0x1f;
  402. // int m = idx&0x03ff;
  403. float x = 1.0;
  404. // if(idx>65535)
  405. // return 0;
  406. // if(unitShm2->spoint[m].SensorType=='L')
  407. // x = 0.001;
  408. devidLen = (int)(strlen(unitShm2->spoint[m].ServiceNo))+1;
  409. if(devidLen==0)
  410. return 0;
  411. datalen = devidLen+46;
  412. data[cur++] = 0x42;
  413. data[cur++] = (m>>8)&0xff;
  414. data[cur++] = m&0xff;
  415. data[cur++] = (devidLen>>8)&0xff;
  416. data[cur++] = devidLen&0xff;
  417. for(i=0;i<(devidLen-1);i++)
  418. data[cur++] = unitShm2->spoint[m].ServiceNo[i];
  419. data[cur++] = 0x31;
  420. data[cur++] = 0x00;
  421. data[cur++] = 0x00;
  422. data[cur++] = unitShm2->record[d][n][m].Type;
  423. data[cur++] = unitShm2->record[d][n][m].IoValue;
  424. fc.f = unitShm2->record[d][n][m].RealtimeValue * x;
  425. data[cur++] = fc.c[3];
  426. data[cur++] = fc.c[2];
  427. data[cur++] = fc.c[1];
  428. data[cur++] = fc.c[0];
  429. fc.f = unitShm2->record[d][n][m].AveValue * x;
  430. data[cur++] = fc.c[3];
  431. data[cur++] = fc.c[2];
  432. data[cur++] = fc.c[1];
  433. data[cur++] = fc.c[0];
  434. tm_time = gmtime(&(unitShm2->record[d][n][m].UpdateTime));
  435. year = 1900+tm_time->tm_year;
  436. mon = 1+tm_time->tm_mon;
  437. day = tm_time->tm_mday;
  438. hour = tm_time->tm_hour;
  439. min = tm_time->tm_min;
  440. sec = tm_time->tm_sec;
  441. // if(hour!=n)
  442. // return 0;
  443. data[cur++] = (((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f);
  444. data[cur++] = ((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f);
  445. data[cur++] = (((mon/10)&0x0f)<<4)|((mon%10)&0x0f);
  446. data[cur++] = (((day/10)&0x0f)<<4)|((day%10)&0x0f);
  447. data[cur++] = (((hour/10)&0x0f)<<4)|((hour%10)&0x0f);
  448. data[cur++] = (((min/10)&0x0f)<<4)|((min%10)&0x0f);
  449. data[cur++] = (((sec/10)&0x0f)<<4)|((sec%10)&0x0f);
  450. fc.f = unitShm2->record[d][n][m].MaxValue * x;
  451. data[cur++] = fc.c[3];
  452. data[cur++] = fc.c[2];
  453. data[cur++] = fc.c[1];
  454. data[cur++] = fc.c[0];
  455. tm_time = gmtime(&(unitShm2->record[d][n][m].MaxTime));
  456. year = 1900+tm_time->tm_year;
  457. mon = 1+tm_time->tm_mon;
  458. day = tm_time->tm_mday;
  459. hour = tm_time->tm_hour;
  460. min = tm_time->tm_min;
  461. sec = tm_time->tm_sec;
  462. if(hour!=n)
  463. return 0;
  464. data[cur++] = (((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f);
  465. data[cur++] = ((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f);
  466. data[cur++] = (((mon/10)&0x0f)<<4)|((mon%10)&0x0f);
  467. data[cur++] = (((day/10)&0x0f)<<4)|((day%10)&0x0f);
  468. data[cur++] = (((hour/10)&0x0f)<<4)|((hour%10)&0x0f);
  469. data[cur++] = (((min/10)&0x0f)<<4)|((min%10)&0x0f);
  470. data[cur++] = (((sec/10)&0x0f)<<4)|((sec%10)&0x0f);
  471. fc.f = unitShm2->record[d][n][m].MinValue * x;
  472. data[cur++] = fc.c[3];
  473. data[cur++] = fc.c[2];
  474. data[cur++] = fc.c[1];
  475. data[cur++] = fc.c[0];
  476. tm_time = gmtime(&(unitShm2->record[d][n][m].MinTime));
  477. year = 1900+tm_time->tm_year;
  478. mon = 1+tm_time->tm_mon;
  479. day = tm_time->tm_mday;
  480. hour = tm_time->tm_hour;
  481. min = tm_time->tm_min;
  482. sec = tm_time->tm_sec;
  483. if(hour!=n)
  484. return 0;
  485. data[cur++] = (((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f);
  486. data[cur++] = ((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f);
  487. data[cur++] = (((mon/10)&0x0f)<<4)|((mon%10)&0x0f);
  488. data[cur++] = (((day/10)&0x0f)<<4)|((day%10)&0x0f);
  489. data[cur++] = (((hour/10)&0x0f)<<4)|((hour%10)&0x0f);
  490. data[cur++] = (((min/10)&0x0f)<<4)|((min%10)&0x0f);
  491. data[cur++] = (((sec/10)&0x0f)<<4)|((sec%10)&0x0f);
  492. mkCommCmd(cmd,data,CMD,datalen);
  493. return datalen+14;
  494. }
  495. int chk_protocol(unsigned char *inData, int inLen, unsigned char *outData)
  496. {
  497. if(chk_frame(inData,inLen)){
  498. if(inData[4]==0x81)
  499. return 0;
  500. else if((inLen>=14)&&(inData[4]==0x83)){
  501. switch(inData[12]){
  502. case 0x01:
  503. return mkDeviceIDQryRtn(outData);
  504. break;
  505. case 0x02:
  506. return mkDeviceIDSetRtn(inData,inLen,outData);
  507. break;
  508. case 0x0b:
  509. return mkTimeSetRtn(inData,inLen,outData);
  510. break;
  511. case 0x0c:
  512. return mkDevResetRtn(inData,inLen,outData);
  513. break;
  514. case 0x15:
  515. return mkServerQryRtn(inData,inLen,outData);
  516. break;
  517. case 0x16:
  518. return mkServerSetRtn(inData,inLen,outData);
  519. break;
  520. case 0x40:
  521. return 0;
  522. break;
  523. case 0x41:
  524. {
  525. int idx = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  526. unitShm2->report[idx].Send = 0x01;
  527. unitShm2->report[idx].UnSaved = 0x01;
  528. return 0;
  529. }
  530. break;
  531. case 0x42:
  532. {
  533. int idx = ((inData[13]&0x00ff)<<8)|(inData[14]&0x00ff);
  534. int d = (idx>>15)&0x01;
  535. int h = (idx>>10)&0x1f;
  536. int i = idx&0x03ff;
  537. unitShm2->record[d][h][i].Send = 0x01;
  538. unitShm2->record[d][h][i].UnSaved = 0x01;
  539. return 0;
  540. }
  541. break;
  542. default:break;
  543. }
  544. }
  545. }
  546. return 0;
  547. }
  548. int mkDeviceRegistCmd(unsigned char *cmd){
  549. int i=0, cur=0;
  550. unsigned char data[256];
  551. unsigned char CMD = 0x03;
  552. int datalen = 0;
  553. int IEMILen = strlen(unitShm->IMEI);
  554. int IMSILen = strlen(unitShm->IMSI);
  555. int DevLen = strlen(unitShm->UnitId);
  556. datalen = IEMILen+IMSILen+DevLen+11;
  557. data[cur++] = 0x40;
  558. data[cur++] = (IEMILen>>8)&0xff;
  559. data[cur++] = (IEMILen&0xff);
  560. for(i=0;i<IEMILen;i++)
  561. data[cur++] = unitShm->IMEI[i]&0xff;
  562. data[cur++] = 0x00;
  563. data[cur++] = (IMSILen>>8)&0xff;
  564. data[cur++] = (IMSILen&0xff);
  565. for(i=0;i<IMSILen;i++)
  566. data[cur++] = unitShm->IMSI[i]&0xff;
  567. data[cur++] = 0x00;
  568. data[cur++] = (DevLen>>8)&0xff;
  569. data[cur++] = (DevLen&0xff);
  570. for(i=0;i<DevLen;i++)
  571. data[cur++] = unitShm->UnitId[i]&0xff;
  572. data[cur++] = 0x00;
  573. data[cur++] = unitShm->UnSavedFalg[OFFSET_CSQ];
  574. mkCommCmd(cmd,data,CMD,datalen);
  575. return datalen+14;
  576. }