1
0
forked from dyf/APP

6155点阵插件完成。

This commit is contained in:
liub
2025-08-07 08:48:02 +08:00
parent b3c0b74628
commit ca844723fa
4 changed files with 270 additions and 287 deletions

View File

@ -83,23 +83,25 @@
<text class="usrtitle fleft">人员信息登记</text>
<view class="btnSend fright" v-on:click.stop="sendUsr">发送</view>
<view class="clear"></view>
<TextToHex class="TextToHex" ref="textToHex" :txts="textLines" :bgColor="'#000000'" :color="'#FFFFFF'"
:fontSize="16" />
</view>
<view class="item">
<text class="lbl">单位</text>
<input class="value" v-model="user.company" placeholder="请输入单位" placeholder-class="usrplace" />
<input class="value" v-model="textLines[0]" placeholder="请输入单位" placeholder-class="usrplace" />
</view>
<view class="item">
<text class="lbl">姓名</text>
<input class="value" v-model="user.name" placeholder="请输入姓名" placeholder-class="usrplace" />
<input class="value" v-model="textLines[1]" placeholder="请输入姓名" placeholder-class="usrplace" />
</view>
<view class="item">
<text class="lbl">职位</text>
<input class="value" v-model="user.job" placeholder="请输入职位" placeholder-class="usrplace" />
<input class="value" v-model="textLines[2]" placeholder="请输入职位" placeholder-class="usrplace" />
</view>
<view class="item">
<text class="lbl">ID号</text>
<input class="value" v-model="user.id" placeholder="请输入ID" placeholder-class="usrplace" />
<input class="value" v-model="textLines[3]" placeholder="请输入ID" placeholder-class="usrplace" />
</view>
</view>
<view class="proinfo lamp">
@ -144,8 +146,9 @@
</template>
<script>
import ble from '@/api/6155/BlueHelper';
import TextToHexVue from '@/components/TextToHex/TextToHex.vue';
import bleTool from '@/utils/BleHelper.js';
var ble = null;
export default {
data() {
return {
@ -234,18 +237,13 @@
cEdit: {
mode: ''
},
user: {
company: '黄石消防支队',
name: '菜英俊',
job: '小队长',
id: 'HSXF01061'
},
textLines: ['黄石消防支队','菜英俊','小队长','HSXF01061'],
device: {
deviceId: '',
writeServiceId: '',
wirteCharactId: '',
notifyServiceid:'',
notifyCharactId:''
notifyServiceid: '',
notifyCharactId: ''
}
}
},
@ -254,21 +252,57 @@
var these = this;
let eventChannel = this.getOpenerEventChannel();
eventChannel.on('detailData', function(data) {
//eventChannel.on('detailData', function(data) {
let data = {
data: {
deviceMac: '35:06:00:EF:46:51',
bluetoothName: 'JQZM-EF4651',
deviceName: 'JQZM-EF4651',
devicePic: '',
id: '35:06:00:EF:46:51'
}
};
console.log("收到父页面的参数:" + JSON.stringify(data));
var device = data.data;
these.device.deviceId = device.deviceMac;
these.formData.name = device.bluetoothName ? device.bluetoothName : device.deviceName;
these.formData.img = device.devicePic;
these.formData.id = device.id;
})
//})
ble = bleTool.getBleTool();
ble.addReceiveCallback(these.bleValueNotify);
ble.featrueValueCallback = these.bleValueNotify;
let startLink=()=>{
ble.addDeviceFound((res) => {
console.log("发现新设备,",res);
let f = res.devices.find((v) => {
return v.name == device.deviceName;
});
if (f) {
console.log("找到了目标设备,正在连接:"+f.deviceId)
these.device.deviceId = f.deviceId;
these.formData.id = f.deviceId;
ble.LinkBlue(f.deviceId);
}
});
ble.StartSearch();
}
if(ble.data.LinkedList && ble.data.LinkedList.length>0){
let f=ble.data.LinkedList.find((v)=>{
return v.name==device.deviceName;
});
if(!f){
startLink();
}else{
these.device.deviceId = f.deviceId;
these.formData.id = f.deviceId;
}
}else{
startLink();
}
},
onHide: function() {
@ -280,36 +314,38 @@
console.log("these.device=" + JSON.stringify(these.device));
if (these.device.deviceId) {
if (e.from === 'backbutton') {
ble.getLinkBlue((res) => {
let res = {
devices: ble.data.LinkedList
};
if (res.devices.length == 0) {
console.log("没有已连接的蓝牙设备")
uni.navigateBack();
return;
}
let f = res.devices.find(function(v) {
return v.deviceId == these.device.deviceId;
});
if (!f) {
console.log("该设备没有连接")
uni.navigateBack();
return;
}
uni.showModal({
title: '提示',
content: '是否断开与设备的蓝牙连接?',
success: function(res) {
if (res.confirm) {
ble.disconnectDevice(these.device.deviceId);
}
uni.navigateBack();
}
});
if (res.devices.length == 0) {
console.log("没有已连接的蓝牙设备")
uni.navigateBack();
return false;
}
let f = res.devices.find(function(v) {
return v.deviceId == these.device.deviceId;
});
if (!f) {
console.log("该设备没有连接")
uni.navigateBack();
return false;
}
uni.showModal({
title: '提示',
content: '是否断开与设备的蓝牙连接?',
success: function(res) {
if (res.confirm) {
ble.disconnectDevice(these.device.deviceId);
}
uni.navigateBack();
}
});
return true;
}
}
@ -337,45 +373,12 @@
methods: {
getDevice: function() {
var these = this;
if (this.device.deviceId && this.device.writeServiceId && this.device.wirteCharactId) {
return this.device;
}
let key = "linkedDevices";
var store = uni.getStorageInfoSync();
var f = store.keys.find(function(v) {
return v == key;
console.log("these.device=",these.device);
console.log("LinkedList=",ble.data.LinkedList.LinkedList);
let f = ble.data.LinkedList.find((v) => {
return v.deviceId == these.device.deviceId;
});
// console.log("倒计时5");
var linkedDevices = [];
if (f) {
var str = uni.getStorageSync(key);
if (str) {
linkedDevices = JSON.parse(str);
}
}
// console.log("倒计时4");
if (linkedDevices && linkedDevices.length && linkedDevices.length > 0) {
// console.log("倒计时3");
f = linkedDevices.find(function(v) {
if(v.deviceId == these.device.deviceId){
these.device.writeServiceId=v.writeServiceId;
these.device.wirteCharactId=v.wirteCharactId;
these.device.notifyServiceid=v.notifyServiceid;
these.device.notifyCharactId=v.notifyCharactId;
return true;
}
return false;
});
} else {
f = null;
}
return f;
},
bleValueNotify: function(data) {
@ -408,44 +411,14 @@
var processAndSendImageData = function(pixels) {
return new Promise((resolve, reject) => {
// 创建RGB565格式的像素数据
const rgb565Data = convertToRGB565(pixels);
const rgb565Data = ble.convertToRGB565(pixels);
// 分包发送
sendImagePackets(rgb565Data).then(resolve).catch(reject);
});
}
// 将RGBA转换为RGB565
var convertToRGB565 = function(pixels) {
var rgbaToRgb565 = function(r, g, b, a = 255) {
// 忽略透明度(如果需要考虑透明度,请根据需求处理)
// 将8位颜色值压缩到RGB565对应的位数
const r5 = Math.round((r / 255) * 31); // 5位0-31
const g6 = Math.round((g / 255) * 63); // 6位0-63
const b5 = Math.round((b / 255) * 31); // 5位0-31
// 合并为16位整数
return (r5 << 11) | (g6 << 5) | b5;
}
const result = new Uint16Array(160 * 80);
let index = 0;
console.log("pixels.length=" + pixels.length);
for (let i = 0; i < pixels.length; i += 4) {
const r = pixels[i];
const g = pixels[i + 1];
const b = pixels[i + 2];
// 转换为RGB565 (R:5bit, G:6bit, B:5bit)
const rgb565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
//let rgb565=rgbaToRgb565(r,g,b);
result[index++] = rgb565;
}
return result;
}
// 分包发送图片数据
var sendImagePackets = function(imageData) {
@ -528,7 +501,8 @@
//发送数据包
ble.sendDataNew(f.deviceId, f.writeServiceId, f.wirteCharactId, buffer)
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId,
30)
.then(() => {
console.log("发送一个包完成了");
these.Status.Progress.curr = currentPacket;
@ -716,15 +690,21 @@
}
dataView.setUint8(5, dataValue); // 数据
dataView.setUint16(6, '9C41');
let f = this.getDevice();
// 发送数据
ble.LinkBlue(f.deviceId, () => {
setTimeout(() => {
ble.sendDataNew(f.deviceId, f.writeServiceId, f.wirteCharactId, buffer);
}, 1000);
});
if(f){
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30).then(() => {
}).catch((ex) => {
});
}
},
handleItemClick(item, index) {
@ -748,124 +728,129 @@
this.Status.Pop.showPop = false;
},
sendUsr: function() {
async sendUsr(){
// this.alert(JSON.stringify(this.user));
//生成位图并分包发送 //暂时弹出成功提示
var these = this;
var textLines = [
this.user.company,
this.user.name,
this.user.job,
this.user.id
let f = this.getDevice();
if(!f){
return;
}
var sendTxtPackge = (rgbdata, type, str) => {
];
var sendText = function() {
var promise = new Promise((resolve, reject) => {
try {
let packetSize = 120; //每包均分的数量
let mode = rgbdata.length % packetSize; //最后一包的数量
let cnt = parseInt(rgbdata.length / packetSize) + (mode > 0 ? 1 : 0); //总包数量
let curr = 1; //当前包序号
let sendNext = () => {
if (curr > cnt) {
resolve();
return;
}
console.log("正在发送" + curr + "/" + cnt)
let bufferSize = 0;
if (curr == 1) {
bufferSize = packetSize * 2 + 5;
} else if (curr == cnt) {
bufferSize = mode > 0 ? (mode * 2) : (packetSize * 2);
} else {
bufferSize = packetSize * 2;
}
// 总数据包数
const totalPackets = textLines.length;
let currentPacket = 1;
let buffer = new ArrayBuffer(bufferSize);
let dataView = new DataView(buffer);
let startIndex = (curr - 1) * packetSize;
let endIndex = Math.min(startIndex + packetSize, rgbdata.length);
if (startIndex > endIndex) {
return;
}
let packetData = rgbdata.slice(startIndex, endIndex); //取一片数据发送
let start = 0;
if (curr == 1) {
dataView.setUint8(0, 0x70);
dataView.setUint8(1, 0x65);
dataView.setUint8(2, type);
dataView.setUint16(3, str.length, false);
start = 5;
}
for (let i = 0; i < packetData.length; i++) {
dataView.setUint16(start + i * 2, packetData[i], false); // 大端字节序
}
let inteval = parseInt(this.inteval ? this.inteval : 0);
//发送数据包
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30).then(() => {
console.log("发送成功,准备发送下一包" + curr)
curr++;
setTimeout(sendNext, inteval);
}).catch(err => {
console.log("出现错误", err)
if (err.code == '10007') {
setTimeout(sendNext, inteval);
} else {
reject(err);
}
});
// 发送单个数据包
const sendNextPacket = () => {
if (currentPacket > totalPackets) {
these.Status.Pop = {
showPop: true, //是否显示弹窗
popType: 'custom',
bgColor: '#383934bd',
borderColor: '#BBE600',
textColor: '#ffffffde',
buttonBgColor: '#BBE600',
buttonTextColor: '#232323DE',
iconUrl: '/static/images/6155/DeviceDetail/sendSucc.png',
message: '人员信息发送成功',
buttonText: '确定',
clickEvt: 'SendUsr',
visiblePrompt: false,
promptTitle: '',
modelValue: '',
visibleClose: true
}
return;
sendNext();
} catch (ex) {
console.log("出现异常", ex)
reject(ex);
}
});
// 获取当前行文字
const text = textLines[currentPacket - 1] || '';
let arr = ""; // gbk.encode(text)
let gbkData = ""; //gbk.arr2hex(arr);
return promise;
console.log(JSON.stringify(gbkData));
// 构建数据包
const bufferSize = 5 + text.length * 2; // 头部4字节 + 数据部分
const buffer = new ArrayBuffer(bufferSize);
const dataView = new DataView(buffer);
// 填充头部
dataView.setUint8(0, 0x55); // 帧头
dataView.setUint8(1, 0x03); // 帧类型:文字
dataView.setUint8(2, currentPacket.toString(16)); // 包序号
dataView.setUint16(3, (text.length * 2).toString(16)); // 数据长度
console.log("gbkData.length=" + gbkData.length)
// 填充数据
for (let i = 1; i <= text.length * 2; i++) {
const highNibble = gbkData[i * 2 - 2]; // 高4位
const lowNibble = gbkData[i * 2 - 1]; // 低4位如果是奇数长度补0
console.log("i=" + i + "," + highNibble + lowNibble)
// 组合高低位并转换为字节值
const byteValue = parseInt(highNibble + lowNibble, 16);
dataView.setUint8(5 + i - 1, byteValue);
}
console.log("dataView.length=" + dataView.byteLength)
let f = these.getDevice();
if (f) {
// 发送数据包
ble.LinkBlue(f.deviceId, () => {
setTimeout(() => {
ble.sendDataNew(f.deviceId, f.writeServiceId, f
.wirteCharactId, buffer).then(() => {
// 更新进度
console.log(
`发送文字数据包 ${currentPacket}/${totalPackets}: ${text}`
);
// 发送下一个包
currentPacket++;
setTimeout(sendNextPacket, 100);
}).catch(err => {
// this.isSendingText = false;
uni.showToast({
title: '文字发送失败',
icon: 'none'
});
});
}, 0);
});
}
// }).catch(err => {
// this.isSendingText = false;
// console.log(`文字编码失败: ${err}`);
// uni.showToast({
// title: '编码失败',
// icon: 'none'
// });
// });
};
// 开始发送第一个包
sendNextPacket();
}
sendText();
var result = await this.$refs.textToHex.drawAndGetPixels();
let h3dic = [0x06, 0x07, 0x08];
let pros = [];
let flag=true;
for (var i = 0; i < result.length; i++) {
let str = this.textLines[i];
if (str.length > 0) {
let width = str.length * 16;
var rgb = ble.convertToRGB565(result[i].pixelData, width, 16);
try{
await sendTxtPackge(rgb, h3dic[i], str);
}catch(ex){
flag=false;
break;
}
}
}
if(flag){
uni.showModal({
title:"提示",
content:"发送成功"
})
}else{
uni.showModal({
title:"错误",
content:"出现了异常发送失败"
})
}
},
ack: function() {
@ -898,12 +883,9 @@
let f = this.getDevice();
if (f) {
// 发送数据
ble.LinkBlue(f.deviceId, () => {
setTimeout(() => {
ble.sendDataNew(f.deviceId, f.writeServiceId, f.wirteCharactId, buffer);
}, 1000)
});
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30);
}
},
@ -943,11 +925,9 @@
let f = this.getDevice();
if (f) {
// 发送数据
ble.LinkBlue(f.deviceId, () => {
setTimeout(() => {
ble.sendDataNew(f.deviceId, f.writeServiceId, f.wirteCharactId, buffer);
}, 100)
});
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30);
}
}
@ -1410,4 +1390,11 @@
width: 70rpx;
height: 70rpx;
}
.TextToHex {
position: fixed;
top: -99999rpx;
left: -99999rpx;
visibility: hidden;
}
</style>

View File

@ -346,13 +346,17 @@
console.log("these.device=" + JSON.stringify(these.device));
if (these.device.deviceId) {
if (e.from === 'backbutton') {
these.getLinkBlue((res) => {
let res = {
devices: ble.data.LinkedList
};
if (res.devices.length == 0) {
console.log("没有已连接的蓝牙设备")
uni.navigateBack();
return;
return false;
}
let f = res.devices.find(function(v) {
return v.deviceId == these.device.deviceId;
@ -360,22 +364,22 @@
if (!f) {
console.log("该设备没有连接")
uni.navigateBack();
return;
return false;
}
uni.showModal({
title: '提示',
content: '是否断开与设备的蓝牙连接?',
success: function(res) {
if (res.confirm) {
ble.disconnectDevice(these.device.deviceId);
}
uni.navigateBack();
}
});
});
return true;
}
}
@ -646,44 +650,14 @@
var processAndSendImageData = function(pixels) {
return new Promise((resolve, reject) => {
// 创建RGB565格式的像素数据
const rgb565Data = convertToRGB565(pixels);
const rgb565Data = ble.convertToRGB565(pixels);
// 分包发送
sendImagePackets(rgb565Data).then(resolve).catch(reject);
});
}
// 将RGBA转换为RGB565
var convertToRGB565 = function(pixels) {
var rgbaToRgb565 = function(r, g, b, a = 255) {
// 忽略透明度(如果需要考虑透明度,请根据需求处理)
// 将8位颜色值压缩到RGB565对应的位数
const r5 = Math.round((r / 255) * 31); // 5位0-31
const g6 = Math.round((g / 255) * 63); // 6位0-63
const b5 = Math.round((b / 255) * 31); // 5位0-31
// 合并为16位整数
return (r5 << 11) | (g6 << 5) | b5;
}
const result = new Uint16Array(160 * 80);
let index = 0;
console.log("pixels.length=" + pixels.length);
for (let i = 0; i < pixels.length; i += 4) {
const r = pixels[i];
const g = pixels[i + 1];
const b = pixels[i + 2];
// 转换为RGB565 (R:5bit, G:6bit, B:5bit)
const rgb565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
//let rgb565=rgbaToRgb565(r,g,b);
result[index++] = rgb565;
}
return result;
}
// 分包发送图片数据
var sendImagePackets = function(imageData) {