diff --git a/app/api/controller/DataCollectController.php b/app/api/controller/DataCollectController.php new file mode 100644 index 00000000..41262335 --- /dev/null +++ b/app/api/controller/DataCollectController.php @@ -0,0 +1,214 @@ +request->post(); + Log::info('采集消息发布'.json_encode($parmas)); + if(!$parmas || !isset($parmas['username']) || $parmas['username']==''){ + return $this->fail('参数错误'); + } + $land = explode('_', $parmas['username']); // 命名规则:land_id id土地表主键id + // mqtt服务端 消息发布事件 + if ($parmas['event'] == 'message.publish') { + + $payload= json_decode($parmas['payload'], true); + // 如果该设备之前离线,现在重新上线则删除之前的设备离线记录 + DeviceOffline::where('land_id', $land[3])->delete(); + $device = explode('_', $parmas['topic']); // 命名规则:topic_deviceid deviceid为设备主键id + $data = [ + 'land_id' => $land[3], + 'device_id'=>$device[1], + 'qos'=>$parmas['qos'], + 'wind_speed' => $payload['wind_speed'], + 'wind_direction' => $payload['wind_direction'], + 'ambient_temperature' => $payload['ambient_temperature'], + 'ambient_humidity' => $payload['ambient_humidity'], + 'carbon_dioxide' => $payload['carbon_dioxide'], + 'ambient_air_pressure' => $payload['ambient_air_pressure'], + 'rainfall' => $payload['rainfall'], + 'ambient_lighting' => $payload['ambient_lighting'], + 'soil_temperature' => $payload['soil_temperature'], + 'soil_conductivity' => $payload['soil_conductivity'], + 'soil_moisture' => $payload['soil_moisture'], + 'soil_PH' => $payload['soil_PH'], + 'soil_potassium_phosphate_nitrogen' => $payload['soil_potassium_phosphate_nitrogen'], + 'soil_potassium_phosphate_phosphorus' => $payload['soil_potassium_phosphate_phosphorus'], + 'soil_potassium_phosphate_potassium' => $payload['soil_potassium_phosphate_potassium'], + 'client_id'=>$parmas['clientid'], + 'create_time'=>date('Y-m-d H:i:s'), + 'update_time'=>date('Y-m-d H:i:s'), + ]; + + LandCollection::create($data); + + // 设备告警 + $monitorThreshold = MonitorThreshold::find(); + // 风速告警 + if ($payload['wind_speed'] > $monitorThreshold['wind_speed_max']) { + self::createAlarm($land[3], $device[1], 'wind_speed', '风速偏快' ,$payload['wind_speed']); + } + + // ambient_temperature 环境温度 + if ($payload['ambient_temperature'] < $monitorThreshold['air_temp_min']) { + self::createAlarm($land[3], $device[1], 'ambient_temperature', '气温偏低' ,$payload['ambient_temperature']); + } + + // ambient_temperature 环境温度 + if ($payload['ambient_temperature'] > $monitorThreshold['air_temp_max']) { + self::createAlarm($land[3], $device[1], 'ambient_temperature', '气温偏高' ,$payload['ambient_temperature']); + } + + // ambient_humidity 环境湿度 + if ($payload['ambient_humidity'] < $monitorThreshold['air_mois_min']) { + self::createAlarm($land[3], $device[1], 'ambient_temperature', '空气湿度偏低' ,$payload['ambient_humidity']); + } + // ambient_humidity 环境湿度 + if ($payload['ambient_humidity'] < $monitorThreshold['air_mois_max']) { + self::createAlarm($land[3], $device[1], 'ambient_temperature', '空气湿度偏高' ,$payload['ambient_humidity']); + } + + // carbon_dioxide 二氧化碳含量 + if ($payload['carbon_dioxide'] > $monitorThreshold['air_co2_content_max']) { + self::createAlarm($land[3], $device[1], 'ambient_temperature', '空气二氧化碳含量偏高' ,$payload['carbon_dioxide']); + } + // carbon_dioxide 二氧化碳含量 + if ($payload['carbon_dioxide'] < $monitorThreshold['air_co2_content_min']) { + self::createAlarm($land[3], $device[1], 'ambient_temperature', '空气二氧化碳含量偏低' ,$payload['carbon_dioxide']); + } + + // ambient_air_pressure 大气压力 + if ($payload['ambient_air_pressure'] >= 120) + { + self::createAlarm($land[3], $device[1], '大气压力', '大气压力偏高' ,$payload['ambient_air_pressure']); + } + if ($payload['ambient_air_pressure'] < 10) + { + self::createAlarm($land[3], $device[1], '大气压力', '大气压力偏低' ,$payload['ambient_air_pressure']); + } + + // rainfall 雨量 +// if ($payload['rainfall'] >= 100) + // ambient_lighting 光照 + + // soil_temperature 土壤温度 + if ($payload['soil_temperature'] >= $monitorThreshold['soil_temp_max']) { + self::createAlarm($land[3], $device[1], '土壤温度', '土壤温度偏高' ,$payload['soil_temperature']); + } + // soil_temperature 土壤温度 + if ($payload['soil_temperature'] < $monitorThreshold['soil_temp_min']) { + self::createAlarm($land[3], $device[1], '土壤温度', '土壤温度偏低' ,$payload['soil_temperature']); + } + + // soil_conductivity 土壤电导率 +// if ($payload['soil_conductivity'] < $monitorThreshold['soil_mois_max']) { +// self::createAlarm($land[3], $device[1], '土壤电导率', '土壤湿度偏高' ,$payload['soil_conductivity']); +// } +// if ($payload['soil_conductivity'] < $monitorThreshold['soil_mois_min']) { +// self::createAlarm($land[3], $device[1], '土壤电导率', '土壤湿度偏低' ,$payload['soil_conductivity']); +// } + + // soil_conductivity 土壤湿度 + if ($payload['soil_moisture'] < $monitorThreshold['soil_mois_max']) { + self::createAlarm($land[3], $device[1], '土壤湿度', '土壤湿度偏高' ,$payload['soil_moisture']); + } + if ($payload['soil_moisture'] < $monitorThreshold['soil_mois_min']) { + self::createAlarm($land[3], $device[1], '土壤湿度', '土壤湿度偏低' ,$payload['soil_moisture']); + } + + // soil_PH 土壤ph值 + if ($payload['soil_PH'] < $monitorThreshold['soil_ph_max']) { + self::createAlarm($land[3], $device[1], '土壤PH值', '土壤PH值偏碱性' ,$payload['soil_moisture']); + } + if ($payload['soil_PH'] < $monitorThreshold['soil_ph_min']) { + self::createAlarm($land[3], $device[1], '土壤PH值', '土壤PH值偏酸性' ,$payload['soil_moisture']); + } + + // soil_potassium_phosphate_nitrogen 土壤磷酸钾:氮 + if ($payload['soil_PH'] < $monitorThreshold['soil_n_content_max']) { + self::createAlarm($land[3], $device[1], '土壤磷酸钾-氮', '土壤磷酸钾-含氮量偏高' ,$payload['soil_moisture']); + } + if ($payload['soil_PH'] < $monitorThreshold['soil_n_content_min']) { + self::createAlarm($land[3], $device[1], '土壤磷酸钾-氮', '土壤磷酸钾-含氮量偏低' ,$payload['soil_moisture']); + } + + // soil_potassium_phosphate_phosphorus 土壤磷酸钾:磷 + if ($payload['soil_PH'] < $monitorThreshold['soil_p_content_max']) { + self::createAlarm($land[3], $device[1], '土壤磷酸钾-磷', '土壤磷酸钾-含磷量偏高' ,$payload['soil_moisture']); + } + if ($payload['soil_PH'] < $monitorThreshold['soil_p_content_min']) { + self::createAlarm($land[3], $device[1], '土壤磷酸钾-磷', '土壤磷酸钾-含磷量偏低' ,$payload['soil_moisture']); + } + + // soil_potassium_phosphate_potassium 土壤磷酸钾:钾 + if ($payload['soil_PH'] < $monitorThreshold['soil_k_content_max']) { + self::createAlarm($land[3], $device[1], '土壤磷酸钾-钾', '土壤磷酸钾-含钾量偏高' ,$payload['soil_moisture']); + } + if ($payload['soil_PH'] < $monitorThreshold['soil_k_content_min']) { + self::createAlarm($land[3], $device[1], '土壤磷酸钾-钾', '土壤磷酸钾-含钾量偏低' ,$payload['soil_moisture']); + } + + return $this->success('接收成功', ['user_name'=>$parmas['username'], 'topic'=>$parmas['topic']]); + } + + // mqtt服务端 连接断开事件 客户端断开表示该土块的所有设备都已断开 共用同一个mqtt客户端 + if ($parmas['event'] == 'client.disconnected') { + // 查询该土地关联的设备 + $landProduct = LandProduct::where('land_id', $land[3])->find(); + $productDevice = ProductDevice::where('product_id', $landProduct['product_id'])->select(); + foreach ($productDevice as $item) { + $addData = [ + 'land_id' => $land[3], + 'device_id' => $item['device_id'], + 'last_online_time' => $parmas['disconnected_at']/1000, + 'disconnected_time' => $parmas['disconnected_at']/1000, + 'create_time' => time(), + 'update_time' => time() + ]; + DeviceOffline::create($addData); + } + return $this->success('接收成功'); + } + } catch (Exception $e) { + return $this->fail($e->getMessage()); + } + + } + + public static function createAlarm($user_id, $device_id, $type, $content, $value) + { + $data = [ + 'user_id' => $user_id, + 'device_id' => $device_id, + 'type' => $type, + 'content' => $content, + 'value' => $value, + 'create_time' => time(), + 'update_time' => time(), + ]; + + MonitorAlarm::create($data); + } + + public function disabled() + { + $parmas = $this->request->post(); + Log::info('连接断开事件'.json_encode($parmas)); + } +} \ No newline at end of file diff --git a/app/api/controller/PlantController.php b/app/api/controller/PlantController.php index 08deb26f..a5444a60 100644 --- a/app/api/controller/PlantController.php +++ b/app/api/controller/PlantController.php @@ -35,6 +35,7 @@ return $this->fail('种植信息错误'); } $data['pic'] = json_decode($data['pic'],true); + $data['plant_date'] = date('Y-m-d H:i:s',$data['plant_date']); return $this->success('请求成功',$data->toArray()); } diff --git a/app/common/model/LandCollection.php b/app/common/model/LandCollection.php new file mode 100644 index 00000000..374f47ec --- /dev/null +++ b/app/common/model/LandCollection.php @@ -0,0 +1,8 @@ +