TCPIP接口读卡器VC例子代码(2)

TCPIP接口读卡器VC例子代码  界面

 

 

 

 

// UdpReaderDlg.cpp : implementation file
//

//广州荣士电子有限公司,联系电话020-82318861,82322852,定制13826029618 网址http://www.icmcu.com


#include "stdafx.h"
#include "UdpReader.h"
#include "UdpReaderDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

 


/
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();
// Dialog Data

 //{{AFX_DATA(CAboutDlg)
 enum { IDD = IDD_ABOUTBOX };
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CAboutDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 //{{AFX_MSG(CAboutDlg)
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
 //{{AFX_DATA_INIT(CAboutDlg)
 //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CAboutDlg)
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CUdpReaderDlg dialog

CUdpReaderDlg::CUdpReaderDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CUdpReaderDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CUdpReaderDlg)
 m_edit1 = _T("");
 m_check1 = FALSE;
 m_edit2 = 0;
 m_edit3 = 0;
 m_edit4 = 0;
 m_edit5 = 0;
 m_edit6 = 0;
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUdpReaderDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CUdpReaderDlg)
 DDX_Control(pDX, IDC_COMBO1, m_combo1);
 DDX_Text(pDX, IDC_EDIT1, m_edit1);
 DDX_Check(pDX, IDC_CHECK1, m_check1);
 DDX_Text(pDX, IDC_EDIT2, m_edit2);
 DDV_MinMaxInt(pDX, m_edit2, 0, 255);
 DDX_Text(pDX, IDC_EDIT3, m_edit3);
 DDV_MinMaxInt(pDX, m_edit3, 0, 255);
 DDX_Text(pDX, IDC_EDIT4, m_edit4);
 DDV_MinMaxInt(pDX, m_edit4, 0, 255);
 DDX_Text(pDX, IDC_EDIT5, m_edit5);
 DDV_MinMaxInt(pDX, m_edit5, 0, 255);
 DDX_Text(pDX, IDC_EDIT6, m_edit6);
 DDV_MinMaxLong(pDX, m_edit6, 0, 65535);
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CUdpReaderDlg, CDialog)
 //{{AFX_MSG_MAP(CUdpReaderDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
 ON_MESSAGE(WM_SOCKET,OnSocketEvent)
 //}}AFX_MSG_MAP
 
END_MESSAGE_MAP()

/
// CUdpReaderDlg message handlers

BOOL CUdpReaderDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
 // TODO: Add extra initialization here

 m_combo1.SetCurSel(0);  
 m_edit2 = 192;
 m_edit3 = 168;
 m_edit4 = 1;
 m_edit5 = 218;
 m_edit6 = 0;

 m_socket=INVALID_SOCKET;

 UpdateData(false);

 


 
 
 
 
 return TRUE;  // return TRUE  unless you set the focus to a control
}

void CUdpReaderDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CUdpReaderDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CUdpReaderDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

void CUdpReaderDlg::OnOK()
{
 // TODO: Add extra validation here
 //打开
 WSADATA wsaData;

 if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
 {
  //fprintf(stderr,"WSAStartup failed: %d/n",GetLastError());

  return;
 }

 //m_socket = WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL, 0,WSA_FLAG_OVERLAPPED);
 m_socket=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

 if(m_socket==INVALID_SOCKET)
 {
 // ir=::WSAGetLastError();


  AfxMessageBox("打开套接字失败");
  return;
 }
 else
 {

  sockaddr_in binda;
  //启动SOCKET库,版本为2.0

  //然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
  binda.sin_family=AF_INET;
  binda.sin_addr.s_addr=INADDR_ANY;//所有地址都接收
  binda.sin_port=htons(39169);//固定地址为39169

  if(SOCKET_ERROR !=bind(m_socket,(sockaddr *)&binda,sizeof(binda)))
  {
   WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET,FD_READ);
   AfxMessageBox("开始接收信息");
  }
 }

 //closesocket(m_socket);

 //WSACleanup();

}

void CUdpReaderDlg::OnCancel()
{
 // TODO: Add extra cleanup here
 
 CDialog::OnCancel();
}

void CUdpReaderDlg::OnButton1()
{//发出声响
 // TODO: Add your control notification handler code here
 char sendbuf[4];
 sockaddr_in binda;
 CString readeripstr;
 int ret;

 if(m_socket==INVALID_SOCKET)
 {
  AfxMessageBox("请先开始接收");
  return;
 }

 UpdateData(true);//交换变量,一定要这句

 sendbuf[0] = (char)0x96;//声响指令
 sendbuf[1] = m_edit6 % 256;
 sendbuf[2] = m_edit6/256;
 sendbuf[3] = m_combo1.GetCurSel();

 if(m_check1)
 {//广播式
  bool opt=true;
  //设置该套接字为广播类型,
  setsockopt(m_socket,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));

  binda.sin_family = AF_INET;
  binda.sin_addr.s_addr = INADDR_BROADCAST;//inet_addr(m_devIpAddrStr);//INADDR_ANY;//所有地址都接收
  binda.sin_port = htons(39169);
  
  ret=sendto(m_socket,sendbuf,4,0,(sockaddr*)&binda,sizeof(binda));
  

  if(ret == SOCKET_ERROR)
  {
   AfxMessageBox("发送失败!");
  }

 }
 else
 {
  bool opt=false;
  //设置该套接字为广播类型,
  setsockopt(m_socket,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));

  binda.sin_family = AF_INET;
  readeripstr.Format("%d.%d.%d.%d",m_edit2,m_edit3,m_edit4,m_edit5);
  binda.sin_addr.s_addr = inet_addr(readeripstr);//inet_addr(m_devIpAddrStr);//INADDR_ANY;//所有地址都接收
  binda.sin_port = htons(39169);


  ret=sendto(m_socket,sendbuf,4,0,(sockaddr*)&binda,sizeof(binda));

  if(ret == SOCKET_ERROR)
  {
   AfxMessageBox("发送失败!");
  }
 }

 

 


}


LRESULT CUdpReaderDlg::OnSocketEvent(WPARAM wparam,LPARAM lparam)
{
 char buf[512];
 char sendbuf[9];

 int i;

 int myLen;
 CString mystr;
 CString readeripstr;//读卡器IP地址
 CString jihaostr;//读卡器机号
 CString pktstr;//数据包序号
 CString cardnumberstr;//卡号

 

 switch (LOWORD(lparam))
 { 
 case FD_READ:
  
  //AfxBeginThread((AFX_THREADPROC)AcceptSocket,this);

   memset(buf,0,512);

   myLen = recv(m_socket,buf,512,0);
   if(myLen != SOCKET_ERROR)//SOCKET_ERROR为(-1)
   {
    if(myLen>=14)
    {
     
     
     if((buf[0] == ((char)0xc1)) || (buf[0] == ((char)0xd1)))
     {//接收到IC卡或ID卡刷卡信息
      //接收成功向读卡器发送回应信息
      sendbuf[0] = 0x69;
      for(i = 1;i<9;i++)
      {
       sendbuf[i] = buf[i];
      }

      //buf[1]~buf[4]为IP地址
      readeripstr.Format("%d.%d.%d.%d",(unsigned char)buf[1],(unsigned char)buf[2],(unsigned char)buf[3],(unsigned char)buf[4]);

      sockaddr_in binda;
      //启动SOCKET库,版本为2.0

      //然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
      binda.sin_family = AF_INET;
      binda.sin_addr.s_addr = inet_addr(readeripstr);//inet_addr(m_devIpAddrStr);//INADDR_ANY;//所有地址都接收
      binda.sin_port = htons(39169);
      int ret;
      ret=sendto(m_socket,sendbuf,9,0,(sockaddr*)&binda,sizeof(binda));

      if(ret==SOCKET_ERROR)
      {
       
      }
      else
      {//发送成功


       
      }
      //接收到刷卡信息:读卡器IP地址[192.168.1.218],机号[2],数据包序号[21],物理卡号[00-B2-BA-A9-04]
      jihaostr.Format("%d",(unsigned char)buf[5]+(unsigned char)buf[6]*256);//机号

      pktstr.Format("%d",(unsigned char)buf[7]+(unsigned char)buf[8]*256);//数据包序号
      cardnumberstr.Format("%0.2x-%0.2x-%0.2x-%0.2x",(unsigned char)buf[10],(unsigned char)buf[11],(unsigned char)buf[12],(unsigned char)buf[13]);//卡号
      
      m_edit1 = "接收到刷卡信息:读卡器IP地址["+readeripstr+"],机号["+jihaostr+"],数据包序号["+pktstr+"],物理卡号["+cardnumberstr+"]";
      UpdateData(false);

      


     }

 

    }
    
    
   }

  return 0; 

  break;
 case FD_CLOSE:
     //ListClose();
  return 0;
  break;

    default:
  return DefWindowProc(WM_SOCKET,wparam,wparam);
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值