管灌系统农户端微信小程序(嘉峪关应用)
pages/stationMonitor/stationMonitor.js
@@ -387,7 +387,7 @@
            return {
              id: item.id,
              name: item.name,
              online: true, // 默认在线,实际项目中可能需要额外的状态检查
              onLine: true, // 默认在线,实际项目中可能需要额外的状态检查
              lastUpdate: new Date().toLocaleString(), // 当前时间作为最后更新时间
              isPlaying: false, // 视频播放状态
              hslUrl: rtmpUrl, // 使用生成的RTMP URL
@@ -432,356 +432,12 @@
 
  /**
   * 批量获取所有摄像头的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'
        });
      }
    });
  },
  /**
   * 获取气象站列表(兼容性方法,现在调用统一接口)
@@ -849,8 +505,6 @@
            windDirectionAngle: content.windDirection, // 风向角度
            // 在线状态
            onLine: content.onLine,
            // 计算在线状态
            online: content.onLine === 1,
            // 格式化显示数据
            lastUpdate: content.dt || new Date().toLocaleString()
          };
@@ -903,7 +557,7 @@
      windSpeed: 0.00,
      windDirection: '北',
      windDirectionAngle: 0,
      onLine: 1,
      onLine: false,
      online: true,
      lastUpdate: new Date().toLocaleString()
    };
@@ -1071,8 +725,7 @@
      soilTemperature4: 0.00,
      soilTemperature5: 0.00,
      // 在线状态
      onLine: 1,
      online: true,
      onLine: false,
      lastUpdate: new Date().toLocaleString()
    };
@@ -1240,7 +893,7 @@
      stirTime: 0,
      stirDuration: 300,
      injectDuration: 300,
      onLine: 1,
      onLine: false,
      mixingEnabled: false,
      fertilizingEnabled: false,
      lastUpdate: new Date().toLocaleString()