本人在一个安卓智能物联网项目当中需要将作为主控设备的全智33板子与Zigbee模块连接。连接通过一条T头的USB串口线进行连接。从对串口驱动和实现方法一无所知到最终可以正常的实现Zigbee收发通信,其中遇到了很多难关。我总结如下:
问题编号 | 问题描述 | 解决方法 | 备注 |
1 | 插上连接线没有检测到串口设备节点/dev/ttyUSB* | make menuconfig,选上USB serial support中的2303系列 | 先通过了解USB转串口驱动大致有哪几种,然后看Zigbee转串口芯片型号判断 |
2 | 不知道怎么去读数据,读数据容易发生阻塞 | HAL层开启线程去读数据,实现回调上层JAVA函数方法 | 了解JAVA的语法知识 |
3 | 设备节点权限777,却open失败 | 第一步,我们找到file_contexts文件,这个文件通常在device/mypaltform/sepolicy 或者external/sepolicy目录下。我们在这个文件下增加一行 “/dev/devname u:object_r:my_device:s0”。/dev/devname是设备节点,也就是我们要打开的设备名。my_device我们可以定义一个我们看的懂的有意义的名字。object_r标明这是一个文件。s0是表示优先级的。 第二步,在device.te文件中添加一行 “type my_device, dev_type ”; 第三步,在对应的在device/mypaltform/sepolicy 或者external/sepolicy目录下找到进程名加te为扩展名的,例如如果我们希望rild程序可以访问我们的节点可以打开rild.te文件在后面加上一行“allow rild my_device:chr_file rw_file_perms;”这时我们重新编译后,再看看在rild进程里面打开/dev/devname,读写这个设备文件都正常了。可是在实际的开发中往往是我们并不知道这个驱动将会被哪个应用程序调用,可能其他人调用我们的驱动做开发,或者安装第三方APP。如果是这样,我们可以找到例如app.te、systemp_app.te、untrusted_app.te。等文件,在里面加上如“allow appdomain my_device:chr_file rw_file_perms; ”(表示所有的APP都可以访问该设备节点)、“allow system_app my_device:chr_file rw_file_perms; ”表示具有system UID的APP都可以访问该设备节点)、“allow untrusted_app my_device:chr_file rw_file_perms;”(表示所有第三方的APP都可以访问该设备节点)。或者直接打开domain.te加上“allow domain my_device:chr_file rw_file_perms;”(所有的进程、服务都可以访问该节点)。当然了,实际上上诉的语句不一定放在上面指定的文件里,放在任何文件里效果是一样的,但是为了方便阅读和管理,还是添加到对应的文件中比较好。 | 在Android 5.0或5.1下,采取了SEAndroid/SElinux的安全机制。SELINUX是美国国家安全局和一些公司设计的一个针对linux的安全加强系统,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。 |
4 | 需要连接的设备线太多,端口不够用 | 买个USB HUB,用无线adb调试 |