当前位置: 首页 > news >正文

安卓设备通过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 执行继电器开关");}
http://www.dtcms.com/a/331384.html

相关文章:

  • 前端包管理工具
  • 【FreeRTOS】任务管理:创建与删除任务,任务优先级与阻塞
  • 计算机网络---传输控制协议Transmission Control Protocol(TCP)
  • Redis的 ​​散列(Hash)​​ 和 ​​列表(List)​​ 数据结构操作详解
  • 力扣-64.最小路径和
  • 【AI推理部署教程】使用 vLLM 运行智谱 GLM-4.5V 视觉语言模型推理服务
  • 电商双 11 美妆数据分析总结(补充)
  • 入门概述(面试常问)
  • 中久数创——笔试题
  • Android构建工具版本兼容性对照表
  • Git 中切换到指定 tag
  • 会议系统核心流程详解:创建、加入与消息交互
  • 卫星通信链路预算之七:上行载噪比计算
  • MySQL-dble分库分表方案
  • 【最新版】怎么下载mysqlclient并成功安装?
  • 物化视图优先迁移大表,缩短逻辑迁移时间
  • MySql——binlog和redolog的区别
  • uniapp开发动态添加密码验证
  • Go语言全面解析:从入门到精通
  • C/C++ 指针与内存操作详解——从一级指针到字符串转换函数的完整解析
  • 拒绝“孤岛式”作战,全方位构筑隧道应急通信解决方案
  • Java 学习笔记(基础篇2)
  • 13、C 语言结构体尺寸知识点总结
  • LeetCode 刷题【41. 缺失的第一个正数】
  • 【力扣322】零钱兑换
  • 非容器方式安装Prometheus和Grafana,以及nginx配置访问Grafana
  • GraphRAG查询(Query)流程实现原理分析
  • NetLimiter:精准掌控网络流量,优化网络体验
  • 《中国人工智能安全承诺框架》发布
  • arthas火焰图怎么看