// pages/stationMonitor/stationMonitor.js
|
const {
|
get
|
} = require('../../api/request.js');
|
|
Page({
|
|
/**
|
* 页面的初始数据
|
*/
|
data: {
|
activeTab: 'weather', // 默认选中气象站
|
cameraList: [],
|
isLoading: false,
|
// 气象站相关数据
|
weatherStationList: [],
|
selectedWeatherStationIndex: 0,
|
currentWeatherStation: null,
|
// 水肥机相关数据
|
fertilizerStationList: [],
|
selectedFertilizerStationIndex: 0,
|
currentFertilizerStation: null,
|
// 土壤墒情站相关数据
|
soilStationList: [],
|
selectedSoilStationIndex: 0,
|
currentSoilStation: null,
|
//摄像头相关
|
accessToken: 'at.4l27eilo2x0euquw4yrhjxnz9kvr294l-2dp10mcwig-1nnzr8p-7wp71d2bk',
|
hslUrl: '',
|
// 设备信息
|
deviceInfo: null,
|
isRealDevice: false,
|
deviceSpecificConfig: {
|
videoHeight: 400,
|
buttonHeight: 72,
|
fontSize: 26
|
}
|
},
|
|
/**
|
* 生命周期函数--监听页面加载
|
*/
|
onLoad(options) {
|
// 检测设备类型和屏幕信息
|
this.detectDeviceInfo();
|
|
// 页面加载时获取摄像头信息
|
this.getCameraList();
|
// 获取所有设备信息(气象站、土壤墒情站、水肥机)
|
this.getAllDeviceInfo();
|
},
|
|
/**
|
* 检测设备信息
|
*/
|
detectDeviceInfo() {
|
try {
|
const systemInfo = wx.getSystemInfoSync();
|
console.log('设备信息:', systemInfo);
|
|
// 检测是否为真机
|
const isRealDevice = systemInfo.platform === 'android' || systemInfo.platform === 'ios';
|
|
// 检测屏幕尺寸
|
const screenWidth = systemInfo.screenWidth;
|
const screenHeight = systemInfo.screenHeight;
|
const pixelRatio = systemInfo.pixelRatio;
|
|
// 检测微信版本
|
const version = systemInfo.version;
|
|
this.setData({
|
deviceInfo: {
|
platform: systemInfo.platform,
|
isRealDevice: isRealDevice,
|
screenWidth: screenWidth,
|
screenHeight: screenHeight,
|
pixelRatio: pixelRatio,
|
version: version,
|
model: systemInfo.model,
|
system: systemInfo.system
|
}
|
});
|
|
console.log('设备检测结果:', {
|
isRealDevice,
|
screenWidth,
|
screenHeight,
|
pixelRatio,
|
version
|
});
|
|
// 根据设备信息调整布局
|
this.adjustLayoutForDevice();
|
|
} catch (error) {
|
console.error('获取设备信息失败:', error);
|
}
|
},
|
|
/**
|
* 根据设备信息调整布局
|
*/
|
adjustLayoutForDevice() {
|
const { deviceInfo } = this.data;
|
if (!deviceInfo) return;
|
|
// 真机特殊处理
|
if (deviceInfo.isRealDevice) {
|
console.log('检测到真机,应用特殊优化');
|
|
// 真机上可能需要调整一些参数
|
this.setData({
|
isRealDevice: true,
|
// 可以根据设备信息调整其他参数
|
deviceSpecificConfig: {
|
videoHeight: deviceInfo.screenHeight < 700 ? 320 : 400,
|
buttonHeight: deviceInfo.screenHeight < 700 ? 64 : 72,
|
fontSize: deviceInfo.pixelRatio > 2 ? 24 : 26
|
}
|
});
|
} else {
|
console.log('检测到模拟器');
|
this.setData({
|
isRealDevice: false
|
});
|
}
|
},
|
|
/**
|
* 生命周期函数--监听页面初次渲染完成
|
*/
|
onReady() {
|
|
},
|
|
/**
|
* 生命周期函数--监听页面显示
|
*/
|
onShow() {
|
console.log('=== 页面显示 ===');
|
console.log('当前页面数据:', {
|
activeTab: this.data.activeTab,
|
cameraList: this.data.cameraList,
|
deviceInfo: this.data.deviceInfo,
|
deviceSpecificConfig: this.data.deviceSpecificConfig
|
});
|
|
// 检查ezplayer组件的状态
|
if (this.data.activeTab === 'camera') {
|
console.log('摄像头页面激活,检查组件状态');
|
this.data.cameraList.forEach(camera => {
|
console.log(`摄像头 ${camera.name} 状态:`, {
|
id: camera.id,
|
online: camera.online,
|
hslUrl: camera.hslUrl,
|
isLoadingUrl: camera.isLoadingUrl,
|
urlError: camera.urlError,
|
isPlaying: camera.isPlaying
|
});
|
});
|
}
|
},
|
|
/**
|
* 生命周期函数--监听页面隐藏
|
*/
|
onHide() {
|
|
},
|
|
/**
|
* 生命周期函数--监听页面卸载
|
*/
|
onUnload() {
|
|
},
|
|
/**
|
* 页面相关事件处理函数--监听用户下拉动作
|
*/
|
onPullDownRefresh() {
|
// 下拉刷新时重新获取数据
|
if (this.data.activeTab === 'camera') {
|
this.getCameraList();
|
} else if (this.data.activeTab === 'weather' || this.data.activeTab === 'soil' || this.data.activeTab === 'fertilizer') {
|
this.getAllDeviceInfo();
|
}
|
wx.stopPullDownRefresh();
|
},
|
|
/**
|
* 页面上拉触底事件的处理函数
|
*/
|
onReachBottom() {
|
|
},
|
|
/**
|
* 用户点击右上角分享
|
*/
|
onShareAppMessage() {
|
|
},
|
|
/**
|
* 切换选项卡
|
*/
|
switchTab(e) {
|
const tab = e.currentTarget.dataset.tab;
|
console.log('切换到:', tab);
|
this.setData({
|
activeTab: tab
|
});
|
|
// 如果切换到摄像头选项卡,确保有数据
|
if (tab === 'camera' && this.data.cameraList.length === 0) {
|
this.getCameraList();
|
}
|
|
// 如果切换到气象站选项卡,确保有数据
|
if (tab === 'weather' && this.data.weatherStationList.length === 0) {
|
this.getAllDeviceInfo();
|
}
|
|
// 如果切换到土壤墒情站选项卡,确保有数据
|
if (tab === 'soil' && this.data.soilStationList.length === 0) {
|
this.getAllDeviceInfo();
|
}
|
|
// 如果切换到水肥机选项卡,确保有数据
|
if (tab === 'fertilizer' && this.data.fertilizerStationList.length === 0) {
|
this.getAllDeviceInfo();
|
}
|
},
|
|
/**
|
* 获取所有设备信息(气象站、土壤墒情站、水肥机)
|
*/
|
getAllDeviceInfo() {
|
const app = getApp();
|
|
// 检查登录状态
|
if (!app.globalData.isLoggedIn) {
|
wx.showToast({
|
title: '请先登录',
|
icon: 'error'
|
});
|
return;
|
}
|
|
console.log('开始调用 /wx/mqtt/allSimple 接口获取设备信息');
|
|
get({url: '/wx/mqtt/allSimple'})
|
.then(response => {
|
console.log('设备信息接口返回数据:', response);
|
|
if (response.success && response.code === '0001') {
|
const content = response.content;
|
|
// 处理气象站数据
|
if (content.weathers && content.weathers.length > 0) {
|
const weatherStations = content.weathers.map(item => ({
|
id: item.id,
|
name: item.name,
|
no: item.no,
|
online: true, // 默认在线
|
location: '甘肃省民勤县', // 默认位置
|
lastUpdate: new Date().toLocaleString()
|
}));
|
|
this.setData({
|
weatherStationList: weatherStations
|
});
|
|
// 默认选择第一个气象站
|
if (weatherStations.length > 0) {
|
this.selectWeatherStation(0);
|
}
|
}
|
|
// 处理土壤墒情站数据
|
if (content.soils && content.soils.length > 0) {
|
const soilStations = content.soils.map(item => ({
|
id: item.id,
|
name: item.name,
|
no: item.no,
|
online: true, // 默认在线
|
location: '甘肃省民勤县', // 默认位置
|
lastUpdate: new Date().toLocaleString()
|
}));
|
|
this.setData({
|
soilStationList: soilStations
|
});
|
|
// 默认选择第一个土壤墒情站
|
if (soilStations.length > 0) {
|
this.selectSoilStation(0);
|
}
|
}
|
|
// 处理水肥机数据
|
if (content.manures && content.manures.length > 0) {
|
const fertilizerStations = content.manures.map(item => ({
|
id: item.id,
|
name: item.name,
|
no: item.no,
|
online: true // 默认在线
|
}));
|
|
this.setData({
|
fertilizerStationList: fertilizerStations
|
});
|
|
// 默认选择第一个水肥机
|
if (fertilizerStations.length > 0) {
|
this.selectFertilizerStation(0);
|
}
|
}
|
|
console.log('设备信息处理完成:', {
|
weatherStations: this.data.weatherStationList,
|
soilStations: this.data.soilStationList,
|
fertilizerStations: this.data.fertilizerStationList
|
});
|
|
} else {
|
console.error('获取设备信息失败:', response.msg);
|
wx.showToast({
|
title: response.msg || '获取设备信息失败',
|
icon: 'none'
|
});
|
}
|
})
|
.catch(error => {
|
console.error('调用设备信息接口失败:', error);
|
wx.showToast({
|
title: '获取设备信息失败',
|
icon: 'error'
|
});
|
});
|
},
|
|
/**
|
* 获取摄像头列表
|
*/
|
getCameraList() {
|
const app = getApp();
|
|
// 检查登录状态
|
if (!app.globalData.isLoggedIn) {
|
wx.showToast({
|
title: '请先登录',
|
icon: 'error'
|
});
|
return;
|
}
|
|
this.setData({
|
isLoading: true
|
});
|
|
// 调用真实接口获取摄像头列表
|
this.getVideoListFromApi();
|
},
|
|
/**
|
* 从接口获取视频列表
|
*/
|
getVideoListFromApi() {
|
console.log('开始调用 /wx/video/all 接口获取视频列表');
|
|
get({url:'/wx/video/all'} )
|
.then(response => {
|
console.log('接口返回数据:', response);
|
|
if (response.success && response.code === '0001') {
|
// 处理返回的摄像头数据
|
const cameraList = response.content.map(item => {
|
// 根据devNo生成RTMP URL
|
const channelNo = 1; // 默认通道号
|
const rtmpUrl = `rtmp://open.ys7.com/${item.devNo}/${channelNo}/live`;
|
|
console.log(`摄像头 ${item.name} 生成RTMP URL:`, rtmpUrl);
|
|
return {
|
id: item.id,
|
name: item.name,
|
online: true, // 默认在线,实际项目中可能需要额外的状态检查
|
lastUpdate: new Date().toLocaleString(), // 当前时间作为最后更新时间
|
isPlaying: false, // 视频播放状态
|
hslUrl: rtmpUrl, // 使用生成的RTMP URL
|
deviceSerial: item.devNo, // 使用接口返回的devNo
|
isLoadingUrl: false, // URL加载状态
|
urlError: false, // URL获取错误状态
|
autoPlay: false, // 自动播放控制
|
// 新增字段
|
lng: item.lng, // 经度
|
lat: item.lat, // 纬度
|
accessToken: item.accessToken // 设备专用accessToken
|
};
|
});
|
|
this.setData({
|
cameraList: cameraList,
|
isLoading: false
|
});
|
|
console.log('处理后的摄像头列表:', cameraList);
|
|
// 由于现在直接使用RTMP URL,不需要再调用萤石云API获取播放地址
|
// this.batchGetHlsUrls(cameraList);
|
} else {
|
console.error('获取摄像头列表失败:', response.msg);
|
this.setData({
|
isLoading: false
|
});
|
wx.showToast({
|
title: response.msg || '获取摄像头列表失败',
|
icon: 'none'
|
});
|
}
|
})
|
.catch(error => {
|
console.error('调用接口失败:', error);
|
this.setData({
|
isLoading: false
|
});
|
});
|
},
|
|
|
|
/**
|
* 批量获取所有摄像头的HLS播放地址
|
*/
|
batchGetHlsUrls(cameraList) {
|
if (!cameraList || cameraList.length === 0) {
|
console.log('摄像头列表为空,无需获取播放地址');
|
return;
|
}
|
|
console.log('开始批量获取播放地址,摄像头数量:', cameraList.length);
|
|
// 为每个摄像头获取播放地址
|
cameraList.forEach((camera, index) => {
|
// 延迟获取,避免同时发起太多请求
|
setTimeout(() => {
|
this.getHlsUrlForCamera(camera);
|
}, index * 500); // 每个请求间隔500ms
|
});
|
},
|
|
/**
|
* 播放视频
|
*/
|
playVideo(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('=== 播放视频开始 ===');
|
console.log('摄像头信息:', camera);
|
console.log('设备信息:', this.data.deviceInfo);
|
console.log('设备特定配置:', this.data.deviceSpecificConfig);
|
|
if (!camera.online) {
|
console.log('摄像头离线,无法播放');
|
wx.showToast({
|
title: '设备离线,无法播放',
|
icon: 'error'
|
});
|
return;
|
}
|
|
if (!camera.hslUrl) {
|
console.log('无播放地址,无法播放');
|
wx.showToast({
|
title: '暂无播放地址,请稍后重试',
|
icon: 'error'
|
});
|
return;
|
}
|
|
if (camera.isLoadingUrl) {
|
console.log('正在加载URL,无法播放');
|
wx.showToast({
|
title: '正在获取播放地址,请稍候',
|
icon: 'none'
|
});
|
return;
|
}
|
|
console.log('开始播放视频,播放地址:', camera.hslUrl);
|
console.log('当前页面数据状态:', {
|
cameraList: this.data.cameraList,
|
activeTab: this.data.activeTab,
|
isLoading: this.data.isLoading
|
});
|
|
// 检查URL格式
|
if (camera.hslUrl.startsWith('rtmp://')) {
|
console.log('检测到RTMP URL格式,开始播放');
|
|
// 更新播放状态
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === camera.id) {
|
return {
|
...item,
|
isPlaying: true
|
};
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
|
// 显示播放成功提示
|
wx.showToast({
|
title: `开始播放 ${camera.name}`,
|
icon: 'success'
|
});
|
|
console.log(`播放状态已更新,摄像头 ${camera.name} 开始播放RTMP流`);
|
} else {
|
console.log('URL格式不是RTMP,无法播放');
|
wx.showToast({
|
title: '播放地址格式不正确',
|
icon: 'error'
|
});
|
}
|
|
console.log('=== 播放视频结束 ===');
|
},
|
|
/**
|
* 暂停视频
|
*/
|
pauseVideo(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('暂停摄像头:', camera.name);
|
|
// 更新视频播放状态
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === camera.id) {
|
return {
|
...item,
|
isPlaying: false
|
};
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
},
|
|
/**
|
* 停止视频
|
*/
|
stopVideo(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('停止摄像头:', camera.name);
|
|
// 更新视频播放状态
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === camera.id) {
|
return {
|
...item,
|
isPlaying: false
|
};
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
},
|
|
|
|
/**
|
* 直播播放器状态变化
|
*/
|
onLivePlayerStateChange(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('直播播放器状态变化:', camera.name, e.detail);
|
|
const {
|
code
|
} = e.detail;
|
|
// 显示状态信息给用户
|
let statusText = '';
|
let isPlaying = false;
|
|
switch (code) {
|
case 2001:
|
statusText = '已经连接服务器';
|
break;
|
case 2002:
|
statusText = '已经连接 RTMP 服务器,开始拉流';
|
isPlaying = true;
|
break;
|
case 2003:
|
statusText = '网络接收到首个视频数据包(IDR)';
|
isPlaying = true;
|
break;
|
case 2004:
|
statusText = '视频播放开始';
|
isPlaying = true;
|
break;
|
case 2005:
|
statusText = '视频播放进度';
|
isPlaying = true;
|
break;
|
case 2006:
|
statusText = '视频播放结束';
|
isPlaying = false;
|
break;
|
case 2007:
|
statusText = '视频播放Loading';
|
isPlaying = true;
|
break;
|
case 2008:
|
statusText = '解码器启动';
|
isPlaying = true;
|
break;
|
case 2009:
|
statusText = '视频分辨率改变';
|
isPlaying = true;
|
break;
|
case 2101:
|
statusText = '网络断连,且经多次重连抢救无效';
|
isPlaying = false;
|
break;
|
case 2102:
|
statusText = '获取加速拉流地址失败';
|
isPlaying = false;
|
break;
|
case 2103:
|
statusText = '当前视频帧解码失败';
|
isPlaying = false;
|
break;
|
case 2104:
|
statusText = '网络断连, 已启动自动重连';
|
isPlaying = false;
|
break;
|
case 2105:
|
statusText = '网络来断连, 且经多次重连抢救无效';
|
isPlaying = false;
|
break;
|
case 2106:
|
statusText = '网络来断连, 且经多次重连抢救无效';
|
isPlaying = false;
|
break;
|
default:
|
statusText = `未知状态码: ${code}`;
|
break;
|
}
|
|
console.log(`摄像头 ${camera.name} 状态: ${statusText}`);
|
|
// 更新播放状态
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === camera.id) {
|
return {
|
...item,
|
isPlaying: isPlaying
|
};
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
},
|
|
/**
|
* 直播播放器网络状态
|
*/
|
onLivePlayerNetStatus(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('直播播放器网络状态:', camera.name, e.detail);
|
},
|
|
/**
|
* 直播播放器错误
|
*/
|
onLivePlayerError(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.error('直播播放器错误:', camera.name, e.detail);
|
|
wx.showToast({
|
title: '直播播放失败',
|
icon: 'error'
|
});
|
|
// 更新播放状态
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === camera.id) {
|
return {
|
...item,
|
isPlaying: false
|
};
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
},
|
|
/**
|
* 全屏播放视频
|
*/
|
fullscreenVideo(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('全屏播放:', camera.name);
|
|
if (!camera.online) {
|
wx.showToast({
|
title: '摄像头离线',
|
icon: 'error'
|
});
|
return;
|
}
|
|
// 使用RTMP URL进行全屏播放
|
if (camera.hslUrl) {
|
console.log('全屏视频URL:', camera.hslUrl);
|
|
wx.showModal({
|
title: '全屏播放',
|
content: `即将全屏播放 ${camera.name} 的视频流`,
|
confirmText: '开始播放',
|
success: (res) => {
|
if (res.confirm) {
|
// 这里可以跳转到全屏视频播放页面
|
wx.showToast({
|
title: '正在加载全屏视频...',
|
icon: 'loading'
|
});
|
|
// 模拟全屏视频加载
|
setTimeout(() => {
|
wx.showToast({
|
title: '全屏播放中',
|
icon: 'success'
|
});
|
}, 1500);
|
}
|
}
|
});
|
} else {
|
wx.showToast({
|
title: '全屏视频地址无效',
|
icon: 'error'
|
});
|
}
|
},
|
|
/**
|
* 摄像头设置
|
*/
|
cameraSettings(e) {
|
const camera = e.currentTarget.dataset.camera;
|
console.log('摄像头设置:', camera.name);
|
|
wx.showActionSheet({
|
itemList: ['云台控制', '录像设置', '画质调节', '报警设置'],
|
success: (res) => {
|
const actions = ['云台控制', '录像设置', '画质调节', '报警设置'];
|
wx.showToast({
|
title: `${actions[res.tapIndex]}功能开发中`,
|
icon: 'none'
|
});
|
}
|
});
|
},
|
|
/**
|
* 获取气象站列表(兼容性方法,现在调用统一接口)
|
*/
|
getWeatherStationList() {
|
console.log('获取气象站列表(调用统一接口)');
|
this.getAllDeviceInfo();
|
},
|
|
/**
|
* 选择气象站
|
*/
|
selectWeatherStation(index) {
|
const weatherStation = this.data.weatherStationList[index];
|
if (!weatherStation) return;
|
|
console.log('选择气象站:', weatherStation.name);
|
|
// 获取该气象站的详细数据
|
this.getWeatherStationData(weatherStation.id);
|
|
this.setData({
|
selectedWeatherStationIndex: index
|
});
|
},
|
|
/**
|
* 获取气象站详细数据
|
*/
|
getWeatherStationData(stationId) {
|
console.log('获取气象站数据:', stationId);
|
|
// 调用真实接口获取气象站详细信息
|
this.getWeatherLastData(stationId);
|
},
|
|
/**
|
* 调用 /wx/mqttLast/oneWeatherLast 接口获取气象站详细信息
|
*/
|
getWeatherLastData(weatherId) {
|
console.log('开始调用 /wx/mqttLast/oneWeatherLast 接口获取气象站详细信息');
|
console.log('气象站ID:', weatherId);
|
|
get({url: `/wx/mqttLast/oneWeatherLast?weatherId=${weatherId}`})
|
.then(response => {
|
console.log('气象站详细信息接口返回数据:', response);
|
|
if (response.success && response.code === '0001') {
|
const content = response.content;
|
|
// 处理接口返回的气象站数据
|
const weatherData = {
|
id: content.id,
|
weatherId: content.weatherId,
|
weatherName: content.weatherName || '气象站',
|
dt: content.dt,
|
// 气象数据
|
temperature: content.airTemperature, // 空气温度
|
humidity: content.airHumidity, // 空气湿度
|
uv: content.ultraviolet, // 紫外线
|
light: content.lightIntensity, // 光照强度
|
rainfall: content.rainfall, // 雨量
|
windSpeed: content.windSpeed, // 风速
|
windDirection: content.windDirectionStr, // 风向描述
|
windDirectionAngle: content.windDirection, // 风向角度
|
// 在线状态
|
onLine: content.onLine,
|
// 计算在线状态
|
online: content.onLine === 1,
|
// 格式化显示数据
|
lastUpdate: content.dt || new Date().toLocaleString()
|
};
|
|
this.setData({
|
currentWeatherStation: weatherData
|
});
|
|
console.log('处理后的气象站数据:', weatherData);
|
|
} else {
|
console.error('获取气象站详细信息失败:', response.msg);
|
wx.showToast({
|
title: response.msg || '获取气象站详细信息失败',
|
icon: 'none'
|
});
|
|
// 如果接口调用失败,使用模拟数据作为备选
|
this.setMockWeatherData(stationId);
|
}
|
})
|
.catch(error => {
|
console.error('调用气象站详细信息接口失败:', error);
|
wx.showToast({
|
title: '获取气象站详细信息失败',
|
icon: 'error'
|
});
|
|
// 如果接口调用失败,使用模拟数据作为备选
|
this.setMockWeatherData(stationId);
|
});
|
},
|
|
/**
|
* 设置模拟气象站数据(作为接口调用失败的备选方案)
|
*/
|
setMockWeatherData(stationId) {
|
console.log('使用模拟气象站数据:', stationId);
|
|
const mockWeatherData = {
|
id: stationId,
|
weatherId: stationId,
|
weatherName: '气象站',
|
dt: new Date().toLocaleString(),
|
temperature: 0.0,
|
humidity: 0.0,
|
uv: 0,
|
light: 0,
|
rainfall: 0.00,
|
windSpeed: 0.00,
|
windDirection: '北',
|
windDirectionAngle: 0,
|
onLine: 1,
|
online: true,
|
lastUpdate: new Date().toLocaleString()
|
};
|
|
this.setData({
|
currentWeatherStation: mockWeatherData
|
});
|
},
|
|
|
|
/**
|
* 气象站选择改变
|
*/
|
onWeatherStationChange(e) {
|
const index = e.detail.value;
|
this.selectWeatherStation(index);
|
},
|
|
/**
|
* 刷新气象数据
|
*/
|
refreshWeatherData() {
|
if (!this.data.currentWeatherStation) {
|
wx.showToast({
|
title: '请先选择气象站',
|
icon: 'none'
|
});
|
return;
|
}
|
|
console.log('刷新气象数据');
|
|
wx.showLoading({
|
title: '刷新中...'
|
});
|
|
// 重新调用接口获取最新数据
|
this.getWeatherLastData(this.data.currentWeatherStation.weatherId || this.data.currentWeatherStation.id);
|
|
wx.hideLoading();
|
wx.showToast({
|
title: '刷新成功',
|
icon: 'success'
|
});
|
},
|
|
/**
|
* 选择土壤墒情站
|
*/
|
selectSoilStation(index) {
|
const soilStation = this.data.soilStationList[index];
|
if (!soilStation) return;
|
|
console.log('选择土壤墒情站:', soilStation.name);
|
|
// 获取该土壤墒情站的详细数据
|
this.getSoilStationData(soilStation.id);
|
|
this.setData({
|
selectedSoilStationIndex: index
|
});
|
},
|
|
/**
|
* 获取土壤墒情站详细数据
|
*/
|
getSoilStationData(stationId) {
|
console.log('获取土壤墒情站数据:', stationId);
|
|
// 调用真实接口获取土壤墒情站详细信息
|
this.getSoilLastData(stationId);
|
},
|
|
/**
|
* 调用 /wx/mqttLast/oneSoilLast 接口获取土壤墒情站详细信息
|
*/
|
getSoilLastData(soilId) {
|
console.log('开始调用 /wx/mqttLast/oneSoilLast 接口获取土壤墒情站详细信息');
|
console.log('土壤墒情站ID:', soilId);
|
|
get({url: `/wx/mqttLast/oneSoilLast?soilId=${soilId}`})
|
.then(response => {
|
console.log('土壤墒情站详细信息接口返回数据:', response);
|
|
if (response.success && response.code === '0001') {
|
const content = response.content;
|
|
// 处理接口返回的土壤墒情站数据
|
const soilData = {
|
id: content.id,
|
soilId: content.soilId,
|
soilName: content.soilName || '土壤墒情站',
|
dt: content.dt,
|
// 5层土壤湿度数据
|
soilHumidity1: content.soilHumidity1,
|
soilHumidity2: content.soilHumidity2,
|
soilHumidity3: content.soilHumidity3,
|
soilHumidity4: content.soilHumidity4,
|
soilHumidity5: content.soilHumidity5,
|
// 5层土壤温度数据
|
soilTemperature1: content.soilTemperature1,
|
soilTemperature2: content.soilTemperature2,
|
soilTemperature3: content.soilTemperature3,
|
soilTemperature4: content.soilTemperature4,
|
soilTemperature5: content.soilTemperature5,
|
// 在线状态
|
onLine: content.onLine,
|
// 计算在线状态
|
online: content.onLine === 1,
|
// 格式化显示数据
|
lastUpdate: content.dt || new Date().toLocaleString()
|
};
|
|
this.setData({
|
currentSoilStation: soilData
|
});
|
|
console.log('处理后的土壤墒情站数据:', soilData);
|
|
} else {
|
console.error('获取土壤墒情站详细信息失败:', response.msg);
|
wx.showToast({
|
title: response.msg || '获取土壤墒情站详细信息失败',
|
icon: 'none'
|
});
|
|
// 如果接口调用失败,使用模拟数据作为备选
|
this.setMockSoilData(stationId);
|
}
|
})
|
.catch(error => {
|
console.error('调用土壤墒情站详细信息接口失败:', error);
|
wx.showToast({
|
title: '获取土壤墒情站详细信息失败',
|
icon: 'error'
|
});
|
|
// 如果接口调用失败,使用模拟数据作为备选
|
this.setMockSoilData(stationId);
|
});
|
},
|
|
/**
|
* 设置模拟土壤墒情站数据(作为接口调用失败的备选方案)
|
*/
|
setMockSoilData(stationId) {
|
console.log('使用模拟土壤墒情站数据:', stationId);
|
|
const mockSoilData = {
|
id: stationId,
|
soilId: stationId,
|
soilName: '土壤墒情站',
|
dt: new Date().toLocaleString(),
|
// 5层土壤湿度数据
|
soilHumidity1: 0.00,
|
soilHumidity2: 0.00,
|
soilHumidity3: 0.00,
|
soilHumidity4: 0.00,
|
soilHumidity5: 0.00,
|
// 5层土壤温度数据
|
soilTemperature1: 0.00,
|
soilTemperature2: 0.00,
|
soilTemperature3: 0.00,
|
soilTemperature4: 0.00,
|
soilTemperature5: 0.00,
|
// 在线状态
|
onLine: 1,
|
online: true,
|
lastUpdate: new Date().toLocaleString()
|
};
|
|
this.setData({
|
currentSoilStation: mockSoilData
|
});
|
},
|
|
/**
|
* 土壤墒情站选择改变
|
*/
|
onSoilStationChange(e) {
|
const index = e.detail.value;
|
this.selectSoilStation(index);
|
},
|
|
/**
|
* 刷新土壤墒情数据
|
*/
|
refreshSoilData() {
|
if (!this.data.currentSoilStation) {
|
wx.showToast({
|
title: '请先选择土壤墒情站',
|
icon: 'none'
|
});
|
return;
|
}
|
|
console.log('刷新土壤墒情数据');
|
|
wx.showLoading({
|
title: '刷新中...'
|
});
|
|
// 重新调用接口获取最新数据
|
this.getSoilLastData(this.data.currentSoilStation.soilId || this.data.currentSoilStation.id);
|
|
wx.hideLoading();
|
wx.showToast({
|
title: '刷新成功',
|
icon: 'success'
|
});
|
},
|
|
/**
|
* 获取水肥机列表(兼容性方法,现在调用统一接口)
|
*/
|
getFertilizerStationList() {
|
console.log('获取水肥机列表(调用统一接口)');
|
this.getAllDeviceInfo();
|
},
|
|
/**
|
* 选择水肥机
|
*/
|
selectFertilizerStation(index) {
|
const fertilizerStation = this.data.fertilizerStationList[index];
|
if (!fertilizerStation) return;
|
|
console.log('选择水肥机:', fertilizerStation.name);
|
|
// 获取该水肥机的详细数据
|
this.getFertilizerStationData(fertilizerStation.id);
|
|
this.setData({
|
selectedFertilizerStationIndex: index
|
});
|
},
|
|
/**
|
* 获取水肥机详细数据
|
*/
|
getFertilizerStationData(stationId) {
|
console.log('获取水肥机数据:', stationId);
|
|
// 调用真实接口获取水肥机详细信息
|
this.getManureLastData(stationId);
|
},
|
|
/**
|
* 调用 /wx/mqttLast/oneManureLast 接口获取水肥机详细信息
|
*/
|
getManureLastData(manureId) {
|
console.log('开始调用 /wx/mqttLast/oneManureLast 接口获取水肥机详细信息');
|
console.log('水肥机ID:', manureId);
|
|
get({url: `/wx/mqttLast/oneManureLast?manureId=${manureId}`})
|
.then(response => {
|
console.log('水肥机详细信息接口返回数据:', response);
|
|
if (response.success && response.code === '0001') {
|
const content = response.content;
|
|
// 处理接口返回的水肥机数据
|
const fertilizerData = {
|
id: content.id,
|
manureId: content.manureId,
|
manureName: content.manureName || '水肥机',
|
dt: content.dt,
|
alarm: content.alarm,
|
// 搅拌运行状态
|
stirRunning1: content.stirRunning1,
|
// 注肥运行状态
|
injectRunning: content.injectRunning,
|
// 流量和时间数据
|
manureFlow: content.manureFlow,
|
manureTime: content.manureTime,
|
stirTime: content.stirTime,
|
stirDuration: content.stirDuration,
|
injectDuration: content.injectDuration,
|
// 在线状态
|
onLine: content.onLine,
|
// 计算运行状态
|
mixingEnabled: content.stirRunning1 === 1,
|
fertilizingEnabled: content.injectRunning === 1,
|
// 格式化显示数据
|
lastUpdate: content.dt || new Date().toLocaleString()
|
};
|
|
this.setData({
|
currentFertilizerStation: fertilizerData
|
});
|
|
console.log('处理后的水肥机数据:', fertilizerData);
|
|
} else {
|
console.error('获取水肥机详细信息失败:', response.msg);
|
wx.showToast({
|
title: response.msg || '获取水肥机详细信息失败',
|
icon: 'none'
|
});
|
|
// 如果接口调用失败,使用模拟数据作为备选
|
this.setMockFertilizerData(stationId);
|
}
|
})
|
.catch(error => {
|
console.error('调用水肥机详细信息接口失败:', error);
|
wx.showToast({
|
title: '获取水肥机详细信息失败',
|
icon: 'error'
|
});
|
|
// 如果接口调用失败,使用模拟数据作为备选
|
this.setMockFertilizerData(stationId);
|
});
|
},
|
|
/**
|
* 设置模拟水肥机数据(作为接口调用失败的备选方案)
|
*/
|
setMockFertilizerData(stationId) {
|
console.log('使用模拟水肥机数据:', stationId);
|
|
const mockFertilizerData = {
|
id: stationId,
|
manureId: stationId,
|
manureName: '水肥机',
|
dt: new Date().toLocaleString(),
|
alarm: 0,
|
stirRunning1: 0,
|
injectRunning: 0,
|
manureFlow: 0.00,
|
manureTime: 0,
|
stirTime: 0,
|
stirDuration: 300,
|
injectDuration: 300,
|
onLine: 1,
|
mixingEnabled: false,
|
fertilizingEnabled: false,
|
lastUpdate: new Date().toLocaleString()
|
};
|
|
this.setData({
|
currentFertilizerStation: mockFertilizerData
|
});
|
},
|
|
|
|
/**
|
* 水肥机选择改变
|
*/
|
onFertilizerStationChange(e) {
|
const index = e.detail.value;
|
this.selectFertilizerStation(index);
|
},
|
|
/**
|
* 刷新水肥机数据
|
*/
|
refreshFertilizerData() {
|
if (!this.data.currentFertilizerStation) {
|
wx.showToast({
|
title: '请先选择水肥机',
|
icon: 'none'
|
});
|
return;
|
}
|
|
console.log('刷新水肥机数据');
|
|
wx.showLoading({
|
title: '刷新中...'
|
});
|
|
// 重新调用接口获取最新数据
|
this.getManureLastData(this.data.currentFertilizerStation.manureId || this.data.currentFertilizerStation.id);
|
|
wx.hideLoading();
|
wx.showToast({
|
title: '刷新成功',
|
icon: 'success'
|
});
|
},
|
|
/**
|
* 切换搅拌开关
|
*/
|
toggleMixing(e) {
|
const enabled = e.detail.value;
|
console.log('搅拌开关:', enabled ? '开启' : '关闭');
|
|
if (!this.data.currentFertilizerStation) return;
|
|
// 更新搅拌状态
|
const currentStation = {
|
...this.data.currentFertilizerStation
|
};
|
currentStation.mixingEnabled = enabled;
|
|
// 更新具体的搅拌运行状态(这里假设只控制第一个搅拌器)
|
currentStation.stirRunning1 = enabled ? 1 : 0;
|
|
this.setData({
|
currentFertilizerStation: currentStation
|
});
|
|
// 显示操作结果
|
wx.showToast({
|
title: enabled ? '搅拌已开启' : '搅拌已关闭',
|
icon: 'success'
|
});
|
},
|
|
/**
|
* 切换注肥开关
|
*/
|
toggleFertilizing(e) {
|
const enabled = e.detail.value;
|
console.log('注肥开关:', enabled ? '开启' : '关闭');
|
|
if (!this.data.currentFertilizerStation) return;
|
|
// 更新注肥状态
|
const currentStation = {
|
...this.data.currentFertilizerStation
|
};
|
currentStation.fertilizingEnabled = enabled;
|
|
// 更新注肥运行状态
|
currentStation.injectRunning = enabled ? 1 : 0;
|
|
this.setData({
|
currentFertilizerStation: currentStation
|
});
|
|
// 显示操作结果
|
wx.showToast({
|
title: enabled ? '注肥已开启' : '注肥已关闭',
|
icon: 'success'
|
});
|
},
|
|
|
|
|
|
|
/**
|
* 手动重试获取播放地址
|
*/
|
retryGetHlsUrl(e) {
|
const camera = e.currentTarget.dataset.camera;
|
if (!camera) {
|
console.error('重试失败:摄像头信息不完整');
|
wx.showToast({
|
title: '摄像头信息不完整',
|
icon: 'error'
|
});
|
return;
|
}
|
|
console.log('=== 手动重试获取播放地址 ===');
|
console.log(`摄像头: ${camera.name}, ID: ${camera.id}`);
|
console.log('当前状态:', {
|
online: camera.online,
|
hslUrl: camera.hslUrl,
|
isLoadingUrl: camera.isLoadingUrl,
|
urlError: camera.urlError
|
});
|
|
// 重置错误状态并重新获取
|
this.updateCameraUrlLoadingState(camera.id, false, false);
|
this.getHlsUrlForCamera(camera);
|
},
|
|
/**
|
* 更新摄像头URL加载状态
|
*/
|
updateCameraUrlLoadingState(cameraId, isLoading, hasError) {
|
console.log('=== 更新摄像头URL加载状态 ===');
|
console.log('参数:', { cameraId, isLoading, hasError });
|
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === cameraId) {
|
const updatedItem = {
|
...item,
|
isLoadingUrl: isLoading,
|
urlError: hasError
|
};
|
console.log(`摄像头 ${cameraId} 状态更新:`, {
|
name: updatedItem.name,
|
isLoadingUrl: updatedItem.isLoadingUrl,
|
urlError: updatedItem.urlError
|
});
|
return updatedItem;
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
|
console.log('状态更新完成,当前摄像头列表:', cameraList);
|
},
|
|
/**
|
* 为单个摄像头获取HLS播放地址
|
*/
|
getHlsUrlForCamera(camera) {
|
if (!camera || !camera.deviceSerial) {
|
console.error('摄像头信息不完整:', camera);
|
return;
|
}
|
|
console.log('=== 获取播放地址开始 ===');
|
console.log(`摄像头: ${camera.name}, ID: ${camera.id}, 设备序列号: ${camera.deviceSerial}`);
|
console.log('当前accessToken:', this.data.accessToken);
|
|
// 更新加载状态
|
this.updateCameraUrlLoadingState(camera.id, true, false);
|
|
// 调用萤石云API获取播放地址
|
this.getHlsUrl(this.data.accessToken, camera.deviceSerial, camera.id);
|
},
|
|
/**
|
* ezplayer错误处理
|
*/
|
handleError(e) {
|
console.log('=== ezplayer 错误处理 ===');
|
console.log('错误事件详情:', e);
|
console.log('错误详情:', e.detail);
|
|
// 获取摄像头信息
|
const cameraId = e.currentTarget.id;
|
console.log('出错的摄像头ID:', cameraId);
|
|
// 查找对应的摄像头
|
const camera = this.data.cameraList.find(item => `ezplayer-${item.id}` === cameraId);
|
if (camera) {
|
console.log('出错的摄像头信息:', camera);
|
|
// 更新错误状态
|
this.updateCameraUrlLoadingState(camera.id, false, true);
|
|
// 显示错误提示
|
wx.showToast({
|
title: '视频播放出错',
|
icon: 'error',
|
duration: 2000
|
});
|
} else {
|
console.error('未找到对应的摄像头:', cameraId);
|
}
|
},
|
|
/**
|
* ezplayer控制事件
|
*/
|
onControlEvent(e) {
|
console.log('=== ezplayer 控制事件 ===');
|
console.log('控制事件详情:', e);
|
console.log('事件类型:', e.type);
|
console.log('事件数据:', e.detail);
|
|
// 获取摄像头信息
|
const cameraId = e.currentTarget.id;
|
console.log('事件来源摄像头ID:', cameraId);
|
|
// 查找对应的摄像头
|
const camera = this.data.cameraList.find(item => `ezplayer-${item.id}` === cameraId);
|
if (camera) {
|
console.log('事件来源摄像头信息:', camera);
|
|
// 根据事件类型处理
|
switch (e.type) {
|
case 'play':
|
console.log('视频开始播放');
|
|
break;
|
case 'pause':
|
console.log('视频暂停播放');
|
|
break;
|
case 'ended':
|
console.log('视频播放结束');
|
|
break;
|
case 'error':
|
console.log('视频播放错误');
|
this.updateCameraUrlLoadingState(camera.id, false, true);
|
break;
|
default:
|
console.log('未知事件类型:', e.type);
|
}
|
} else {
|
console.error('未找到对应的摄像头:', cameraId);
|
}
|
},
|
|
|
|
|
/**
|
* 更新摄像头播放状态
|
*/
|
updateCameraPlayState(cameraId, isPlaying) {
|
console.log('=== 更新摄像头播放状态 ===');
|
console.log('参数:', { cameraId, isPlaying });
|
|
const cameraList = this.data.cameraList.map(item => {
|
if (item.id === cameraId) {
|
const updatedItem = {
|
...item,
|
isPlaying: isPlaying
|
};
|
console.log(`摄像头 ${cameraId} 播放状态更新:`, {
|
name: updatedItem.name,
|
isPlaying: updatedItem.isPlaying
|
});
|
return updatedItem;
|
}
|
return item;
|
});
|
|
this.setData({
|
cameraList: cameraList
|
});
|
|
console.log('播放状态更新完成');
|
},
|
|
|
})
|