Android系统韦根调试从驱动到应用

软件开发平台:android P 源码。
硬件开发平台:nxp imx8m mini开发板。

本文记录在nxp 8m mini 硬件平台, androidP 源码的软件平台上调试韦根驱动,增加韦根的framework 层,并能在APP 应用层 获取韦根数据的流程。

二.韦根Framework 层调试
作为APP开发者是不需要知道驱动是如何工作的,只需要在读卡器贴卡时能得到卡号就可以了。上面我们完成了驱动的开发,那怎么上报给APP开发者呢, 就需要framework 这个桥梁了。
Framework 就相当于上面驱动代码的应用层。只是在framework在 read 到卡号后,还需要将卡号广播到android 系统中。所以 韦根framework层要做两件事,读到卡号,广播卡号.
这里贴出 WiegandManagerService的代码

class WiegandManagerService extends SystemService {static final String TAG = "WiegandManagerService";byte[] wiegand_value = new byte[ 20 ];public WiegandManagerService(Context context) {super(context);}public void onStart() {Log.d(TAG, "onStart: ");//   mNativeData = init();WiegandThread waitThread = new WiegandThread();waitThread.start();}private class WiegandThread extends Thread{public WiegandThread(){super("WiegandThread");}public void run(){while (true) {try {Log.d(TAG, "run: waitForWiegand");//long result = waitForWiegand();Arrays.fill(wiegand_value, (byte)0);//阻塞的这里等待读卡器读卡号, 这里需要判断返回值如果是韦根OPEN出错,说明驱动未准备好,则应该退出 service,否则会占用资源. 如果是读卡号出错,继续等待.int result = waitForWiegand(wiegand_value);String CARD_NO = new String(wiegand_value, "UTF-8");Log.d(TAG, "run: waitForWiegand " + result+" CARD_NO :"+CARD_NO+" length "+CARD_NO.length() );String localChartSet = System.getProperty("file.encoding");Log.d(TAG,"localChartSet>>>>"+localChartSet);   //查看本地默认字符集//发送广播 ,在Intent.java 增加广播Intent intent = new Intent(Intent.ACTION_WIEGAND_CHANGED);intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND| Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);intent.putExtra("wiegand_value", CARD_NO);getContext().sendBroadcastAsUser(intent, UserHandle.ALL);}catch(Exception e){Log.d(TAG, "e: "+e.toString() );}}}}//private native long waitForWiegand( );private native int waitForWiegand(byte[] value);
}

在SystemServer中启动WiegandManagerService。

并注册ACTION_WIEGAND_CHANGED 广播。

JNI 部分代码如下:

#define LOG_TAG "WiegandManagerService"#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <utils/Log.h>
#include <utils/misc.h>
#include <utils/String8.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/epoll.h>
#include <sys/timerfd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <linux/ioctl.h>
#include <linux/rtc.h>
#include <array>
#include <memory>
#include <sys/stat.h>
#include <poll.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>namespace android {#define WIEGAND_FILE "dev/wiegand"
static int fd;
//java 的byte 是8 个字节,和C 的char 字长一致,这里使用jbyteArray
static jint android_server_WiegandManagerService_waitForWiegand(JNIEnv* env, jobject clazz/* this */, jbyteArray  byteArray)
{int result = 0;ALOGD("%s\n",__func__);jsize numChars   = env->GetArrayLength(byteArray);ALOGD("%s length %d\n",__func__, numChars);jbyte *jbytes  = (jbyte*)calloc(numChars, sizeof(jbyte));//开辟jbyte类型内存空间memset(jbytes, 0, numChars);if(jbytes == NULL){ALOGD("UPON : calloc error.\n");return -1;}fd = open(WIEGAND_FILE, O_RDWR);//打开dev/wiegand设备文件if (fd < 0)//小于0说明没有成功{ALOGD("error, can't open wiegand file (%s)\n", strerror(errno));return -1;}ALOGD("%s read fd %d\n", __func__ , fd);
//阻塞在这里等待读卡号result = read(fd, jbytes, numChars );//copy buffer to jchar arrayALOGD("%s read %s  result : %d\n",__func__, (char *)jbytes , result);env->SetByteArrayRegion(byteArray,0,numChars,jbytes);//复制pArray的jbytes数据元素到jbyteArrayfree(jbytes);//return (jint)result;}static const JNINativeMethod sMethods[] = {/* name, signature, funcPtr */{"waitForWiegand", "([B)I", (void*)android_server_WiegandManagerService_waitForWiegand},};int register_android_server_WiegandManagerService(JNIEnv* env)
{return jniRegisterNativeMethods(env, "com/android/server/WiegandManagerService",sMethods, NELEM(sMethods));
}} /* namespace android */

将com_android_server_WiegandManagerService.cpp加入系统

因为驱动是root 用户权限, WiegandManagerService 是system_server 用户,所以存在selinux 权限不通过的问题。

使用 external/selinux/prebuilts/bin/audit2allow 可以解决权限问题,
#============= system_server ==============
allow system_server device:chr_file open;
修改文件权限

如果有编译问题,再解决编译问题。

运行后可以看到 在读卡器不贴卡时 WiegandManagerServcie 阻塞在read 函数等待

贴卡后,

读出卡号,再次等待。这里有个乱码的问题。

————————————————
版权声明:本文为CSDN博主「大熊的瓜地」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/blueheart05/article/details/106116954

Android系统韦根调试从驱动到应用(二)相关推荐

  1. Android系统韦根调试从驱动到应用(三)

    Android系统韦根调试从驱动到应用 软件开发平台:android P 源码. 硬件开发平台:nxp imx8m mini开发板. 本文记录在nxp 8m mini 硬件平台, androidP 源 ...

  2. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  3. Android系统 linux内核按键驱动开发

    Android系统 linux内核按键驱动开发 前言 刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人. 1.修改设备树.dts 我是用的开发板是rp-rk32 ...

  4. Android之 震动(Vibrator)如何贯通Android系统 (从硬件设计 -- 驱动 -- HAL -- JNI -- Framework -- Application)

        在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于"Android 震动马达系统"的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的 ...

  5. android系统移植之按键驱动篇

    平台:MX53_QSB开发板 MX53_QSB开发板上一起有四个按键,分别为RESET,POWER,USER1,USER2.其中RESET为纯硬件复位按键,无须软件控制.POWER,USER1,USE ...

  6. android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区

    针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...

  7. android 系统gpu 调试_【资讯】高通公布首批可OTA更新GPU驱动手机:谷歌Pixel 4/三星S10在列...

    文章转载自:iT之家 原文链接: https://www.ithome.com/0/479/483.htm (IT之家3月25日消息) 谷歌今天宣布了一系列面向游戏开发者的新工具:Google Pla ...

  8. Unity3D在android系统下调试

    一.工具准备 1.JDK--由于android是基于Java平台开发的,jdk是必须要安装的.下载地址:http://www.java.net/download/jdk6/6u10/promoted/ ...

  9. Android系统 Systrace调试使用说明

    1. 前言 Systrace是Android4.1中新增的性能数据采样和分析工具. 它可帮助开发者收集Android关键子系统的运行信息,从而帮助开发者更直观的分析系统瓶颈, 改进性能. 2. Sys ...

最新文章

  1. 智能猫窝是如何诞生的?详解百度大脑的开放生态
  2. python turtle画彩虹-python绘制樱花,彩虹旋等
  3. 理解随机森林:基于Python的实现和解释
  4. linux中文输入法的实现
  5. 栈和队列都是限制存取点的线性结构_栈的练习以及解析
  6. (十)深入浅出TCPIP之网络阻塞和非阻塞
  7. TextField对象相关的属性和方法总结
  8. python期末大作业_大一期末考试很重要,考得好不仅有机会有钱拿,还有机会换专业...
  9. 期待!小米电视5官曝新功能:可准确识别家中每一个人
  10. js判断字符串是否在数组中
  11. python 生成嵌套字典
  12. 2021年NLP重要国际会议时间
  13. python变量及其作用域,闭包
  14. Hyperledger Fabric 或 Composer 获取某个channel区块链的信息 或 区块链的最新高度
  15. oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
  16. 新兴基金经理凯瑟琳·伍德ARKK基金在 2022 年初遭受新的打击
  17. ubuntu中smbd服务搭建,ifcongfig命令没有IP地址
  18. no suitable HttpMessageConverter found for response type 异常
  19. cad的lisp画线_CAD画缓和曲线lisp程序
  20. C语言-指针存储空间大小

热门文章

  1. html 计算24点游戏,0048 JavaScript编程实现算24点游戏
  2. SpringBoot 结合Activiti 进行单条实例工作流审批
  3. 【shell】shell脚本实战-awk使用案例
  4. android微信分享图片压缩,Android微信分享图片按质量压缩的解决方案
  5. 华为设备配置基于VLAN的二层协议透明传输
  6. 单招计算机主板图解,磐正系列主板刷bios图解新.pdf
  7. 图片怎么批量重命名?掌握这招轻松处理
  8. 亲密接触中国SaaS应用(中)
  9. 探究对接支付API时,相遇获取文件的绝对路径
  10. python实战系列之python变量