property = [ 'box1up' => 'box1', 'box2up' => 'box2', 'box3up' => 'box3', 'box4up' => 'box4', 'box5up' => 'box5', 'box6up' => 'box6', 'Software_Version' => 'version', 'IMEI' => 'imei', // 'GeoLocation' => 'location', 'MagDoorSwitch' => 'lock_switch', 'RodSwitch' => 'deliver_lock_switch', 'RunningState' => 'runningStatus', 'Weight' => 'device_weight', 'RestCapacity' => 'rest_capacity', ]; $this->blueProperty = [ 'CurrentTemperature' => 'device_tem', 'IMEI' => 'imei', //'GeoLocation' => 'location', 'MagDoorSwitch' => 'lock_switch', 'RodSwitch' => 'deliver_lock_switch', 'RunningState' => 'runningStatus', 'Weight' => 'device_weight', 'RestCapacity' => 'rest_capacity', ]; $this->conf = SystemConfig::get('ali_config'); } /** * 刷新所有设备列表 * @return string|bool */ public function refreshList() { $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } if (!isset($conf['productKey']) || empty($conf['productKey'])) { return '请先配置阿里云产品识别码'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $list = $ali->getDeviceList($conf['productKey'], 100); $deviceList = $list['Data']['DeviceInfo']; if ($list['Page'] < $list['PageCount']) { for ($i = ($list['Page'] + 1); $i <= $list['PageCount']; $i++) { $list = $ali->getDeviceList($conf['productKey'], 100, $i); $deviceList = array_merge($deviceList, $list['Data']['DeviceInfo']); } } foreach ($deviceList as $key => $val) { $check = DeviceInfo::where([['device_name', $val['DeviceName']], ['product_key', $val['ProductKey']]]) ->orWhere('iot_id', $val['IotId'])->first(['id', 'status']); $status = 0; switch ($val['DeviceStatus']) { case 'ONLINE': $status = DeviceInfo::ONLINE; break; case 'OFFLINE': $status = DeviceInfo::OFFLINE; break; case 'UNACTIVE': $status = DeviceInfo::UNACTIVE; break; case 'DISABLE': $status = DeviceInfo::DISABLE; break; } if ($check) { $check->status = $status; $check->save(); } else { $create = [ 'status' => $status, 'iot_id' => $val['IotId'], 'product_key' => $val['ProductKey'], 'device_secret' => $val['DeviceSecret'], 'device_name' => $val['DeviceName'], ]; if ($status != 3) { DeviceInfo::insert($create); } } $this->refreshDevice($val['IotId']); } return true; } /** * 刷新设备属性 * @param String $iot_id * @return bool|string|array */ public function refreshDevice(string $iot_id) { $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $deviceProperty = $ali->getDeviceProperty($iot_id); Log::info("设备数据刷新[1]:" . json_encode($deviceProperty)); if (isset($deviceProperty['Success']) && $deviceProperty['Success']) { $data = []; foreach ($deviceProperty['Data']['List']['PropertyStatusInfo'] as $index => $item) { if (isset($this->property[$item['Identifier']])) { if (isset($item['Value'])) { $data[$this->property[$item['Identifier']]] = $item['Value']; } else { return ['data' => ['ErrorMessage' => "请检查设备属性[{$item['Identifier']}]是否初始化"], 'code' => 4]; } } } if (empty($data)) { return ['data' => ['ErrorMessage' => '未获取到设备属性'], 'code' => 3]; } //修复 // if ($data['deliver_lock_switch'] == 1) { // return ['data' => ['ErrorMessage' => '当前设备已开启,请等待'], 'code' => '2']; // } /* if (isset($data['location'])) { $location = json_decode($data['location'], true); $data['device_latitude'] = $location['latitude']; $data['device_longitude'] = $location['longitude']; unset($data['location']); }*/ /*if ($data['rest_capacity'] == 0) { $data['status'] = DeviceInfo::MAX; } else { $data['status'] = DeviceInfo::WELL; }*/ $insert['device_item'] = $data['device_tem']; $insert['imei'] = $data['imei']; if ($data['device_tem'] >= 80) { $id = DeviceInfo::where('iot_id', $iot_id)->first(['id'])->id; // Log::info("设备温度【{$id}】:{$data['device_tem']}" ); // WaringMessage::temWaring($id); } $res = DeviceInfo::where('iot_id', $iot_id)->update($insert); if (!$res) { Log::info('设备数据刷新[2]:' . json_encode($data)); } return ['data' => $data, 'code' => '0']; } else { return ['data' => $deviceProperty, 'code' => 1]; } } /** * 获取设备属性 * @param String $iot_id * @return bool|string|array */ public function getProperty(string $iot_id) { $conf = $this->conf; //Todo 全局 两个if合并 if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $deviceProperty = $ali->getDeviceProperty($iot_id); // dd($deviceProperty); if (isset($deviceProperty['Success']) && $deviceProperty['Success']) { $data = []; foreach ($deviceProperty['Data']['List']['PropertyStatusInfo'] as $index => $item) { if (isset($this->property[$item['Identifier']])) { if (isset($item['Value'])) { $data[$this->property[$item['Identifier']]] = $item['Value']; } else { $data[$this->property[$item['Identifier']]] = ''; // return ['data' => ['ErrorMessage' => "请检查设备属性[{$item['Identifier']}]是否初始化"], 'code' => 4]; } } } if (empty($data)) { return ['data' => ['ErrorMessage' => '未获取到设备属性'], 'code' => 3]; } /*if (isset($data['location'])) { $location = json_decode($data['location'], true); $data['device_latitude'] = $location['latitude']; $data['device_longitude'] = $location['longitude']; unset($data['location']); }*/ /*if ($data['rest_capacity'] == 0) { $data['status'] = DeviceInfo::MAX; } else { $data['status'] = DeviceInfo::WELL; }*/ return ['data' => $data, 'code' => '0']; } else { return ['data' => $deviceProperty, 'code' => 1]; } } //蓝牙链接 传输加密数据 public function getDecodeProperty(string $base64_data, string $iot_id) { Log::info($base64_data); $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } $dataDecode = ToolServer::decode($base64_data, '1234567890123456'); //$dataDecode = json_decode($base64_data, true); Log::info("蓝牙设备数据刷新:" . json_encode($dataDecode)); $data = []; if (!$dataDecode["P"]) { return ['message' => '未获取到设备属性', 'code' => 3]; } $updateIotData = []; foreach ($dataDecode["P"] as $index => $item) { if (isset($this->property[$item['I']])) { if (isset($item['V'])) { $data[$this->property[$item['I']]] = $item['V']; $updateIotData[$item['I']] = $item['V']; } else { return ['data' => ['ErrorMessage' => "请检查设备属性[{$item['Identifier']}]是否初始化"], 'code' => 4]; } } } if (empty($data)) { return ['message' => '未获取到设备属性', 'code' => 3]; } $iotService = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $resUpload = $iotService->setDeviceProperty($iot_id, $updateIotData); /*if (!$resUpload['Success']) { return ['message' => '设备数据上报物联网失败', 'code' => 4]; }*/ if ($data['device_tem'] >= 80) { $id = DeviceInfo::where('iot_id', $iot_id)->first(['id'])->id; WaringMessage::temWaring($id); } $res = DeviceInfo::where('iot_id', $iot_id)->update($data); if (!$res) { Log::info('设备数据刷新[3]:' . json_encode($data)); } return ['data' => $data, 'code' => '0']; } public function getBase64Property(string $base64_data) { $dataDecode = json_decode(base64_decode($base64_data), true); // Log::debug($dataDecode); if ( empty($dataDecode)|| !is_array($dataDecode) || !isset($dataDecode['identifier']) ) { return true; } if ($dataDecode['identifier'] == 'errorEvent') { $id = DeviceInfo::where('iot_id', $dataDecode['iotId'])->first(['id'])->id; WaringMessage::normalWarning($id, $dataDecode['value']['errorEvent'], WaringMessage::ALARM); return true; } if ($dataDecode['identifier'] == 'warnEvent') { $device = DeviceInfo::where('iot_id', $dataDecode['iotId'])->first(['id', 'device_comment']); $last = WaringMessage::where([['no', $device->id], ['message', $dataDecode['value']['warnEvent']], ['type', WaringMessage::WARN]])->first(['created_at']); $mobile = SystemConfig::get('system_config', 'admin_mobile', 18981831779); if ($mobile && (!$last || ($last && strtotime($last->created_at) + 1800 <= time()))) { $type = SystemConfig::get('sms_config', 'sms_type', 'AliSmsServer'); $template = SystemConfig::get('ali_config', 'sms', ''); $template = json_decode($template, true); if ($template['DeviceTmpId'] && $template['sign']) { $type = '\App\Server\Sms\\' . $type; $sms = new SmsServer(new $type($mobile, $template['DeviceTmpId'], $template['sign'], ['deviceId' => $device->id, 'deviceName' => $device->device_comment, 'warnInfo' => $dataDecode['value']['warnEvent']])); $sms->send(); } } WaringMessage::normalWarning($device->id, $dataDecode['value']['warnEvent'], WaringMessage::WARN); return true; } if ($dataDecode['identifier'] == 'commoneEvent') { //toDO 开/关门 $device = DeviceInfo::where('iot_id', $dataDecode['iotId'])->first(['id']); if(!$device){ return true; } $order = DeliverInfo::where('device_id', $device->id)->orderBy('id', 'Desc')->first(); //优化关门统一走回调 if(!$order || $order->status != DeliverInfo::UNFINISHED){ return true; } Log::info('Cache:' . 'device-msg-'.$dataDecode['iotId'].'-'.$dataDecode['requestId']); //处理设备发送重复消息 if (Cache::has('device-msg-'.$dataDecode['iotId'].'-'.$dataDecode['requestId'])) { Log::info('关门回调通知重复消息:' .$dataDecode['requestId']); return true; } if($dataDecode['value']['action']=='open') { //开门回调通知 Log::info('开门回调通知:' . json_encode($dataDecode)); $order->open_weight = $dataDecode['value']['weight']; $order->save(); Cache::put('device-msg-'.$dataDecode['iotId'].'-'.$dataDecode['requestId'], $dataDecode['requestId'], 3600); return true; } if($dataDecode['value']['action']=='close'){ //关门回调通知 Log::info('关门回调通知:' . json_encode($dataDecode)); $close_weight = $dataDecode['value']['weight']; $weight = $close_weight - $order->open_weight; $order->close_weight = $close_weight; $order->weight = $weight; $order->finished_at = date('Y-m-d H:i:s'); Log::info('关门回调变化重量:'.$weight); Log::info('关门回调关门重量:'.$close_weight); Log::info('关门回调获得金额:'.$order->money); Log::info('关门回调变化重量:'.($weight <= 0)); Cache::forget('deviceUse_' . $device->id); $fetch_price= SystemConfig::get('system_config', 'fetch_per_g', '0.1'); $price = SystemConfig::get('system_config', 'put_per_g', '0.06'); //如果有小区加个就取小区价格 $deviceInfo = DeviceInfo::with('communities')->where(['id'=>$order['device_id']])->first(); if(!empty($deviceInfo->communities)) { if(!empty($deviceInfo->communities->put_per_g)) $price = $deviceInfo->communities->put_per_g; if(!empty($deviceInfo->communities->fetch_per_g)) $fetch_price = $deviceInfo->communities->fetch_per_g; } $order->deliver_price = $price; $order->transport_price = $fetch_price; if ($weight <= 0) { $order->status=DeliverInfo::LOSS; $order->income = 0; if($weight < -5000){ $order->status=DeliverInfo::UNNORMAL; WaringMessage::deliverWarning($order->no); } $order->save(); Log::info('关门回调失效订单:' . json_encode($order)); Cache::put('device-msg-'.$dataDecode['iotId'].'-'.$dataDecode['requestId'], $dataDecode['requestId'], 3600); return true; } $start = date('Y') . '-' . date('m') . '-' . date('d') . ' 00:00:00'; $checkCount = DeliverInfo::where([['user_id', $order->user_id], ['status', DeliverInfo::SUCCESS]]) ->where('created_at', '>', $start)->count(); $deliverLimit = SystemConfig::get('system_config', 'deliver_limit', 10); $deliverWeight = SystemConfig::get('system_config', 'deliver_weight', 0); //To Do 地区价格计算公式 Log::info('筛选时间:' . $start); Log::info('投递次数:' . $checkCount); Log::info('投递限制:' . $deliverLimit); Log::info('地区价格:' . $price); if (($deliverWeight != 0 && $weight > $deliverWeight) || $checkCount > $deliverLimit) { $order->status = DeliverInfo::WAIT_CHECK; } else { $order->status = DeliverInfo::SUCCESS; } $order->money = $price*$weight; $order->income = ($fetch_price - $price)*$weight; if ($order->save()) { Cache::put('device-msg-'.$dataDecode['iotId'].'-'.$dataDecode['requestId'], $dataDecode['requestId'], 3600); return true; } else { return false; } } } if (isset($dataDecode['items'])) { $property = $dataDecode['items']; $data = []; if (!$property) { return ['message' => '未获取到设备属性', 'code' => 3]; } foreach ($property as $index => $item) { if (isset($this->property[$index])) { if (isset($item['value'])) { $data[$this->property[$index]] = $item['value']; } else { return ['data' => ['ErrorMessage' => "请检查设备属性[{$item['Identifier']}]是否初始化"], 'code' => 4]; } } } if (empty($data)) { return ['message' => '未获取到设备属性', 'code' => 3]; } if ($data['device_tem'] >= 80) { $id = DeviceInfo::where('iot_id', $dataDecode['iotId'])->first(['id'])->id; WaringMessage::temWaring($id); } $res = DeviceInfo::where('iot_id', $dataDecode['iotId'])->update($data); $this->getDeviceStatus($dataDecode['iotId']); if (!$res) { Log::info('设备数据刷新[4]:' . json_encode($data)); } Log::info('success'); return ['data' => $data, 'code' => '0']; } return true; } public function getDeviceStatus($iotId) { $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } if (!isset($conf['productKey']) || empty($conf['productKey'])) { return '请先配置阿里云产品识别码'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $res = $ali->GetDeviceStatus($iotId); if ($res['Success'] == true) { $check = DeviceInfo::Where('iot_id', $iotId)->first(['status']); $status = 0; switch ($res['Data']['Status']) { case 'ONLINE': $status = DeviceInfo::ONLINE; break; case 'OFFLINE': $status = DeviceInfo::OFFLINE; break; case 'UNACTIVE': $status = DeviceInfo::UNACTIVE; break; case 'DISABLE': $status = DeviceInfo::DISABLE; break; } ////// dd($val); $check->status = $status; $check->save(); return $status; } else { return 'fail'; } } /** * 启用和禁用 * @param String $iot_id * @param int $state AliYunIotServer::ENABLE * @return array|string */ public function switchDevice(string $iot_id, int $state = AliYunIotServer::ENABLE) { $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $res = $ali->switchDevice($state, $iot_id); if (isset($res['Success']) && $res['Success']) { if ($state == AliYunIotServer::ENABLE) { $state = 0; } else { $state = 2; } DeviceInfo::where('iot_id', $iot_id)->update(['status' => $state]); return 'success'; } else { return $res['ErrorMessage']; } } /** 投递门/收运门 开关 * @param string $iot_id * @param int $mode * @return string */ public function doorOperation(string $iot_id, int $mode = self::OPEN) { $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); if ($mode == self::OPEN) { $identifier = 'open1'; } else if ($mode == self::CLOSE) { $identifier = 'close1'; } else if ($mode == self::AGENTOPEN) { $identifier = 'RemoteAgentOpen'; } else if ($mode == self::AGENTCLOSE) { $identifier = 'RemoteAgentClose'; } $args = (object)[]; $res = $ali->invokeThingService($iot_id, $identifier, $args); Log::info('doorOperation 参数:'. $iot_id .' '. $mode .'返回数据:'.json_encode($res)); if (isset($res['Success']) && $res['Success']) { DeviceInfo::where('iot_id', $iot_id)->update(['deliver_lock_switch' => $mode]); return 'success'; } else { return $res['ErrorMessage']; } } /** 下发锁协议 * @param string $device_name 设备名称 * @param string $rules 下发规则 **/ public function sendMsg(string $device_name, string $rules) { $conf = $this->conf; if (!isset($conf['appSecret']) || empty($conf['appSecret'])) { return '请先配置阿里云app秘钥'; } if (!isset($conf['appKey']) || empty($conf['appKey'])) { return '请先配置阿里云appKey'; } $ali = new AliYunIotServer($conf['appKey'], $conf['appSecret']); $args['Action'] = "Pub"; $args['DeviceName'] = $device_name; $args['ProductKey'] = 'a15yVIP0Onl'; $args['MessageContent'] = base64_encode($rules); $args['TopicFullName'] = "/a15yVIP0Onl/{$device_name}/user/get"; // $args['RequestBase64Byte'] = base64_encode($rules); // $args['Timeout'] = 7000; // $args['Topic'] = "/a15yVIP0Onl/{$device_name}/user/get"; $data = $ali->RRpc($args); return $data; } }