#include namespace gsd { #define DATA_HEAD (0x40) // 数据头 //控制设备类型 // device_TYPE #define DEVICE_TYPE_ID (0x05) // 煤气炮 // 命令类型 // msgId #define MSG_ID_COMMAND (0x08) //命令 #define MSG_ID_INQUIRE (0x04) //查询 #define MSG_ID_DEPLOY (0x03) //配置 #define MSG_ID_COMMAND_ACK (0X09) //命令应答 #define MSG_ID_INQUIRE_ACK (0X0A) //查询应答 #define MSG_ID_DEPLOY_ACK (0x0b) //配置应答 //data #define DATA_FIRE (0x55)//开启 #define DATA_STOP (0xAA)//停止 #define DATA_INQUIRE (0xAB)//查询监控数据 /** * @description: 序列化 * @param {ControlerMsg} gasV1Control * @param {char} *data * @return {*} */ void DeviceGasV1::serialization(const ControlerMsg gasControl,char *data){ data[0] = DATA_HEAD; data[1] = 0x23; data[2] = 0x24; data[3] = DEVICE_TYPE_ID; data[4] = gasControl.deviceId; data[5] = gasControl.msgId; data[6] = gasControl.data; if(gasControl.msgId == MSG_ID_COMMAND){ data[7] = 0xb3; data[8] = 0xff; }else if(gasControl.msgId == MSG_ID_INQUIRE){ data[7] = 0xAA; data[8] = 0xAA; } data[9] = LRC_check((unsigned char *)data, 9); } /** * @description: 反序列化 * @param {uint8_t} *data * @param {int} len * @param {int} &msg_id * @return {*} */ bool DeviceGasV1::deserialization(const uint8_t *data, int len, int &msg_id){ if(data[0] != DATA_HEAD && data[1] != 0x23 && data[2] != 0x24 && data[3] != DEVICE_TYPE_ID) return false; if(DeviceGasV1::LRC_check((unsigned char *)data, len - 1) != data[len - 1]) return false; setDeviceId(std::to_string(data[4])); if(data[5] == 0x00){ msg_id = data[6]; switch (msg_id) { // 命令应答 case MSG_ID_COMMAND_ACK: break; // 查询应答 case MSG_ID_INQUIRE_ACK: this->voltage = (float)data[8] + (float)(data[9]/100); this->pressure = (float)data[10] + (float)(data[11]/100); this->state = data[12]; break; // 配置应答 case MSG_ID_DEPLOY_ACK: break; } return true; } return false; } /** * @description: 消费数据 * @param {uint8_t} *data * @param {int} len * @param {int} &msg_id * @return {*} */ bool DeviceGasV1::Consumer(uint8_t *data, int len, int &msg_id) { bool ReceiveSuccessful = false; for (int i = 0; i < len; i++) { switch(_comm.step){ case STEP_HEAD: if(data[i] == DATA_HEAD){ _comm.data[0] = DATA_HEAD; _comm.step = STEP_1; } break; case STEP_1: if(data[i] == 0x23){ _comm.data[1] = data[i]; _comm.step = STEP_2; } break; case STEP_2: if(data[i] == 0x24){ _comm.data[2] = data[i]; _comm.step = STEP_TYPE; } break; case STEP_TYPE: _comm.data[3] = data[i]; _comm.step = STEP_ADDR; break; case STEP_ADDR: _comm.data[4] = data[i]; _comm.step = STEP_COM; break; case STEP_COM: _comm.data[5] = data[i]; _comm.step = STEP_ACK; break; case STEP_ACK: _comm.data[6] = data[i]; _comm.step = STEP_STA; break; case STEP_STA: _comm.data[7] = data[i]; _comm.step = STEP_DATA; _comm.dataCount = 8; break; case STEP_DATA: _comm.data[_comm.dataCount++] = data[i]; if(_comm.dataCount == 40){ ReceiveSuccessful = true; _comm.step = STEP_HEAD; } break; default: _comm.step = STEP_HEAD; break; } } if(!ReceiveSuccessful) return false; return deserialization(_comm.data, _comm.dataCount, msg_id); } /** * @description: 打开 * @param {int} deivceId * @return {*} */ int8_t DeviceGasV1::Open(std::string DeviceId, uint8_t* data, int& length){ ControlerMsg gasControl; gasControl.deviceId = atoi(DeviceId.c_str()); gasControl.msgId = 0x00; gasControl.data = 0x00; length = 11; serialization(gasControl, (char *)data); return 0; } /** * @description: 关闭 * @param {int} deivceId * @return {*} */ int8_t DeviceGasV1::Close(std::string DeviceId, uint8_t* data, int& length){ ControlerMsg gasControl; gasControl.deviceId = atoi(DeviceId.c_str()); gasControl.msgId = MSG_ID_COMMAND; gasControl.data = DATA_STOP; length = 11; serialization(gasControl, (char *)data); return 0; } /** * @description: 开炮 * @param {int} deivceId * @return {*} */ int8_t DeviceGasV1::Fire(std::string DeviceId, uint8_t* data, int& length){ ControlerMsg gasControl; gasControl.deviceId = atoi(DeviceId.c_str()); gasControl.msgId = MSG_ID_COMMAND; gasControl.data = DATA_FIRE; length = 11; serialization(gasControl, (char *)data); return 0; } /** * @description: 状态 * @param {int} deivceId * @return {*} */ int8_t DeviceGasV1::Status(std::string DeviceId, uint8_t* data, int& length){ ControlerMsg gasControl; gasControl.deviceId = atoi(DeviceId.c_str()); gasControl.msgId = MSG_ID_INQUIRE; gasControl.data = DATA_INQUIRE; length = 11; serialization(gasControl, (char *)data); return 0; } /** * @description: 判定msg是否为status * @param {int} &msg_id * @return {*} */ bool DeviceGasV1::getStatusMsg(int &msg_id){ if(msg_id != MSG_ID_INQUIRE_ACK) return false; return true; } /** * @description: 构建设备信息 * @param {SendDevice&} sendDevice * @return {*} */ void DeviceGasV1::BuildDeviceInfo(SendDevice& sendDevice){ sendDevice.deviceId = atoi(this->getDeviceId().c_str()); sendDevice.commandCode = "1"; sendDevice.status = 1; sendDevice.workStatus = 1; sendDevice.powerStatus = 1; sendDevice.batteryStatus = 1; sendDevice.num = 0; sendDevice.oxyPressure = 0; sendDevice.gasPressure = 0; sendDevice.remark = ""; sendDevice.attr1 = std::to_string(this->voltage); // 电压 sendDevice.attr2 = std::to_string(this->pressure); // 声压 } /** * @description: LRC_check * @param {unsigned char} *pSendBuf * @param {unsigned char} num * @return {*} */ unsigned char DeviceGasV1::LRC_check(unsigned char *pSendBuf,unsigned char num) { char bylrc = 0,i = 0; for(i = 0; i < num; i++) { bylrc += pSendBuf[i]; } bylrc = ~bylrc; bylrc++; return bylrc; } } // namespace gsd