Android系统韦根调试从驱动到应用(二)
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系统韦根调试从驱动到应用(二)相关推荐
- Android系统韦根调试从驱动到应用(三)
Android系统韦根调试从驱动到应用 软件开发平台:android P 源码. 硬件开发平台:nxp imx8m mini开发板. 本文记录在nxp 8m mini 硬件平台, androidP 源 ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...
- Android系统 linux内核按键驱动开发
Android系统 linux内核按键驱动开发 前言 刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人. 1.修改设备树.dts 我是用的开发板是rp-rk32 ...
- Android之 震动(Vibrator)如何贯通Android系统 (从硬件设计 -- 驱动 -- HAL -- JNI -- Framework -- Application)
在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于"Android 震动马达系统"的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的 ...
- android系统移植之按键驱动篇
平台:MX53_QSB开发板 MX53_QSB开发板上一起有四个按键,分别为RESET,POWER,USER1,USER2.其中RESET为纯硬件复位按键,无须软件控制.POWER,USER1,USE ...
- android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区
针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...
- android 系统gpu 调试_【资讯】高通公布首批可OTA更新GPU驱动手机:谷歌Pixel 4/三星S10在列...
文章转载自:iT之家 原文链接: https://www.ithome.com/0/479/483.htm (IT之家3月25日消息) 谷歌今天宣布了一系列面向游戏开发者的新工具:Google Pla ...
- Unity3D在android系统下调试
一.工具准备 1.JDK--由于android是基于Java平台开发的,jdk是必须要安装的.下载地址:http://www.java.net/download/jdk6/6u10/promoted/ ...
- Android系统 Systrace调试使用说明
1. 前言 Systrace是Android4.1中新增的性能数据采样和分析工具. 它可帮助开发者收集Android关键子系统的运行信息,从而帮助开发者更直观的分析系统瓶颈, 改进性能. 2. Sys ...
最新文章
- 智能猫窝是如何诞生的?详解百度大脑的开放生态
- python turtle画彩虹-python绘制樱花,彩虹旋等
- 理解随机森林:基于Python的实现和解释
- linux中文输入法的实现
- 栈和队列都是限制存取点的线性结构_栈的练习以及解析
- (十)深入浅出TCPIP之网络阻塞和非阻塞
- TextField对象相关的属性和方法总结
- python期末大作业_大一期末考试很重要,考得好不仅有机会有钱拿,还有机会换专业...
- 期待!小米电视5官曝新功能:可准确识别家中每一个人
- js判断字符串是否在数组中
- python 生成嵌套字典
- 2021年NLP重要国际会议时间
- python变量及其作用域,闭包
- Hyperledger Fabric 或 Composer 获取某个channel区块链的信息 或 区块链的最新高度
- oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
- 新兴基金经理凯瑟琳·伍德ARKK基金在 2022 年初遭受新的打击
- ubuntu中smbd服务搭建,ifcongfig命令没有IP地址
- no suitable HttpMessageConverter found for response type 异常
- cad的lisp画线_CAD画缓和曲线lisp程序
- C语言-指针存储空间大小