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);
}
}