#include #include #include #include #include #include #include #include "../uart/SH_Uart.hpp" namespace{ Uart *pUart = Uart::instance(); } // namespace{ // PlatformInit *platform = PlatformInit::instance(); // LocalServer *wlServer = LocalServer::instance(); // GenericFunc *genericFunc = GenericFunc::instance(); // } using namespace boost::asio; const UINT CharSize = 8; const UINT UartBaud = 115200; Uart::Uart():mUart(mIoSev),mStrand(mIoSev) { mRdLength = 0; memset(mUartRecvBuf,0,BUF_LENGTH); } void Uart::InitUart() { //*.reset()作用重置对象,为run()的调用做准备 mUart.get_io_service().reset(); mStrand.get_io_service().reset(); // ThreadInit(); mRdLength = 0; //errcode用来接收错误类型 boost::system::error_code errcode; //打开/dev/ttymxc4串口文件 mUart.open(GlobalConfig::UartName_G,errcode); if ( errcode) { print_error("Fail To Open Uart!\n"); // LOG_ERROR("Fail To Open Uart!\n"); return ; } else { if (mUart.is_open()) { print_info("Success To Open Uart!\n"); } } //设置串口的波特率 数据位 流控 奇偶校验位 停止位 mUart.set_option( serial_port::baud_rate(UartBaud), errcode); mUart.set_option( serial_port::flow_control(serial_port::flow_control::none),errcode ); mUart.set_option( serial_port::parity(serial_port::parity::none),errcode ); mUart.set_option( serial_port::stop_bits(serial_port::stop_bits::one),errcode ); mUart.set_option( serial_port::character_size(CharSize),errcode ); // WriteToUart(); // mUart.set_option( serial_port::baud_rate(UartBaud), errcode); } Uart::~Uart() { if (mUart.is_open()) mUart.close(); } void Uart::WriteToUart(const char *strSend,int pLen) { //#ifdef ZIGBEE_TEST print_debug("Write To Uart Start:\n"); for(int i=0; iWriteToUart(pData.mData,pData.mLen); // LOG_INFO("WriteToUart:%s", pData.mDataMing); boost::this_thread::sleep(boost::posix_time::milliseconds(110)); } void Uart::UpdateZigbeeInfoCtrl() { char buf[5] = {0xAB, 0xBC, 0xCD, 0xD1, 0x05}; WriteToUart(buf, 5); boost::this_thread::sleep(boost::posix_time::seconds(1)); } void Uart::UpdateZigbeeInfo(const char *pData) { print_info("update gateway zigbee info\n"); GlobalConfig::Zigbee_G = *((ZIGBEE *)pData); char buff[8]; sprintf(buff, "%02d", pData[36]&0xFF); GlobalConfig::ZigbeeInfo_G.DevMode = boost::lexical_cast(buff); memset(buff, 0, 8); sprintf(buff, "%02d", pData[37]&0xFF); GlobalConfig::ZigbeeInfo_G.Channel = boost::lexical_cast(buff); memset(buff, 0, 8); sprintf(buff, "%02x%02x", pData[38]&0xFF, pData[39]&0xFF); GlobalConfig::ZigbeeInfo_G.PanID = std::string(buff); memset(buff, 0, 8); sprintf(buff, "%02x%02x", pData[40]&0xFF, pData[41]&0xFF); GlobalConfig::ZigbeeInfo_G.MyAddr = std::string(buff); memset(buff, 0, 8); sprintf(buff, "%02x%02x", pData[50]&0xFF, pData[51]&0xFF); GlobalConfig::ZigbeeInfo_G.DstAddr = std::string(buff); print_info("local zigbee module info Mode : %d Chan : %d PanID : %s MyAddr : %s DstAddr : %s\n", GlobalConfig::ZigbeeInfo_G.DevMode, GlobalConfig::ZigbeeInfo_G.Channel, GlobalConfig::ZigbeeInfo_G.PanID.c_str(),GlobalConfig::ZigbeeInfo_G.MyAddr.c_str(), GlobalConfig::ZigbeeInfo_G.DstAddr.c_str()); LOG_INFO("[UpdateZigbeeInfo---] ZigBee PanID: %s ; Channel: %d ; MyAddr : %s ",GlobalConfig::ZigbeeInfo_G.PanID.c_str(),GlobalConfig::ZigbeeInfo_G.Channel,GlobalConfig::ZigbeeInfo_G.MyAddr.c_str()); } void Uart::DealRecvData(const char *pData) { char buf[8]; sprintf(buf, "%02d", pData[5]&0xFF); int flag = boost::lexical_cast(buf); print_info("the data package type(1,2,3,4,5,6) is %s,%x\n",buf,pData[5]&0xFF); switch (flag) { case 1:{ DealDataNodeInfo(pData); } break; case 2:{ DealDataNodeFeature(pData, 0); } break; case 3:{ DealDataNodeWave(pData); } break; case 4:{ DealDataNodeWave(pData); } break; case 5:{ DealDataNodeWave(pData); } break; case 6:{ DealDataNodeFeature(pData, 1); } break; default: break; } } void Uart::DealDataNodeInfo(const char *pData) { print_info("recv remote zigbee module info\n"); RecvData * pRecvData = (RecvData *)pData; char buf[32] = {0}; char chTemp = pRecvData->Data[0]; DataNodeInfo dataNodeInfo; dataNodeInfo.EquipSta = boost::lexical_cast(chTemp >> 2 & 0x1); dataNodeInfo.TemTopFlag = boost::lexical_cast(chTemp >> 3 & 0x1); dataNodeInfo.TemBotFlag = boost::lexical_cast(chTemp >> 4 & 0x1); dataNodeInfo.ZigbeeFlag = boost::lexical_cast(chTemp >> 5 & 0x1); dataNodeInfo.AccFlag = boost::lexical_cast(chTemp >> 6 & 0x1); dataNodeInfo.InitFlag = boost::lexical_cast(chTemp >> 7 & 0x1); sprintf(buf, "%02x%02x%02x%02x%02x%02x%02x%02x", pRecvData->Data[1], pRecvData->Data[2], pRecvData->Data[3], pRecvData->Data[4], pRecvData->Data[5], pRecvData->Data[6], pRecvData->Data[7],pRecvData->Data[8]); dataNodeInfo.ZigbeeLongAddr = std::string(buf); chTemp = pRecvData->Data[9]; memset(buf, 0, 32); sprintf(buf, "%02x", chTemp); dataNodeInfo.HardVersion = std::string(buf); chTemp = pRecvData->Data[10]; memset(buf, 0, 32); //sprintf(buf, "%02x", chTemp); sprintf(buf, "%.1f", 0.1*chTemp); dataNodeInfo.SoftVersion = std::string(buf); memset(buf, 0, 32); sprintf(buf, "%02x%02x%02x%02x", pRecvData->Data[11], pRecvData->Data[12], pRecvData->Data[13], pRecvData->Data[14]); dataNodeInfo.BpNo = std::string(buf); memset(buf, 0, 32); sprintf(buf, "%02x%02x%02x%02x", pRecvData->Data[15], pRecvData->Data[16], pRecvData->Data[17], pRecvData->Data[18]); dataNodeInfo.SerialNo = std::string(buf); memset(buf, 0, 32); sprintf(buf, "%02x%02x%02x%02x", pRecvData->Data[19], pRecvData->Data[20], pRecvData->Data[21], pRecvData->Data[22]); dataNodeInfo.FirstPowerTime = std::string(buf); //23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38=>序号13 无线信号强度 // 获取 RSSI chTemp = pRecvData->Data[38]; memset(buf, 0, 32); sprintf(buf, "%d", chTemp); dataNodeInfo.RSSI = boost::lexical_cast(buf); chTemp = pRecvData->Data[39]; memset(buf, 0, 32); sprintf(buf, "%02x", chTemp); dataNodeInfo.ConfigFlag = ((0 == std::string(buf).compare("aa")) ? 1 : 0); memset(buf, 0, 32); sprintf(buf, "%u%u", pRecvData->Data[40], pRecvData->Data[41]); dataNodeInfo.FeatureInterVal = boost::lexical_cast(buf); chTemp = pRecvData->Data[42]; memset(buf, 0, 32); // sprintf(buf, "%02x", chTemp); sprintf(buf, "%d",(unsigned int)chTemp); // yxq dataNodeInfo.WaveInterVal = boost::lexical_cast(buf); memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[43], pRecvData->Data[44]); dataNodeInfo.ZigbeePanId = std::string(buf); chTemp = pRecvData->Data[45]; memset(buf, 0, 32); sprintf(buf, "%d", chTemp); dataNodeInfo.ZigbeeChannel = boost::lexical_cast(buf); memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[46], pRecvData->Data[47]); dataNodeInfo.ZigbeeShortAddr = std::string(buf); memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[48], pRecvData->Data[49]); dataNodeInfo.ZigbeeDesAddr = std::string(buf); //50 51 52=》序号23 zigbee重试间隔 chTemp = pRecvData->Data[53]; dataNodeInfo.Range = boost::lexical_cast(chTemp >> 2 & 0x3); dataNodeInfo.SamplingRate = boost::lexical_cast(chTemp & 0x3); // 54=》序号25 ACC采样时间 int iTemp = 0; //使用了55 56 59 60 63 64 67 68 71 72 for (int i = 0; i < 5; i++) { memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[55 + i * 4], pRecvData->Data[55 + i * 4 + 1]); iTemp = (int)strtol(buf, NULL, 16); if (0 == i) { dataNodeInfo.StartBrands = boost::lexical_cast(iTemp); } else { dataNodeInfo.StartBrands += ("," + boost::lexical_cast(iTemp)); } } //使用了57 58 61 62 65 66 69 70 73 74 for (int j = 0; j < 5; j++) { memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[57 + j * 4], pRecvData->Data[57 + j * 4 + 1]); iTemp = (int)strtol(buf, NULL, 16); if (0 == j) { dataNodeInfo.StopBrands = boost::lexical_cast(iTemp); } else { dataNodeInfo.StopBrands += ("," + boost::lexical_cast(iTemp)); } } memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[75], pRecvData->Data[76]); iTemp = (int)strtol(buf, NULL, 16); dataNodeInfo.EnvelopeBandPass = boost::lexical_cast(iTemp); memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[77], pRecvData->Data[78]); iTemp = (int)strtol(buf, NULL, 16); dataNodeInfo.EnvelopeBandPass += ("," + boost::lexical_cast(iTemp)); //使用了79 80 81 82 83 84 85 86 for (int j = 0; j < 4; j++) { memset(buf, 0, 32); sprintf(buf, "%02x%02x", pRecvData->Data[79 + j * 2], pRecvData->Data[79 + j * 2 + 1]); iTemp = (int)strtol(buf, NULL, 16); if (0 == j) { dataNodeInfo.FaultFrequency = boost::lexical_cast(iTemp); } else { dataNodeInfo.FaultFrequency += ("," + boost::lexical_cast(iTemp)); } } memset(buf, 0, 32); sprintf(buf, "%02x%02x%02x%02x", pRecvData->Data[87], pRecvData->Data[88], pRecvData->Data[89],pRecvData->Data[90]); long lTimeStamp = strtol(buf, NULL, 16); dataNodeInfo.ConfigDate = boost::lexical_cast(lTimeStamp); chTemp = pRecvData->Data[91]; memset(buf, 0, 32); sprintf(buf, "%d", chTemp); dataNodeInfo.VIntegralFilterFrequency = boost::lexical_cast(buf); char whereCon[64] = {0}; sprintf(whereCon, "dataNodeNo='%s'", dataNodeInfo.ZigbeeLongAddr.c_str()); if (sql_ctl->GetTableRows(T_SENSOR_INFO(TNAME), whereCon) > 0) { sql_ctl->DeleteTableData(T_SENSOR_INFO(TNAME), whereCon); } char insertSql[1024] = { 0 }; sprintf(insertSql, "'%s','%s','%d','%d','%d','%d','%d','%d','%s','%s','%s','%s','%s','%d','%s','%s','%u','%d','%d','%s','%d','%s','%s','%s','%d','%s','%s','%s','%s','%s','%d','%d'", dataNodeInfo.ZigbeeLongAddr.c_str(), " ", dataNodeInfo.InitFlag, dataNodeInfo.AccFlag, dataNodeInfo.ZigbeeFlag, dataNodeInfo.TemTopFlag, dataNodeInfo.TemBotFlag,dataNodeInfo.EquipSta,\ dataNodeInfo.HardVersion.c_str(), dataNodeInfo.SoftVersion.c_str(), dataNodeInfo.BpNo.c_str(), dataNodeInfo.SerialNo.c_str(), dataNodeInfo.FirstPowerTime.c_str(), dataNodeInfo.ConfigFlag, dataNodeInfo.StartBrands.c_str(), \ dataNodeInfo.StopBrands.c_str(), dataNodeInfo.FeatureInterVal, dataNodeInfo.WaveInterVal, dataNodeInfo.SamplingRate, "range", dataNodeInfo.Range, dataNodeInfo.EnvelopeBandPass.c_str(), dataNodeInfo.FaultFrequency.c_str(),\ dataNodeInfo.ZigbeePanId.c_str(), dataNodeInfo.ZigbeeChannel, dataNodeInfo.ZigbeeShortAddr.c_str(), dataNodeInfo.ZigbeeLongAddr.c_str(), dataNodeInfo.ZigbeeDesAddr.c_str(), "1", dataNodeInfo.ConfigDate.c_str(),dataNodeInfo.VIntegralFilterFrequency,dataNodeInfo.RSSI); sql_ctl->InsertData(T_SENSOR_INFO(TNAME), insertSql); Json::Value jsonVal; jsonVal.clear(); jsonVal["cmd"] = "26"; Json::Value jsBody; jsBody["dataNodeGatewayNo"] = GlobalConfig::MacAddr_G; jsBody["dataNodeNo"] = dataNodeInfo.ZigbeeLongAddr; jsBody["type"] = "insert"; Json::Value jsSensorData; jsSensorData["dataNodeNo"] = dataNodeInfo.ZigbeeLongAddr; jsSensorData["dataNodeName"] = ""; jsSensorData["initFlag"] = dataNodeInfo.InitFlag; jsSensorData["accFlag"] = dataNodeInfo.AccFlag; jsSensorData["zigbeeFlag"] = dataNodeInfo.ZigbeeFlag; jsSensorData["temTopFlag"] = dataNodeInfo.TemTopFlag; jsSensorData["temBotFlag"] = dataNodeInfo.TemBotFlag; jsSensorData["equipsta"] = dataNodeInfo.EquipSta; jsSensorData["hardVersion"] = dataNodeInfo.HardVersion; jsSensorData["softVersion"] = dataNodeInfo.SoftVersion; jsSensorData["bpNo"] = dataNodeInfo.BpNo; jsSensorData["serialNo"] = dataNodeInfo.SerialNo; jsSensorData["firstPowerTime"] = dataNodeInfo.FirstPowerTime; jsSensorData["configFlag"] = dataNodeInfo.ConfigFlag; jsSensorData["startBrands"] = dataNodeInfo.StartBrands; jsSensorData["stopBrands"] = dataNodeInfo.StopBrands; jsSensorData["featureInterVal"] = dataNodeInfo.FeatureInterVal; jsSensorData["waveInterVal"] = dataNodeInfo.WaveInterVal; jsSensorData["samplingRate"] = dataNodeInfo.SamplingRate; jsSensorData["range"] = dataNodeInfo.Range; jsSensorData["envelopeBandPass"] = dataNodeInfo.EnvelopeBandPass; jsSensorData["faultFrequency"] = dataNodeInfo.FaultFrequency; jsSensorData["zigbeePanId"] = dataNodeInfo.ZigbeePanId; jsSensorData["zigbeeChannel"] = dataNodeInfo.ZigbeeChannel; jsSensorData["zigbeeAddr"] = dataNodeInfo.ZigbeeLongAddr; jsSensorData["zigbeeDesAddr"] = dataNodeInfo.ZigbeeDesAddr; jsSensorData["status"] = 1; jsSensorData["timeStamp"] = dataNodeInfo.ConfigDate; jsSensorData["VIntegralFilterFrequency"] = dataNodeInfo.VIntegralFilterFrequency; jsSensorData["RSSI"] = dataNodeInfo.RSSI; jsBody["dataNodeInfo"] = jsSensorData; Json::FastWriter showValue; std::string dataBody = showValue.write(jsBody); jsonVal["cmdBody"] = dataBody; std::string strCmd27 = showValue.write(jsonVal); //传感器发来的数据包中的表示设备信息的数据转化为json格式后,通过调用data_publish将数据传给mqttclient : Topic:wireless/cmd/60294D203717 data_publish(strCmd27.c_str(), GlobalConfig::Topic_G.mPubCmd.c_str()); print_info("remote wireless sensor device info AccFlag : %d EquipSta : %d BpNo : %s ConfigFlag : %d EnvelopeBandPass : %s FaultFrequency : %s FeatureInterVal : %u FirstPowerTime : %s HardVersion : %s InitFlag : %d SamplingRate : %d range : %d SerialNo : %s\ SoftVersion : %s StartBrands : %s StopBrands : %s TemBotFlag : %d TemTopFlag : %d WaveInterVal : %d ZigbeeChannel : %d ZigbeeDesAddr : %s ZigbeeFlag : %d ZigbeeLongAddr : %s panid : %s ZigbeeShortAddr : %s Configdate : %s vintegralfilterfrequency : %d RSSI : %d \n", \ dataNodeInfo.AccFlag, dataNodeInfo.EquipSta, dataNodeInfo.BpNo.c_str(), dataNodeInfo.ConfigFlag, dataNodeInfo.EnvelopeBandPass.c_str(), dataNodeInfo.FaultFrequency.c_str(),\ dataNodeInfo.FeatureInterVal, dataNodeInfo.FirstPowerTime.c_str(), dataNodeInfo.HardVersion.c_str(), dataNodeInfo.InitFlag, dataNodeInfo.SamplingRate, dataNodeInfo.Range, dataNodeInfo.SerialNo.c_str(),\ dataNodeInfo.SoftVersion.c_str(), dataNodeInfo.StartBrands.c_str(), dataNodeInfo.StopBrands.c_str(), dataNodeInfo.TemBotFlag, dataNodeInfo.TemTopFlag, dataNodeInfo.WaveInterVal,\ dataNodeInfo.ZigbeeChannel, dataNodeInfo.ZigbeeDesAddr.c_str(), dataNodeInfo.ZigbeeFlag, dataNodeInfo.ZigbeeLongAddr.c_str(), dataNodeInfo.ZigbeePanId.c_str(), dataNodeInfo.ZigbeeShortAddr.c_str(), dataNodeInfo.ConfigDate.c_str(), dataNodeInfo.VIntegralFilterFrequency, dataNodeInfo.RSSI); } void Uart::DealDataNodeFeature(const char *pData, int flag) { if (1 == flag) { print_info("recv wave minute\n"); unsigned short shortAddr = 0x9999; WriteShortAddr2Zigbee(shortAddr); LOG_INFO("[DealDataNodeFeature] ZigBee PanID: %s ; Channel: %d ; MyAddr : %4x ",GlobalConfig::ZigbeeInfo_G.PanID.c_str(),GlobalConfig::ZigbeeInfo_G.Channel, (unsigned short)GlobalConfig::Zigbee_G.MyAddr); // 进入传输原始数据状态,启动计数 60秒 GlobalConfig::EnterZigBeeWaveTransmittingFlag_G = ENTER_TRANSMITTING_STATUS; GlobalConfig::EnterZigBeeWaveTransmittingCnt_G = 0; } print_info("recv feature\n"); RecvData * pRecvData = (RecvData *)pData; char buf[8]; sprintf(buf, "%02x%02x", pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]); std::string strShortAddr = std::string(buf); char getLongAddr_sql[32] = { 0 }; //根据数据包中的传感器的短地址获取数据库中长地址(MAC),在下面判断该传感器是否存在,如果不存在则把数据包丢弃 sprintf(getLongAddr_sql, "zigbeeShortAddr='%s'", strShortAddr.c_str()); std::string strLongAddr = sql_ctl->GetData(T_SENSOR_INFO(TNAME), T_SENSOR_INFO(ZIGBEELONGADDR), getLongAddr_sql); print_info("--------->the remote sensor short addr:%s strLongAddr=%s\n",buf,strLongAddr.c_str()); if (0 == strLongAddr.length()) { print_error("device info not found\n"); return; } char localtimestamp[32] = { 0 }; GetTimeNet(localtimestamp, 1); std::string nowTimetamp = std::string(localtimestamp); int iTemp = 0; unsigned char highbit = 0; unsigned int lowbit = 0; float n = 0; DataRecvStatic dataStatic; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[5], pRecvData->Data[4]); print_blue("!!!!!!!!!!!!!!!!!!!!!!%s\n",buf); iTemp = (int)strtol(buf, NULL, 16); dataStatic.Dip = iTemp; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[1], pRecvData->Data[0]); print_blue("@@@@@@@@@@@@@@@@@%s\n",buf); iTemp = (int)strtol(buf, NULL, 16); dataStatic.TemBot = iTemp * 0.0625; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[3], pRecvData->Data[2]); iTemp = (int)strtol(buf, NULL, 16); dataStatic.TemTop = iTemp * 0.0625; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[7], pRecvData->Data[6]); iTemp = (int)strtol(buf, NULL, 16); dataStatic.Voltage = iTemp; print_info("dataStatic.TemTop : %f dataStatic.TemBot : %f dataStatic.Dip :%d dataStatic.Voltage : %d\n", dataStatic.TemTop\ , dataStatic.TemBot, dataStatic.Dip, dataStatic.Voltage); char whereCon[64] = {0}; sprintf(whereCon, "channelID='%s'", (strLongAddr + "-S").c_str()); if ( 0 == sql_ctl->GetTableRows(T_DATASTATIC_INFO(TNAME), whereCon) ) { print_info("insert static data to sql\n"); char insertSql[1024] = { 0 }; sprintf(insertSql, "'%s','%s','%f','%f','%d','%d','%s'", strLongAddr.c_str(), (strLongAddr + "-S").c_str(), dataStatic.TemTop, dataStatic.TemBot, dataStatic.Dip, dataStatic.Voltage, nowTimetamp.c_str()); sql_ctl->InsertData(T_DATASTATIC_INFO(TNAME), insertSql); } else { print_info("update static data to sql\n"); char updateSql[1024] = { 0 }; sprintf(updateSql, "temTop='%f',temBot='%f',dip='%d',voltage='%d',timeStamp='%s'",\ dataStatic.TemTop, dataStatic.TemBot, dataStatic.Dip, dataStatic.Voltage, nowTimetamp.c_str()); sql_ctl->UpdateTableData(T_DATASTATIC_INFO(TNAME), updateSql, whereCon); } DataRecvDym dataDymX; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[9], pRecvData->Data[8]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.DiagnosisPk = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[11], pRecvData->Data[10]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.RmsValues = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[13], pRecvData->Data[12]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.IntegratPk = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[15], pRecvData->Data[14]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.IntegratRMS = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[17], pRecvData->Data[16]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Amp1 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[19], pRecvData->Data[18]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Amp2 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[21], pRecvData->Data[20]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Amp3 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[23], pRecvData->Data[22]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Amp4 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[25], pRecvData->Data[24]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Amp5 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[27], pRecvData->Data[26]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.EnvelopEnergy = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[29], pRecvData->Data[28]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Phase1 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[31], pRecvData->Data[30]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Phase2 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[33], pRecvData->Data[32]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Phase3 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[35], pRecvData->Data[34]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymX.Phase4 = lowbit * n; memset(whereCon, 0, 64); sprintf(whereCon, "channelID='%s'", (strLongAddr + "-X").c_str()); if ( 0 == sql_ctl->GetTableRows(T_DATA_INFO(TNAME), whereCon) ) { char insertSql[1024] = { 0 }; sprintf(insertSql, "'%s','%s','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%s'", strLongAddr.c_str(), (strLongAddr + "-X").c_str(), dataDymX.DiagnosisPk, dataDymX.IntegratPk, dataDymX.IntegratRMS, dataDymX.RmsValues, dataDymX.EnvelopEnergy,\ dataDymX.Amp1, dataDymX.Amp2, dataDymX.Amp3, dataDymX.Amp4, dataDymX.Amp5,dataDymX.Phase1, dataDymX.Phase2, dataDymX.Phase3, dataDymX.Phase4, nowTimetamp.c_str()); sql_ctl->InsertData(T_DATA_INFO(TNAME), insertSql); } else { char updateSql[1024] = { 0 }; sprintf(updateSql, "diagnosisPk='%f',integratPk='%f',integratRMS='%f',rmsValues='%f',envelopEnergy='%f',\ Amp1='%f',Amp2='%f',Amp3='%f',Amp4='%f',Amp5='%f',Phase1='%f',Phase2='%f',Phase3='%f',Phase4='%f',timeStamp='%s'",\ dataDymX.DiagnosisPk, dataDymX.IntegratPk, dataDymX.IntegratRMS, dataDymX.RmsValues, dataDymX.EnvelopEnergy,\ dataDymX.Amp1, dataDymX.Amp2, dataDymX.Amp3, dataDymX.Amp4, dataDymX.Amp5,dataDymX.Phase1, dataDymX.Phase2, dataDymX.Phase3, dataDymX.Phase4, nowTimetamp.c_str()); sql_ctl->UpdateTableData(T_DATA_INFO(TNAME), updateSql, whereCon); } print_info("x:%s,%s,diagnosisPk=%f,integratPk=%f,integratRMS=%f,rmsValues=%f,envelopEnergy=%f,Amp1=%f,Amp2=%f,Amp3=%f,Amp4=%f,Amp5=%f,Phase1=%f,Phase2=%f,Phase3=%f,Phase4=%f,timeStamp=%s\n",\ strLongAddr.c_str(), (strLongAddr + "-X").c_str(), dataDymX.DiagnosisPk, dataDymX.IntegratPk, dataDymX.IntegratRMS, dataDymX.RmsValues, dataDymX.EnvelopEnergy,\ dataDymX.Amp1, dataDymX.Amp2, dataDymX.Amp3, dataDymX.Amp4, dataDymX.Amp5,dataDymX.Phase1, dataDymX.Phase2, dataDymX.Phase3, dataDymX.Phase4, nowTimetamp.c_str()); Json::Value valNodeData; Json::Value valNodeFeature; valNodeFeature["dataNodeNo"] = strLongAddr; valNodeFeature["channelID"] = strLongAddr + "-X"; valNodeFeature["diagnosisPk"] = dataDymX.DiagnosisPk; valNodeFeature["integratPk"] = dataDymX.IntegratPk; valNodeFeature["integratRMS"] = dataDymX.IntegratRMS; valNodeFeature["rmsValues"] = dataDymX.RmsValues; valNodeFeature["envelopEnergy"] = dataDymX.EnvelopEnergy; valNodeFeature["Amp1"] = dataDymX.Amp1; valNodeFeature["Amp2"] = dataDymX.Amp2; valNodeFeature["Amp3"] = dataDymX.Amp3; valNodeFeature["Amp4"] = dataDymX.Amp4; valNodeFeature["Amp5"] = dataDymX.Amp5; valNodeFeature["Phase1"] = dataDymX.Phase1; valNodeFeature["Phase2"] = dataDymX.Phase2; valNodeFeature["Phase3"] = dataDymX.Phase3; valNodeFeature["Phase4"] = dataDymX.Phase4; valNodeFeature["timeStamp"] = nowTimetamp; valNodeData.append(valNodeFeature); DataRecvDym dataDymY; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[37], pRecvData->Data[36]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.DiagnosisPk = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[39], pRecvData->Data[38]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.RmsValues = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[41], pRecvData->Data[40]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.IntegratPk = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[43], pRecvData->Data[42]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.IntegratRMS = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[45], pRecvData->Data[44]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Amp1 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[47], pRecvData->Data[46]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Amp2 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[49], pRecvData->Data[48]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Amp3 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[51], pRecvData->Data[50]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Amp4 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[53], pRecvData->Data[52]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Amp5 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[55], pRecvData->Data[54]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.EnvelopEnergy = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[57], pRecvData->Data[56]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Phase1 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[59], pRecvData->Data[58]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Phase2 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[61], pRecvData->Data[60]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Phase3 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[63], pRecvData->Data[62]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymY.Phase4 = lowbit * n; memset(whereCon, 0, 64); sprintf(whereCon, "channelID='%s'", (strLongAddr + "-Y").c_str()); if ( 0 == sql_ctl->GetTableRows(T_DATA_INFO(TNAME), whereCon) ) { char insertSql[1024] = { 0 }; sprintf(insertSql, "'%s','%s','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%s'", strLongAddr.c_str(), (strLongAddr + "-Y").c_str(), dataDymY.DiagnosisPk, dataDymY.IntegratPk, dataDymY.IntegratRMS, dataDymY.RmsValues, dataDymY.EnvelopEnergy,\ dataDymY.Amp1, dataDymY.Amp2, dataDymY.Amp3, dataDymY.Amp4, dataDymY.Amp5,dataDymY.Phase1, dataDymY.Phase2, dataDymY.Phase3, dataDymY.Phase4, nowTimetamp.c_str()); sql_ctl->InsertData(T_DATA_INFO(TNAME), insertSql); } else { char updateSql[1024] = { 0 }; sprintf(updateSql, "diagnosisPk='%f',integratPk='%f',integratRMS='%f',rmsValues='%f',envelopEnergy='%f',\ Amp1='%f',Amp2='%f',Amp3='%f',Amp4='%f',Amp5='%f',Phase1='%f',Phase2='%f',Phase3='%f',Phase4='%f',timeStamp='%s'",\ dataDymY.DiagnosisPk, dataDymY.IntegratPk, dataDymY.IntegratRMS, dataDymY.RmsValues, dataDymY.EnvelopEnergy,\ dataDymY.Amp1, dataDymY.Amp2, dataDymY.Amp3, dataDymY.Amp4, dataDymY.Amp5,dataDymY.Phase1, dataDymY.Phase2, dataDymY.Phase3, dataDymY.Phase4, nowTimetamp.c_str()); sql_ctl->UpdateTableData(T_DATA_INFO(TNAME), updateSql, whereCon); } print_info("y: %s,%s,diagnosisPk=%f,integratPk=%f,integratRMS=%f,rmsValues=%f,envelopEnergy=%f,Amp1=%f,Amp2=%f,Amp3=%f,Amp4=%f,Amp5=%f,Phase1=%f,Phase2=%f,Phase3=%f,Phase4=%f,timeStamp=%s\n",\ strLongAddr.c_str(), (strLongAddr + "-Y").c_str(), dataDymY.DiagnosisPk, dataDymY.IntegratPk, dataDymY.IntegratRMS, dataDymY.RmsValues, dataDymY.EnvelopEnergy,\ dataDymY.Amp1, dataDymY.Amp2, dataDymY.Amp3, dataDymY.Amp4, dataDymY.Amp5,dataDymY.Phase1, dataDymY.Phase2, dataDymY.Phase3, dataDymY.Phase4, nowTimetamp.c_str()); valNodeFeature["dataNodeNo"] = strLongAddr; valNodeFeature["channelID"] = strLongAddr + "-Y"; valNodeFeature["diagnosisPk"] = dataDymY.DiagnosisPk; valNodeFeature["integratPk"] = dataDymY.IntegratPk; valNodeFeature["integratRMS"] = dataDymY.IntegratRMS; valNodeFeature["rmsValues"] = dataDymY.RmsValues; valNodeFeature["envelopEnergy"] = dataDymY.EnvelopEnergy; valNodeFeature["Amp1"] = dataDymY.Amp1; valNodeFeature["Amp2"] = dataDymY.Amp2; valNodeFeature["Amp3"] = dataDymY.Amp3; valNodeFeature["Amp4"] = dataDymY.Amp4; valNodeFeature["Amp5"] = dataDymY.Amp5; valNodeFeature["Phase1"] = dataDymY.Phase1; valNodeFeature["Phase2"] = dataDymY.Phase2; valNodeFeature["Phase3"] = dataDymY.Phase3; valNodeFeature["Phase4"] = dataDymY.Phase4; valNodeFeature["timeStamp"] = nowTimetamp; valNodeData.append(valNodeFeature); DataRecvDym dataDymZ; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[65], pRecvData->Data[64]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.DiagnosisPk = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[67], pRecvData->Data[66]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.RmsValues = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[69], pRecvData->Data[68]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.IntegratPk = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[71], pRecvData->Data[70]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.IntegratRMS = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[73], pRecvData->Data[72]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Amp1 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[75], pRecvData->Data[74]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Amp2 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[77], pRecvData->Data[76]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Amp3 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[79], pRecvData->Data[78]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Amp4 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[81], pRecvData->Data[80]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Amp5 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[83], pRecvData->Data[82]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.EnvelopEnergy = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[85], pRecvData->Data[84]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Phase1 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[87], pRecvData->Data[86]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Phase2 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[89], pRecvData->Data[88]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Phase3 = lowbit * n; memset(buf, 0, 8); sprintf(buf, "%02x%02x", pRecvData->Data[91], pRecvData->Data[90]); iTemp = (unsigned int)strtol(buf, NULL, 16); highbit = iTemp >> 14 & 0x3; lowbit = iTemp & 0x3fff; switch (highbit) { case 0: n = 0.0001; break; case 1: n = 0.01; break; case 2: n = 1; break; case 3: n = 100; break; } dataDymZ.Phase4 = lowbit * n; memset(whereCon, 0, 64); sprintf(whereCon, "channelID='%s'", (strLongAddr + "-Z").c_str()); if ( 0 == sql_ctl->GetTableRows(T_DATA_INFO(TNAME), whereCon) ) { char insertSql[1024] = { 0 }; sprintf(insertSql, "'%s','%s','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%s'", strLongAddr.c_str(), (strLongAddr + "-Z").c_str(), dataDymZ.DiagnosisPk, dataDymZ.IntegratPk, dataDymZ.IntegratRMS, dataDymZ.RmsValues, dataDymZ.EnvelopEnergy,\ dataDymZ.Amp1, dataDymZ.Amp2, dataDymZ.Amp3, dataDymZ.Amp4, dataDymZ.Amp5,dataDymZ.Phase1, dataDymZ.Phase2, dataDymZ.Phase3, dataDymZ.Phase4, nowTimetamp.c_str()); sql_ctl->InsertData(T_DATA_INFO(TNAME), insertSql); } else { char updateSql[1024] = { 0 }; sprintf(updateSql, "diagnosisPk='%f',integratPk='%f',integratRMS='%f',rmsValues='%f',envelopEnergy='%f',\ Amp1='%f',Amp2='%f',Amp3='%f',Amp4='%f',Amp5='%f',Phase1='%f',Phase2='%f',Phase3='%f',Phase4='%f',timeStamp='%s'",\ dataDymZ.DiagnosisPk, dataDymZ.IntegratPk, dataDymZ.IntegratRMS, dataDymZ.RmsValues, dataDymZ.EnvelopEnergy,\ dataDymZ.Amp1, dataDymZ.Amp2, dataDymZ.Amp3, dataDymZ.Amp4, dataDymZ.Amp5,dataDymZ.Phase1, dataDymZ.Phase2, dataDymZ.Phase3, dataDymZ.Phase4, nowTimetamp.c_str()); sql_ctl->UpdateTableData(T_DATA_INFO(TNAME), updateSql, whereCon); } print_info("Z: %s,%s,diagnosisPk=%f,integratPk=%f,integratRMS=%f,rmsValues=%f,envelopEnergy=%f,Amp1=%f,Amp2=%f,Amp3=%f,Amp4=%f,Amp5=%f,Phase1=%f,Phase2=%f,Phase3=%f,Phase4=%f,timeStamp=%s\n",\ strLongAddr.c_str(), (strLongAddr + "-Z").c_str(), dataDymZ.DiagnosisPk, dataDymZ.IntegratPk, dataDymZ.IntegratRMS, dataDymZ.RmsValues, dataDymZ.EnvelopEnergy,\ dataDymZ.Amp1, dataDymZ.Amp2, dataDymZ.Amp3, dataDymZ.Amp4, dataDymZ.Amp5,dataDymZ.Phase1, dataDymZ.Phase2, dataDymZ.Phase3, dataDymZ.Phase4, nowTimetamp.c_str()); //无线传感器Z信息 valNodeFeature["dataNodeNo"] = strLongAddr; valNodeFeature["channelID"] = strLongAddr + "-Z"; valNodeFeature["diagnosisPk"] = dataDymZ.DiagnosisPk; valNodeFeature["integratPk"] = dataDymZ.IntegratPk; valNodeFeature["integratRMS"] = dataDymZ.IntegratRMS; valNodeFeature["rmsValues"] = dataDymZ.RmsValues; valNodeFeature["envelopEnergy"] = dataDymZ.EnvelopEnergy; valNodeFeature["Amp1"] = dataDymZ.Amp1; valNodeFeature["Amp2"] = dataDymZ.Amp2; valNodeFeature["Amp3"] = dataDymZ.Amp3; valNodeFeature["Amp4"] = dataDymZ.Amp4; valNodeFeature["Amp5"] = dataDymZ.Amp5; valNodeFeature["Phase1"] = dataDymZ.Phase1; valNodeFeature["Phase2"] = dataDymZ.Phase2; valNodeFeature["Phase3"] = dataDymZ.Phase3; valNodeFeature["Phase4"] = dataDymZ.Phase4; valNodeFeature["timeStamp"] = nowTimetamp; valNodeData.append(valNodeFeature); //无线传感器信息 Json::Value root; Json::Value valdatastatic; valdatastatic["TemperatureTop"] = dataStatic.TemTop; valdatastatic["TemperatureBot"] = dataStatic.TemBot; valdatastatic["Dip"] = dataStatic.Dip; valdatastatic["Voltage"] = dataStatic.Voltage; valdatastatic["ChannelType"] = "STATUS"; valdatastatic["ChannelId"] = strLongAddr + "-S"; valdatastatic["TimeStamp"] = nowTimetamp; valdatastatic["dataNodeNo"] = strLongAddr; valNodeData.append(valdatastatic); root["data"] = valNodeData; root["TimeStamp"] = nowTimetamp; root["dataNodeNo"] = strLongAddr; root["dataNodeGatewayNo"] = GlobalConfig::MacAddr_G; Json::FastWriter featureValue; std::string strstatisticData = featureValue.write(root); //传感器发来的数据包中的表示设备信息的数据转化为json格式后,通过调用data_publish将数据传给mqttclient : Topic:wireless/cmd/60294D203717 data_publish(strstatisticData.c_str(), GlobalConfig::Topic_G.mPubData.c_str()); //综上代码,把静态数据,x y z轴的特征值存放到sql数据库中(如果数据原来不存在,则插入新数据;如果存在,则更新数据) print_info("Dip : %d TemBot : %f TemBot : %f Voltage : %d\n", dataStatic.Dip, dataStatic.TemBot, dataStatic.TemTop, dataStatic.Voltage); } void Uart::DealDataNodeWave(const char *pData) { print_info("recv wave\n"); RecvData * pRecvData = (RecvData *)pData; m_VecWaveData.push_back(*pRecvData); print_blue("wave data size is(m_VecWaveData.size) : %d\n",m_VecWaveData.size()); char localtimestamp[32] = { 0 }; GetTimeNet(localtimestamp, 1); // 接收到原始数据信息,则更新时间戳,如果三秒种未收到原始数据,则重新从短地址 9999 切换回 短地址 8888 m_TimeStamp = strtol(localtimestamp, NULL, 10); } void Uart::DealWaveThread() //连续三秒没有原始数据,则处理缓存的原始数据 { unsigned long nowTimeStamp = 0; unsigned long tmpTimeStamp = 0; while (1) { // 接收到原始波形,则 m_TimeStamp 不为零 // 如果当前时间与记录时间超过3秒,要求,m_TimeStamp不变化,而数据在传输,则一定小于3秒 if (0 == m_TimeStamp) { boost::this_thread::sleep(boost::posix_time::seconds(1)); continue; } char localtimestamp[32] = { 0 }; GetTimeNet(localtimestamp, 1); nowTimeStamp = strtol(localtimestamp, NULL, 10); // 避免在未同步时钟导致数据错误 if(nowTimeStamp >= m_TimeStamp) { tmpTimeStamp = nowTimeStamp - m_TimeStamp; } else { tmpTimeStamp = m_TimeStamp - nowTimeStamp; } //if ((nowTimeStamp - m_TimeStamp) > 3) { 时间戳需要修改为绝对值,可能丢失时钟,或工作一会儿,才同步时钟,可能减出异常值 if (tmpTimeStamp > 3) { // TODO: 时间戳需要修改为绝对值,可能丢失时钟,或工作一会儿,才同步时钟,可能减出异常值 print_info("yes!The time difference is more than 3,nowTimeStamp : %ld m_TimeStamp : %ld\n", nowTimeStamp, m_TimeStamp); DealWave(); m_TimeStamp = 0; pUart->UpdateZigbeeInfoCtrl(); GlobalConfig::EnterZigBeeWaveTransmittingFlag_G = NO_ENTER_TRANSMITTING_STATUS; GlobalConfig::EnterZigBeeWaveTransmittingCnt_G = 0; // 准备重新恢复到 8888 PanID,正常接收特征数据 ZigbeeInit(); } else { print_info("NO! The time difference is less than 3,nowTimeStamp : %ld m_TimeStamp : %ld\n", nowTimeStamp, m_TimeStamp); } boost::this_thread::sleep(boost::posix_time::seconds(1)); } } void Uart::DealWave() { print_info("begin deal Wave data !\n"); std::string strShortAddr = ""; std::string strShortAddrTemp; std::string strLongAddr = ""; std::string strFileName = ""; int iChannel = 0; int iChannelTemp = 0; long iTemp = 0; std::vector vecData; char buf[8]; RecvData recvTemp; print_info("all wave data size is(m_VecWaveData.size) : %d\n", m_VecWaveData.size()); while (m_VecWaveData.size() > 0) { //对每个传感器的每个通道进行遍历然后处理数据,例如:传感器1x轴的数据处理完后,再去处理y轴的。传感器1的所有数据处理完后,再处理传感器2的 std::vector::iterator iter = m_VecWaveData.begin(); recvTemp = *iter; memset(buf, 0, 8); sprintf(buf, "%02x%02x", recvTemp.ShortAddr[0], recvTemp.ShortAddr[1]); strShortAddr = std::string(buf); memset(buf, 0, 8); sprintf(buf, "%02d", recvTemp.Type&0xFF); iChannel = boost::lexical_cast(buf); char getLongAddr_sql[32] = { 0 }; sprintf(getLongAddr_sql, "zigbeeShortAddr='%s'", strShortAddr.c_str()); strLongAddr = sql_ctl->GetData(T_SENSOR_INFO(TNAME), T_SENSOR_INFO(ZIGBEELONGADDR), getLongAddr_sql); //print_info("3.1.2.3--->strLongAddr : %s\n", strLongAddr.c_str()); if ( 0 == strLongAddr.length() ) { boost::this_thread::sleep(boost::posix_time::seconds(1)); continue; } std::string ran = ""; int n = 0; int range = 0; float coe = 0; char getrange[32] = {0}; std::string str = "range"; sprintf(getrange, "scope='%s'", str.c_str()); ran = sql_ctl->GetData(T_SENSOR_INFO(TNAME), T_SENSOR_INFO(RANGE), getrange); //print_info("@@@@@@@@@@@@@@@@@@@@@@ran=%s\n",ran.c_str()); memset(getrange, 0, 32); sprintf(getrange, "%s", ran.c_str()); n = (int)strtol(getrange, NULL, 32); //print_light_purple("!!!!!!!!!!!!!n=%d\n",n); switch (n) { case 0:{ range = 8; coe = 8*1.0/32767; } break; case 1:{ range = 16; coe = 16*1.0/32767; } break; case 2:{ range = 32; coe = 32*1.0/32767; } break; case 3:{ range = 64; coe = 64*1.0/32767; } break; } //print_blue("##############range = %d,%f\n",range,coe); for(; iter != m_VecWaveData.end();) { recvTemp = *iter; memset(buf, 0, 8); sprintf(buf, "%02x%02x", recvTemp.ShortAddr[0], recvTemp.ShortAddr[1]); strShortAddrTemp = std::string(buf); memset(buf, 0, 8); sprintf(buf, "%02d", recvTemp.Type & 0xFF); iChannelTemp = boost::lexical_cast(buf); if( 0 == strShortAddr.compare(strShortAddrTemp) && (iChannel == iChannelTemp) ) { float fTemp; for (int i = 0; i < 46; i++) { memset(buf, 0, 8); sprintf(buf, "%02x%02x", recvTemp.Data[2*i+1],recvTemp.Data[i*2]); iTemp = strtol(buf, NULL, 16); if (iTemp < 0x8000) { fTemp = iTemp * coe; } else { fTemp = (((~iTemp)&0xffff) + 1) * -coe; } //print_blue("wave data is %u,%f\n",iTemp,fTemp); vecData.push_back(fTemp); } iter = m_VecWaveData.erase(iter); } else { iter++; } } /*char getLongAddr_sql[32] = { 0 }; sprintf(getLongAddr_sql, "zigbeeShortAddr='%s'", strShortAddr.c_str()); strLongAddr = sql_ctl->GetData(T_SENSOR_INFO(TNAME), T_SENSOR_INFO(ZIGBEELONGADDR), getLongAddr_sql); print_info("strLongAddr : %s\n", strLongAddr.c_str());*/ if ( 0 == strLongAddr.length() ) { boost::this_thread::sleep(boost::posix_time::seconds(1)); continue; } std::string strChannelID = ""; switch (iChannel) { case 3:{ strFileName = "/opt/data/" + strLongAddr + "-X.dat"; strChannelID = strLongAddr + "-X"; } break; case 4:{ strFileName = "/opt/data/" + strLongAddr + "-Y.dat"; strChannelID = strLongAddr + "-Y"; } break; case 5:{ strFileName = "/opt/data/" + strLongAddr + "-Z.dat"; strChannelID = strLongAddr + "-Z"; } break; default: break; } if (access(strFileName.c_str(), 0) > 0) { //如果存在原始数据删除原来的,只保留一份 std::string strCmd = "rm " + strFileName; system(strCmd.c_str()); } FILE *fp = fopen(strFileName.c_str(), "w"); print_info("fopen FIle vecData.size : %d\n", vecData.size()); float frTemp; char buf[33]={0x00}; std::string strWaveData = ""; for (int i = 0; i < vecData.size(); i++) { frTemp = vecData[i]; fwrite(&frTemp,sizeof(float),1,fp); memset(buf,0x00,sizeof(buf)); sprintf(buf, "%.2f", vecData[i]); std::string waveTemp(buf); if(i == 0) strWaveData = waveTemp; strWaveData = strWaveData + "," + waveTemp; } vecData.clear(); fclose(fp); // Json::Value valWaveData; valWaveData["number"] = strWaveData.length(); valWaveData["channelId"] = strChannelID; valWaveData["dataNodeNo"] = strLongAddr; valWaveData["dataNodeGatewayNo"] = GlobalConfig::MacAddr_G; valWaveData["SensorEngineeringUnit"] = ""; valWaveData["waveData"] = strWaveData; Json::FastWriter WaveValue; std::string WaveData = WaveValue.write(valWaveData); //传感器发来的数据包中的表示设备信息的数据转化为json格式后,通过调用data_publish将数据传给mqttclient : Topic:wireless/cmd/60294D203717 data_publish(WaveData.c_str(), GlobalConfig::Topic_G.mPubWaveData.c_str()); print_info("write data to filename %s\n", strFileName.c_str()); boost::this_thread::sleep(boost::posix_time::seconds(1)); } // memset(buf, 0, 8); // sprintf(buf, "%02x%02x", recvTemp.ShortAddr[0], recvTemp.ShortAddr[1]); // std::string strShortAddr = std::string(buf); } void Uart::modify_info(unsigned short id, char * zigbee) { int i, j, ret,con; char command[100]; char command1[20]; char tmp = 0; command[0] = 0xab; command[1] = 0xbc; command[2] = 0xcd; command[3] = 0xd6; command[4] = ((char *)&id)[1]; command[5] = ((char *)&id)[0]; command[6] = 0; if (zigbee != NULL) { con = 71; memcpy(&(command[6]), zigbee + 4, 65); } else { con = 6; } for(i = 0; i < con; i++) { tmp += command[i]; } command[i] = tmp; WriteToUart(command, i+1); boost::this_thread::sleep(boost::posix_time::seconds(1)); } void Uart::zigbee_reset(unsigned short pad, unsigned short type) { char command[10],tmp = 0,i; command[0] = 0xab; command[1] = 0xbc; command[2] = 0xcd; command[3] = 0xd9; command[4] = ((char *)&pad)[1]; command[5] = ((char *)&pad)[0]; command[6] = ((char *)&type)[1]; command[7] = ((char *)&type)[0]; for(i = 0; i<8; i++) { tmp += command[i]; } command[8] = tmp; WriteToUart(command, 9); } void Uart::WriteChanl2Zigbee(unsigned char pad) { print_info("WriteChanl2Zigbee : %d\n", pad); unsigned char pad1 = pad; unsigned short tmp; tmp = GlobalConfig::Zigbee_G.MyAddr; //swap((char *)&pad1); swap((char *)&tmp); GlobalConfig::Zigbee_G.Chan = pad1; modify_info(tmp, (char *)& GlobalConfig::Zigbee_G); zigbee_reset(tmp, 1); } void Uart::WritePanId2Zigbee(unsigned short pad) { print_info("WritePanId2Zigbee : %d\n", pad); unsigned short pad1 = pad,tmp; tmp = GlobalConfig::Zigbee_G.MyAddr; swap((char *)&pad1); swap((char *)&tmp); GlobalConfig::Zigbee_G.PanID = pad1; modify_info(tmp, (char *)&GlobalConfig::Zigbee_G); zigbee_reset(tmp, 1); } void Uart::WriteShortAddr2Zigbee(unsigned short pad) { print_info("WriteShortAddr2Zigbee : %4x\n", (unsigned short)pad); unsigned short pad1 = pad,tmp; tmp = GlobalConfig::Zigbee_G.MyAddr; swap((char *)&pad1); swap((char *)&tmp); GlobalConfig::Zigbee_G.MyAddr = pad1; modify_info(tmp, (char *)& GlobalConfig::Zigbee_G); zigbee_reset(tmp, 1); } void Uart::ZigbeeInit() { std::string strPanId = GlobalConfig::MacAddr_G.substr(8); print_info("strPanId : %s\n", strPanId.c_str()); // 新增管理ZigBee代码 std::string strchan = ReadStrByOpt(ZIGBEECONFIG, "Zigbee", "channel"); unsigned char Chan = (unsigned char)strtol(strchan.c_str(), NULL, 10); printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%the chan = %u\n",Chan); print_info("ZigbeeInfo_G.Channel=%d\n",GlobalConfig::ZigbeeInfo_G.Channel); if(Chan > 10 && Chan < 27) { if (Chan != GlobalConfig::ZigbeeInfo_G.Channel) { printf("the chanl is different\n"); WriteChanl2Zigbee(Chan); boost::this_thread::sleep(boost::posix_time::seconds(1)); } } if (0 != GlobalConfig::ZigbeeInfo_G.PanID.compare(strPanId.c_str())) { long lShortAddr = strtol(strPanId.c_str(), NULL, 16); unsigned short panid = lShortAddr & 0xffff; print_info("the panid is different\n"); WritePanId2Zigbee(panid); boost::this_thread::sleep(boost::posix_time::seconds(1)); } if (0 != GlobalConfig::ZigbeeInfo_G.MyAddr.compare("8888")) { unsigned short shortAddr = 0x8888; print_info("the short addr is different\n"); WriteShortAddr2Zigbee(shortAddr); boost::this_thread::sleep(boost::posix_time::seconds(1)); LOG_INFO("[ZigbeeInit---------] ZigBee PanID: %s ; Channel: %d ; MyAddr : %4x ",GlobalConfig::ZigbeeInfo_G.PanID.c_str(),GlobalConfig::ZigbeeInfo_G.Channel, (unsigned short)GlobalConfig::Zigbee_G.MyAddr); // 更新GlobalConfig::ZigbeeInfo_G.MyAddr,用于外部显示 char tmp[16]; sprintf(tmp,"%4x",(unsigned short)GlobalConfig::Zigbee_G.MyAddr); std::string strTmp(tmp); GlobalConfig::ZigbeeInfo_G.MyAddr = strTmp; } print_info("ZigbeeInfo_G.MyAddr=%s\n",GlobalConfig::ZigbeeInfo_G.MyAddr.c_str()); }