更新记录
1.0.9(2023-05-22)
- 优化SDK和demo
- 增加串口接口
1.0.8(2022-11-16)
- 增加root权限执行cmd命令
1.0.7(2022-11-15)
适配最新基座混淆问题
查看更多平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 11.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
前言
android串口通讯,支持root或无root权限系统,支持多个串口收发数据,串口参数支持波特率、数据位、校验位、停止位、流控 此插件大部分用于嵌入式Android定制主板系统中(如Android TV等), 如果是手机上type-c等otg转USB ttl串口,请使用:
WCH沁恒微电子USB转串口CH340CH341CH342CH343等新版
https://ext.dcloud.net.cn/plugin?id=12400
OTG USB串口、CP210X、CDC、FTDI、PL2303、CH34X等
https://ext.dcloud.net.cn/plugin?id=12157
串口通讯(云小帆otg转TTL串口)USB-OTG-CH340-UART
https://ext.dcloud.net.cn/plugin?id=9924
支持定制,QQ252797991
wrs-serialport组件
var serialport = uni.requireNativePlugin("wrs-serialport");
方法
- 检查Android 6 以后的动态读写权限,已经弃用,采用unaipp自带的API来检查权限,见demo
serialport.checkPermission((resp) => {
var str = JSON.stringify(resp);
this.receiveData = str;
});
- 获取所有串口
方式1:(推荐使用)
var params = {};
// params.dir = "/proc/tty/drivers"; 默认获取的是/proc/tty/drivers路径下的所有串口
serialport.getSerialPorts(params, (resp) => {
var devices = resp.devices;
if (devices.length > 0) {
var length = devices.length;
var itemList = [];
for (var i = 0; i < length; i++) {
var device = devices[i];
var title = device.path;
itemList.push(title);
}
this.showActionSheet(itemList, (index) => {
var path = devices[index].path;
if (callBack) {
callBack(path);
}
});
} else {
this.showMsg("/proc/tty/drivers路径下没有获取到串口,尝试修改dir参数");
this.showToast("/proc/tty/drivers路径下没有获取到串口,尝试修改dir参数");
}
});
方式2:(老接口,不推荐使用)
// 驱动为:/proc/tty/drivers 串口路径为:/dev
var sps = serialport.getAllSerialport();
if(isString(sps)) {
sps = JSON.parse(sps);
}
console.log(JSON.stringify(sps));
var devices = sps.devices;
- 打开串口
方式1:(推荐使用)
var params = {};
params.path = this.path;
params.baudRate = parseInt(this.baudRate); // 波特率, 默认9600
// params.dataBits = 8;// 数据位,值范围:5,6,7,8
// params.parity = 0;// 校验位,值范围:0(不校验)、1(奇校验)、2(偶校验)、3(空校验)
// params.stopBits = 1; // 停止位,值范围:1、2
// params.flowCon = 0; // 流控,值范围:0(不使用流控)、1(硬件流控RTS/CTS)、2(软件流控XON/XOFF)
// params.dataType = 0; // 设置收到数据的返回类型 0: 十六进制数字返回 1: 十六进制字符串返回 3:采用charsetName参数的转码返回
// params.charsetName = "UTF_8"; // dataType为3时生效,支持UTF_8、US_ASCII、ISO_8859_1、UTF_16、UTF_16BE、UTF_16LE
// params.sh = "/system/bin/su";
// params.needChmod = true; // true: 当串口没有读写权限时会采用/system/bin/su chmod 777 /dev/ttyS2来修改串口权限,系统需要root权限
serialport.openSP(params, (resp) => { // 打开串口回调
console.log(JSON.stringify(resp));
var title = "";
if (resp.flag) {
title = "打开成功";
} else {
title = "打开失败," + resp.msg;
}
this.showMsg(title);
}, (resp) => { // 串口发送数据回调
var respStr = JSON.stringify(resp);
console.log("数据发送成功:" + respStr);
}, (resp) => { // 串口收到数据回调
console.log(JSON.stringify(resp));
var respStr = JSON.stringify(resp);
var str = dataUtils.arrayBufferToHexStr(resp.data)
if (this.receiveData == null) {
this.receiveData = str;
} else {
this.receiveData += "\n" + str;
}
console.log("收到串口数据:" + str);
});
方式2:(老接口,不推荐使用)
var params = {};
params.path = this.path;
var baudRateValue = 9600;
if(this.baudRate != null) {
baudRateValue = parseInt(this.baudRate)
}
params.baudRate = baudRateValue; // 波特率, 默认9600
params.needChmod = false; // 当串口没有读写权限时,是否调用chmod 777命令修改读写权限,需要root权限才能执行
// params.dataBits = 8;// 数据位,值范围:5,6,7,8
// params.parity = 0;// 校验位,值范围:0(不校验)、1(奇校验)、2(偶校验)、3(空校验)
// params.stopBits = 1; // 停止位,值范围:1、2
// params.flowCon = 0; // 流控,值范围:0(不使用流控)、1(硬件流控RTS/CTS)、2(软件流控XON/XOFF)
// params.needChmod = true; // 当此串口读写权限时,是否使用chmod 777指令修改权限,需要root权限系统
serialport.open(params, (resp) => { // 打开串口回调
var title = "";
if (resp.flag) {
title = "打开成功";
} else {
title = "打开失败," + resp.msg;
}
uni.showModal({
title: title,
success: function(res) {
}
});
}, (resp) => { // 串口发送数据回调
var respStr = JSON.stringify(resp);
console.log("数据发送成功:" + respStr);
}, (resp) => { // 串口收到数据回调
var respStr = JSON.stringify(resp);
var str = dataUtils.arrayBufferToHexStr(resp.data)
if(this.receiveData == null) {
this.receiveData = str;
} else {
this.receiveData += "\n" + str;
}
console.log("收到串口数据:" + str);
});
- serialport.close(params, callback) 关闭串口
var params = {};
params.path = this.path;
serialport.close(params, (resp) => {
console.log("串口已关闭");
});
- serialport.sendData(params) 发送数据
var array = new Array();
// array.push(0xFA);
// array.push(0xFB);
dataUtils.addHexStrToArray(this.data, this.data.length/2, array);
var params = {};
params.path = this.path;
params.data = array; // data可以是十六进制的数组,如上面的array,也可以是十六进制的字符串,如“FAFB”
serialport.sendData(params);
- serialport.sendHex(params) 发送十六进制数据
var params = {};
params.path = this.path;
params.data = “FAFB”;
serialport.sendHex(params);
- serialport.sendBytes(params) 发送字节数据
var array = new Array();
array.push(0xFA);
array.push(0xFB);
var params = {};
params.path = this.path;
params.data = array;
serialport.sendBytes(params);
- serialport.getSerialportState(params) 查询串口状态
var params = {};
params.path = this.path;
var resp = serialport.getSerialportState(params)
if(isString(resp)) {
resp = JSON.parse(resp);
}
var state = resp.state; // 0: 串口没有打开 1: 串口打开了
- 检查读权限
serialport.canRead({
path: this.path
}, (resp)=>{
var canRead = resp.canRead;
if(canRead) {
this.showMsg("可读");
} else {
this.showMsg("不可读");
}
});
- 检查写权限
serialport.canWrite({
path: this.path
}, (resp)=>{
var canWrite = resp.canWrite;
if(canWrite) {
this.showMsg("可写");
} else {
this.showMsg("不可写");
}
});
- 执行cmd命令
// 一般用来串口读写权限不够时,在打开串口之前提前使用cmd命令来改变权限
serialport.executeCmd({
cmd: "chmod 777 " + this.path
// needWaitFor: true // 是否等待命令执行完
}, (resp)=>{
var flag = resp.flag;
if(flag) {
this.showMsg("cmd执行成功");
} else {
this.showMsg("cmd执行失败:" + resp.msg);
}
});
- root权限执行cmd命令
// 一般用来串口读写权限不够时,在打开串口之前提前使用cmd命令来改变权限,需要root权限
serialport.executeRootCmd({
cmd: "chmod 777 " + this.path
// needWaitFor: true // 是否等待命令执行完
// suPath: "/system/bin/su" // su命令路径,一般不需要指定
}, (resp)=>{
var flag = resp.flag;
if(flag) {
this.showMsg("cmd执行成功");
} else {
this.showMsg("cmd执行失败:" + resp.msg);
}
});
- 检查串口是否存在
serialport.exists({
path: this.path
}, (resp)=>{
var exists = resp.exists;
if(exists) {
this.showMsg("存在");
} else {
this.showMsg("不存在");
}
});