www.pudn.com > GSMTest1.rar > TransJS.cpp
// TransJS.cpp : implementation file //变压器监视界面 #include "stdafx.h" #include "GSMTest.h" #include "TransJS.h" #include "QueryDlg.h" #include "pdu.h" #include "winsock.h" #include#include "database.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTransJS dialog CTransJS::CTransJS(CWnd* pParent /*=NULL*/) : CDialog(CTransJS::IDD, pParent) { //{{AFX_DATA_INIT(CTransJS) m_sCurTime = _T(""); m_sStatus1 = _T(""); m_sStatus2 = _T(""); //}}AFX_DATA_INIT } void CTransJS::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTransJS) DDX_Control(pDX, IDC_TRANS_LIST, m_ctrTrans); DDX_Text(pDX, IDC_CUR_TIME, m_sCurTime); DDX_Text(pDX, IDC_STATUS1, m_sStatus1); DDX_Text(pDX, IDC_STATUS, m_sStatus2); DDX_Control(pDX, IDC_GSMCOMM, m_ctrGsm); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTransJS, CDialog) //{{AFX_MSG_MAP(CTransJS) ON_BN_CLICKED(IDC_REFRESH, OnRefresh) ON_BN_CLICKED(IDC_QUERY_BUTTON, OnQuery) ON_BN_CLICKED(IDC_CHECK, OnCheck) ON_WM_PAINT() ON_WM_TIMER() ON_BN_CLICKED(IDC_CFG_STAND, OnCfgStand) ON_BN_CLICKED(IDC_PRE_PAGE, OnPrePage) ON_BN_CLICKED(IDC_NEXT_PAGE, OnNextPage) ON_BN_CLICKED(IDC_START2, OnStart) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTransJS message handlers BOOL CTransJS::OnInitDialog() { CDialog::OnInitDialog(); ShowWindow(SW_MAXIMIZE); //设置控件大小,位置等. CRect rcClient; GetWindowRect(&rcClient); int cx = rcClient.Width(); int cy = rcClient.Height(); GetDlgItem(IDC_TRANS_LIST)->MoveWindow(120,20,cx-150,cy-200,true); GetDlgItem(IDC_FOOTER)->MoveWindow(0,cy-60,300,20,TRUE); GetDlgItem(IDC_PRE_PAGE)->MoveWindow(350,cy-60,50,20,TRUE); GetDlgItem(IDC_NEXT_PAGE)->MoveWindow(450,cy-60,50,20,TRUE); GetDlgItem(IDC_CUR_TIME)->MoveWindow(650,cy-60,180,20,TRUE); // TODO: Add extra initialization here m_nNumofPage=5; m_nCurPage=1; GetDlgItem(IDC_PRE_PAGE)->EnableWindow(FALSE); m_ctrTrans.InsertColumn(0,"ID",LVCFMT_CENTER,30,0); m_ctrTrans.InsertColumn(1,"变压器TEL",LVCFMT_CENTER,120,1); m_ctrTrans.InsertColumn(2,"电流(A相)",LVCFMT_LEFT,80,2); m_ctrTrans.InsertColumn(3,"电流(B相)",LVCFMT_LEFT,80,2); m_ctrTrans.InsertColumn(4,"电流(C相)",LVCFMT_LEFT,80,2); m_ctrTrans.InsertColumn(5,"电压(A相)",LVCFMT_LEFT,80,3); m_ctrTrans.InsertColumn(6,"电压(B相)",LVCFMT_LEFT,80,3); m_ctrTrans.InsertColumn(7,"电压(C相)",LVCFMT_LEFT,80,3); m_ctrTrans.InsertColumn(8,"功率因数",LVCFMT_LEFT,80,4); m_ctrTrans.InsertColumn(9,"三相功率",LVCFMT_LEFT,100,5); m_ctrTrans.InsertColumn(10,"温度",LVCFMT_LEFT,50,6); m_ctrTrans.InsertColumn(11,"状态",LVCFMT_CENTER,50,6); m_ctrTrans.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES); ShowTrans(); OnStart(); //{AfxMessageBox("监控系统启动失败!");CDialog::OnCancel();} SetTimer(1,1000,NULL);//时间显示 SetTimer(2,5000,NULL);//定时检查短信 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CTransJS::ShowTrans() { CDatabase database; try { database.ConnectDB(); //AfxMessageBox("连接服务器成功!"); CString charset="set charset gb2312;";//使之正常显示中文,或用set character_set_results=gb2312; database.ExecuteSQL(charset,charset.GetLength());//执行语句. CString limit; limit.Format("trans_info limit %d,%d",(m_nCurPage-1)*m_nNumofPage,m_nCurPage*m_nNumofPage); Data_Param result; result.tab_name=limit.GetBuffer(40); result.select_exp="trans_id,trans_TEL,Ia,Ib,Ic,Ua,Ub,Uc,F,Temp,remark"; if(database.SelectAll(&result)) { int count=(int)database.GetRowNum(); if(count<=0) { m_nCurPage-=1; GetDlgItem(IDC_NEXT_PAGE)->EnableWindow(FALSE); return; } else { m_ctrTrans.DeleteAllItems(); GetDlgItem(IDC_PRE_PAGE)->EnableWindow(TRUE); } CImageList list; list.Create(IDB_NORMAL,16, 1, RGB(255, 0, 255)); for(int i=0;i GetWindowRect(rect); ScreenToClient(&rect); //dc.FillSolidRect(rect,RGB(150,210,240)); dc.DrawText("重庆大学电工技术研究所,重庆..科技有限公司",&rect,DT_CENTER|DT_BOTTOM); dc.SelectObject(pOldFont); // Do not call CDialog::OnPaint() for painting messages } #include "alarmdlg.h" void CTransJS::OnTimer(UINT nIDEvent) { if(nIDEvent==1) { CTime time=CTime::GetCurrentTime(); m_sCurTime=time.Format("%Y年%m月%d日 %H:%M:%S"); UpdateData(FALSE); } if(nIDEvent==2) { DecodeData(); } CDialog::OnTimer(nIDEvent); } #include "standdlg.h" void CTransJS::OnCfgStand() //设置标准 { //检查变压器状态 POSITION pos = m_ctrTrans.GetFirstSelectedItemPosition(); if (pos == NULL) { AfxMessageBox("请选择变压器!"); return; } int nItem =m_ctrTrans.GetNextSelectedItem(pos); CStandDlg dlg; dlg.m_sTransID=m_ctrTrans.GetItemText(nItem,0); dlg.DoModal(); } void CTransJS::OnPrePage() //向前翻页 { if(m_nCurPage==1) { GetDlgItem(IDC_PRE_PAGE)->EnableWindow(FALSE); return; } m_nCurPage-=1; GetDlgItem(IDC_NEXT_PAGE)->EnableWindow(TRUE); ShowTrans(); } void CTransJS::OnNextPage() //向后翻页 { m_nCurPage+=1; //GetDlgItem(IDC_PRE_PAGE)->EnableWindow(FALSE); ShowTrans(); } BOOL CTransJS::OnStart() { try { if(!InitCom()) return FALSE; m_sStatus2=""; m_ctrGsm.SetOutput(COleVariant("AT\r")); Sleep(1000); OnOnCommGsmcomm(); m_ctrGsm.SetOutput(COleVariant("AT+CNMI=2,2,0,1,1\r")); m_ctrGsm.SetOutput(COleVariant("AT+CMGF=1\r")); //得到SIM卡基本信息 //短信中心 //卡号 m_sStatus2=""; if(m_sStatus1.Find("OK")>=0) {m_sStatus1="连接成功";UpdateData(FALSE);return TRUE;} else {m_sStatus1="连接失败";UpdateData(FALSE);return FALSE;} } catch (...) { //AfxMessageBox(ex.what()); return FALSE; } } BEGIN_EVENTSINK_MAP(CTransJS, CDialog) //{{AFX_EVENTSINK_MAP(CTransJS) ON_EVENT(CTransJS, IDC_GSMCOMM, 1 /* OnComm */, OnOnCommGsmcomm, VTS_NONE) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() void CTransJS::OnOnCommGsmcomm() { VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; CString strtemp; switch(m_ctrGsm.GetCommEvent()) { case 1: //comEvSend发送数据 break; case 2: //comEvReceive读取数据 variant_inp=m_ctrGsm.GetInput();//读缓冲区 safearray_inp=variant_inp;//VARIANT型变量转换为COleSafeArray型变量 len=safearray_inp.GetOneDimSize();//得到有效数据长度 //接收数据 for(k=0;k =0) m_sStatus1="成功"; UpdateData(FALSE);//回显 break; default: m_ctrGsm.SetOutBufferCount(0); break; } } BOOL CTransJS::InitCom() { if (m_ctrGsm.GetPortOpen()) m_ctrGsm.SetPortOpen(false);//如果是打开的,则先关闭串口 m_ctrGsm.SetCommPort(1); //选择COM1 m_ctrGsm.SetInBufferSize(1024);//设置输入缓冲区大小 m_ctrGsm.SetOutBufferSize(1024);//设置输出缓冲区大小 m_ctrGsm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取 m_ctrGsm.SetInputMode(1);//以二进制方式读写数据 m_ctrGsm.SetRThreshold(1);//当接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件 m_ctrGsm.SetSettings("9600,n,8,1");//波特率9600,无校验位,8个数据位,1个停止位 if(!m_ctrGsm.GetPortOpen()) m_ctrGsm.SetPortOpen(TRUE); else m_ctrGsm.SetInBufferCount(0); // SetTimer(1,10,NULL); // InBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; // OutBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; // OutBuffer.vt=VT_BSTR; //m_ctrGsm.SetCommPort(1);//设置为com1 // m_ctrGsm.SetOutput(COleVariant("AT\r")); return true; } void CTransJS::DecodeData() { UpdateData(TRUE); //赋值 if(m_sStatus2.Find("+CMT:")>=0)//处理消息内容 { PDU p; int index=m_sStatus2.Find("+CMT:"); CString str=m_sStatus2.Mid(index); index=str.Find("\r"); string content=str.Mid(index+2); string strTime=p.GetDataTime(content); string strNum=p.GetTelphone(content).substr(2); CString sAlarm; sAlarm.Format("时间:%s\r\n",strTime.c_str()); string strCont; if(p.IsPDU(content)) strCont=p.GetContent(content); else strCont=p.GetTextContent(content); sAlarm+=str; str.Format("内容:%s",strCont.c_str()); if(str.Find("lost")>=0) { CAlarmDlg dlg; dlg.m_sContent=m_sStatus2; m_sStatus2=""; UpdateData(FALSE); dlg.DoModal(); } } }