pda
概述
PDA Android 版本号是 9,通过包名查看器,封装的报修客户端的包名是 webapp.weixiupda
IP
为所有车间触摸屏和 PDA 都设置了静态 IP,PDA 的 IP 从176到190
新PDA初始化步骤
- 2026年5月15日 采购5个
PDA,设置IP地址从192.168.110.175 ~ 171,手持打印机打印后贴在背面电池壳 - 2026年6月13日 采购3个
PDA, 新增向下的IP地址,从192.168.110.170到192.168.110.168 - 安装保护壳+钢化膜
- 设置 > 系统 > 高级 > 关于手机,找到 版本号 (倒数第二个选项),连续点击7次,输入密码 4007770876(或者888888),开启开发者模式。直接安装
apk文件的密码也是这个 - 设置 > 系统 > 高级 > 开发者选项,关闭 系统自动更新,打开 USB调试,关闭 始终开启移动数据网络
- 特色设置 > 打开 隐藏软键盘
- 特色设置 > 打开 硬键盘提示音
- 扫描工具 > 应用设置 > 条码发送 > 修改为 焦点录入
- 设置 > 电池 > 关闭 待机智能省电
- 关闭 电池管理器
- 打开 电池电量百分比
- 设置 > 显示 > 设置 休眠 为30秒
- 设置 屏保 为时钟
- 设置 > 安全性和位置信息 > 屏幕锁定,选择为无
- 关闭 位置信息
- 打开 显示密码
- 安装一个在公司可以测试客户端,打开测试。之后安装对方厂里的客户端,3个都要安装
- 开启
WLAN并连接网络SNBC,密码是SNBC123456,前面的英文是大写 - 在
SNBC服务器桌面上打开 极限投屏 ,点击左边按钮 扫描WIFI ,勾选右边显示的网段192.167.110.1 - 192.168.110.254后点击扫描,同时关注正在开机的新的PDA,会自动跳出要求确认的对话框,勾选 一律允许... 并点击确定。之后就可以通过这个工具远程控制PDA - 完成上面第10步后安装目录 D:\安装程序\pda 下的两个软件:SNBCPDA后台.apk,维修PDA.apk。在 极限投屏 软件的左边,通过按钮 安装apk 安装前面两个软件。测试登录维修系统
- 切记,不可关闭开发者选项
- 开启
WLAN并连接网络@Ruijie,密码是Aa123456 - 在
xdf250服务器桌面上打开 极限投屏 ,点击左边按钮 扫描WIFI ,勾选右边显示的网段192.167.0.1 - 192.168.0.254后点击扫描,同时关注正在开机的新的PDA,会自动跳出要求确认的对话框,勾选 一律允许... 并点击确定。之后就可以通过这个工具远程控制PDA - 使用 极限投屏 安装目录 D:\客户列表\SNBC\apk 下的三个
apk。在 极限投屏 软件的左边,通过按钮 安装apk 进行安装 - 切记,不可关闭开发者选项
原生APP.WebView
最初使用第三方封装工具将 web 项目封装为 android app 安装到 PDA 上,后来自己制作了封装 webview 的原生 app,所以下面的 EMSAnnex 后来弃用了。自己制作的壳 app 是 仓库,在 Android Studio 中通过修改配置编译生成多个 PDA app
- 文件
build.gradle.kts中通过启用applicationId保证编译生成的app唯一 - 文件
AppConfig.java中的WEB_APP_URL修改app访问的web项目 - 修改文件
AndroidManifest.xml中的android:label是安装后的app名称,更换图标的话需要替换文件,不要修改源码中的文件名。使用\\192.168.0.119\安装程序\素材\android图标\SNBCEMS图标\故障对应\android\res下的6个目录覆盖掉源码中的同名目录,即实现了更换图标。类似的使用\\192.168.0.119\安装程序\素材\android图标\SNBCEMS图标\设备点检\android\res下的所有目录覆盖源码同名目录,更换为设备点检的图标再编译。 - 如果要使用本源码项目生成新的
app,要在strings.xml中的标签resources中新增一行生成的app名称 - 最后通过菜单项
Build > Generate App Bundles or APKs > Generate APKs编译生成apk
EMSAnnex
在 Trae 中通过提示词开发的过程
这是一个 android 原生 app 的项目,之后会运行在 android9 的系统中,请帮我添加开机启动功能,在 MainActivity 中添加一个定时任务,每5秒钟请求地址 http://192.168.0.68:17080/nskemsbe/androidAnnex/insert 以 post 方式传参 {"deviceId":"aa","reqTime":"2025-12-15 00:01:02"},注意属性 reqTime 要设置为发送请求的时间
在 activity_main.xml 中新增一个 TextView,用于设置IP地址,再新增一个 TextView 用于设置端口号,保存后将这两个数据用于 MainActivity 中变量 URL 中的IP地址和端口号。注意,修改并保存后立即生效
在工程中创建一个存放资源文件的目录,我会将一个音频文件“new_task.mp3”拷贝到这个目录下,在之前做好的定时任务中追加逻辑:播放这个音频文件
定时任务中请求接口 nskemsbe/androidAnnex/insert 时传入的参数的属性 deviceId 更换为当前硬件的唯一标识
后台服务使用 springboot 开发,其中有两个实体类,分别是 public class JsonResult {
private Integer code; private String msg; private Object data;} 和 public class RepairMain {private Long id;
private String progress;
private Long lineId; private String userSid; } 是否需要在这个项目中制作对应的实体类?以后会有接口响应的数据是将 RepairMain 对象数组赋值给 JsonResult.data 属性,请考虑是否需要做类型转换相关的操作在定时任务中追加逻辑:请求A接口 http://127.0.0.1:17078/nskemsbe/repairMain/getPDAVoiceData 以 post 方式传A1参数 {"pdaSid":"aa"},注意A接口中的主机IP地址和端口号使用 MainActivity 中的全局变量 KEY_IP 和 KEY_PORT,A1参数属性 pdaSid 的值要使用硬件唯一标识,即调用方法 getAndroidDeviceId 得到的返回数据。后端响应来的数据是本项目的实体类 JsonResult 对象,其中属性 data 是 RepairMain 对象数组。拿到响应数据后遍历 RepairMain 对象数组,查看属性 lineId,如果等于0则播放文件 R.raw.new_task,同时请求B接口 http://127.0.0.1:17078/nskemsbe/pdaVoiceLog/insert,以post方式传B1参数 {"repairId":11,"pdaSid":"aa","reqTime":"2025-12-12 11:12:13"}。B接口中的IP地址和端口号使用全局变量 KEY_IP 和 KEY_PORT,B1参数的属性 repairId 是当前遍历的数组元素对象的属性id,pdaSid是硬件唯一标识,reqTime是当前发送请求的时间,注意要采用B1参数中相同的格式。遍历过程中如果属性 lineId 大于0则不要任何操作,继续下一次循环
注册PDA客户端
使用 Gemini 给出下面的提示词,可直接生成使用自定义封装层调用 web 注册 PDA 硬件的 app。这个布局适合用于 PC 上,放在 PDA 上布局错乱
我想要制作一个html页面,注意逻辑代码都要写在js文件中,不要写在html中。这个前端项目的后台服务采用springboot制作,对应的mysql有表如下: create table pda ( id bigint auto_increment comment '自增主键' primary key, sid varchar(100) default '' null comment 'pda硬件标识,是唯一标识', name varchar(100) default '' null comment 'pda名称', state int default 1 null comment '状态,默认1有效,0停用', is_delete int default 0 null comment '删除标识,默认0未删除,1表示删除。mybatis-flex默认使用该名称作为逻辑删除的标识', remark varchar(200) default '' null comment '备注', sys_remark varchar(100) default '' null comment '系统备注,系统在做自动化操作时用于说明业务逻辑', seq float default 0 null comment '排序序号', extra_info json null comment '附加信息', create_time datetime default CURRENT_TIMESTAMP null comment '创建时间,DB自动填充', create_user varchar(100) default '' null comment '创建人', update_time datetime null on update CURRENT_TIMESTAMP comment '最后一次修改时间', update_user varchar(100) default '' null comment '修改人' ) comment 'PDA注册表'; 后台服务响应来的结果是下面类的对象 public class JsonResult { private Integer code; private String msg; private Object data; } 请创建一个html页面,打开该页面时立即请求接口A:/snbcemsbe/pda/selectAll,响应来的结果是JsonResult对象,其中的data是pda表对应的java实体类对象数组,将这个对象数组显示到一个表格中,只要显示字段sid和name,列头显示的中文依次是“编号”和“名称”。这个页面中提供对表格数据的新增、修改、删除操作,新增数据时调用js函数 window.PDAApp.getDeviceHardwareId()的返回值填充到“编号”要素中,“名称”由用户手动输入,新增的接口是B:/snbcemsbe/pda/insertSelective,以post方式传参{"sid":"aa","name":"1#"} 其中sid属性就是“编号”的数据,注意新增数据时不可与表格中的名称重复。修改表格数据时不可修改“编号”,只能修改“名称”,请求接口C:/snbcemsbe/pda/update8Sid,以post方式传参{"sid":"aa","name":"1#"}。删除时请求接口D:/snbcemsbe/pda/delete8Sid,以post方式传参{"sid":"aa"}。在新增、修改、删除后都再次请求接口A,查询获取最新数据后更新到表格中。
