新搞到一个平板(win10系统的),想问下怎么用delphi获取NFC读到的卡号

LinY_X 2019-12-19 09:14:40
如题
新搞到一个平板(win10系统的),
想问下怎么用delphi获取NFC读到的卡号,
只需要读到卡号就行了
...全文
753 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinY_X 2020-04-02
  • 打赏
  • 举报
回复
有没有人帮忙啊 急!!!
LinY_X 2020-04-02
  • 打赏
  • 举报
回复
型号是PN547
  • 打赏
  • 举报
回复
关键大部分人没这设备,研究起来很麻烦
LinY_X 2020-01-13
  • 打赏
  • 举报
回复
难道要去研究libnfc么
LinY_X 2020-01-03
  • 打赏
  • 举报
回复
LinY_X 2020-01-02
  • 打赏
  • 举报
回复
引用 11 楼 早打大打打核战争 的回复:
myDeviceArrived-DeviceId,这个应该就是吧
不是 我试了刷相同卡 deviceId会变的
  • 打赏
  • 举报
回复
myDeviceArrived-DeviceId,这个应该就是吧
LinY_X 2019-12-31
  • 打赏
  • 举报
回复
新手只能加到400分了 有大佬指点下么
LinY_X 2019-12-31
  • 打赏
  • 举报
回复

unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Winapi.Networking.Proximity, Vcl.StdCtrls, Vcl.ComCtrls, Winapi.WinRT,
  System.Win.ComObj, Winapi.Foundation.Types, Winapi.Storage.Streams,
  Winapi.CommonTypes, System.Win.WinRT;

const
  MsgTypes: array[0..4] of string = ('NDEF', 'Pairing:Bluetooth', 'WindowsUri',
    'WindowsMime', 'WriteableTag');

type
  TMessageReceivedHandler = class(TInterfacedObject, MessageReceivedHandler)
  public
    procedure Invoke(Sender: IProximityDevice; message: IProximityMessage); safecall;
  end;

  TDeviceArrivedEventHandler = class(TInterfacedObject, DeviceArrivedEventHandler)
  public
    procedure Invoke(Sender: IProximityDevice); safecall;
  end;

  TDeviceDepartedEventHandler = class(TInterfacedObject, DeviceDepartedEventHandler)
  public
    procedure Invoke(Sender: IProximityDevice); safecall;
  end;

  TForm3 = class(TForm)
    rbOutput: TRichEdit;
    btnInit: TButton;
    btnQuit: TButton;
    ComboBox1: TComboBox;
    procedure btnInitClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnQuitClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    Device: TProximityDevice;
    NFCReader: IProximityDevice;
    FDeviceArrivedHandler: DeviceArrivedEventHandler;
    FDeviceDepartedHandler: DeviceDepartedEventHandler;
    token: EventRegistrationToken;
    FMsgHandler: TMessageReceivedHandler;
    FMsgType: string;
  public
    { Public declarations }
  end;

procedure ReceiveMessage(Sender: IProximityDevice; message: IProximityMessage);

procedure myDeviceArrived(Sender: IProximityDevice);

procedure myDeviceDeparted(Sender: IProximityDevice);

function StringToHSTRING(Value: string): HSTRING;

function HSTRINGToString(Src: HSTRING): string;

procedure Log(Str: string);

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.btnInitClick(Sender: TObject);
var
  MsgType: string;
  h: HSTRING;
  SubscribeID: Int64;
  launchArgs, praid, appName, launchAppMessage: string;
begin
  try
    Device := TProximityDevice.Create;
    Log('Device.GetDeviceSelector:' + IntToStr(Device.GetDeviceSelector));
    NFCReader := Device.GetDefault;

    if (not Assigned(NFCReader)) then
    begin
      FreeAndNil(NFCReader);
      FreeAndNil(Device);
      Log('no reader');
      Exit;
    end;
    Log('Device.GetDefault.DeviceId:' + IntToStr(NFCReader.DeviceId));
    MsgType := ComboBox1.Text;
    h := StringToHSTRING(MsgType);
    Log(Format('h:%s>>>%s', [MsgType, IntToStr(h)]));
    FMsgHandler := TMessageReceivedHandler.Create;
    SubscribeID := Form3.NFCReader.SubscribeForMessage(h, Form3.FMsgHandler);
    Log('SubscribeForMessage-ID:' + IntToStr(SubscribeID));

    FDeviceArrivedHandler := TDeviceArrivedEventHandler.Create;
    token := NFCReader.add_DeviceArrived(FDeviceArrivedHandler);
    Log('add_DeviceArrived-token' + IntToStr(token.Value));

    FDeviceDepartedHandler := TDeviceDepartedEventHandler.Create;
    token := NFCReader.add_DeviceDeparted(FDeviceDepartedHandler);
    Log('add_DeviceDeparted-token' + IntToStr(token.Value));
  except
    on E: Exception do
    begin
      Log('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
end;

procedure TForm3.btnQuitClick(Sender: TObject);
begin
  FreeAndNil(FMsgHandler);
  FreeAndNil(FDeviceArrivedHandler);
  FreeAndNil(FDeviceDepartedHandler);
  FreeAndNil(NFCReader);
  FreeAndNil(Device);
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  btnQuitClick(nil);
  inherited;
end;

procedure TForm3.FormShow(Sender: TObject);
var
  I: Integer;
begin
  inherited;
  for I := 0 to Length(MsgTypes) - 1 do
  begin
    ComboBox1.Items.Add(MsgTypes[I]);
  end;
end;

procedure myDeviceArrived(sender: IProximityDevice);
var
  SubscribeID: Int64;
  iidCount: Cardinal;
  iids: PGUID;
  ret: HRESULT;
begin
  Log('myDeviceArrived-DeviceId:' + IntToStr(sender.DeviceId));
  Log('myDeviceArrived-MaxMessageBytes:' + IntToStr(sender.MaxMessageBytes));
  Log('myDeviceArrived-BitsPerSecond:' + UIntToStr(sender.BitsPerSecond));
  ret := sender.GetIids(iidCount, iids);
//
  Log('myDeviceArrived-iidCount:' + IntToStr(iidCount));
  Log('myDeviceArrived-iids:' + GUIDToString(iids^));
  Log('myDeviceArrived-ret:' + IntToStr(ret));
end;

procedure myDeviceDeparted(sender: IProximityDevice);
var
  SubscribeID: Int64;
begin
  Log('myDeviceArrived-DeviceId:' + IntToStr(sender.DeviceId));
  Log('myDeviceArrived-MaxMessageBytes:' + IntToStr(sender.MaxMessageBytes));
  Log('myDeviceArrived-BitsPerSecond:' + UIntToStr(sender.BitsPerSecond));

  SubscribeID := sender.SubscribeForMessage(HSTRING(LongInt(@Form3.FMsgType)),
    Form3.FMsgHandler);
  Log('12-SubscribeID' + IntToStr(SubscribeID));
end;

{ TDeviceArrivedEventHandler }

procedure TDeviceArrivedEventHandler.Invoke(sender: IProximityDevice);
begin
  myDeviceArrived(sender);
end;

procedure ReceiveMessage(sender: IProximityDevice; message: IProximityMessage);
var
  str: string;
begin
  str := Format('[%s]msg[%s]:%s', [IntToStr(sender.DeviceId), IntToStr(message.MessageType),
    string(message.DataAsString)]);
  Log(str);
end;

{ TMessageReceivedHandler }

procedure TMessageReceivedHandler.Invoke(sender: IProximityDevice; message:
  IProximityMessage);
begin
  Log('111');
  ReceiveMessage(sender, message);
end;

{ TDeviceDepartedEventHandler }

procedure TDeviceDepartedEventHandler.Invoke(sender: IProximityDevice);
begin
  myDeviceDeparted(sender);
end;

function StringToHSTRING(Value: string): HSTRING;
begin
  if not Succeeded(WindowsCreateString(PWideChar(Value), Length(Value), Result)) then
    raise Exception.CreateFmt('Unable to create HString for %s', [Value]);
end;

function HSTRINGToString(Src: HSTRING): string;
var
  c: Cardinal;
begin
  c := WindowsGetStringLen(Src);
  Result := WindowsGetStringRawBuffer(Src, @c);
end;

procedure Log(str: string);
begin
  Form3.rbOutput.Lines.Insert(0, str);
end;

end.
这是新改之后的代码 DeviceArrived和DeviceDeparted 刷卡进入和离开事件都能监听到 但是不知道怎么获取卡号 SubscribeForMessage设置成功了 但是刷卡没反应 测试结果是这样的:
LinY_X 2019-12-28
  • 打赏
  • 举报
回复
官网看到的都是NFC设备交互的 一个发送消息 另一个接收消息 我这里只是读取普通M卡的卡号 有整过的大佬指导下么 试了好久了
  • 打赏
  • 举报
回复
我用10.2.1编译你的代码通过,至于功能性,我这没有带NFC的win10设备,无法验证
LinY_X 2019-12-20
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
这有一个更详细的例子:https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/NfcProvisioner/cs/Scenario1.xaml.cs
0.0 不怎么懂C# 小白一个 帮忙看下 这样写有点问题

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Winapi.Networking.Proximity, Vcl.StdCtrls, Vcl.ComCtrls, Winapi.WinRT;

type
  TMessageReceivedHandler = class(TInterfacedObject, MessageReceivedHandler)
  public
    procedure Invoke(sender: IProximityDevice; message: IProximityMessage); safecall;
  end;

  TForm1 = class(TForm)
    Label1: TLabel;
    cbReader: TComboBox;
    rbOutput: TRichEdit;
    btnInit: TButton;
    btnConnect: TButton;
    btnActive: TButton;
    SendGroup: TGroupBox;
    tbData: TMemo;
    btnClear: TButton;
    btnReset: TButton;
    btnQuit: TButton;
    procedure btnInitClick(sender: TObject);
    procedure FormClose(sender: TObject; var Action: TCloseAction);
    procedure btnQuitClick(sender: TObject);
    procedure FormCreate(sender: TObject);
  private
    { Private declarations }
    Device: TProximityDevice;
    NFCReader: IProximityDevice;
    SubscribedMessageId: Int64;
    MessageReceivedHandler: TMessageReceivedHandler;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnInitClick(Sender: TObject);
var
  h: HSTRING;
begin
  try
    Device := TProximityDevice.Create;
    rbOutput.Lines.Add('Device.GetDeviceSelector:' + IntToStr(Device.GetDeviceSelector));
    NFCReader := Device.GetDefault;
    if (not Assigned(NFCReader)) then
    begin
      FreeAndNil(NFCReader);
      FreeAndNil(Device);
      rbOutput.Lines.Add('no reader');
      Exit;
    end;
    rbOutput.Lines.Add('Device.GetDefault.DeviceId' + IntToStr(NFCReader.DeviceId));
    // TODO: 这个HSTRING 为啥是数字的? 微软那边不是字符串么
//    h := HSTRING(1);
    rbOutput.Lines.Add('h>>>');
    if (not Assigned(MessageReceivedHandler)) then
    begin
      MessageReceivedHandler := TMessageReceivedHandler.Create;
      rbOutput.Lines.Add('MessageReceivedHandler.Create>>>');
    end;
    if (SubscribedMessageId = -1) then
    begin
      // TODO: 这行有问题 会报错
      SubscribedMessageId := NFCReader.SubscribeForMessage(h, MessageReceivedHandler);
    end;
    rbOutput.Lines.Add('SubscribedMessageId:' + IntToStr(SubscribedMessageId));
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
end;

procedure TForm1.btnQuitClick(Sender: TObject);
begin
  rbOutput.Lines.Add('FreeAndNil(MessageReceivedHandler)');
  try
    FreeAndNil(MessageReceivedHandler);
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
  rbOutput.Lines.Add('FreeAndNil(NFCReader)');
  try
    FreeAndNil(NFCReader);
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
  rbOutput.Lines.Add('FreeAndNil(Device)');
  try
    FreeAndNil(Device);
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  rbOutput.Lines.Add('FreeAndNil(MessageReceivedHandler)');
  try
    FreeAndNil(MessageReceivedHandler);
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
  rbOutput.Lines.Add('FreeAndNil(NFCReader)');
  try
    FreeAndNil(NFCReader);
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
  rbOutput.Lines.Add('FreeAndNil(Device)');
  try
    FreeAndNil(Device);
  except
    on E: Exception do
    begin
      rbOutput.Lines.Add('error:' + E.ClassName + '///' + E.Message);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  inherited;
  SubscribedMessageId := 1;
end;


{ TMessageReceivedHandler }

procedure TMessageReceivedHandler.Invoke(sender: IProximityDevice; message:
  IProximityMessage);
begin
  inherited;
  Form1.rbOutput.Lines.Add('[' + IntToStr(sender.DeviceId) + ']msg:' + string(message.DataAsString));
end;

end.
doloopcn 2019-12-19
  • 打赏
  • 举报
回复
就是向提供商索要平板的SDK啊


如果是通用型NFCA型或B型,先到网上找例子(一般都是JAVA),然后转到DELPHI吧,或者直接找D的例子试试
LinY_X 2019-12-19
  • 打赏
  • 举报
回复
有没有大佬啊 给个思路也行啊
LinY_X 2019-12-19
  • 打赏
  • 举报
回复
NFC设备是 NXP NearFieldProximity Provider
  • 打赏
  • 举报
回复
win10从10240开始已经内置支持NFC设备,WinRT API Windows.Networking.Proximity,参考:https://docs.microsoft.com/en-us/uwp/api/Windows.Networking.Proximity.ProximityDevice?redirectedfrom=MSDN

Delphi大概从10.0 Seattle开始支持WinRT API,你只需要uses WinAPI.Networking.Proximity; 然后抄一下微软的例子就差不多了
Delphi XE2 正式版的破解程序,有效哦。 Delphi XE2 官方完整 delphicbuilder_xe2_win_dl.iso下载地址: http://altd.embarcadero.com/download/radstudio/xe2/delphicbuilder_xe2_win_dl.iso 文件大小: 2.33G MD5: de8b9f897e2ad678643b64898470b707 Delphi Prism XE2 - ISO 1.28G http://altd.embarcadero.com/download/prism/xe2/prism_xe2_win.iso RadPHP XE2 - ISO 343M http://altd.embarcadero.com/download/radphp/xe2/radphp_xe2_win.iso 建议大家用迅雷下载 ************************************** 英巴卡迪诺发布版RAD Studio XE2开发工具套件 日前,英巴卡迪诺宣布发布版RAD Studio XE2软件开发工具套件,版包含了10多年来最深入全面的特性升级。RAD Studio XE2中包含了版本的Delphi、C++Builder、Prism和RadPHP。主要特性包括完整的Delphi 64位Windows支持,通过全的FireMonkey富商业应用平台支持Mac OSX和iOS,以及通过RadPHP XE2支持安卓web和移动应用开发。 对Delphi XE2和C++Builder XE2来说,一个极其重要的特性就是FireMonkey,业界第一款用于创建商业软件的原生的能全面利用到CPU和GPU计算能力的富应用平台。使用 FireMonkey,Delphi和C++Builder开发人员能开发出视觉绚丽的高清和3D应用程序,并与后台的企业级数据库如Oracle、微软 SQL Server、IBM DB2、Sybase和其他数据库互联互通。FireMonkey应用以原生方式运行在Windows PC和Mac上,可以完全利用到现代GPU的处理能力,以不可置信的细节处理能力和优异的性能表现展现数据和用户界面。FireMonkey还可以使 Delphi XE2用户为移动(iOS)设备创建原生的高清和3D应用程序。 Delphi和C++Builder为应用开发提供原生开发方式,而RadPHP XE2则支持web开发和移动设备应用的开发。使用RadPHP XE2,开发人员可以轻松为移动智能电话和平板电脑创建支持触碰和UI优化的web应用。开发人员可以部署他们的移动Web应用为原生移动应用到苹果公司的iOS应用商店和安卓的应用市场。在他们的移动Web应用中,可以直接访问移动设备的硬件,如相机、GPS和重力感应器。 其他增特性包括: Delphi XE2 和C++Builder XE2 Delphi XE2包括完整的Windows 64位对FireMonkey、编译器、调试器、RTL 和VCL的支持; dbExpress具有的对InterBase XE, FireBird 2.5, SQL Anywhere 12 和ODBC的连接能力; 的DataSnap移动连接器,带有原生的平台组件和示例以创建从移动客户端到Delphi DataSnap服务器的连接,支持安卓(Java), iOS (Objective C), 黑莓(Java) 和Windows Phone 7 (C#); 增和更的扩展工具,包括FastReport,用于快速设计和生成报表;Documentation Insight,用于Delphi的源代码文档工具; TeeChart、IBX、InstallAware、IP*Works、Aqtime、FinalBuilder、IntraWeb和Indy 的64位版本。 TeeChart、Indy和FinalBuilder还支持Mac平台; C++Builder XE2中还包含了的代码审计和QA度量工具; LiveBindings使用户能连接任意类型的信息到任意的FireMonkey用户界面和图形对象上。用户可以绑定实时数据到标准的用户界面控件、高清或3D图形元素上,以创建可视化任意类型数据的崭方式; RadPHP: 集成式为移动优化的Web开发; 部署应用到Web, iOS, 或安卓; 扩展的Zend框架组件集; Embarcadero Prism: 来自RemObjects的全的.NET Oxygene编译器; 匿名接口实现; FastReport.net

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧