安卓设备通过USB,连接继电器,再通过继电器开关闸机
背景是,手上有一台设备,商米的,有USB口和RJ11口,想要通过这个设备放在闸机上,能够联动闸机的开关
因为这个安卓设备 本身不支持 发送开关量信号,所以要自己买一个 继电器
我的继电器是淘宝上买的一个。直接插在 安卓设备的 USB口上。
话不多说,看代码,要自己稍微整理一下。
1,AndroidManifest.xml 文件
<uses-feature android:name="android.hardware.usb.host" /><uses-permission android:name="android.permission.USB_PERMISSION" />权限声明<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 可选,维持唤醒--><application>
......其他文件<!-- 配置USB设备过滤器,当插入设备时系统会提示是否打开应用(可选) --><meta-dataandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/device_filter" /></application>
新建一个过滤文件 res/xml /device_filter.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><!-- 以下是一些常见USB串口芯片的示例 --><!-- FTDI --><usb-device vendor-id="1027" product-id="24577" /> <!-- 0x0403, 0x6001 --><!-- Prolific (注意:很多山寨芯片,可能需要尝试不同的PID) --><usb-device vendor-id="1659" product-id="8963" /> <!-- 0x067B, 0x2303 --><!-- Silicon Labs CP210x --><usb-device vendor-id="4292" product-id="60000" /> <!-- 0x10C4, 0xEA60 --><!-- CH340, CH341 --><usb-device vendor-id="6790" product-id="29987" /> <!-- 0x1A86, 0x7523 --><!-- 添加更多支持的设备... -->
</resources>
代码部分
private UsbManager usbManager;private UsbSerialDriver serialDriver;private UsbSerialPort port;private PendingIntent permissionIntent;//这是继电器开的指令。找淘宝卖家问private static final byte[] opencode = new byte[] {(byte) 0xA0,0x01,0x01,(byte) 0xA2};
//这是继电器关的指令。找淘宝卖家问private static final byte[] closecode = new byte[] {(byte) 0xA0,0x01,0x00,(byte) 0xA1};//初始化连接public void initUsb() {usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);datatext.append("usb数量:"+availableDrivers.size()+"\n");if (availableDrivers.isEmpty()) {Log.e("USB", "未检测到串口设备");return;}//找到多个USB 设备for(int i = 0;i<availableDrivers.size();i++){UsbSerialDriver localserialDriver = availableDrivers.get(i);datatext.append("Usb SerialDriver:"+localserialDriver.toString()+"\n");int vendorId = localserialDriver.getDevice().getVendorId();int deviceId = localserialDriver.getDevice().getDeviceId();int productId = localserialDriver.getDevice().getProductId();datatext.append("Usb vendorId:"+vendorId+"\n");datatext.append("Usb deviceId:"+deviceId+"\n");datatext.append("Usb productId:"+productId+"\n");if(vendorId == 6790 && productId == 29987){//根据厂商编号和产品编号,找到设备serialDriver = localserialDriver;break;}}if(serialDriver != null){datatext.append("Usb 找到设备了 \n");}permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("ACTION_USB_PERMISSION"), PendingIntent.FLAG_MUTABLE);// 检查权限,这里必要要请求到权限if (!usbManager.hasPermission(serialDriver.getDevice())) {// 请求权限,需要创建PendingIntent// 注意:这里使用driver.getDevice()获取UsbDeviceusbManager.requestPermission(serialDriver.getDevice(),permissionIntent);datatext.append("Usb 权限初始化");}//开始连接,openconnect();}public boolean openconnect(){UsbSerialPort localport = serialDriver.getPorts().get(0);try {localport.open(usbManager.openDevice(serialDriver.getDevice()));}catch (Exception e){datatext.append("Usb 失败,请重试");return false;}port = localport;datatext.append("Usb 连接成功");return true;}//根据使用时机,发送指令public void setOnoff(){try {//连接可能会一段时间后断开,一定要做好重试机制if(port != null && !port.isOpen()){if(!openconnect()){datatext.append("Usb 连接失败,请重试");}}port.write(opencode,1);Thread.sleep(1000);port.write(closecode,1);}catch (Exception e){datatext.append("Usb 失败,请重试");}datatext.append("Usb 执行继电器开关");}