这篇文章用来分析NFC学习——NFC Enable 过程分析(一)中setp3-2:开启一些循环监听的线程服务。处理方法enableDisable().

code路径:packages/apps/nfc/src/com/android/nfc/P2pLinkManager.java,具体看enableDisable()中的处理code:

[html]view plaincopy
  1. publicvoidenableDisable(booleansendEnable,booleanreceiveEnable){
  2. synchronized(this){
  3. if(!mIsReceiveEnabled&&receiveEnable){
  4. //setp1:启动SnepServer
  5. mDefaultSnepServer.start();
  6. //setp2:启动NdefPushServer
  7. mNdefPushServer.start();
  8. if(mEchoServer!=null){
  9. //setp3:启动EchoServer
  10. mHandler.sendEmptyMessage(MSG_START_ECHOSERVER);
  11. }
  12. }
  13. }
  14. }

Setp1:启动SnepServer,此Server的作用是接收NDEF消息,并把它推送给LLCP(Logical Link Control Protocol).启动SnepServer最后转到其内部类ServerThread去处理,ServerThread继承Thread,具体分析它的run方法。

code路径:packages/apps/nfc/src/com/android/nfc/snep/SnepServer.java

[html]view plaincopy
  1. publicvoidrun(){
  2. ........
  3. while(threadRunning){
  4. synchronized(SnepServer.this){
  5. //setp1-1:创建一个服务器端Socket连接
  6. mServerSocket=NfcService.getInstance().createLlcpServerSocket(mServiceSap,
  7. mServiceName,MIU,1,1024);
  8. }
  9. ......
  10. //接收Socket请求
  11. LlcpSocketcommunicationSocket=serverSocket.accept();
  12. if(communicationSocket!=null){
  13. //setp1-2:miu是什么,如何获取来的
  14. intmiu=communicationSocket.getRemoteMiu();
  15. intfragmentLength=(mFragmentLength==-1)?
  16. miu:Math.min(miu,mFragmentLength);
  17. //setp1-3:启动线程处理SnepMessenger
  18. newConnectionThread(communicationSocket,fragmentLength).start();
  19. }
  20. ......
  21. }
  22. }

Setp1-1:创建服务器端mServerSocket中参数如下:

mServiceSap:socket 端口,默认是4;

mServiceName:从命名可以看出,它是socket名称

MIU:全称是Maximum information Unit ,LLCP中数据单元中消息最大的长度(不知道是不是按byte算的),

1:

1024:是buffer的长度,至于它的作用是什么,赞时还不知道。

mServerSocket的创建过程:通过NfcService调用createLlcpServerSocket(),而NfcService直接返回的DeviceHost.createLlcpServerSocket()的调用,DeviceHost仅仅只是一个接口,DeviceHost.createLlcpServerSocket()具体实现在NativeNfcManager.createLlcpServerSocket().NativeNfcManager则直接调用JNI方法com_android_nfc_NfcManager_doCreateLlcpServiceSocket()来实现其创建功能,其中的参数为了书写方便都省略了。

[html]view plaincopy
  1. staticjobjectcom_android_nfc_NfcManager_doCreateLlcpServiceSocket(JNIEnv*e,jobjecto,
  2. jintnSap,jstringsn,jintmiu,jintrw,jintlinearBufferLength)
  3. {
  4. ......
  5. /*Createsocket*/
  6. /*setp1-1-1:函数在external/libnfc-nxp/src/phLibNfc.h声明,具体的函数作用,函数参数含义请查看代码中注释,&hLlcpSocket即是创建成功的Sokect的指针*/
  7. ret=phLibNfc_Llcp_Socket(phFriNfc_LlcpTransport_eConnectionOriented,
  8. &sOptions,
  9. &sWorkingBuffer,
  10. &hLlcpSocket,
  11. nfc_jni_llcp_transport_socket_err_callback,
  12. (void*)nat);
  13. ......
  14. /*CreatenewNativeLlcpServiceSocketobject,到此出现了我们分析到目前的mServerSocket的创建,返回的serviceSocket就是*/
  15. if(nfc_jni_cache_object(e,"com/android/nfc/nxp/NativeLlcpServiceSocket",&(serviceSocket))==-1)
  16. {
  17. ALOGE("LlcpSocketobjectcreationerror");
  18. gotoerror;
  19. }
  20. ......
  21. returnserviceSocket;
  22. }

附上一张思路图,就清晰点

Setp1-2:miu如何得来的,看下面分析图

看到这张图,可能只是对函数的调用过程有个清晰的了解,但是miu到底是如何获取到的呢??这次我们从函数的调用最后来分析,即phFriNfc_LlcpTransport_Connection.c这个文件的函数。

[html]view plaincopy
  1. NFCSTATUSphFriNfc_LlcpTransport_ConnectionOriented_SocketGetRemoteOptions(
  2. phFriNfc_LlcpTransport_Socket_t*pLlcpSocket,
  3. phLibNfc_Llcp_sSocketOptions_t*psRemoteOptions)
  4. {
  5. NFCSTATUSstatus=NFCSTATUS_SUCCESS;
  6. /*GetRemoteMIUX*/
  7. psRemoteOptions->miu=pLlcpSocket->remoteMIU;
  8. /*GetRemoteReceiveWindow*/
  9. psRemoteOptions->rw=pLlcpSocket->remoteRW;
  10. returnstatus;
  11. }

上面code可以发现phFriNfc_LlcpTransport_Socket_t 的remoteMIU 直接赋给phLibNfc_Llcp_sSocketOptions_t的miu.这就是我们要找的答案。phFriNfc_LlcpTransport_Socket_t 和phLibNfc_Llcp_sSocketOptions_t具体是什么就不做研究了。

setp1-3: 启动线程处理SnepMessenger,从新开启一个Thread处理SnepMessage,处理code 还是SnepServer.java

[html]view plaincopy
  1. staticbooleanhandleRequest(SnepMessengermessenger,Callbackcallback)throwsIOException{
  2. SnepMessagerequest;
  3. ......
  4. //从SnepMessenger中取出SnepMessage
  5. request=messenger.getMessage();
  6. if(((request.getVersion()&0xF0)>>4)!=SnepMessage.VERSION_MAJOR){
  7. messenger.sendMessage(SnepMessage.getMessage(
  8. SnepMessage.RESPONSE_UNSUPPORTED_VERSION));
  9. }elseif(request.getField()==SnepMessage.REQUEST_GET){
  10. /*发送SnepMessage,SnepMessage来源于CallBack的实现,sendMessage把SnepMessage转换成byte[]通过LlcpSocketsocket发送数据*/
  11. messenger.sendMessage(callback.doGet(request.getAcceptableLength(),
  12. request.getNdefMessage()));
  13. }elseif(request.getField()==SnepMessage.REQUEST_PUT){
  14. if(DBG)Log.d(TAG,"puttingmessage"+request.toString());
  15. //发送SnepMessage,SnepMessage来源于Callback的实现
  16. messenger.sendMessage(callback.doPut(request.getNdefMessage()));
  17. }else{
  18. if(DBG)Log.d(TAG,"Unknownrequest("+request.getField()+")");
  19. messenger.sendMessage(SnepMessage.getMessage(
  20. SnepMessage.RESPONSE_BAD_REQUEST));
  21. }
  22. returntrue;
  23. }

上面code涉及到CallBack一个回调接口,它实现在P2pLinkManager.java中

[html]view plaincopy
  1. finalSnepServer.CallbackmDefaultSnepCallback=newSnepServer.Callback(){
  2. @Override
  3. publicSnepMessagedoPut(NdefMessagemsg){
  4. /*该方法中有个EventLogTags.writeNfcNdefReceived的调用,我始终没找到它的具体方法实现在哪儿*/
  5. onReceiveComplete(msg);
  6. returnSnepMessage.getMessage(SnepMessage.RESPONSE_SUCCESS);
  7. }
  8. @Override
  9. publicSnepMessagedoGet(intacceptableLength,NdefMessagemsg){
  10. NdefMessageresponse=mHandoverManager.tryHandoverRequest(msg);
  11. if(response!=null){
  12. onReceiveHandover();
  13. returnSnepMessage.getSuccessResponse(response);
  14. }else{
  15. returnSnepMessage.getMessage(SnepMessage.RESPONSE_NOT_FOUND);
  16. }
  17. }
  18. };

setp2:启动NdefPushServer,setp3:启动EchoServer的过程和setp1:启动SnepServer过程类似,具体可以参照setp1,在此就不做详细分析。

以上分析中涉及到SnepServer,NdefPushServer,EchoServer。看下这三个文件中对自己的注释说明。。

SnepServer:A simple server that accepts NDEF messages pushed to it over an LLCP connection. Those messages are typically set on the client side by using NfcAdapter.enableForegroundNdefPush.通过LLCP接收NDEF 消息,并把消息通过NfcAdapter.enableForegroundNdefPush设置到客户端。

NdefPushServer:同SnepServer。

EchoServer:EchoServer is an implementation of the echo server that is used in the nfcpy LLCP test suite. Enabling the EchoServer allows to test Android NFC devices against nfcpy,这是code中给的注释说明,但不知到nfcpy是什么东西,故不做翻译了。

NFC Enable 过程分析(三)相关推荐

  1. Android近场通信---NFC基础(三)

    Android近场通信---NFC基础(三) 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种.两种或全部三种类型的NF ...

  2. Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord

    Android NFC技术(三)--初次开发Android NFC你须知道NdefMessage和NdefRecord 这最近也是有好多天没写博客了,除了到处张罗着搬家之外,依旧还是许许多多的琐事阻碍 ...

  3. 最直白理解NFC开发的三种工作模式

    刚开始开发NFC时,说的三种模式:说的感觉都是些专业术语.看的不是很明白,以下是最直白的NFC三种模式的介绍. 1.NFC的工作模式 NFC支持如下3种工作模式:读卡器模式(Reader/writer ...

  4. Android NFC手机的三种工作模式

    Android 支持NFC功能,但是需要硬件的支持,带NFC功能的手机支持3种工作模式:读写模式.点对点模式.仿真卡模式,下面分别介绍 读写模式 这种模式中Android设备扮演的是读卡器的角色,可以 ...

  5. linux网卡接收raw,网络数据接收过程分析(三)---RAW数据接收(1)

    ------------------------------------------------------------------------------------------ 以下是我根据 li ...

  6. 分析蓝牙、wifi、NFC三种近场通信技术的特点以及未来的应用场景(移动开发作业五)

    文章目录 一.三种近场通信技术的特点 BlueTooth WIFI NFC 二.对未来近场通信技术的应用场景进行分析与预测 BlueTooth WIFI NFC 一.三种近场通信技术的特点 BlueT ...

  7. android nfc(一)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自 http://blog.sina.com.cn/s/blog_67d95f4001011uiv.html 啥是NFC你 ...

  8. 华三配置telnet

    华三配置telnet H3C如何去配置telnet,它的具体步骤和命令都有哪些,下面将给予你详细的介绍.第一步配置至少一个IP地址,以便提供IP连通性[H3C-etherneto/0]ip addre ...

  9. android beam 第三方 aar,NFC通讯之Beam方式

    临时接到要求,开发一个基于Android智能手表的NFC应用.立刻在网上狂搜索了一番.了解到NFC通讯有 三种方式:读标签.当做标签.互相通讯.根据已有的要求和条件确认为第三种通讯方式. 任务通讯基本 ...

最新文章

  1. linux nginx php 目录权限,Nginx环境中配置网站目录权限设置
  2. stm32之TIM-高级定时器应用实例一(详细)
  3. Android---手动创建线程与GUI线程同步(一)
  4. Package vim is not available, but is referred to by another package.
  5. ubuntu 给执行文件添加快捷方式
  6. ArcGIS中修改面图层中相邻面的公共边
  7. python ipad 微信_用Python玩微信(非常详细)
  8. IDEA打包jar包并运行
  9. arcgis字段计算器赋值_ArcGIS中62个常用应用技巧汇总【必须收藏】
  10. 区块链开发金融交易平台
  11. iOS永久不掉签名工具,TrollStore超详使用教程
  12. 【数字电子技术 Digital Electronic Technology 2】—— 逻辑代数基础 之 逻辑函数以其描述方法解析
  13. 当java碰到防火墙
  14. APP机型兼容测试的手机选择
  15. TriSun PDF 13.0中文版本,TriSun PDF15的发布
  16. 大厂都有哪些●快速上手●项目管理秘籍?
  17. python制作自己的专属二维码
  18. 草图大师素材是如何快速导入到模型中的呢?草图溜溜来替你解答
  19. 编程中的匈牙利命名法
  20. 学校招聘行政老师的计算机能力测试,【】计算机教师招聘试题(25页)-原创力文档...

热门文章

  1. 事件管理决定一个网管软件的成功与失败
  2. 【DP】【单调队列】【NOI2005】瑰丽华尔兹
  3. 360分拆计划生变,临时剥离四大业务
  4. EasyUI的-表格设置
  5. 数据仓库入门(实验6)添加层次结构
  6. 2007年下半年网工考试试题+分析+标准答案
  7. 超长干货 | Kubernetes命名空间详解
  8. 王爽《汇编语言》第2版-----2、寄存器
  9. 从dump看硬件问题
  10. CRM 客户端程序开发:设置实体表单界面字段的值