Android OTG之USB转串口模块通讯
微信公众号:CodingAndroid
CSDN:http://blog.csdn.net/xinpengfei521
1.背景简介
我们公司开发了一款室内机平板APP应用,要求平板能去控制智能门锁、等其他智能设备,智能门锁不是我们公司开发的,与我们公司属于合作关系。
2.分析及实现思路
- 智能门锁的控制是通过使用 433射频(不了解的请百度)来进行通讯的;
- 平板是没法与智能门锁直接进行通讯,但是厂家提供了一个433通讯模块(支持串口);
- 而平板(支持OTG)是支持USB转串口模块的,所以整个流程是可以走通的,如下图
3.主要代码实现
3.1初始化USB转串口模块
由于我们选用的是CH340模块,我们先导入ch340的 jar 包,然后在代码中检查手机/平板是否支持USB HOST模式,如果支持我们就初始化通讯时的相关参数:波特率、数据位、停止位等,具体的参数看你们之间通讯的协议。初始化完成之后,我们就可以打开USB进行通讯了,同时初始化完成之后我们需要开启一个读取数据的线程,这样,一旦收到数据或者相应的响应包(一般也叫ACK)我们就可以进行相应的处理了。
下面贴上初始化、及开启读取数据线程的代码实现:
1 /**
2 * initialize ch340 parameters.
3 *
4 * @param context Application context.
5 */
6 public static void initCH340(Context context) {
7 if (context == null) return;
8 Context appContext = context.getApplicationContext();
9 mUsbManager = (UsbManager) appContext.getSystemService(Context.USB_SERVICE);
10 if (mUsbManager != null) {
11 HashMap<String, UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
12 for (UsbDevice device : deviceHashMap.values()) {
13 if (device.getProductId() == 29987 && device.getVendorId() == 6790) {
14 mUsbDevice = device;
15 if (mUsbManager.hasPermission(device)) {
16 loadDriver(appContext, mUsbManager);
17 } else {
18 if (listener != null) {
19 listener.result(false);
20 }
21 }
22 break;
23 }
24 }
25 }
26 }
27 /**
28 * load ch340 driver.
29 *
30 * @param appContext
31 * @param usbManager
32 */
33 public static void loadDriver(Context appContext, UsbManager usbManager) {
34 driver = new CH34xUARTDriver(usbManager, appContext, ACTION_USB_PERMISSION);
35 // 判断系统是否支持USB HOST
36 if (!driver.UsbFeatureSupported()) {
37 InLog.e(TAG, "Your mobile phone does not support USB HOST, please change other phones to try again!");
38 } else {
39 openCH340();
40 }
41 }
42 /**
43 * config and open ch340.
44 */
45 private static void openCH340() {
46 int ret_val = driver.ResumeUsbList();
47 InLog.d(TAG, ret_val + "");
48 // ResumeUsbList方法用于枚举CH34X设备以及打开相关设备
49 if (ret_val == -1) {
50 InLog.d(TAG, ret_val + "Failed to open device!");
51 driver.CloseDevice();
52 } else if (ret_val == 0) {
53 if (!driver.UartInit()) { //对串口设备进行初始化操作
54 InLog.d(TAG, ret_val + "Failed device initialization!");
55 InLog.d(TAG, ret_val + "Failed to open device!");
56 return;
57 }
58 InLog.d(TAG, ret_val + "Open device successfully!");
59 if (!isOpenDeviceCH340) {
60 isOpenDeviceCH340 = true;
61 configParameters();//配置ch340的参数、需要先配置参数
62 }
63 } else {
64 InLog.d(TAG, "The phone couldn't find the device!");
65 }
66 }
67 /**
68 * config ch340 parameters.
69 * 配置串口波特率,函数说明可参照编程手册
70 */
71 private static void configParameters() {
72 if (driver.SetConfig(baudRate, dataBit, stopBit, parity, flowControl)) {
73 InLog.d(TAG, "Successful serial port Settings!");
74 if (readDataRunnable == null) {
75 readDataRunnable = new ReadDataRunnable();
76 }
77 mThreadPool.execute(readDataRunnable);
78 } else {
79 InLog.d(TAG, "Serial port Settings failed!");
80 }
81 }
3.2发送和接收数据
发送和接收数据都是按16进制进行发送和处理的,所以我们写了一个工具类方便发送,如下:
1/**
2 * Created by xpf on 2018/2/6 :)
3 * Function:CH340数据处理工具类
4 */
5public class CH340Util {
6 /**
7 * write data in ch340.
8 *
9 * @param byteArray 字节数组
10 * @return 返回写入的结果,-1表示写入失败!
11 */
12 public static int writeData(@NonNull byte[] byteArray) {
13 // 将此处收到的数组转化为HexString
14 String hexString = bytesToHexString(byteArray, byteArray.length);
15 InLog.i("TAG", "WriteHexString===" + hexString);
16 return InitCH340.getDriver().WriteData(byteArray, byteArray.length);
17 }
18 /**
19 * byte[]转换为hexString
20 *
21 * @param buffer 数据
22 * @param size 字符数
23 * @return 返回转换后的十六进制字符串
24 */
25 public static String bytesToHexString(byte[] buffer, final int size) {
26 StringBuilder stringBuilder = new StringBuilder("");
27 if (buffer == null || size <= 0) return null;
28 for (int i = 0; i < size; i++) {
29 String hex = Integer.toHexString(buffer[i] & 0xff);
30 if (hex.length() < 2) stringBuilder.append(0);
31 stringBuilder.append(hex);
32 }
33 return stringBuilder.toString();
34 }
35}
然后基本的发送和接收数据就写完了,发送数据时调用 writeData() 方法就可以了,接收数据也类似,具体的业务及通讯的协议、加密规则等都需要你和硬件提供方进行协商对接制定,由于涉及到公司机密,此处我就不进行说明了,只说一下最基本的发送和接收数据。
4.插入模块实现自动打开APP
Android中USB的插拔都会发送一个广播,我们只需要在AndroidMenifest.xml文件中接收这个广播就可以了,当我们入模块的时候就会启动我们的APP,第一次会弹出一个对话框询问我们是否打开xxx应用,我们点击确认即可,另外不是我们插入任何USB设备都打开我们的应用,所以我们需要过滤掉对我们没有用的设备,在res下建一个xml目录,新建usb_filter.xml文件,配置好我们这个USB设备模块的product-id和vendor-id,每个模块厂家这个值都是不一样的,有两种获取方式,一个是代码中枚举USB设备然后打印出来,另外一种方法是打开Logcat观察,然后插入USB设备,你会发现系统会打印出来这个USB设备等信息。
最后不要忘了添加权限:
1 <uses-feature
2 android:name="android.hardware.usb.host"
3 android:required="true" />
4 <uses-permission android:name="android.hardware.usb.host" />
此处由于篇幅原因就不具体展开讲解更多细节了,核心的代码和实现我都已经贴出来了,要想查看更具体的实现,请下载我的demo:
https://github.com/xinpengfei520/USB-OTG-CH340-UART-interface
若在阅读过程中遇到什么问题,或有好提议,欢迎在公众号“CodingAndroid”中提出
长按后点击扫一扫关注!
Android OTG之USB转串口模块通讯的更多相关文章
- android设备中USB转串口demo 下载
http://files.cnblogs.com/guobaPlayer/testUSB2Serial.apk USB转串口demo程序, 无需驱动,只要手机USB是OTG类型,插上我们的模块即可使用 ...
- 快速上手CH340N电路设计(CH340N USB转串口模块 USB Type-C接口 CH340系列芯片讲解)
一.上模块 二.功能分析 l 芯片:CH340N l 输入接口:USB.TYPE-C l 输出接口:TTL(5V\3.3V\GND\TX\RX) l 指示灯:电源.TX.RX ...
- Android OTG支持USB读卡器
我们知道,三星Android手机将USB读卡器通过OTG线插入Micro USB插口后,插拔读卡器里的SD卡,文件管理器也能够识别卡的插拔:而很多手机的OTG连上USB读卡器也来插拔SD卡,会发现文件 ...
- usb转串口模块下载时遇到的问题
ch340g usb转TTL模块,烧写wifi模块ESP8266固件时,为图省事,我直接用的该模块的3.3v电为wifi模块供的电,结果刚一上电就出现串口模块消失(听到噔的一声),电脑设备管理器里就看 ...
- 重新指派usb转串口模块在linux系统中的设备调用名称
How to remap /dev/ttyUSB* to a specific name to be called by my program. How to map /dev/ttyUSB* to ...
- 杭州蓝松科技推出的安卓端的USB转串口调试助手, 欢迎下载使用
杭州蓝松科技推出的安卓端的USB转串口调试助手, 欢迎下载使用 下载地址:http://files.cnblogs.com/guobaPlayer/%E8%93%9D%E6%9D%BEUSB%E4%B ...
- USB转串口CH340接线方法
https://blog.csdn.net/wangjiaweiwei/article/details/49612207 USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装. USB转串口模块 ...
- Android开启OTG功能/USB Host API功能
Android USB 模式简介 设备模式 当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为"USB设备"角色的,在计算机上显示为 USB 外设.现在的安卓设备已经被 ...
- Android USB转串口通信开发基本流程
好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...
随机推荐
- 嵊州D2T3 玛利亚∙多斯普拉泽雷斯 完美配对
嵊州D2T3 玛利亚∙多斯普拉泽雷斯 公墓一共有 n 个墓地,通过 n − 1 条通道相连. 每次,推销员可以在选择一个墓地推销给玛利亚. 但是,考虑很多的玛利亚会尽量否决这个提议. 她会选择一个墓地 ...
- happy and angry day! 2019-07-05
2019-07-05 01:59:51 现在我是挺开心的哈! 直面困难!迎难而上!毫无畏惧! 现在我的结果,少不了大家给我的支持与鼓励! 鸣谢 章香涛老师---------在各个方面鼓舞了我,激发了我 ...
- centos7 + Nginx+ HTTPS + uwsgi + python3.6 + Docker + Django1.11 + mysql 5.6 + virtualenv 环境搭建
环境搭建: 系统: centos7.2 x64 开发环境: python3.6 Django 1.11 虚拟环境: [Docker](https://www.runoob.com/dock ...
- Zimg—轻量级图片服务器搭建利器
在一个互联网应用中,图片扮演着越来越重要的角色.有稳定的可扩展的图片存储服务器就显得尤为的重要,云厂商们提供了便利的图片存储服务,花钱就可以解决了.这里简单介绍一个开源的一个分布式图片存储服务器--z ...
- Object.keys使用整理
一.语法 Object.keys(obj) 参数:要返回其枚举自身属性的对象 返回值:一个表示给定对象的所有可枚举属性的字符串数组 二.处理对象,返回可枚举的属性数组 let person = { n ...
- springcloud高可用方案
1. 场景描述 公司在规划后续可能会做中台服务,考虑用微服务的方案,让用springcloud部署个简单的高可用Demo. 2. 解决方案 2.1 方案说明 demo用了5台虚拟机: (1)1台gat ...
- 关于int和integer
大家可以看一下下面这个java程序的运行结果 int k = 1; int l = 1; System.out.println(k == l); int a = 128; int b = 128; S ...
- 【MySQL】(一)MySQL 体系结构和存储引擎
1.1.定义数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.在MySQL数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共 ...
- zabbix3.4汉化
1.管理员用户登入zabbix页面,更改语言为Chinese(zh_CN),点击Update 2.解决zabbix页面中文乱码 2.1在windows的C:\Windows\Fonts找到字体文件si ...
- IIS身份验证和文件操作权限(一、身份验证配置)
最近有一个项目服务器需要升级,主要是Web项目.因为以前是只写代码,不管发布.所以在环境构筑方面就出现自己的知识盲点.盲点一:IIS的身份验证的作用盲点二:IIS的身份验证和文件操作权限的关系(重点) ...