userverthread.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. #include "userverthread.h"
  2. #include <time.h>
  3. #include <sys/time.h>
  4. #include "yt_unit_shm.h"
  5. extern YT_UNIT_SHM *ytShm;
  6. UServerThread::UServerThread(QObject *parent, QString ip, quint16 port) :
  7. QThread(parent)
  8. {
  9. ServerIP = ip;
  10. ServerPort = port;
  11. CmdList.clear();
  12. }
  13. void UServerThread::mkCommCmd(unsigned char *cmd, unsigned char *data, unsigned char cmdCode, int dataLen)
  14. {
  15. int cur=0,crc=0;
  16. int i;
  17. cmd[cur++] = 0x7e;
  18. cmd[cur++] = 0x01;
  19. cmd[cur++] = ((dataLen>>8)&0xff);
  20. cmd[cur++] = dataLen&0xff;
  21. cmd[cur++] = cmdCode;
  22. cmd[cur++] = 0x85;
  23. cmd[cur++] = 0x83;
  24. cmd[cur++] = 0x75;
  25. cmd[cur++] = 0x89;
  26. cmd[cur++] = 0x73;
  27. cmd[cur++] = 0x79;
  28. cmd[cur++] = 0x84;
  29. for(i=0;i<dataLen;i++)
  30. cmd[cur++] = data[i];
  31. cmd[cur] = 0x00;
  32. cmd[cur+1] = 0xe7;
  33. for(i=1;i<cur;i++)
  34. crc += cmd[i];
  35. cmd[cur] = crc&0xff;
  36. }
  37. int UServerThread::mkHeartBeatCmd(unsigned char *cmd)
  38. {
  39. int datalen = 0;
  40. unsigned char data[256];
  41. unsigned char CMD = 0x01;
  42. mkCommCmd(cmd,data,CMD,datalen);
  43. return datalen+14;
  44. }
  45. int UServerThread::mkDeviceRegistCmd(unsigned char *cmd)
  46. {
  47. int i=0, cur=0;
  48. unsigned char data[256];
  49. unsigned char CMD = 0x03;
  50. int datalen = 0;
  51. int IEMILen = strlen(ytShm->sysShm.USKYID);
  52. int IMSILen = strlen(ytShm->sysShm.USKYID);
  53. int DevLen = strlen(ytShm->sysShm.USKYID);
  54. datalen = IEMILen+IMSILen+DevLen+11;
  55. data[cur++] = 0x40;
  56. data[cur++] = (IEMILen>>8)&0xff;
  57. data[cur++] = (IEMILen&0xff);
  58. for(i=0;i<IEMILen;i++)
  59. data[cur++] = ytShm->sysShm.USKYID[i]&0xff;
  60. data[cur++] = 0x00;
  61. data[cur++] = (IMSILen>>8)&0xff;
  62. data[cur++] = (IMSILen&0xff);
  63. for(i=0;i<IMSILen;i++)
  64. data[cur++] = ytShm->sysShm.USKYID[i]&0xff;
  65. data[cur++] = 0x00;
  66. data[cur++] = (DevLen>>8)&0xff;
  67. data[cur++] = (DevLen&0xff);
  68. for(i=0;i<DevLen;i++)
  69. data[cur++] = ytShm->sysShm.USKYID[i]&0xff;
  70. data[cur++] = 0x00;
  71. data[cur++] = 0x00;
  72. mkCommCmd(cmd,data,CMD,datalen);
  73. return datalen+14;
  74. }
  75. bool UServerThread::chk_frame(QByteArray rtn)
  76. {
  77. int i,crc = 0;
  78. unsigned short dataLen;
  79. if((rtn.length()>=14)&&((rtn[0]&0xff)==0x7e)&&((rtn[1]&0xff)==0x10)
  80. &&((rtn[rtn.length()-1]&0xff)==0xe7)){
  81. for(i=1;i<(rtn.length()-2);i++)
  82. crc += (rtn[i]&0xff);
  83. if((rtn[rtn.length()-2]&0xff)==(crc&0xff)){
  84. dataLen = ((rtn[2]&0x00ff)<<8)|(rtn[3]&0x00ff);
  85. if(rtn.length()==(dataLen+14))
  86. return true;
  87. }
  88. }
  89. return false;
  90. }
  91. bool UServerThread::set_systime(int year, int mon, int day, int hour, int min, int sec)
  92. {
  93. int i;
  94. time_t t;
  95. struct tm _tm;
  96. struct timeval tv;
  97. _tm.tm_year = year-1900;
  98. _tm.tm_mon = mon-1;
  99. _tm.tm_mday = day;
  100. _tm.tm_hour = hour;
  101. _tm.tm_min = min;
  102. _tm.tm_sec = sec;
  103. t = mktime(&_tm);
  104. tv.tv_sec = t;
  105. tv.tv_usec = 0;
  106. if(settimeofday(&tv,(struct timezone *)0)<0){
  107. return false;
  108. }
  109. system("hwclock -w");
  110. QDateTime curDatetime = QDateTime::currentDateTime();
  111. uint chkTime = curDatetime.toTime_t();
  112. ytShm->currentTime.YEAR = curDatetime.date().year()&0xffff;
  113. ytShm->currentTime.MONTH = curDatetime.date().month()&0xff;
  114. ytShm->currentTime.DAY = curDatetime.date().day()&0xff;
  115. ytShm->currentTime.HOUR = curDatetime.time().hour()&0xff;
  116. ytShm->currentTime.MINUTE = curDatetime.time().minute()&0xff;
  117. ytShm->currentTime.SECOND = curDatetime.time().second()&0xff;
  118. ytShm->currentTime.TIMESTAMP = chkTime;
  119. for(i=0;i<60;i++){
  120. if(ytShm->dogTimeList.dogTime[i].ENABLED==0x01)
  121. ytShm->dogTimeList.dogTime[i].LASTFEED = ytShm->currentTime.TIMESTAMP;
  122. }
  123. return true;
  124. }
  125. int UServerThread::mkTimeSetRtn(QByteArray rtn, unsigned char *cmd)
  126. {
  127. int i=0, cur=0;
  128. unsigned char data[256];
  129. unsigned char CMD = 0x83;
  130. int datalen = 0;
  131. bool idchk = true;
  132. unsigned short devidLen = ((rtn[13]&0x00ff)<<8)|(rtn[14]&0x00ff);
  133. if((rtn.length()==(devidLen+25))&&(devidLen>0)&&(devidLen<=32)){
  134. for(i=0;i<devidLen;i++){
  135. if(ytShm->sysShm.USKYID[i]!=(rtn[15+i]&0xff)){
  136. idchk = false;
  137. break;
  138. }
  139. }
  140. if(idchk){
  141. int year = ((rtn[16+devidLen]>>4)&0x0f)*1000
  142. +(rtn[16+devidLen]&0x0f)*100
  143. +((rtn[17+devidLen]>>4)&0x0f)*10
  144. +(rtn[17+devidLen]&0x0f);
  145. int mon = ((rtn[18+devidLen]>>4)&0x0f)*10
  146. +(rtn[18+devidLen]&0x0f);
  147. int day = ((rtn[19+devidLen]>>4)&0x0f)*10
  148. +(rtn[19+devidLen]&0x0f);
  149. int hour = ((rtn[20+devidLen]>>4)&0x0f)*10
  150. +(rtn[20+devidLen]&0x0f);
  151. int min = ((rtn[21+devidLen]>>4)&0x0f)*10
  152. +(rtn[21+devidLen]&0x0f);
  153. int sec = ((rtn[22+devidLen]>>4)&0x0f)*10
  154. +(rtn[22+devidLen]&0x0f);
  155. if(set_systime(year,mon,day,hour,min,sec)){
  156. datalen = devidLen+4;
  157. data[cur++] = 0x0b;
  158. data[cur++] = rtn[13]&0xff;
  159. data[cur++] = rtn[14]&0xff;
  160. for(i=0;i<devidLen;i++)
  161. data[cur++] = rtn[15+i]&0xff;
  162. data[cur] = 0x00;
  163. mkCommCmd(cmd,data,CMD,datalen);
  164. return datalen+14;
  165. }
  166. }
  167. }
  168. return 0;
  169. }
  170. int UServerThread::chk_protocol(QByteArray rtn, unsigned char *outData)
  171. {
  172. if(chk_frame(rtn)){
  173. if((rtn[4]&0xff)==0x81)
  174. return 0;
  175. else if((rtn.length()>=14)&&((rtn[4]&0xff)==0x83)){
  176. switch(rtn[12]&0xff){
  177. case 0x0b:
  178. return mkTimeSetRtn(rtn,outData);
  179. }
  180. }
  181. }
  182. return 0;
  183. }
  184. void UServerThread::appendAllRealdata()
  185. {
  186. FC fc;
  187. int i=0, cur=0;
  188. unsigned char data[256],cmd[1024];
  189. unsigned char CMD = 0x03;
  190. int year,mon,day,hour,min,sec;
  191. int datalen = 0;
  192. int devidLen = 0;
  193. QDateTime dt;
  194. QByteArray PnoId = QString("%1").arg(ytShm->sysShm.USKYID).toUtf8();
  195. devidLen = PnoId.length();
  196. if(devidLen==0)
  197. return;
  198. datalen = devidLen+139;
  199. data[cur++] = 0x44;
  200. data[cur++] = (devidLen>>8)&0xff;
  201. data[cur++] = devidLen&0xff;
  202. for(i=0;i<devidLen;i++)
  203. data[cur++] = PnoId.at(i)&0xff;
  204. data[cur++] = 0x00;
  205. for(int pid=0;pid<32;pid++){
  206. fc.f = ytShm->spStatusList.spStatus[0][pid].REALTIME_VALUE;
  207. data[cur++] = fc.c[3];
  208. data[cur++] = fc.c[2];
  209. data[cur++] = fc.c[1];
  210. data[cur++] = fc.c[0];
  211. }
  212. dt = QDateTime::currentDateTime();
  213. year = dt.date().year();
  214. mon = dt.date().month();
  215. day = dt.date().day();
  216. hour = dt.time().hour();
  217. min = dt.time().minute();
  218. sec = dt.time().second();
  219. data[cur++] = (((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f);
  220. data[cur++] = ((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f);
  221. data[cur++] = (((mon/10)&0x0f)<<4)|((mon%10)&0x0f);
  222. data[cur++] = (((day/10)&0x0f)<<4)|((day%10)&0x0f);
  223. data[cur++] = (((hour/10)&0x0f)<<4)|((hour%10)&0x0f);
  224. data[cur++] = (((min/10)&0x0f)<<4)|((min%10)&0x0f);
  225. data[cur++] = (((sec/10)&0x0f)<<4)|((sec%10)&0x0f);
  226. mkCommCmd(cmd,data,CMD,datalen);
  227. QByteArray rep = QByteArray((const char *)cmd,datalen+14);
  228. CmdList.append(rep);
  229. }
  230. void UServerThread::run(){
  231. bool soSta=false;
  232. unsigned char cmd[1024];
  233. int len;
  234. CommTime = 0;
  235. so = new QTcpSocket;
  236. while(1){
  237. if(!soSta){
  238. printf("connected to %s:%d\n",ServerIP.toUtf8().data(),ServerPort);
  239. so->connectToHost(QHostAddress(ServerIP),ServerPort);
  240. if(so->waitForConnected(3000)){
  241. printf("so open pass\n");
  242. soSta = true;
  243. len = mkDeviceRegistCmd(cmd);
  244. if(len>0){
  245. QByteArray Cmd = QByteArray((const char *)cmd,len);
  246. so->write(Cmd);
  247. if(!so->waitForBytesWritten(3000)){
  248. so->abort();
  249. soSta = false;
  250. }else
  251. CommTime = ytShm->currentTime.TIMESTAMP;
  252. }
  253. }else{
  254. printf("so open failed\n");
  255. so->abort();
  256. }
  257. }else{
  258. if(so->waitForReadyRead(3000)){
  259. QByteArray Rtn = so->readAll();
  260. len = chk_protocol(Rtn,cmd);
  261. if(len>0){
  262. QByteArray Cmd = QByteArray((const char *)cmd,len);
  263. so->write(Cmd);
  264. if(!so->waitForBytesWritten(3000)){
  265. so->abort();
  266. soSta = false;
  267. }
  268. }
  269. }else if(CmdList.length()>0){
  270. while(CmdList.length()>1000)
  271. CmdList.removeFirst();
  272. if(CmdList.length()>0){
  273. QByteArray Cmd = CmdList.first();
  274. so->write(Cmd);
  275. if(!so->waitForBytesWritten(3000)){
  276. so->abort();
  277. soSta = false;
  278. }else{
  279. CmdList.removeFirst();
  280. CommTime = ytShm->currentTime.TIMESTAMP;
  281. }
  282. }
  283. }else if((ytShm->currentTime.TIMESTAMP-CommTime)>30){
  284. len = mkHeartBeatCmd(cmd);
  285. if(len>0){
  286. QByteArray Cmd = QByteArray((const char *)cmd,len);
  287. so->write(Cmd);
  288. if(!so->waitForBytesWritten(3000))
  289. {
  290. so->abort();
  291. soSta = false;
  292. }else
  293. CommTime = ytShm->currentTime.TIMESTAMP;
  294. }
  295. }
  296. }
  297. usleep(100000);
  298. }
  299. }