wirelessgateway/uart/SH_Uart.cpp

2228 lines
72 KiB
C++
Raw Normal View History

2021-09-18 13:45:24 +08:00
#include <signal.h>
#include <boost/thread/thread.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/bind.hpp>
#include <boost/timer.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#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);
update = false;
2021-09-18 13:45:24 +08:00
}
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; i<pLen; i++){
print_debug("%02X ", *(strSend+i) & 0xFF);
}
print_debug("\nWrite To Uart End.\n");
//#endif
if (mUart.is_open()) {
mUart.async_write_some(buffer(strSend,pLen),
mStrand.wrap(
boost::bind(&Uart::WriteHandle,this,strSend,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred))
);
}
}
void Uart::ReadFromUart()
{
if (mUart.is_open()) {
mUart.async_read_some(buffer(&mUartRecvBuf[mRdLength], BUF_LENGTH-mRdLength-4),
mStrand.wrap(
boost::bind(&Uart::ReadHandle,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred))
);
}
print_info("async_read_some,wait......................................\n");
}
void Uart::Run()
{
mIoSev.run();
}
void Uart::Stop()
{
if (mUart.is_open())
mUart.close();
mIoSev.stop();
}
void Uart::ReadHandle(const boost::system::error_code &ec,size_t bytesRead)
{
try{
if (ec) {
mRdLength = 0;
ReadFromUart();
return ;
}
else
{ //长度检测
/* printf("recv uart len in ZigBee short address %4x : %d\n recv uart data:",
(unsigned short)GlobalConfig::Zigbee_G.MyAddr, bytesRead);
for (unsigned int i = 0; i < bytesRead; i++)
print_debug("%02X ",mUartRecvBuf[i]&0xFF);
*/
int iPackageSize = bytesRead / 100;
if (0 == iPackageSize) {
iPackageSize = 1;
}
int Count = bytesRead;
/*每次看到这块代码时总感觉不妥因为bytesRead是100的整数倍时对结果不影响如果不是则会造成数据丢失例如1024时iPackageSize的值
1024线 线线
while循环bytesRead是否大于03
ABBCCD还是AA55AAABBCCD就处理74字节数据AA55AA就处理100自己数据buf减去处理的大小数据
while循环*/
for (int j = 0; j < iPackageSize; j++) {
char buf[6];
char buf1[2];
char mUartRecvPackage[100] = {0};
// 多包分包,解包,
if (Count < 100) {
memcpy(mUartRecvPackage, &mUartRecvBuf[j * 100], Count);
} else {
memcpy(mUartRecvPackage, &mUartRecvBuf[j * 100], 100);
Count = Count - 100;
}
sprintf(&buf[0], "%02X", mUartRecvPackage[0]&0xFF);
sprintf(&buf[2], "%02X", mUartRecvPackage[1]&0xFF);
sprintf(&buf[4], "%02X", mUartRecvPackage[2]&0xFF);
//sprintf(&buf1[0], "%02X", mUartRecvPackage[3]&0xFF);
std::string strHeadFlag(buf);
//std::string strType(buf1);
print_info("data package head command type:%s\n", strHeadFlag.c_str());
if ( 0 == strHeadFlag.compare("ABBCCD") && (0xD1 == (mUartRecvPackage[3]&0xFF))) {
UpdateZigbeeInfo(mUartRecvPackage);
}
if ( 0 == strHeadFlag.compare("DEDFEF") ) {
update = true;
LOG_INFO("ReadHandle flag = %s\n",strHeadFlag.c_str());
2021-09-18 13:45:24 +08:00
}
if ( 0 == strHeadFlag.compare("AA55AA") ) {
DealRecvData(mUartRecvPackage);
}
}
}
//读串口循环
ReadFromUart();
} catch(...) {
print_error("PlatFormInit exception happend.\n");
// LOG_ERROR("%s,%d\n", __FUNCTION__, __LINE__);
}
}
void Uart::setCallBack(onReceiveUart _callback)
{
m_callback = _callback;
}
void Uart::DataAnalysis_R(DevDataOfGwid &pData)
{
mLocalTime = boost::posix_time::microsec_clock::local_time();
m_callback(pData);
mLocalTime = boost::posix_time::microsec_clock::local_time();
}
void Uart::WriteHandle(const char *strSend,const boost::system::error_code &ec,size_t bytesWrite)
{
if (ec) {
print_error("Fail To Write Uart! ]\n");
// LOG_ERROR("Fail To Write Uart! ]\n");
} else {
// print_info("[ To Uart ][ Bytes:%d ]\n",bytesWrite);
2021-09-18 13:45:24 +08:00
}
}
void Uart::ThreadInit()
{
// SignalInit();
}
void Uart::DataAnalysis_W(DevData &pData,bool pFlag)
{
this->WriteToUart(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<int>(buff);
memset(buff, 0, 8);
sprintf(buff, "%02d", pData[37]&0xFF);
GlobalConfig::ZigbeeInfo_G.Channel = boost::lexical_cast<int>(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());
2021-09-18 13:45:24 +08:00
}
void int2bytes(int i, unsigned char* bytes, int size) {
// byte[] bytes = new byte[4];
memset(bytes,0,sizeof(unsigned char) * size);
bytes[0] = (unsigned char) (0xff & i);
bytes[1] = (unsigned char) ((0xff00 & i) >> 8);
bytes[2] = (unsigned char) ((0xff0000 & i) >> 16);
bytes[3] = (unsigned char) ((0xff000000 & i) >> 24);
}
void Uart::UpdateWirelessNode(unsigned char* id)
{
LOG_INFO("UpdateWirelessNode id = %02x %02x\n",id[0],id[1]);
//compare hardversion in update list
std::vector<std::string> strHWversion;
std::string strFileName = "";
strHWversion = ReadStrByOpt("/opt/update/DataNode/config.json",strFileName);
char gethardVersion_sql[32] = { 0 };
sprintf(gethardVersion_sql, "zigbeeShortAddr='%s'", id);
std::string hardVersion = sql_ctl->GetData(T_SENSOR_INFO(TNAME), T_SENSOR_INFO(HARDVERSION), gethardVersion_sql);
int thisindex = -1;
for(int i = 0; i < strHWversion.size();i++){
if(hardVersion == strHWversion[i]){
thisindex = i;
break;
}
}
printf("thisindex = %d\n",thisindex);
if(thisindex < 0)
return;
FILE * pFile=NULL;
int thisSize = 0;
char *buffer=NULL;
strFileName = "/opt/update/DataNode/" + strFileName;
pFile = fopen (strFileName.c_str(),"rb");
if (pFile==NULL) perror ("Error opening file");
else
{
while (fgetc(pFile) != EOF) {
++thisSize;
}
rewind(pFile);
buffer = (char*)malloc(thisSize);//
fread (buffer, sizeof (char), thisSize, pFile);
fclose (pFile);
unsigned char Data[12]={0x00};
unsigned char size[4]={0x00};
//帧头[3byte] 节点地址[2byte] 数据类型[1byte] 序号[1byte] 升级包大小[4byte] CRC校验[1byte]
Data[0]=0xAA;
Data[1]=0x55;
Data[2]=0xAA;
Data[3]=id[0] & 0xFF;
Data[4]=id[1] & 0xFF;
Data[5]=0x07;
Data[6]=0x00;
int2bytes(thisSize,size,4);
Data[7]=size[3];
Data[8]=size[2];
Data[9]=size[1];
Data[10]=size[0];
unsigned char tmp = 0x00;
for(int i = 0 ; i < 11;i++){
tmp +=Data[i];
}
Data[11]=tmp;
WriteToUart((const char*)Data,12);
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
int Count = thisSize / 92;
int lastSize = thisSize % 92;
unsigned char UpdateData[100]={0x00};
//帧头[3byte] 节点地址[2byte] 数据类型[1byte] 序号[1byte] 数据包[92byte] CRC校验[1byte]
print_info("Start Update!!! file Size = %d\n",thisSize);
for(int j = 0; j < Count;j++){
UpdateData[0]=0xAA;
UpdateData[1]=0x55;
UpdateData[2]=0xAA;
UpdateData[3]=id[0];
UpdateData[4]=id[1];
UpdateData[5]=0x08;
UpdateData[6]=0xff & j;
memcpy(&UpdateData[7],buffer+92*j,92);
tmp = 0x00;
for(int k = 0; k < 99;k++){
tmp +=UpdateData[k];
}
UpdateData[99] = tmp;
WriteToUart((const char*)UpdateData,100);
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
memset(UpdateData,0x00,sizeof(UpdateData));
}
printf("Count =%d,lastSize = %d\n",Count,lastSize);
if(lastSize > 0){
UpdateData[0]=0xAA;
UpdateData[1]=0x55;
UpdateData[2]=0xAA;
UpdateData[3]=id[0];
UpdateData[4]=id[1];
UpdateData[5]=0x08;
UpdateData[6]=0xff & Count;
memcpy(&UpdateData[7],buffer+92*Count,lastSize);
tmp = 0x00;
for(int k = 0; k < 99;k++){
tmp +=UpdateData[k];
}
UpdateData[99] = tmp;
WriteToUart((const char*)UpdateData,100);
memset(UpdateData,0x00,sizeof(UpdateData));
}
print_info("Update END!!! file Size = %d\n",thisSize);
}
free(buffer);
ZigbeeInit();
update = false;
LOG_INFO("UpdateWirelessNode success");
}
2021-09-18 13:45:24 +08:00
void Uart::DealRecvData(const char *pData)
{
char buf[8];
sprintf(buf, "%02d", pData[5]&0xFF);
int flag = boost::lexical_cast<int>(buf);
print_info("the data package type(1,2,3,4,5,6) is %s,%x\n",buf,pData[5]&0xFF);
2021-09-18 13:45:24 +08:00
switch (flag)
{
case 1:{//0x01:设备信息
2021-09-18 13:45:24 +08:00
DealDataNodeInfo(pData);
}
break;
case 2:{//0x02:特征值
2021-09-18 13:45:24 +08:00
DealDataNodeFeature(pData, 0);
}
break;
case 3:{//0x03:长波形X轴
2021-09-18 13:45:24 +08:00
DealDataNodeWave(pData);
}
break;
case 4:{//0x04:长波形Y轴
2021-09-18 13:45:24 +08:00
DealDataNodeWave(pData);
}
break;
case 5:{//0x05:长波形Z轴
2021-09-18 13:45:24 +08:00
DealDataNodeWave(pData);
}
break;
case 6:{//0x06:特征值+长波形
2021-09-18 13:45:24 +08:00
DealDataNodeFeature(pData, 1);
}
break;
case 7:{//0x07:升级
//DealDataNodeFeature(pData, 1);
}
break;
2021-09-18 13:45:24 +08:00
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];//设备状态标志 1 byte
2021-09-18 13:45:24 +08:00
DataNodeInfo dataNodeInfo;
dataNodeInfo.EquipSta = boost::lexical_cast<int>(chTemp >> 2 & 0x1);
dataNodeInfo.TemTopFlag = boost::lexical_cast<int>(chTemp >> 3 & 0x1);
dataNodeInfo.TemBotFlag = boost::lexical_cast<int>(chTemp >> 4 & 0x1);
dataNodeInfo.ZigbeeFlag = boost::lexical_cast<int>(chTemp >> 5 & 0x1);
dataNodeInfo.AccFlag = boost::lexical_cast<int>(chTemp >> 6 & 0x1);
dataNodeInfo.InitFlag = boost::lexical_cast<int>(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);//Zigbee MAC 8 byte
2021-09-18 13:45:24 +08:00
chTemp = pRecvData->Data[9];//硬件版本 1 byte
2021-09-18 13:45:24 +08:00
memset(buf, 0, 32);
sprintf(buf, "%02x", chTemp);
dataNodeInfo.HardVersion = std::string(buf);
chTemp = pRecvData->Data[10];//软件版本 1 byte
2021-09-18 13:45:24 +08:00
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, "%d", BUILD_UINT32(pRecvData->Data[11], pRecvData->Data[12], pRecvData->Data[13], pRecvData->Data[14]));
dataNodeInfo.BpNo = std::string(buf);//生产批号 4 byte
2021-09-18 13:45:24 +08:00
memset(buf, 0, 32);
sprintf(buf, "%d", BUILD_UINT32(pRecvData->Data[15], pRecvData->Data[16], pRecvData->Data[17], pRecvData->Data[18]));
dataNodeInfo.SerialNo = std::string(buf);//生产序列号 4 byte
2021-09-18 13:45:24 +08:00
memset(buf, 0, 32);
sprintf(buf, "%d", BUILD_UINT32(pRecvData->Data[19], pRecvData->Data[20], pRecvData->Data[21], pRecvData->Data[22]));
dataNodeInfo.FirstPowerTime = std::string(buf);//首次上电日期 4 byte
2021-09-18 13:45:24 +08:00
//23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38=>序号13 无线信号强度
memset(buf, 0, 32);
sprintf(buf, "%d", BUILD_UINT32(pRecvData->Data[23], pRecvData->Data[24], pRecvData->Data[25], pRecvData->Data[26]));
dataNodeInfo.WakeupTime = std::string(buf);//唤醒次数 4 byte
memset(buf, 0, 32);
sprintf(buf, "%d", BUILD_UINT32(pRecvData->Data[27], pRecvData->Data[28], pRecvData->Data[29], pRecvData->Data[30]));
dataNodeInfo.StaticTime = std::string(buf);//特征值发送次数 4 byte
memset(buf, 0, 32);
sprintf(buf, "%d", BUILD_UINT32(pRecvData->Data[31], pRecvData->Data[32], pRecvData->Data[33], pRecvData->Data[34]));
dataNodeInfo.WaveTime = std::string(buf);//原始波形发送次数 4 byte
memset(buf, 0, 32);
sprintf(buf, "%02x%02x", pRecvData->Data[35], pRecvData->Data[36]);
dataNodeInfo.BateryV = BUILD_UINT16(pRecvData->Data[35],pRecvData->Data[36]);//电池电压 2 byte
memset(buf, 0, 32);
sprintf(buf, "%02x", pRecvData->Data[37]);
dataNodeInfo.ProductNo = std::string(buf);//产品型号 1 byte
2021-09-18 13:45:24 +08:00
// 获取 RSSI
chTemp = pRecvData->Data[38];
memset(buf, 0, 32);
sprintf(buf, "%d", chTemp);
dataNodeInfo.RSSI = boost::lexical_cast<int>(buf); //无线信号强度 1 byte
2021-09-18 13:45:24 +08:00
chTemp = pRecvData->Data[39];
memset(buf, 0, 32);
sprintf(buf, "%02x", chTemp);
dataNodeInfo.ConfigFlag = ((0 == std::string(buf).compare("aa")) ? 1 : 0); //配置标志 1 byte
2021-09-18 13:45:24 +08:00
memset(buf, 0, 32);
sprintf(buf, "%u%u", pRecvData->Data[40], pRecvData->Data[41]);
dataNodeInfo.FeatureInterVal = boost::lexical_cast<unsigned int>(buf); //唤醒周期 2 byte
2021-09-18 13:45:24 +08:00
chTemp = pRecvData->Data[42];
memset(buf, 0, 32);
// sprintf(buf, "%02x", chTemp);
sprintf(buf, "%d",(unsigned int)chTemp); // yxq
dataNodeInfo.WaveInterVal = boost::lexical_cast<unsigned int>(buf);//原始波形发送周期 2 byte
printf("====WaveInterVal = %s\n",buf);
2021-09-18 13:45:24 +08:00
memset(buf, 0, 32);
sprintf(buf, "%02x%02x", pRecvData->Data[43], pRecvData->Data[44]); //Zigbee PID 2 byte
2021-09-18 13:45:24 +08:00
dataNodeInfo.ZigbeePanId = std::string(buf);
chTemp = pRecvData->Data[45];
memset(buf, 0, 32);
sprintf(buf, "%d", chTemp);
dataNodeInfo.ZigbeeChannel = boost::lexical_cast<int>(buf);//Zigbee 信道 1 byte
2021-09-18 13:45:24 +08:00
memset(buf, 0, 32);
sprintf(buf, "%02x%02x", pRecvData->Data[46], pRecvData->Data[47]);//Zigbee 本地地址 2 byte
2021-09-18 13:45:24 +08:00
dataNodeInfo.ZigbeeShortAddr = std::string(buf);
memset(buf, 0, 32);
sprintf(buf, "%02x%02x", pRecvData->Data[48], pRecvData->Data[49]);//Zigbee 目标地址 2 byte
2021-09-18 13:45:24 +08:00
dataNodeInfo.ZigbeeDesAddr = std::string(buf);
//50 51 52=》序号23 zigbee重试间隔
memset(buf, 0, 32);
sprintf(buf, "%02x", pRecvData->Data[50]);//Zigbee 发射功率 1 byte
dataNodeInfo.ZigbeePower = boost::lexical_cast<unsigned int>(buf);
memset(buf, 0, 32);
sprintf(buf, "%02x", pRecvData->Data[51]);//Zigbee 重试次数 1 byte
dataNodeInfo.ZigbeeRetry = boost::lexical_cast<unsigned int>(buf);
memset(buf, 0, 32);
sprintf(buf, "%02x", pRecvData->Data[52]);//Zigbee 重试间隔 1 byte
dataNodeInfo.ZigbeeRetryGap = boost::lexical_cast<unsigned int>(buf);
2021-09-18 13:45:24 +08:00
chTemp = pRecvData->Data[53];
dataNodeInfo.Range = boost::lexical_cast<int>(chTemp >> 2 & 0x3);
dataNodeInfo.SamplingRate = boost::lexical_cast<int>(chTemp & 0x3);
// 54=》序号25 ACC采样时间
memset(buf, 0, 32);
sprintf(buf, "%02x", pRecvData->Data[54]);//ACC 采样时间 1 byte
dataNodeInfo.ACCSampleTime = boost::lexical_cast<unsigned int>(buf);
2021-09-18 13:45:24 +08:00
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<std::string>(iTemp);
} else {
dataNodeInfo.StartBrands += ("," + boost::lexical_cast<std::string>(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<std::string>(iTemp);
} else {
dataNodeInfo.StopBrands += ("," + boost::lexical_cast<std::string>(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<std::string>(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<std::string>(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<std::string>(iTemp);
} else {
dataNodeInfo.FaultFrequency += ("," + boost::lexical_cast<std::string>(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<std::string>(lTimeStamp);
chTemp = pRecvData->Data[91];
memset(buf, 0, 32);
sprintf(buf, "%d", chTemp);
dataNodeInfo.VIntegralFilterFrequency = boost::lexical_cast<int>(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);
}
printf("11111111111\n");
2021-09-18 13:45:24 +08:00
char insertSql[1024] = { 0 };
sprintf(insertSql, "'%s','%s','%d','%d','%d','%d','%d','%d',\
'%s','%s','%s','%s','%s','%s',\
'%s','%d','%d','%s','%d','%s',\
'%s','%u','%d','%d','%s','%d','%s','%s',\
'%s','%d','%s','%s','%s',\
'%d','%d','%d','%d','%s','%s','%d','%d'",
2021-09-18 13:45:24 +08:00
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.WakeupTime.c_str(),\
dataNodeInfo.StaticTime.c_str(),dataNodeInfo.WaveTime.c_str(),dataNodeInfo.BateryV,dataNodeInfo.ProductNo.c_str(),dataNodeInfo.ConfigFlag, dataNodeInfo.StartBrands.c_str(), \
dataNodeInfo.StopBrands.c_str(), dataNodeInfo.FeatureInterVal, dataNodeInfo.WaveInterVal, dataNodeInfo.SamplingRate,"",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(), \
dataNodeInfo.ZigbeePower,dataNodeInfo.ZigbeeRetry,dataNodeInfo.ZigbeeRetryGap,dataNodeInfo.ACCSampleTime,"1", dataNodeInfo.ConfigDate.c_str(),dataNodeInfo.VIntegralFilterFrequency,dataNodeInfo.RSSI);
2021-09-18 13:45:24 +08:00
sql_ctl->InsertData(T_SENSOR_INFO(TNAME), insertSql);
printf("=======insertSql======== %s\n",insertSql);
2021-09-18 13:45:24 +08:00
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 Topicwireless/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)
{
print_info("recv feature\n");
RecvData * pRecvData = (RecvData *)pData;
char buf[8];
sprintf(buf, "%02x%02x", pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]);
LOG_INFO("DealDataNodeFeature %02x%02x\n",pRecvData->ShortAddr[0], pRecvData->ShortAddr[1]);
std::string strShortAddr = std::string(buf);
print_info("zigbeeShortAddr='%s'", strShortAddr.c_str());
2021-09-18 13:45:24 +08:00
if (1 == flag) {
print_info("recv wave minute\n");
unsigned short shortAddr = 0x9999;
WriteShortAddr_DistAddr2Zigbee(shortAddr,pRecvData->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);
UpdateWirelessNode(pRecvData->ShortAddr);
2021-09-18 13:45:24 +08:00
// 进入传输原始数据状态,启动计数 60秒
GlobalConfig::EnterZigBeeWaveTransmittingFlag_G = ENTER_TRANSMITTING_STATUS;
GlobalConfig::EnterZigBeeWaveTransmittingCnt_G = 0;
}
2021-09-18 13:45:24 +08:00
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;//设备温度
2021-09-18 13:45:24 +08:00
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;//环境温度
2021-09-18 13:45:24 +08:00
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";
2021-09-18 13:45:24 +08:00
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";
2021-09-18 13:45:24 +08:00
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";
2021-09-18 13:45:24 +08:00
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 Topicwireless/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);
2021-09-18 13:45:24 +08:00
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<float> 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<RecvData>::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<int>(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<int>(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 Topicwireless/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_distaddr_info(unsigned short id, char * zigbee,unsigned char* distAddr)
{
/*char command[6];
command[0] = 0xDE;
command[1] = 0xDF;
command[2] = 0xEF;
command[3] = 0xD2;
command[4] = destaddr[0];
command[5] = destaddr[1];
WriteToUart(command, 6);*/
2021-09-18 13:45:24 +08:00
}
2021-09-18 13:45:24 +08:00
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::WriteShortAddr_DistAddr2Zigbee(unsigned short pad,unsigned char* id)
2021-09-18 13:45:24 +08:00
{
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 = BUILD_UINT16(id[0],id[1]);
GlobalConfig::ZigbeeInfo_G.MyAddr = "9999";
modify_info(tmp, (char *)& GlobalConfig::Zigbee_G);
zigbee_reset(tmp, 1);
}
2021-09-18 13:45:24 +08:00
void Uart::ZigbeeInit()
{
2021-09-18 13:45:24 +08:00
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());
}