DeviceGasV1.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include <DeviceGasV1.hpp>
  2. namespace gsd
  3. {
  4. #define DATA_HEAD (0x40) // 数据头
  5. //控制设备类型
  6. // device_TYPE
  7. #define DEVICE_TYPE_ID (0x05) // 煤气炮
  8. // 命令类型
  9. // msgId
  10. #define MSG_ID_COMMAND (0x08) //命令
  11. #define MSG_ID_INQUIRE (0x04) //查询
  12. #define MSG_ID_DEPLOY (0x03) //配置
  13. #define MSG_ID_COMMAND_ACK (0X09) //命令应答
  14. #define MSG_ID_INQUIRE_ACK (0X0A) //查询应答
  15. #define MSG_ID_DEPLOY_ACK (0x0b) //配置应答
  16. //data
  17. #define DATA_FIRE (0x55)//开启
  18. #define DATA_STOP (0xAA)//停止
  19. #define DATA_INQUIRE (0xAB)//查询监控数据
  20. /**
  21. * @description: 序列化
  22. * @param {ControlerMsg} gasV1Control
  23. * @param {char} *data
  24. * @return {*}
  25. */
  26. void DeviceGasV1::serialization(const ControlerMsg gasControl,char *data){
  27. data[0] = DATA_HEAD;
  28. data[1] = 0x23;
  29. data[2] = 0x24;
  30. data[3] = DEVICE_TYPE_ID;
  31. data[4] = gasControl.deviceId;
  32. data[5] = gasControl.msgId;
  33. data[6] = gasControl.data;
  34. if(gasControl.msgId == MSG_ID_COMMAND){
  35. data[7] = 0xb3;
  36. data[8] = 0xff;
  37. }else if(gasControl.msgId == MSG_ID_INQUIRE){
  38. data[7] = 0xAA;
  39. data[8] = 0xAA;
  40. }
  41. data[9] = LRC_check((unsigned char *)data, 9);
  42. }
  43. /**
  44. * @description: 反序列化
  45. * @param {uint8_t} *data
  46. * @param {int} len
  47. * @param {int} &msg_id
  48. * @return {*}
  49. */
  50. bool DeviceGasV1::deserialization(const uint8_t *data, int len, int &msg_id){
  51. if(data[0] != DATA_HEAD && data[1] != 0x23 && data[2] != 0x24 && data[3] != DEVICE_TYPE_ID) return false;
  52. if(DeviceGasV1::LRC_check((unsigned char *)data, len - 1) != data[len - 1]) return false;
  53. setDeviceId(std::to_string(data[4]));
  54. if(data[5] == 0x00){
  55. msg_id = data[6];
  56. switch (msg_id)
  57. {
  58. // 命令应答
  59. case MSG_ID_COMMAND_ACK:
  60. break;
  61. // 查询应答
  62. case MSG_ID_INQUIRE_ACK:
  63. this->voltage = (float)data[8] + (float)(data[9]/100);
  64. this->pressure = (float)data[10] + (float)(data[11]/100);
  65. this->state = data[12];
  66. break;
  67. // 配置应答
  68. case MSG_ID_DEPLOY_ACK:
  69. break;
  70. }
  71. return true;
  72. }
  73. return false;
  74. }
  75. /**
  76. * @description: 消费数据
  77. * @param {uint8_t} *data
  78. * @param {int} len
  79. * @param {int} &msg_id
  80. * @return {*}
  81. */
  82. bool DeviceGasV1::Consumer(uint8_t *data, int len, int &msg_id)
  83. {
  84. bool ReceiveSuccessful = false;
  85. for (int i = 0; i < len; i++)
  86. {
  87. switch(_comm.step){
  88. case STEP_HEAD:
  89. if(data[i] == DATA_HEAD){
  90. _comm.data[0] = DATA_HEAD;
  91. _comm.step = STEP_1;
  92. }
  93. break;
  94. case STEP_1:
  95. if(data[i] == 0x23){
  96. _comm.data[1] = data[i];
  97. _comm.step = STEP_2;
  98. }
  99. break;
  100. case STEP_2:
  101. if(data[i] == 0x24){
  102. _comm.data[2] = data[i];
  103. _comm.step = STEP_TYPE;
  104. }
  105. break;
  106. case STEP_TYPE:
  107. _comm.data[3] = data[i];
  108. _comm.step = STEP_ADDR;
  109. break;
  110. case STEP_ADDR:
  111. _comm.data[4] = data[i];
  112. _comm.step = STEP_COM;
  113. break;
  114. case STEP_COM:
  115. _comm.data[5] = data[i];
  116. _comm.step = STEP_ACK;
  117. break;
  118. case STEP_ACK:
  119. _comm.data[6] = data[i];
  120. _comm.step = STEP_STA;
  121. break;
  122. case STEP_STA:
  123. _comm.data[7] = data[i];
  124. _comm.step = STEP_DATA;
  125. _comm.dataCount = 8;
  126. break;
  127. case STEP_DATA:
  128. _comm.data[_comm.dataCount++] = data[i];
  129. if(_comm.dataCount == 40){
  130. ReceiveSuccessful = true;
  131. _comm.step = STEP_HEAD;
  132. }
  133. break;
  134. default:
  135. _comm.step = STEP_HEAD;
  136. break;
  137. }
  138. }
  139. if(!ReceiveSuccessful) return false;
  140. return deserialization(_comm.data, _comm.dataCount, msg_id);
  141. }
  142. /**
  143. * @description: 打开
  144. * @param {int} deivceId
  145. * @return {*}
  146. */
  147. int8_t DeviceGasV1::Open(std::string DeviceId, uint8_t* data, int& length){
  148. ControlerMsg gasControl;
  149. gasControl.deviceId = atoi(DeviceId.c_str());
  150. gasControl.msgId = 0x00;
  151. gasControl.data = 0x00;
  152. length = 11;
  153. serialization(gasControl, (char *)data);
  154. return 0;
  155. }
  156. /**
  157. * @description: 关闭
  158. * @param {int} deivceId
  159. * @return {*}
  160. */
  161. int8_t DeviceGasV1::Close(std::string DeviceId, uint8_t* data, int& length){
  162. ControlerMsg gasControl;
  163. gasControl.deviceId = atoi(DeviceId.c_str());
  164. gasControl.msgId = MSG_ID_COMMAND;
  165. gasControl.data = DATA_STOP;
  166. length = 11;
  167. serialization(gasControl, (char *)data);
  168. return 0;
  169. }
  170. /**
  171. * @description: 开炮
  172. * @param {int} deivceId
  173. * @return {*}
  174. */
  175. int8_t DeviceGasV1::Fire(std::string DeviceId, uint8_t* data, int& length){
  176. ControlerMsg gasControl;
  177. gasControl.deviceId = atoi(DeviceId.c_str());
  178. gasControl.msgId = MSG_ID_COMMAND;
  179. gasControl.data = DATA_FIRE;
  180. length = 11;
  181. serialization(gasControl, (char *)data);
  182. return 0;
  183. }
  184. /**
  185. * @description: 状态
  186. * @param {int} deivceId
  187. * @return {*}
  188. */
  189. int8_t DeviceGasV1::Status(std::string DeviceId, uint8_t* data, int& length){
  190. ControlerMsg gasControl;
  191. gasControl.deviceId = atoi(DeviceId.c_str());
  192. gasControl.msgId = MSG_ID_INQUIRE;
  193. gasControl.data = DATA_INQUIRE;
  194. length = 11;
  195. serialization(gasControl, (char *)data);
  196. return 0;
  197. }
  198. /**
  199. * @description: 判定msg是否为status
  200. * @param {int} &msg_id
  201. * @return {*}
  202. */
  203. bool DeviceGasV1::getStatusMsg(int &msg_id){
  204. if(msg_id != MSG_ID_INQUIRE_ACK) return false;
  205. return true;
  206. }
  207. /**
  208. * @description: 构建设备信息
  209. * @param {SendDevice&} sendDevice
  210. * @return {*}
  211. */
  212. void DeviceGasV1::BuildDeviceInfo(SendDevice& sendDevice){
  213. sendDevice.deviceId = atoi(this->getDeviceId().c_str());
  214. sendDevice.commandCode = "1";
  215. sendDevice.status = 1;
  216. sendDevice.workStatus = 1;
  217. sendDevice.powerStatus = 1;
  218. sendDevice.batteryStatus = 1;
  219. sendDevice.num = 0;
  220. sendDevice.oxyPressure = 0;
  221. sendDevice.gasPressure = 0;
  222. sendDevice.remark = "";
  223. sendDevice.attr1 = std::to_string(this->voltage); // 电压
  224. sendDevice.attr2 = std::to_string(this->pressure); // 声压
  225. }
  226. /**
  227. * @description: LRC_check
  228. * @param {unsigned char} *pSendBuf
  229. * @param {unsigned char} num
  230. * @return {*}
  231. */
  232. unsigned char DeviceGasV1::LRC_check(unsigned char *pSendBuf,unsigned char num)
  233. {
  234. char bylrc = 0,i = 0;
  235. for(i = 0; i < num; i++)
  236. {
  237. bylrc += pSendBuf[i];
  238. }
  239. bylrc = ~bylrc;
  240. bylrc++;
  241. return bylrc;
  242. }
  243. } // namespace gsd