camera_manage.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. import re
  2. import requests
  3. import time
  4. from django.conf import settings
  5. from django.db.models import Count
  6. from django.core.paginator import Paginator
  7. from smartfarming.api.views.forecast.all_dict import insect_dict, attract_discern
  8. from smartfarming.models.sim_card import MongoMsg_Conf
  9. from smartfarming.models.device import MongoDevice
  10. from smartfarming.models.camera import MongoCameraPhoto, MongoCameraData, MongoCameraAccount
  11. from smartfarming.serializers.device_serializers import DeviceSerializers
  12. from smartfarming.utils import controlMove
  13. from kedong.decoration import kedong_deco, PortError
  14. config_dict = settings.CONFIG
  15. @kedong_deco(login_required=True)
  16. def list_camera(request):
  17. """
  18. 获取监控设备列表 :
  19. 参数:
  20. page 非必传(num) 页码,默认为1
  21. device_id 非必传 设备ID, 不传为监控列表, 传设备号为搜索
  22. page_size 非必传 一页条数,默认为10
  23. 返回值:
  24. {
  25. "data": {
  26. data : {
  27. "device_name":"", 设备名称
  28. "device_id":"", 设备ID
  29. "photo_num":"", 是否拍过照片 0未拍过 1拍过
  30. "status":"", 设备状态 0离线 1在线
  31. "camera_playback":"" 用来判断是否有录像功能 0不支持 1支持
  32. "sim":"" 监控SIM 卡
  33. }
  34. counts : 99 总数
  35. }
  36. "errorCode": 0,
  37. "message": "",
  38. "formError": {}
  39. }
  40. """
  41. _list = []
  42. myuser = request.myuser
  43. post_info = request.POST
  44. device_id = post_info.get('device_id')
  45. page = int(post_info.get('page', 1))
  46. page_size = int(post_info.get('page_size', 10))
  47. search_dict = {
  48. "device_type_id": 6
  49. }
  50. if device_id:
  51. search_dict["device_id"] = re.compile(fr"^.*{device_id}.*$")
  52. # total_num, data_list = MongoDevice.get_device_list(myuser, match=search_dict, page_num=page, page_size=page_size)
  53. queryset = MongoDevice.objects.filter(device_type_id=6)
  54. total_num = queryset.count()
  55. paginator = Paginator(queryset, page_size)
  56. page_obj = paginator.get_page(page)
  57. serializers = DeviceSerializers(page_obj, many=True)
  58. data_list = serializers.data
  59. _list = []
  60. device_id_list = []
  61. for x in data_list:
  62. device_id = x.get("device_id")
  63. device_id_list.append(device_id)
  64. _list.append({
  65. "device_name": x.get("device_name"),
  66. "device_id": device_id,
  67. "photo_num": "",
  68. "status": x.get("device_status"),
  69. "camera_playback": "",
  70. "sim": x.get("simid")
  71. })
  72. photo_queryset = MongoCameraPhoto.objects.filter(device_id__in=device_id_list, photo_status=1).values('device_id').annotate(count=Count('device_id'))
  73. phote_dict = {p['device_id']: "1" for p in photo_queryset}
  74. playback_dict = {y['device_id']: y["camera_playback"] for y in MongoCameraData.objects.filter(device_id__in=device_id_list).values('device_id','camera_playback')}
  75. for item in _list:
  76. item["photo_num"] = phote_dict.get(device_id, "0")
  77. item["camera_playback"] = playback_dict.get(device_id,"0")
  78. datas = {"data": _list, "counts": total_num}
  79. return datas
  80. @kedong_deco(login_required=True)
  81. def addr_camera_list(request):
  82. """
  83. 获取监控设备播放地址
  84. 参数:
  85. device_id 必传 (string) 监控设备的序列号
  86. 返回值:
  87. {
  88. "data": {
  89. "hls": "http://test.ys7.com:66/openlive/b475942b03544a5aa35b651670d8712c.m3u8", HLS流畅直播地址
  90. "hlsHd": "http://test.ys7.com:66/openlive/b475942b03544a5aa35b651670d8712c.hd.m3u8", HLS高清直播地址
  91. "rtmp": "rtmp://10.82.0.190:1935/openlive/b475942b03544a5aa35b651670d8712c", RTMP流畅直播地址
  92. "rtmpHd": "rtmp://10.82.0.190:1935/openlive/b475942b03544a5aa35b651670d8712c.hd" RTMP高清直播地址
  93. }
  94. "errorCode": 0,
  95. "message": "",
  96. "formError": {}
  97. }
  98. """
  99. try:
  100. if 'HTTP_X_FORWARDED_FOR' in request.META:
  101. ip = request.META['HTTP_X_FORWARDED_FOR']
  102. else:
  103. ip = request.META['HTTP_X_REAL_IP']
  104. except Exception as KeyError:
  105. ip = request.META['REMOTE_ADDR']
  106. device_id = request.POST.get('device_id')
  107. # try:
  108. # ic = InterfaceCallLog()
  109. # ic.ip = ip
  110. # ic.device_id = device_id
  111. # ic.interface = "addr_camera_list"
  112. # ic.meta = str(request.META)
  113. # ic.save()
  114. # except Exception as e:
  115. # pass
  116. # if device_id in jk_list.keys():
  117. # if redis_pool.get(device_id):
  118. # url_path = redis_pool.get(device_id)
  119. # else:
  120. # cameraIndexCode = jk_list.get(device_id,"")
  121. # url = "http://223.151.55.58:8082/zhcg-serve/hkVideo/api/getPreviewURLsByHls?cameraIndexCode={}&streamType=0".format(cameraIndexCode)
  122. # try:
  123. # url_path = (requests.get(url,timeout=5).json())["data"]["url"]
  124. # except:
  125. # url_path = ""
  126. # # 设置播放地址到期时间5分钟
  127. # redis_pool.set(device_id,url_path,300)
  128. # # 因为其他设备返回的数值是字符串的,所以进行拼接
  129. # data = "{'hls':'%s','hlsHd':'%s','rtmp':'%s','rtmpHd':'%s'}"%(url_path,url_path,url_path,url_path)
  130. # return data
  131. try:
  132. addr = MongoCameraData.objects.get(device_id=device_id).device_info
  133. except:
  134. addr = {}
  135. return addr
  136. @kedong_deco(login_required=True)
  137. def ctrl_camera(request):
  138. """
  139. 控制监控设备转动 :
  140. 参数:
  141. device_id 必传 (string) 监控设备的序列号
  142. ctrl 必传 (string) 操作指令 move 控制球机转动 stop 停止球机转动
  143. movenum ctrl=move时必传(string) 0-上,1-下,2-左,3-右,8-放大,9-缩小
  144. 返回值:
  145. {
  146. "data": success, success成功 default失败
  147. "errorCode": 0,
  148. "message": "",
  149. "formError": {}
  150. }
  151. """
  152. device_id = request.POST.get('device_id')
  153. ctrl = request.POST.get('ctrl')
  154. account_id = MongoCameraData.objects.filter(device_id=device_id).first()
  155. if not account_id:
  156. raise PortError("","未找到此设备")
  157. camera_query = MongoCameraAccount.objects.filter(id=int(account_id.account_id)).first()
  158. if not camera_query:
  159. raise PortError("","未找到此账号")
  160. channelNo = "1"
  161. if device_id.find("-") != -1:
  162. channelNo = device_id.split("-")[1]
  163. device_id = device_id.split("-")[0]
  164. # 操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距
  165. if ctrl == "move":
  166. dire = request.POST.get('movenum')
  167. # 增加大华相机操作功能
  168. if camera_query.account_type == 1:
  169. if dire not in ("0","1","2","3","8","9"):
  170. raise PortError("movenum","暂不支持其它指令")
  171. appId = camera_query.app_key
  172. appSecret = camera_query.app_secret
  173. controlMove(appId,appSecret,device_id,dire,channelNo)
  174. else:
  175. accessToken = camera_query.token
  176. ctrl_url = 'https://open.ys7.com/api/lapp/device/ptz/start'
  177. speed = '1'
  178. data = {'accessToken':accessToken, 'deviceSerial':device_id, 'channelNo':channelNo, 'speed':speed, 'direction':dire}
  179. res1 = requests.post(ctrl_url,data=data)
  180. elif ctrl == "stop":
  181. time.sleep(0.4)
  182. # 增加大华相机操作功能
  183. if camera_query.account_type == 1:
  184. dire = "10"
  185. appId = camera_query.app_key
  186. appSecret = camera_query.app_secret
  187. controlMove(appId,appSecret,device_id,dire,channelNo)
  188. else:
  189. accessToken = camera_query.token
  190. ctrl_url = 'https://open.ys7.com/api/lapp/device/ptz/stop'
  191. data = {'accessToken':accessToken, 'deviceSerial':device_id, 'channelNo':channelNo}
  192. res2 = requests.post(ctrl_url,data=data)
  193. return True