1
0
forked from dyf/APP
Files
APP/pages/670/HBY670.vue
2025-08-27 09:08:59 +08:00

2360 lines
58 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content contentBg">
<view class="eq">
<view class="leftImg">
<image class="img" :src="device['devicePic']" mode="aspectFit"></image>
</view>
<view class="rightTxt">
<view class="row">
<image class="img" src="/static/images/6155/DeviceDetail/battry.png" mode="aspectFit"></image>
<view class="txt">
<view class="bigTxt">{{formData.battary}}%</view>
<view class="smallTxt">电量</view>
</view>
</view>
<view class="row">
<image class="img" src="/static/images/6155/DeviceDetail/time.png" mode="aspectFit"></image>
<view class="txt">
<view class="bigTxt">{{formData.xuhang}}</view>
<view class="smallTxt">续航时间</view>
</view>
</view>
</view>
</view>
<view class="eqinfo">
<view class="item">
<text class="lbl">设备IMEI</text>
<text class="value">{{device.deviceImei}}</text>
</view>
<view class="item">
<text class="lbl">设备名称</text>
<text class="value">{{device.deviceName}}</text>
</view>
<view class="item">
<text class="lbl">定位信息</text>
<view>
<view>{{formData.lon}}&nbsp;&nbsp;{{formData.lat}}</view>
<text class="value">{{formData.address}}</text>
</view>
</view>
</view>
<view class="warnnig" v-bind:class="formData.staticWarn?'':'displayNone'">
<view>设备自动报警中</view>
<view>{{Status.staticWarn.time}}s</view>
</view>
<view class="optTitle">
档位
</view>
<view class="modeSetting">
<view class="item" :class="formData.modeCurr=='low'?'active':''"
@click="GearSetting('low','staticBattery')">
<view class="p100 center">低档</view>
</view>
<view class="item " :class="formData.modeCurr=='center'?'active':''"
@click="GearSetting('center','staticBattery')">
<view class="p100 center">中档</view>
</view>
<view class="item " :class="formData.modeCurr=='hight'?'active':''"
@click="GearSetting('hight','staticBattery')">
<view class="p100 center">高档</view>
</view>
</view>
<view class="optTitle">
SOS
</view>
<view class="sosContent">
<view class="item" @click="sosSetting('sg')" :class="formData.SOS=='sg'?'active':''">
<view class="imgContent center">
<image class="img" :src="formData.SOS=='sg'?'/static/images/670/sgActive.png':'/static/images/670/sg.png'" mode="aspectFit"></image>
</view>
<view class="txt">声光报警</view>
</view>
<view class="item" @click="sosSetting('rb')" :class="formData.SOS=='rb'?'active':''">
<view class="imgContent center">
<image class="img" :src="formData.SOS=='rb'?'/static/images/670/rbActive.png':'/static/images/670/rb.png'" mode="aspectFit"></image>
</view>
<view class="txt">红蓝闪烁</view>
</view>
</view>
<view class="optTitle">
照明模式
</view>
<view class="lightMode">
<view class="item" @click="lightSetting('qiang')" :class="formData.lightCurr=='qiang'?'active':''">
<view class="imgContent center">
<image class="img" :src="formData.lightCurr=='qiang'?'/static/images/670/qiangActive.png':'/static/images/670/qiang.png'" mode="aspectFit"></image>
</view>
<view class="txt">强光</view>
</view>
<view class="item" @click="lightSetting('ruo')" :class="formData.lightCurr=='ruo'?'active':''">
<view class="imgContent center">
<image class="img" :src="formData.lightCurr=='ruo'?'/static/images/670/ruoActive.png':'/static/images/670/ruo.png'" mode="aspectFit"></image>
</view>
<view class="txt">弱光</view>
</view>
<view class="item" @click="lightSetting('close')" :class="formData.lightCurr=='close'?'active':''">
<view class="imgContent center">
<image class="img" :src="formData.lightCurr=='close'?'/static/images/670/jieNActive.png':'/static/images/670/jieN.png'" mode="aspectFit"></image>
</view>
<view class="txt">关闭</view>
</view>
</view>
<view class="usrinfo">
<view @click="Status.usrToggle=!Status.usrToggle">
<text class="usrtitle fleft">人员信息登记</text>
<view class="image fright" :style="{transform:Status.usrToggle?'rotate(0deg)':'rotate(180deg)' }">
<image class="img" src="/static/images/6155/DeviceDetail/slideToggle.png" mode="aspectFit"></image>
</view>
<view class="clear"></view>
</view>
<view :class="Status.usrToggle?'':'displayNone'">
<view style="margin: 20rpx 0rpx;">
<view class="btnSend fright" v-on:click.stop="sendUsr(null)">发送</view>
<view class="clear"></view>
</view>
<view class="item">
<text class="lbl">单位</text>
<input class="value" v-model="formData.company" placeholder="请输入单位" placeholder-class="usrplace" />
</view>
<view class="item">
<text class="lbl">姓名</text>
<input class="value" v-model="formData.usrname" placeholder="请输入姓名" placeholder-class="usrplace" />
</view>
<view class="item">
<text class="lbl">职位</text>
<input class="value" v-model="formData.job" placeholder="请输入职位" placeholder-class="usrplace" />
</view>
<view class="item">
<text class="lbl">ID号</text>
<input class="value" v-model="formData.usrid" placeholder="请输入ID" placeholder-class="usrplace" />
</view>
</view>
</view>
<view class="usrinfo">
<view >
<text class="usrtitle fleft">发送信息</text>
<view class="btnSend fright" v-on:click.stop="sendUrgent(null)">发送</view>
<view class="clear"></view>
</view>
<view >
<view class="item">
<input class="value" style="text-indent: 20rpx;" v-model="formData.msgTxt" placeholder="请输入文字" placeholder-class="usrplace" />
</view>
</view>
</view>
<view class="usrinfo picVideo">
<view >
<text class="usrtitle fleft">开机画面</text>
<view class="clear"></view>
</view>
<view v-on:click.stop="ShowUpload()" class="btnImg center">
<image class="img" src="/static/images/6155/DeviceDetail/add.png" mode="aspectFit"></image>
</view>
</view>
<view class="proinfo lamp">
<text class="title">产品信息</text>
<view class="itemcontent">
<view class="item" @click="proParam()">
<image class="img" src="/static/images/6155/DeviceDetail/param.png" mode="aspectFit"></image>
<text class="txt">产品参数</text>
</view>
<view class="item" @click="handRemark()">
<image class="img" src="/static/images/6155/DeviceDetail/remark.png" mode="aspectFit"></image>
<text class="txt">操作说明</text>
</view>
<view class="item" @click="handVideo()">
<image class="img" src="/static/images/6155/DeviceDetail/video.png" mode="aspectFit"></image>
<text class="txt">操作视频</text>
</view>
</view>
</view>
<!-- 弹窗通知 -->
<MessagePopup :visible="Status.Pop.showPop" :type="Status.Pop.popType" :bgColor="Status.Pop.bgColor"
:borderColor="Status.Pop.borderColor" :textColor="Status.Pop.textColor"
:buttonBgColor="Status.Pop.buttonBgColor" :buttonTextColor="Status.Pop.buttonTextColor"
:iconUrl="Status.Pop.iconUrl" :message="Status.Pop.message" :buttonText="Status.Pop.buttonText"
@buttonClick="HidePop" :visiblePrompt="Status.Pop.visiblePrompt" :promptTitle="Status.Pop.promptTitle"
v-model="Status.Pop.modelValue" />
<!-- 下方菜单 -->
<BottomSlideMenuPlus :config="Status.BottomMenu" @close="closeMenu" @itemClick="handleItemClick"
@btnClick="btnClick">
<view>
<view class="addIco">
<view class="icoContent center" v-on:click.stop="checkImgUpload()">
<image mode="aspectFit" class="img" src="/static/images/6155/DeviceDetail/add.png"></image>
</view>
</view>
</view>
</BottomSlideMenuPlus>
<global-loading ref="loading" />
</view>
</template>
<script>
import gbk from '@/utils/gbk.js'
import BleTool from '@/utils/BleHelper.js'
import BleReceive from '@/utils/BleReceive';
import api from '@/api/670/HBY670.js';
import MqttClient from '@/utils/mqtt.js';
import {
showLoading,
hideLoading,
updateLoading
} from '@/utils/loading.js'
const pagePath = "pages/650/HBY650";
var ble = null;
var these = null;
var recei = null;
var mqttClient=null;
export default {
data() {
return {
Status: {
staticWarn:{
time:0,
inteval:null
},
Pop: {
showPop: false, //是否显示弹窗
popType: 'custom',
bgColor: '#383934bd',
borderColor: '#BBE600',
textColor: '#ffffffde',
buttonBgColor: '#BBE600',
buttonTextColor: '#232323DE',
iconUrl: '',
message: '您确定要这样做吗?',
buttonText: '确定',
clickEvt: '',
visiblePrompt: false,
promptTitle: '设备名称',
modelValue: '',
visibleClose: false
},
BottomMenu: {
show: false,
showHeader: true,
menuItems: [{
text: '强光',
icon: '/static/images/6155/DeviceDetail/qiang.png'
},
{
text: '弱光',
icon: '/static/images/6155/DeviceDetail/ruo.png'
},
{
text: '爆闪',
icon: '/static/images/6155/DeviceDetail/shan.png'
}
],
activeIndex: -1,
bgColor: '#2a2a2a',
itemBgColor: '#3a3a3a',
textColor: '#ffffffde',
textAlign: 'flex-start',
title: '主灯模式',
showDivider: false,
dividerColor: '#00000000',
dividerThickness: '0rpx',
dividerMargin: '10rpx',
itemHeight: '80rpx',
type: '',
showBtn: true,
btnBgColor: "#bbe600",
btnText: "确定",
btnTextColor: "#232323de",
showMask: true,
maskBgColor: '#00000066',
showClose: false
},
usrToggle: true,
},
formData: {
battary: "", //电量
xuhang: "", //续航
imei: "", //imei
Lon: "", //经度
Lat: "", //纬度
address: "", //地址
modeCurr: "", //档位
SOS: "sg", //sos
lightCurr: "qiang", //照明模式
company: "", //单位
usrname: "", //姓名
job: "", //职位
id: "", //id
msgTxt: "", //消息1
qzwarn: false, //是否强制报警
warnLevel: "", //报警级别
staticWarn:false,//静止报警
fourGStrenth:0,//4G信号强度
deviceId: ""
},
device: {
id: "",
deviceName: "",
deviceImei: "",
deviceMac: "",
communicationMode: 0,
devicePic: "",
typeName: "",
bluetoothName: null,
deviceStatus: null,
bindingTime: "",
onlineStatus: 0,
battery: "0",
latitude: null,
longitude: null,
alarmStatus: null,
detailPageUrl: "/pages/670/HBY670",
showConfirm: false
},
rgb565Data: [],
videoHexArray: [],
picPath:""
}
},
onUnload() {
console.log("页面卸载,释放资源");
ble.removeReceiveCallback(pagePath);
},
onLoad: function() {
console.log("670页面加载");
these = this;
recei = BleReceive.getBleReceive();
ble = BleTool.getBleTool();
ble.addReceiveCallback(these.bleValueNotify);
let eventChannel = this.getOpenerEventChannel();
eventChannel.on('detailData', function(data) {
console.log("收到父页面的参数:" + JSON.stringify(data));
var device = data.data;
these.device=device;
if(these.device.deviceImei){
these.initMQ();
}
let f = ble.data.LinkedList.find((v) => {
if (v.macAddress == device.deviceMac) {
console.log("找到设备了", v);
return true;
}
return false;
});
if (!f) {
return;
}
let form = f.formData;
if (form) {
let keys = Object.keys(form);
for (var i = keys.length; i >= 0; i--) {
let key = keys[i];
these.formData[key] = form[key];
}
}
if(these.formData['imei'] && !these.device.deviceImei){
these.initMQ();
}
else if(these.device.deviceImei){
these.formData['imei'] =these.device.deviceImei;
}
ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId);
});
},
onHide: function() {
},
onBackPress(e) {
ble.removeReceiveCallback(pagePath);
},
computed: {
RSSIRemark: function() {
let remark = '极弱';
if (this.formData.RSSI <= 0 && this.formData.RSSI >= -30) {
remark = '强';
}
if (this.formData.RSSI < -30 && this.formData.RSSI >= -60) {
remark = '一般';
}
if (this.formData.RSSI < -60 && this.formData.RSSI >= -85) {
remark = '弱';
}
if (this.formData.RSSI < -85 && this.formData.RSSI >= -100) {
remark = '微弱';
}
}
},
methods: {
initMQ() {
return new Promise((resolve, reject) => {
console.log("正在初始化MQtt")
if (mqttClient) {
console.log("无需再次初始化")
resolve();
return;
}
mqttClient = new MqttClient();
mqttClient.connect(() => {
console.log("连接成功,开始订阅消息")
// 订阅来自设备的状态更新
const statusTopic = `A/${this.formData.imei?this.formData.imei:this.device.deviceImei}`;
mqttClient.subscribe(statusTopic, (payload, receive) => {
try {
let json = JSON.parse(payload);
let keys = Object.keys(json);
// console.log("keys=", keys);
if (keys.indexOf('sta_DetectGrade') > -1) { //上报的报文
console.log("收到设备上报的数据", payload);
this.parseDataMQ(json);
}
// else if (keys.indexOf('sta_PicTrans') > -1) { //发送开机画面
// console.log("收到开机画面答复", payload);
// // this.SendImgMQ(json);
// }
// else if (keys.indexOf('sta_TexTrans') > -1) { //发送文本信息
// console.log("收到文本回复", payload);
// // this.SendTxtMQ(json);
// }
// else if (keys.indexOf('sta_BreakNews') > -1) { //紧急通知
// console.log("收到紧急消息回复", payload);
// // this.sendUrgentMQ(json);
// }
// else {
// console.log("收到不能处理的数据", payload);
// }
} catch (error) {
console.log("无法解析此消息", error);
}
});
resolve();
});
});
},
sendMQ(message) {
message=JSON.stringify(message);
const topic = `B/${this.formData.imei?this.formData.imei:this.device.deviceImei}`;
return new Promise((resolve, reject) => {
if (!mqttClient) {
reject("MQTT未连接");
console.log("MQTT未连接")
return;
}
try {
let flag = mqttClient.publish(topic, message, {
qos: 1
});
if (flag) {
resolve();
return;
}
console.log("MQTT未连接无法发布消息")
reject("MQTT未连接无法发布消息");
} catch (error) {
console.log("出现了异常",error);
mqttClient.unsubscribe(`A/${this.formData.imei?this.formData.imei:this.device.deviceImei}`);
mqttClient.disconnect();
this.initMQ();
reject(error);
}
});
},
parseDataMQ(json){
let staticLevelText = "";
let dic = {
"3": "hight",
"2": "center",
"1": "low",
"0": "close",
};
staticLevelText = dic[json.sta_DetectGrade];
let lightingLevelText = json.sta_LightGrade ===
1 ? 'hight' :
json.sta_LightGrade ===
2 ?
'low' :
'close';
let warn = "";
dic = {
"0": "none",
"1": "ruo",
"2": "center",
"3": "hight",
"4": "veryhight",
};
warn = dic[json.sta_DetectResult];
let sosText = json.sta_SOSGrade === 2 ? 'rb' :
json.sta_SOSGrade === 1 ? "sg" : "close"
let staticWarn = json.sta_ShakeBit === 1 ;
receiveData.modeCurr = staticLevelText;
receiveData.lightCurr = lightingLevelText;
receiveData.xuhang = json.sta_PowerTime + "分钟";
receiveData.battary = json.sta_PowerPercent + "%";
receiveData.SOS = sosText;
receiveData.warnLevel = warn;
receiveData.staticWarn = staticWarn;
receiveData.fourGStrenth = json.sta_4gSinal;
receiveData.imei = json.sta_imei;
receiveData.Lon = json.sta_longitude;
receiveData.Lat = json.sta_latitude;
this.refreshFormData(receiveData);
return receiveData;
},
bleValueNotify: function(receive, device, path) { //订阅消息
let data = recei.ReceiveData(receive, device, pagePath);
console.log("收到设备的数据", data)
if (data) {
if ("staBlue_picture" in data) {
//重发图片
console.log("收到重新发送图片的命令");
this.checkImgUpload('img', data.staBlue_picture);
return;
} else if ("staBlue_text" in data) {
//重发文本
console.log("收到重新发送文本的命令");
this.sendUsr(data.staBlue_text);
return;
} else if ("staBlue_vidio" in data) {
//重发视频
console.log("收到重新发送视频的命令");
this.checkImgUpload('video', data.staBlue_vidio);
return;
} else if ("staBlue" in data) {
if (data.staBlue == "finish") {
console.log("收到设备回复,全部传输完成");
}
return;
}
this.refreshFormData(data);
}
},
refreshFormData(data){
let keys = Object.keys(data);
for (var i = 0; i < keys.length; i++) {
let key = keys[i];
if (key in these.formData) {
these.formData[key] = data[key];
}
}
if(this.formData.imei){
this.initMQ();
}
if (these.formData.staticWarn) {//有静止报警
these.showPop({
message: "自动报警",
iconUrl: "/static/images/6155/DeviceDetail/warnning.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
buttonText:"解除报警",
clickEvt:"staticWarn"
});
this.Status.staticWarn.time=180;
this.Status.staticWarn.inteval=setInterval(()=>{
if(this.Status.staticWarn.time===0){
clearInterval(this.Status.staticWarn.inteval);
this.formData.staticWarn=false;
return;
}
this.Status.staticWarn.time=this.Status.staticWarn.time-1;
},1000)
}
these.setBleFormData();
},
getDevice: function() {
// console.log("LinkedList=", ble.data.LinkedList);
// console.log("formData=", these.formData);
let f = ble.data.LinkedList.find((v) => {
return v.deviceId == these.formData.deviceId;
});
return f;
},
setBleFormData() {
let f=ble.data.LinkedList.find((v) => {
if (v.deviceId == these.formData.deviceId) {
v.formData = these.formData;
return true;
}
return false;
});
if(f){
uni.setStorageSync(ble.StorageKey, ble.data.LinkedList);
}
},
lightSetting:function(type){
if (this.formData.lightCurr == type) {
return;
}
showLoading(this, {
text: "请稍候..."
});
let task = () => {
this.formData.lightCurr = type;
let dic = {
ble: {
qiang: 0x6D,
ruo: 0x6E,
jieneng:0x6E,
close: 0x6F
},
mqtt: {
qiang: 1,
ruo: 2,
jieneng:2,
close: 0
}
};
console.log("type=",type);
let json= {
ins_SOSGrade: [dic.mqtt[type]]
};
let requestSend=()=>{
this.sendMQ(json).then((res)=>{
console.log("4g发送成功");
}).catch((ex)=>{
these.showPop({
message: "通信异常,请检查手机或设备网络",
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
}).finally(()=>{
hideLoading(these);
these.setBleFormData();
});
}
let f = this.getDevice();
let buffer=null;
if (f) {
// 发送数据
buffer = new ArrayBuffer(6);
let dataView = new DataView(buffer);
dataView.setUint8(0, 0x55); // 帧头
dataView.setUint8(1, 0x01); // 帧类型
dataView.setUint8(2, 0x01); // 包序号
dataView.setUint8(3, 0x00); // 数据长度
dataView.setUint8(4, 0x01); // 数据长度
dataView.setUint8(5, dic.ble[type]); // 数据
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10).then(() => {
console.log("蓝牙发送成功了");
hideLoading(these);
these.setBleFormData();
}).catch((ex) => {
//使用4G发送
console.log("蓝牙发送失败,转4g发送",ex);
requestSend();
});
} else {
requestSend();
}
}
setTimeout(task, 0);
},
sosSetting:function(type){
if (this.formData.SOS == type) {
type="close";
}
showLoading(this, {
text: "请稍候..."
});
let task = () => {
this.formData.SOS = type;
let dic = {
ble: {
sg: 0x68,
rb: 0x69,
close: 0x6A
},
mqtt: {
sg: 2,
rb: 1,
close: 0
}
}
console.log("type=",type);
let json= {
ins_SOSGrade: [dic.mqtt[type]]
};
let requestSend=()=>{
this.sendMQ(json).then((res)=>{
console.log("4g发送成功");
}).catch((ex)=>{
these.showPop({
message: "通信异常,请检查手机或设备网络",
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
}).finally(()=>{
hideLoading(these);
these.setBleFormData();
});
}
let f = this.getDevice();
let buffer=null;
if (f) {
// 发送数据
buffer = new ArrayBuffer(6);
let dataView = new DataView(buffer);
dataView.setUint8(0, 0x55); // 帧头
dataView.setUint8(1, 0x05); // 帧类型
dataView.setUint8(2, 0x01); // 包序号
dataView.setUint8(3, 0x00); // 数据长度
dataView.setUint8(4, 0x01); // 数据长度
dataView.setUint8(5, dic.ble[type]); // 数据
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10).then(() => {
console.log("蓝牙发送成功了");
hideLoading(these);
these.setBleFormData();
}).catch((ex) => {
//使用4G发送
console.log("蓝牙发送失败,转4g发送",ex);
requestSend();
});
} else {
requestSend();
}
}
setTimeout(task, 0);
},
GearSetting: function(type) {//档位设置
if (this.formData.modeCurr == type) {
type="close";
}
showLoading(this, {
text: "请稍候..."
});
let task = () => {
this.formData.modeCurr = type;
let dic = {
ble: {
hight: 0x65,
center: 0x66,
low: 0x67,
close: 0x68
},
mqtt: {
hight: 3,
center: 2,
low: 1,
close: 0
}
}
console.log("type=",type);
let json= {
ins_DetectGrade: [dic.mqtt[type]]
}
let requestSend=()=>{
this.sendMQ(json).then((res)=>{
console.log("4g发送成功");
}).catch((ex)=>{
these.showPop({
message: "通信异常,请检查手机或设备网络",
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
}).finally(()=>{
hideLoading(these);
these.setBleFormData();
});
}
let f = this.getDevice();
let buffer=null;
if (f) {
// 发送数据
buffer = new ArrayBuffer(6);
let dataView = new DataView(buffer);
dataView.setUint8(0, 0x55); // 帧头
dataView.setUint8(1, 0x00); // 帧类型
dataView.setUint8(2, 0x01); // 包序号
dataView.setUint8(3, 0x00); // 数据长度
dataView.setUint8(4, 0x01); // 数据长度
dataView.setUint8(5, dic.ble[type]); // 数据
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10).then(() => {
console.log("蓝牙发送成功了");
hideLoading(these);
these.setBleFormData();
}).catch((ex) => {
//使用4G发送
console.log("蓝牙发送失败,转4g发送",ex);
requestSend();
});
} else {
requestSend();
}
}
setTimeout(task, 0);
},
proParam: function() {
uni.navigateTo({
url: '/pages/common/productDes/index?id=' + this.device.id,
success(ev) {
}
});
},
handRemark: function() {
uni.navigateTo({
url: '/pages/common/operatingInstruct/index?id=' + this.device.id,
success(ev) {
}
});
},
handVideo: function() {
uni.navigateTo({
url: '/pages/common/operationVideo/index?id=' + this.device.id,
success(ev) {
}
});
},
checkImgUpload: function(type, index) {
console.log("123213213213");
let f = these.getDevice();
var sendImgByRequest=()=>{
return new Promise((resolve,reject)=>{
api.sendPic({
picPath:these.picPath,
deviceId:these.device.id,
deviceImei:these.device.deviceImei
}).then((res)=>{
if (res.code == 200) {
these.showPop({
showPop: true,
message: "上传成功",
iconUrl: "/static/images/6155/DeviceDetail/uploadSuccess.png",
});
resolve();
return;
} else {
these.showPop({
message: res.errMsg?res.errMsg:"未知的原因上传失败了",
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
reject(res);
}
}).catch((ex)=>{
console.log("图片上传失败了",ex);
reject(ex)
}).finally(()=>{
hideLoading(these);
});
});
}
// 分包发送图片数据
var sendImagePackets = function(ReSendNo) {
return new Promise((resolve, reject) => {
// 总数据包数
let totalPackets = 52;
let currentPacket = 1;
if (ReSendNo) {
totalPackets = ReSendNo;
currentPacket = ReSendNo;
}
if (f) {
// 发送单个数据包
const sendNextPacket = () => {
if (currentPacket > totalPackets) {
hideLoading(these);
these.Status.BottomMenu.show = false;
these.showPop({
showPop: true,
message: "上传成功",
iconUrl: "/static/images/6155/DeviceDetail/uploadSuccess.png",
});
if (!ReSendNo) {
setTimeout(() => {
these.HoldYouHand("transmit complete", 0, f
.deviceId, f
.writeServiceId, f.wirteCharactId);
}, 500);
}
resolve();
return;
}
// 计算当前包的数据
let packetSize = 250;
// if (currentPacket <= 51) {
// packetSize = 250; // 前51个包每个500字节
// } else {
// packetSize = 50; // 最后一个包100字节
// }
// 创建数据包
const startIndex = (currentPacket - 1) * packetSize;
const endIndex = Math.min(startIndex + packetSize, these.rgb565Data
.length);
if (startIndex > endIndex) {
return;
}
const packetData = these.rgb565Data.slice(startIndex,
endIndex);
// 构建数据包
const bufferSize = 505; // 5 + packetData.length * 2; // 头部5字节 + 数据部分
const buffer = new ArrayBuffer(bufferSize);
const dataView = new DataView(buffer);
// 填充头部
dataView.setUint8(0, 0x55); // 帧头
dataView.setUint8(1, 0x02); // 帧类型:开机画面
dataView.setUint8(2, '0x' + currentPacket.toString(16).padStart(2,
'0')); // 包序号
if (packetData.length == 250) {
dataView.setUint8(3, 0x01);
dataView.setUint8(4, 0xF4);
} else {
dataView.setUint8(3, 0x00);
dataView.setUint8(4, 0x64);
}
// 填充数据每个RGB565值占2字节
for (let i = 0; i < packetData.length; i++) {
dataView.setUint16(5 + i * 2, packetData[i], false); // 大端字节序
}
if (currentPacket > 51) { //第52包补FF
for (var i = 105; i < bufferSize; i++) {
dataView.setUint8(i, 0xFF);
}
}
//发送数据包
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId,
10)
.then(() => {
updateLoading(these, {
text: "正在发送:" + currentPacket + "/" +
totalPackets
});
currentPacket++;
setTimeout(sendNextPacket, 0);
}).catch(err => {
console.log("发送数据包失败了" + JSON.stringify(err));
if (err.code == '10007') {
setTimeout(sendNextPacket, 0);
return;
}else{
updateLoading(these, {
text: "蓝牙发送失败,正在使用4G发送"
});
sendImgByRequest().then(resolve).catch(reject);
}
// these.Status.BottomMenu.show = false;
// these.showPop({
// message: err.msg,
// iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
// borderColor: "#e034344d",
// buttonBgColor: "#E03434",
// });
// hideLoading(these);
// reject(err);
});
}
if (ReSendNo) {
sendNextPacket(ReSendNo);
return;
}
// 开始牵手
these.HoldYouHand("picture transmit start", 120, f.deviceId, f.writeServiceId,
f.wirteCharactId).then(() => {
sendNextPacket();
}).catch((err) => {
updateLoading(these, {
text: "蓝牙发送失败,正在使用4G发送"
});
sendImgByRequest().then(resolve).catch(reject);
});
}
});
}
//去图片裁剪
var gotoCutImg = (imgPath) => {
uni.navigateTo({
url: "/pages/6155/ImgCrop",
events: {
ImgCutOver: function(data) {
// console.log("我收到裁剪后的图片了,感谢老铁," + data)
showLoading(these, {
text: "正在发送..."
});
these.Status.BottomMenu.show = false;
these.picPath=data.picPath;
these.rgb565Data = ble.convertToRGB565(data.piexls);
setTimeout(function() {
sendImagePackets().catch(() => {
});
}, 0)
}
},
success(ev) {
ev.eventChannel.emit('checkImg', {
data: imgPath
});
these.Status.BottomMenu.show = false;
}
});
}
let sendVideoPackets = (ReSendNo) => {
console.log("开始发送分片数据");
return new Promise((resolve, reject) => {
if (f) {
// 总数据包数
var totalPackets = 1536;
let currentPacket = 1;
console.log("发送数据准备中,总共" + totalPackets);
if (ReSendNo) {
totalPackets = ReSendNo;
currentPacket = ReSendNo;
}
this.totalPackets = totalPackets;
// 发送单个数据包
const sendNextVideoPacket = () => {
console.log("准备发送一段数据");
if (currentPacket > totalPackets) {
if (!ReSendNo) {
setTimeout(() => {
these.HoldYouHand("transmit complete", 0, f
.deviceId, f
.writeServiceId, f.wirteCharactId).then(
() => {
console.log("全部发送完毕")
}).catch((ex) => {
console.log("出现异常", ex);
});
}, 500);
}
these.Status.BottomMenu.show = false;
hideLoading(these);
these.showPop({
showPop: true,
message: "上传成功",
iconUrl: "/static/images/6155/DeviceDetail/uploadSuccess.png"
});
resolve();
return;
}
// 计算当前包的数据
let packetSize = 500;
// 创建数据包
const startIndex = (currentPacket - 1) * packetSize;
const endIndex = Math.min(startIndex + packetSize, these.videoHexArray
.length);
if (startIndex > endIndex) {
resolve();
return;
}
////console.log("111111");
const packetData = these.videoHexArray.slice(startIndex, endIndex);
// 构建数据包
////console.log("packetData.length"+packetData.length);
const bufferSize = 506; // 头部5字节 + 数据部分
const buffer = new ArrayBuffer(bufferSize);
const dataView = new DataView(buffer);
let sortNo = currentPacket.toString(16).padStart(4, '0');
// 填充头部
dataView.setUint8(0, 0x55); // 帧头
dataView.setUint8(1, 0x04); // 帧类型:开机画面
dataView.setUint8(2, '0x' + sortNo.substring(0, 2)); // 包序号
dataView.setUint8(3, '0x' + sortNo.substring(2, 4)); // 包序号
dataView.setUint8(4, 0x01);
dataView.setUint8(5, 0xF4);
for (let i = 0; i < packetData.length; i++) {
dataView.setUint8(6 + i, '0x' + packetData[i]);
}
let inteval = 30;
console.log("开始发送一段视频"); //
ble.sendData(f.deviceId, buffer, f.writeServiceId, f
.wirteCharactId, 10).then(() => {
updateLoading(these, {
text: "正在发送:" + currentPacket + "/" +
totalPackets
})
currentPacket++;
console.log("发送一段成功,发送下一段");
setTimeout(sendNextVideoPacket, inteval);
}).catch(err => {
console.log("发送失败了");
if (err.code == '10007') { //遇到这个错误自动重新发送
console.log(err.errMsg + ",发送失败了,正在补偿:" +
currentPacket);
setTimeout(sendNextVideoPacket, inteval);
} else {
these.Status.BottomMenu.show = false;
hideLoading(these);
these.showPop({
showPop: true,
message: err.msg + ",发送失败了",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
buttonText: "确定",
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png"
});
reject(err);
return;
}
});
};
sendNextVideoPacket();
} else {
console.log("Fail.......")
}
});
}
var sendVideo = (videoPath) => {
let uploadVideo = () => {
if (these.videoHexArray.length > 0) {
console.log("开始处理,无需上传");
shotVideoClick(these.videoHexArray);
return;
}
console.log("开始处理,正在上传");
showLoading(these, {
text: "上传中"
});
let p1 = these.HoldYouHand("video transmit start", 2200, f.deviceId, f.writeServiceId,
f.wirteCharactId);
let p2 = new Promise((succ, err) => {
uni.uploadFile({
url: 'http://114.55.111.217/video/upload',
filePath: videoPath,
name: 'file',
header: {
"Method": "POST",
"Content-Type": "multipart/form-data"
},
timeout: 600000,
fail: (ex) => {
console.log("上传视频失败" + JSON.stringify(ex));
err(ex);
},
success: (res) => {
console.log("上传完成,向蓝牙设备发送");
succ(res);
}
});
});
Promise.all([p1, p2]).then((arr) => {
let res = arr[1];
res = JSON.parse(res.data);
if (res.data) {
these.videoHexArray = res.data;
updateLoading(these, {
text: "正在发送:0/1536"
});
these.Status.BottomMenu.show = false;
shotVideoClick(res.data);
} else {
console.log("服务器未返回正确的数据");
these.showPop({
message: "与服务器连接出现异常,请检查网络设置",
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
}
}).catch((ex) => {
hideLoading(these);
these.showPop({
message: "出现异常," + ex.msg,
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
})
}
let f = these.getDevice();
let shotVideoClick = () => {
console.log("正在开始发送");
sendVideoPackets().then(() => {
console.log("发送完成");
}).catch((ex1) => {
//console.log("出现了异常", ex1)
}).finally(() => {
hideLoading(these);
});
}
uploadVideo();
}
if (type) {
if (type == 'img') {
sendImagePackets(index);
} else if (type == 'video') {
sendVideoPackets(index);
}
return;
}
uni.chooseMedia({
count: 1,
mediaType: ['image', 'video'],
sourceType: ['album'],
maxDuration: 3,
sizeType: ['original'],
success: (res) => {
let file = res.tempFiles[0];
if (file.fileType == 'image') {
gotoCutImg(file.tempFilePath);
return;
}
if (file.fileType == 'video') {
if (file.duration < 2) {
this.alert('提示', "请选择2S及以上的视频");
return;
}
these.videoHexArray = [];
sendVideo(file.tempFilePath);
return;
}
}
});
},
ShowUpload: function() {
//上传开机画面
this.Status.BottomMenu.menuItems = [];
this.Status.BottomMenu.title = "上传开机画面";
this.Status.BottomMenu.type = "checkImg";
this.Status.BottomMenu.show = true;
this.Status.BottomMenu.showBtn=false;
},
showMenu(flag) {
this.Status.BottomMenu.show = true;
},
closeMenu() {
this.Status.BottomMenu.show = false;
},
btnClick(item, index) {
},
setMode(mode) {
},
handleItemClick(item, index) {
switch (this.Status.BottomMenu.type) {
case "main":
break;
case "fu":
break;
}
this.Status.BottomMenu.activeIndex = index;
},
HidePop: function() {
if (this.Status.Pop.clickEvt == 'staticWarn') {
this.Status.staticWarnTime=0;
}
this.Status.Pop.showPop = false;
},
showPop: function(option) {
if (!option) {
option = {
a: 1
};
}
let keys = Object.keys(option);
for (var i = 0; i < keys.length; i++) {
let key = keys[i];
these.Status.Pop[key] = option[key];
}
if (!option.borderColor) {
option.borderColor = '#BBE600';
option.buttonBgColor = '#BBE600';
}
these.Status.Pop.showPop = true;
},
sendUsr: function(ReSendNo) {
let requestSend=()=>{
let json = {
deviceId: this.device.id,
deviceImei: this.device.deviceImei?this.device.deviceImei:this.formData.imei,
name: this.formData.company,
position: this.formData.name,
unitName: this.formData.job,
code: this.formData.id
};
api.sendUsr(json).then((res)=>{
these.showPop({
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
});
these.setBleFormData();
}).catch((ex)=>{
these.showPop({
message: "文字发送失败," + ex.msg,
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
}).finally(()=>{
hideLoading(these);
});
}
var textLines = [
this.formData.company,
this.formData.name,
this.formData.job,
this.formData.id
];
let f = this.getDevice();
if (!f) {
//走4G通道
requestSend();
return;
}
showLoading(this, {
text: "请稍候..."
});
var sendText = function() {
// 总数据包数
let totalPackets = textLines.length;
let currentPacket = 1;
// console.log("currentPacket=",currentPacket);
// console.log("ReSendNo=",ReSendNo);
if (ReSendNo) {
totalPackets = ReSendNo;
currentPacket = ReSendNo;
}
// console.log("currentPacket=",currentPacket);
// 发送单个数据包
const sendNextPacket = () => {
if (currentPacket > totalPackets) {
if (!ReSendNo) {
setTimeout(() => {
these.HoldYouHand("transmit complete", 0, f.deviceId, f
.writeServiceId, f
.wirteCharactId);
}, 500);
}
these.showPop({
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
});
these.setBleFormData();
hideLoading(these);
return;
}
// 获取当前行文字
const text = textLines[currentPacket - 1] || '';
let arr = gbk.encode(text)
let gbkData = gbk.arr2hex(arr);
// 构建数据包
const bufferSize = 5 + gbkData.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)); // 数据长度
// 填充数据
let index = 0;
for (var i = 0; i < gbkData.length; i += 2) {
let value = parseInt(gbkData[i] + "" + gbkData[i + 1], 16);
dataView.setUint8(5 + index, value);
index++;
}
// 发送数据包
ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10).then(() => {
// 更新进度
console.log(
`发送文字数据包 ${currentPacket}/${totalPackets}: ${text}`
);
// 发送下一个包
currentPacket++;
setTimeout(sendNextPacket, 0);
}).catch(err => {
if(err.code=='10007'){
setTimeout(sendNextPacket, 0);
}else{
requestSend();
}
}).finally(() => {
});
};
// 开始发送第一个包
sendNextPacket();
}
if (ReSendNo) {
sendText(ReSendNo);
return;
}
setTimeout(() => {
these.HoldYouHand("word transmit start", 120, f.deviceId, f.writeServiceId, f
.wirteCharactId).then(
() => {
setTimeout(sendText, 200);
}).catch((ex) => {
requestSend();
// console.log("握手没有成功", ex);
// hideLoading(these);
// these.showPop({
// message: ex.msg,
// iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
// borderColor: "#e034344d",
// buttonBgColor: "#E03434",
// });
});
}, 0);
},
sendUrgent(type) {
if(!this.formData.msgTxt){
return;
}
showLoading(this, {
text: "请稍候..."
});
this.setBleFormData();
let arr=[];
if(this.formData.msgTxt.length>8){
arr.push(this.formData.msgTxt.substring(0,8));
arr.push(this.formData.msgTxt.substring(8));
}else{
let index=Math.floor(this.formData.msgTxt.length/2)
arr.push(this.formData.msgTxt.substring(0,index));
arr.push(this.formData.msgTxt.substring(index));
}
let data={
"sendMsg": arr.join('|'),
"deviceIds": [
this.device.id
],
"deviceImeiList": [
this.device.deviceImei?this.device.deviceImei:this.formData.imei
]
}
console.log("data=",data);
api.warnMsg(data).then((res)=>{
if (res.code == 200) {
these.showPop({
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
});
} else {
these.showPop({
message: res.msg,
iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png",
borderColor: "#e034344d",
buttonBgColor: "#E03434",
});
}
}).finally(()=>{
hideLoading(this);
});
},
HoldYouHand(str, pauseTime, deviceid, serviceid, characid) {
if (!pauseTime) {
pauseTime = 0;
}
var promise = new Promise((resolve, reject) => {
// 1. 创建 ArrayBuffer 和 DataView
const buffer = new ArrayBuffer(str.length);
const dataView = new DataView(buffer);
// 2. 将字符串转换为 ASCII 码并写入 DataView
for (let i = 0; i < str.length; i++) {
dataView.setUint8(i, str.charCodeAt(i));
}
console.log("开始握手");
ble.sendData(deviceid, buffer, serviceid, characid, 10).then(
() => {
setTimeout(() => {
console.log("握手成功并完成了等待");
resolve(true);
}, pauseTime);
}).catch(err => {
console.log("握手没有成功", )
reject(err);
});
});
return promise;
},
ack: function() {
let eventChannel = this.getOpenerEventChannel();
eventChannel.emit('ack', {
data: '我已收到了您的消息,谢谢。'
});
}
}
}
</script>
<style>
.content {
padding: 30rpx;
box-sizing: border-box;
}
.eq {
width: 100%;
height: 250rpx;
border-radius: 8px;
background: rgba(26, 26, 26, 1);
box-sizing: border-box;
padding: 24rpx 28rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
margin-bottom: 24rpx;
}
.eq .leftImg {
box-sizing: border-box;
padding: 36rpx;
border-radius: 16rpx;
background: rgba(42, 42, 42, 0.5);
}
.eq .leftImg,
.eq .rightTxt {
width: 50%;
height: 100%;
}
.eq .rightTxt {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-content: flex-start;
justify-content: space-evenly;
align-items: flex-start;
}
.eq .leftImg .img {
width: 100%;
height: 100%;
}
.eq .rightTxt .img {
width: 52rpx;
height: 52rpx;
}
.eq .rightTxt .row {
width: 100%;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: flex-start;
align-items: center;
box-sizing: border-box;
padding-left: 50rpx;
}
.eq .rightTxt .row .txt {
padding-left: 20rpx;
}
.eq .bigTxt {
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
}
.eq .smallTxt {
color: rgba(255, 255, 255, 0.6);
font-family: PingFang SC;
font-size: 24rpx;
font-weight: 400;
}
.eqinfo {
border-radius: 16rpx;
background: rgba(26, 26, 26, 1);
box-sizing: border-box;
padding: 14rpx 0rpx;
}
.eqinfo .item {
width: 100%;
height: 60rpx;
line-height: 60rpx;
padding: 0rpx 28rpx;
box-sizing: border-box;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-between;
align-items: center;
}
.eqinfo .lbl {
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.07px;
text-align: left;
}
.eqinfo .value {
color: rgba(255, 255, 255, 0.6);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.07px;
text-align: left;
}
.lamp {
margin-top: 24rpx;
}
.lamp .title {
width: 100%;
height: 60rpx;
line-height: 60rpx;
padding: 0rpx 28rpx;
box-sizing: border-box;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-between;
align-items: center;
font-size: 28rpx;
}
.lampMode {
padding: 30rpx 0rpx;
width: 100%;
box-sizing: border-box;
}
.lampMode .mode {
width: calc(calc(100% - 34rpx) / 2);
border-radius: 8px;
margin-top: 20rpx;
background: rgba(26, 26, 26, 1);
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
align-items: center;
justify-content: flex-start;
padding: 30rpx;
box-sizing: border-box;
}
.lampMode .mode.active {
border: 1px solid rgba(174, 214, 0, 1);
}
.lampMode .mode.active .bigTxt {
color: rgba(174, 214, 0, 1) !important;
}
.mode.marginLeft {
margin-left: 34rpx !important;
}
.mode .leftImg .img {
width: 70rpx;
height: 70rpx;
}
.mode .rightTxt {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-content: flex-start;
justify-content: center;
align-items: flex-start;
padding-left: 20rpx;
}
.mode .bigTxt {
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.07px;
}
.mode .smallTxt {
color: rgba(255, 255, 255, 0.6);
font-family: PingFang SC;
font-size: 24rpx;
font-weight: 400;
letter-spacing: 0.07px;
}
.usrinfo {
border-radius: 8px;
width: 100%;
box-sizing: border-box;
padding: 24rpx 28rpx;
background: rgba(26, 26, 26, 1);
}
.usrtitle {
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
height: 40rpx;
line-height: 40rpx;
letter-spacing: 0.07px;
}
.usrinfo .btnSend {
line-height: 65rpx;
border-radius: 8px;
width: 120rpx;
height: 65rpx;
color: rgba(35, 35, 35, 0.87);
font-family: PingFang SC;
font-size: 24rpx;
font-weight: 400;
letter-spacing: 0.15rpx;
text-align: center;
background-color: #BBE600;
}
.usrinfo .item {
border-radius: 8px;
width: 100%;
box-sizing: border-box;
line-height: 90rpx;
height: 90rpx;
background: rgba(42, 42, 42, 1);
margin-top: 24rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: flex-start;
align-items: center;
}
.usrinfo .lbl {
width: 120rpx;
height: 100%;
padding-left: 24rpx;
box-sizing: border-box;
text-align: right;
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.07px;
}
.usrinfo .value {
width: calc(100% - 120rpx);
height: 100%;
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.07px;
text-align: left;
}
.usrinfo .value .uni-input-input {
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
}
.usrplace {
color: rgba(255, 255, 255, 0.4);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.07px;
text-align: left;
}
.proinfo .itemcontent {
display: flex;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-evenly;
}
.proinfo .item {
width: 180rpx;
height: 180rpx;
box-sizing: border-box;
padding: 40rpx;
border-radius: 16rpx;
background: rgba(26, 26, 26, 1);
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
}
.proinfo .item .img {
width: 50rpx;
height: 50rpx;
}
.proinfo .item .txt {
color: rgba(255, 255, 255, 0.6);
font-family: PingFang SC;
font-size: 24rpx;
font-weight: 400;
margin-top: 20rpx;
letter-spacing: 0.07px;
text-align: left;
}
.slider-container {
padding: 0px;
}
.addIco {
width: 100%;
height: 360rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
}
.icoContent {
width: 240rpx;
height: 240rpx;
border-radius: 8rpx;
background: rgba(58, 58, 58, 1);
}
.icoContent .img {
width: 70rpx;
height: 70rpx;
}
.modeSetting {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-around;
align-items: center;
border-radius: 8px;
background: rgba(26, 26, 26, 1);
box-sizing: border-box;
padding: 30rpx 0rpx;
}
.modeSetting .item {
width: 120rpx;
height: 120rpx;
background: rgba(42, 42, 42, 1);
border-radius: 50%;
color: rgba(255, 255, 255, 0.87);
font-family: PingFang SC;
font-size: 28rpx;
font-weight: 400;
line-height: 0px;
box-sizing: border-box;
}
.modeSetting .item.active {
border: 4rpx solid rgba(174, 214, 0, 1);
background: rgba(26, 26, 26, 1);
padding: 6rpx;
color: rgba(26, 26, 26, 0.87);
}
.modeSetting .item.active .p100 {
background: rgba(174, 214, 0, 1);
border-radius: 50%;
}
.usrinfo .image {
width: 30rpx;
height: 40rpx;
}
.usrinfo .img {
width: 30rpx;
height: 40rpx;
}
.content {
box-sizing: border-box;
width: 100%;
min-height: 100vh;
height: auto;
}
.contentBg {
background-color: #121212;
color: #ffffffde;
}
.fleft {
float: left;
}
.fright {
float: right;
}
.clear {
clear: both;
}
.displayNone {
display: none !important;
}
.p100 {
width: 100%;
height: 100%;
}
.center {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
}
.centerLeft {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: flex-start;
align-items: center;
}
.warnnig {
border-radius: 16rpx;
width: 100%;
height: 70rpx;
line-height: 70rpx;
background: rgba(224, 52, 52, 1);
box-sizing: border-box;
padding: 0rpx 30rpx;
margin-top: 20rpx;
color: rgba(255, 255, 255, 0.87);
font-family: 'PingFang SC';
font-size: 28rpx;
font-weight: 400;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-between;
align-items: center;
}
.optTitle{
color: rgba(255, 255, 255, 0.87);
font-family: 'PingFang SC';
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.14rpx;
text-align: left;
width: 100%;
box-sizing: border-box;
padding:30rpx 0rpx 10rpx 30rpx;
}
.sosContent{
width: 100%;
height: 130rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-between;
align-items: center;
}
.sosContent .item{
width:calc(calc(100% - 80rpx) / 2);
height: 100%;
box-sizing: border-box;
border-radius: 16rpx;
background: rgba(26, 26, 26, 1);
color: rgba(255, 255, 255, 0.87);
font-family: 'PingFang SC';
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.14rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
align-items: center;
}
.sosContent .item.active{
border: 1px solid rgba(224, 52, 52, 1);
color: rgba(224, 52, 52, 1);
}
.sosContent .imgContent{
width: 55rpx;
height: 55rpx;
background-color: #232323;
border-radius: 4rpx;
margin-right: 30rpx;
}
.sosContent .imgContent .img{
width: 70%;
height: 70%;
}
.sosContent .item.active .imgContent{
background-color: #E034340F;
}
.lightMode{
width: 100%;
height: 180rpx;
border-radius: 16rpx;
background: rgba(26, 26, 26, 1);
margin-bottom: 30rpx;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: center;
justify-content: space-between;
align-items: center;
}
.lightMode .item{
width:calc(calc(100% - 90rpx) / 3);
height: 100%;
box-sizing: border-box;
border-radius: 16rpx;
color: rgba(255, 255, 255, 0.87);
font-family: 'PingFang SC';
font-size: 28rpx;
font-weight: 400;
letter-spacing: 0.14rpx;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-content: center;
justify-content: space-evenly;
align-items: center;
}
.lightMode .item.active{
color:#AED600;
}
.lightMode .imgContent{
width: 80rpx;
height: 100rpx;
}
.lightMode .imgContent .img{
width: 100%;
height: 100%;
}
.picVideo .btnImg{
width: 100%;
height:100rpx;
border-radius: 16rpx;
background: rgba(42, 42, 42, 1);
}
.picVideo .btnImg .img{
width: 40rpx;
height:40rpx;
}
</style>