send_control.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. import requests
  2. import json
  3. from requests.auth import HTTPBasicAuth
  4. from smartfarming.api.views.forecast.all_dict import insect_dict,get_siminfo,get_simsinfo
  5. from kedong.decoration import kedong_deco, PortError
  6. from smartfarming.models.device import MongoDeviceConfig, MongoDevice
  7. @kedong_deco(login_required=True)
  8. def device_control_info(request):
  9. """
  10. 设备控制信息/ 设备操作当前状态
  11. 参数:
  12. d_id 必传 设备自增id
  13. cmd 必传 netconf/paramconf/config/。。。用来标记获取什么类型的配置信息
  14. """
  15. post_info = request.POST
  16. d_id = post_info.get("d_id", '')
  17. cmd = post_info.get("cmd", '')
  18. if not cmd:
  19. raise PortError('cmd',"参数缺失")
  20. if not d_id:
  21. raise PortError('d_id', "参数缺失")
  22. if MongoDeviceConfig.objects.filter(d_id=d_id,cmd=cmd).exists():
  23. d_config = MongoDeviceConfig.objects.get(d_id=d_id,cmd=cmd)
  24. try:
  25. config = json.loads(d_config.device_config)
  26. except:
  27. config = eval(d_config.device_config)
  28. if "ext" in config:
  29. d_config = config["ext"]
  30. else:
  31. d_config = config
  32. return d_config
  33. else:
  34. raise PortError(d_id, "配置未上传")
  35. @kedong_deco(login_required=True)
  36. def device_control(request):
  37. # 设备下发控制
  38. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  39. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  40. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  41. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  42. post_info = request.POST
  43. device_type_id = post_info.get("device_type_id", '')
  44. d_id = post_info.get("d_id", '')
  45. req = post_info.get("req","")
  46. work_type = post_info.get("work_type", '')
  47. device_name = post_info.get("device_name", '')
  48. if not d_id:
  49. raise PortError('d_id',"参数缺失")
  50. devices = MongoDevice.objects.all()
  51. try:
  52. device = devices.get(id=int(d_id))
  53. except:
  54. raise PortError("d_id","没有此设备")
  55. if device.device_expire == "1":
  56. raise PortError("d_id","设备已过期")
  57. if device_name:
  58. device.device_name = device_name
  59. device.save()
  60. config = post_info.get("config", '')
  61. cmd = post_info.get("cmd", '')
  62. payload = {}
  63. if work_type == "0":
  64. payload = {"cmd": "workmode", "ext": {"asleep": "1", "common": "0", "power": "0"}}
  65. elif work_type == "1":
  66. payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "1", "power": "0"}}
  67. elif work_type == "2":
  68. payload = {"cmd": "workmode", "ext": {"asleep": "0", "common": "0", "power": "1"}}
  69. if config:
  70. try:
  71. config = json.loads(config)
  72. except:
  73. raise PortError('',"参数类型错误")
  74. if not work_type:
  75. if not config:
  76. raise PortError('config', "参数缺失")
  77. payload["cmd"] = "paramconf"
  78. payload["ext"] = config
  79. if req == "ctr_clear":
  80. payload = {"cmd": "ctr_clear"}
  81. topic = ""
  82. if not device_type_id:
  83. raise PortError('device_type_id',"参数缺失")
  84. if int(device_type_id) == 3:
  85. topic = "/yfkj/cbd/sub/%s"%device.device_id
  86. elif int(device_type_id) == 2:
  87. topic = "/yfkj/scd/sub/%s"%device.device_id
  88. elif int(device_type_id) == 4:
  89. topic = "/yfkj/xycb/s2c/%s"%device.device_id
  90. elif int(device_type_id) in [5, 8]:
  91. topic = "/yfkj/qxz/sub/%s"%device.device_id
  92. timeout = config.get("timeout","")
  93. content = config.get("content","")
  94. interval = config.get("interval","")
  95. if content:
  96. payload["cmd"] = "dotled"
  97. payload["ext"] = {
  98. "content":content,
  99. "timeout":timeout,
  100. }
  101. cmds = {"topic": topic, "payload": payload, "qos": 1}
  102. content = "气象站:%s,下发:%s"
  103. if interval:
  104. payload["cmd"] = "config"
  105. payload["ext"] = {"interval":interval}
  106. cmds = {"topic": topic, "payload": payload, "qos": 1}
  107. return True
  108. elif int(device_type_id) == 7:
  109. topic = "/yfkj/bzy/s2c/%s"%device.device_id
  110. elif int(device_type_id) == 14:
  111. payload = config
  112. topic = "yfkj/color/s2c/%s"%device.device_id
  113. elif int(device_type_id) == 12:
  114. topic = "/yfkj/cbd/sub/%s"%device.device_id
  115. if cmd == "setnet":
  116. ftp = config["ftp"]
  117. mqtt = config["mqtt"]
  118. mqtt["qos"] = 0
  119. payload = {
  120. "cmd":cmd,
  121. "ftp": ftp,
  122. "mqtt": mqtt,
  123. }
  124. payload = json.dumps(payload)
  125. cmds = {"topic":topic,"payload":payload,"qos":1}
  126. content = "设备类型:%s,下发:%s"
  127. # TODO 大数据平台转发
  128. print(cmds)
  129. response_code = 200
  130. if response_code == 200:
  131. return True
  132. @kedong_deco(login_required=True)
  133. def clear_insects_permission(request):
  134. """
  135. 杀虫灯账户是否具有清虫权限
  136. """
  137. uid = request.myuser.uid
  138. data = [0, 0]
  139. return data
  140. @kedong_deco(login_required=True)
  141. def get_device_config(request):
  142. """
  143. 查询设备配置信息/设备监测最新数据 刷新按钮
  144. 参数:
  145. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,5气象站,6监控设备,7孢子仪 14色诱测报 12吸虫塔
  146. d_id 必传 设备自增id
  147. control_type 必传 操作类型 data 读取设备数据信息/serverconf 读取服务器配置信息
  148. """
  149. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  150. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  151. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  152. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  153. post_info = request.POST
  154. device_type_id = post_info.get("device_type_id", '')
  155. d_id = post_info.get("d_id", '')
  156. if not d_id:
  157. raise PortError('d_id', "参数缺失")
  158. devices = MongoDevice.objects.all()
  159. device = devices.get(id=int(d_id))
  160. myuser_type = request.user_type
  161. if not myuser_type == 1 and device.device_expire == "1":
  162. raise PortError('', "该设备已到期")
  163. control_type = post_info.get("control_type", '')
  164. if not control_type:
  165. raise PortError('control_type',"参数缺失")
  166. payload = {
  167. "cmd": "read",
  168. "ext":control_type
  169. }
  170. topic = ""
  171. if not device_type_id:
  172. raise PortError('device_type_id', "参数缺失")
  173. if int(device_type_id) == 3 or int(device_type_id) == 12:
  174. topic = "/yfkj/cbd/sub/%s" % device.device_id
  175. elif int(device_type_id) == 2:
  176. topic = "/yfkj/scd/sub/%s" % device.device_id
  177. elif int(device_type_id) == 4:
  178. topic = "/yfkj/xycb/s2c/%s" % device.device_id
  179. elif int(device_type_id) == 5:
  180. topic = "/yfkj/qxz/sub/%s" % device.device_id
  181. payload = {
  182. "cmd": "read",
  183. "ext": {"type": control_type}
  184. }
  185. elif int(device_type_id) == 7:
  186. topic = "/yfkj/bzy/s2c/%s" % device.device_id
  187. elif int(device_type_id) == 9:
  188. topic = "/yfkj/tccbd/sub/%s" % device.device_id
  189. elif int(device_type_id) == 14:
  190. topic = "yfkj/color/s2c/%s" % device.device_id
  191. payload = {"cmd":"read","ext":"data"}
  192. elif int(device_type_id) == 8:
  193. topic = "/yfkj/xyv3/s2c/%s" % device.device_id
  194. # TODO 暂时处理调用http接口
  195. code = 200
  196. if code == 200:
  197. return True
  198. else:
  199. return False
  200. @kedong_deco(login_required=True)
  201. def admin_device_control(request):
  202. """
  203. 单个按钮管理员操作 设备控制
  204. 参数:
  205. device_type_id 必传 设备类型 2杀虫灯,3测报灯,4智能性诱,5气象站,6监控设备,7孢子仪, 9糖醋测报灯 14色诱测报灯 8性诱3.0 12吸虫塔
  206. d_id 必传 设备自增id
  207. cmd 必传 设备控制参数 poweroff关机
  208. poweron开机
  209. reboot重启
  210. update升级
  211. coldoff制冷关闭
  212. coldon制冷开启
  213. takephoto拍照
  214. autotakephoto 对焦拍照
  215. boot1 屏幕禁用
  216. boot0 屏幕取消禁用
  217. turnset 设置定时卷粘虫板时间
  218. turn 卷粘虫带/转仓
  219. photoset 拍照时刻
  220. repower 重新上电
  221. data 数据上传
  222. mqttconf mqtt网络配置
  223. close_shake 关闭震动
  224. open_shake 开启震动
  225. clearworm 清网
  226. dtu_reboot 重启
  227. dtu_update 升级
  228. test 杀虫灯一键测试
  229. big_data 平台转换到大数据平台
  230. yfwlw 平台转发到四情平台
  231. location 手动定位,传lat、lng 参数
  232. imei 修改设备号, 传 imei 参数设备号
  233. photo_num 拍照数量 传num 参数 拍照数
  234. parm 非必传 当某些控制操作需要参数限制的时候 必传 (比如设置定时时间10分钟 传 10)
  235. """
  236. #测报灯 下发主题 /yfkj/cbd/sub/+imei
  237. #杀虫灯 下发主题 /yfkj/scd/sub/+imei
  238. #性诱设备 下发主题 yfkj/xycb/s2c/+imei
  239. #孢子仪 下发主题 /yfkj/bzy/s2c/+imei
  240. #气象站 下发主题 /yfkj/qxz/sub/+imei
  241. #性诱测报 下发主题 yfkj/color/s2c
  242. post_info = request.POST
  243. cmd = post_info.get("cmd", '')
  244. if not cmd:
  245. raise PortError('cmd', "参数缺失")
  246. device_type_id = post_info.get("device_type_id", '')
  247. parm = post_info.get('parm', "")
  248. d_id = post_info.get("d_id", '')
  249. if not d_id:
  250. raise PortError('d_id',"参数缺失")
  251. devices = MongoDevice.objects.all()
  252. device_id = devices.get(id=int(d_id)).device_id
  253. payload = ""
  254. topic = ""
  255. if not device_type_id:
  256. raise PortError('device_type_id',"参数缺失")
  257. if int(device_type_id) == 3 or int(device_type_id) == 12:
  258. topic = "/yfkj/cbd/sub/%s"%device_id
  259. payload = {"cmd": cmd}
  260. if cmd == "boot1":
  261. payload = {"cmd":"switch","ext":{"boot":1}}
  262. elif cmd == "boot0":
  263. payload = {"cmd":"switch","ext":{"boot":0}}
  264. elif cmd == "close_shake":
  265. payload = {"cmd": "shake", "ext":{"ws":0}}
  266. elif cmd == "open_shake":
  267. payload = {"cmd": "shake", "ext":{"ws":1}}
  268. elif cmd == "yfwlw":
  269. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  270. elif cmd =="imei":
  271. # 修改imei
  272. imei = post_info.get("imei", '')
  273. payload = {"cmd":"setimei","ext":{"imei":imei}}
  274. elif int(device_type_id) == 2:
  275. topic = "/yfkj/scd/sub/%s" % device_id
  276. if cmd == "clear":
  277. if not parm:
  278. raise PortError('parm',"参数缺失")
  279. payload = {"cmd":"clear","ext":{ "clt":int(parm)}}
  280. elif cmd == "test":
  281. payload = {"cmd":"test"}
  282. elif cmd == "yfwlw": # 平台切换
  283. payload ={"cmd":"paramconf","ext":{"type": "120.27.222.26"}}
  284. elif cmd == "paramconf1": # 标配物联网
  285. payload = {"cmd":"paramconf","ext":{"vt": "uart"}}
  286. elif cmd == "paramconf2": # 物联网自清虫
  287. payload = {"cmd":"paramconf","ext":{"vt": "uart-ZQC"}}
  288. elif cmd == "paramconf3": # 物联网光控
  289. payload = {"cmd":"paramconf","ext":{"vt": "uart-light"}}
  290. elif cmd == "paramconf4": # 物联网光控自清虫
  291. payload = {"cmd":"paramconf","ext":{"vt": "uart-light-ZQC"}}
  292. else:
  293. payload = {"cmd": cmd}
  294. elif int(device_type_id) == 4:
  295. topic = "/yfkj/xycb/s2c/%s" % device_id
  296. payload = {"cmd": cmd}
  297. if cmd == "turnset":
  298. if not parm:
  299. raise PortError('parm',"参数缺失")
  300. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  301. elif cmd == "turn":
  302. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  303. elif cmd == "photoset":
  304. if not parm:
  305. raise PortError('parm', "参数缺失")
  306. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  307. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  308. elif cmd == "repower":
  309. payload = {"cmd": "repower","ext":""}
  310. elif cmd == "yfwlw":
  311. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  312. elif int(device_type_id) == 8:
  313. topic = "/yfkj/xyv3/s2c/%s" % device_id
  314. payload = {"cmd": cmd}
  315. if cmd == "turnset":
  316. if not parm:
  317. raise PortError('parm',"参数缺失")
  318. payload = {"cmd": "set", "ext": {"type": "turn", "turn_t": parm}}
  319. elif cmd == "turn":
  320. payload = {"cmd": "ctrl", "ext": {"turn": "1"}}
  321. elif cmd == "photoset":
  322. if not parm:
  323. raise PortError('parm', "参数缺失")
  324. pic_t,pic_f = str(parm).split('|') # pic_t定时拍照时刻 "pic_f"定时拍照时间间隔
  325. payload = {"cmd": "set", "ext": {"type": "photo", "pic_t": pic_t, "pic_f": pic_f}}
  326. elif cmd == "repower":
  327. payload = {"cmd": "repower","ext":""}
  328. elif int(device_type_id) == 5:
  329. topic = "/yfkj/qxz/sub/%s" % device_id
  330. payload = {
  331. "cmd": cmd
  332. }
  333. elif int(device_type_id) == 7:
  334. lists = ["update","reboot","poweroff","poweron","coldoff","coldon","dtu_update","dtu_reboot"]
  335. payload = {"cmd": cmd}
  336. if cmd == "takephoto":
  337. payload = {"cmd": "ctrl", "ext": {"type": "takephoto"}}
  338. elif cmd in lists:
  339. payload = {"cmd":cmd}
  340. elif cmd == "autotakephoto":
  341. payload = {"ext":{"type":"auto_takephoto"},"cmd":"ctrl"}
  342. elif cmd == "turn":
  343. payload = {"ext":{"type":"turn"},"cmd":"ctrl"}
  344. elif cmd == "big_data":
  345. # 大数据平台:
  346. payload ={"cmd": "platform", "ext": {"type": "8.136.98.49"}}
  347. elif cmd == "yfwlw":
  348. payload ={"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  349. elif cmd == "location":
  350. #设置手动定位
  351. lat = post_info.get("lat", '')
  352. lng = post_info.get("lng", '')
  353. payload ={"cmd":"location", "ext":{"lat":lat,"lng":lng,"type":0}}
  354. elif cmd == "imei":
  355. # 修改设备ID:
  356. imei = post_info.get("imei", '')
  357. payload = {"cmd":"setimei","ext":{"imei":imei}}
  358. elif cmd == "photo_num":
  359. num = int(post_info.get("num", ''))
  360. payload = {"cmd":"warn","ext":{"status":num,"type":"get_photo_step"}}
  361. topic = "/yfkj/bzy/s2c/%s" % device_id
  362. elif int(device_type_id) == 9:
  363. topic = "/yfkj/tccbd/sub/%s" % device_id
  364. if cmd == "takephoto":
  365. payload = {"ext": {"type": "takephoto"}, "cmd": "ctrl"}
  366. elif cmd == "reboot":
  367. payload = {"cmd":"reboot","ext":""}
  368. elif cmd == "update":
  369. payload = {"cmd":"update","ext":""}
  370. elif cmd == "status":
  371. payload = {"cmd": "read", "ext": {"type": "status"}}
  372. elif cmd == "paramconf":
  373. payload = {"cmd": "read", "ext": {"type": "paramconf"}}
  374. elif cmd == "boot1":
  375. payload = {"cmd": "paramconf","ext": {"st": 20,"et": 5,"collt": 10,"htim": 0,"datt": 20,"pump_sec": 20,"shake_sec": 20,"boot": 1}}
  376. elif int(device_type_id) == 14:
  377. topic = "yfkj/color/s2c/%s" % device_id
  378. if cmd == "update":
  379. payload = {"cmd": "dtu_update"}
  380. elif cmd == "reboot":
  381. payload = {"cmd": "dtu_reboot"}
  382. elif cmd =="takephoto":
  383. payload = {"cmd":"rtu_takephoto"}
  384. payload = json.dumps(payload)
  385. data = {"topic":topic,"payload":payload,"qos":1}
  386. # TODO 调用大数据平台接口
  387. response_code = 200
  388. if response_code == 200:
  389. return True
  390. else:
  391. return False
  392. def tccbd_device_control(request):
  393. """
  394. 糖醋测报单个按钮操作/设备设置
  395. 参数:
  396. device_type_id 必传 设备类型 9 糖醋测报灯
  397. d_id 必传 设备自增id
  398. cmd 必传 设备控制参数 reboot重启
  399. update升级
  400. takephoto拍照
  401. boot1 屏幕禁用
  402. status 查询最新状态
  403. paramconf 查询配置信息
  404. set 下发设置所需参数
  405. st 定时开始时间
  406. et 定时结束时间
  407. collt 收集时间
  408. htim 糖醋液发挥时间
  409. datt 数据上传时间间隔
  410. pump_sec 水泵打开时间
  411. shake_sec 电磁阀打开时间
  412. jp 加液排水时间
  413. """
  414. post_info = request.POST
  415. device_type_id = post_info.get("device_type_id", '')
  416. d_id = post_info.get("d_id", '')
  417. cmd = post_info.get("cmd", '')
  418. devices = Device.objects.all()
  419. device_id = devices.get(id=int(d_id)).device_id
  420. if not cmd:
  421. raise PortError('cmd', "参数缺失")
  422. if int(device_type_id) == 9:
  423. if cmd == "takephoto":
  424. payload = {"ext": {"type": "takephoto"}, "cmd": "ctrl"}
  425. elif cmd == "reboot":
  426. payload = {"cmd":"reboot","ext":""}
  427. elif cmd == "update":
  428. payload = {"cmd":"update","ext":""}
  429. elif cmd == "status":
  430. payload = {"cmd": "read", "ext": {"type": "status"}}
  431. elif cmd == "paramconf":
  432. payload = {"cmd": "read", "ext": {"type": "paramconf"}}
  433. elif cmd == "boot1":
  434. payload = {"cmd": "paramconf","ext": {"st": 20,"et": 5,"collt": 10,"htim": 0,"datt": 20,"pump_sec": 20,"shake_sec": 20,"boot": 1}}
  435. elif cmd == "set":
  436. st = post_info.get('st') #定时开始时间
  437. et = post_info.get('et')#定时结束时间
  438. collt = post_info.get('collt') #收集时间
  439. htim = post_info.get('htim') #糖醋液发挥时间
  440. datt = post_info.get('datt') #数据上传时间间隔
  441. pump_sec = post_info.get('pump_sec') #pump_sec水泵打开时间
  442. shake_sec = post_info.get('shake_sec') #电磁阀打开时间
  443. jp = post_info.get("jp") # 加液排水时间
  444. payload = {"cmd": "paramconf","ext": {"st": int(st),"et": int(et),"collt": int(collt),"htim": int(htim),"datt": int(datt),"pump_sec": int(pump_sec),"shake_sec": int(shake_sec),"jp":int(jp),"boot": 0}}
  445. topic = "/yfkj/tccbd/sub/%s" % device_id
  446. payload = json.dumps(payload)
  447. data = {"topic":topic,"payload":payload,"qos":1}
  448. res = requests.post("%s" % config_dict['mqtt_config']["http"], json=data,
  449. auth=HTTPBasicAuth(config_dict['mqtt_config']["user"], config_dict['mqtt_config']["secret_key"]))
  450. if res.status_code == 200:
  451. return True
  452. else:
  453. raise PortError('cmd', "设备类型错误")
  454. def device_sim(request):
  455. """
  456. 设备查询sim卡接口
  457. d_id 必传 设备自增id
  458. iccid 非必传 用户填写的iccid
  459. type 必传 sim卡类型 sim hksim 海康sim change修改 iccid
  460. """
  461. post_info = request.POST
  462. _device_id = post_info.get("d_id")
  463. iccid = post_info.get("iccid")
  464. types = post_info.get("type")
  465. if not _device_id:
  466. raise PortError('d_id', "未传设备id")
  467. if iccid and not iccid.isalnum():
  468. # if not iccid.isalnum():
  469. raise PortError('iccid', "不能输入特殊字符")
  470. data = []
  471. try:
  472. device = Device.objects.get(id=_device_id)
  473. except:
  474. raise PortError('d_id', "没有该设备")
  475. if types == "hksim":
  476. data.append({"iccid":device.simid})
  477. elif types == "sim":
  478. if device.device_type_id == 7:
  479. models = BZYData
  480. elif device.device_type_id == 4:
  481. models = XYCBData
  482. elif device.device_type_id == 2:
  483. models = SCDData
  484. elif device.device_type_id == 3:
  485. models = CBDData
  486. elif device.device_type_id == 8:
  487. models = XYThreeData
  488. elif device.device_type_id == 14:
  489. models = SYCBData
  490. elif device.device_type_id == 12:
  491. models = XCTData
  492. else:
  493. raise PortError('d_id', "暂无该设备类型")
  494. # if device.device_type_id == 12:
  495. # models = XCTData
  496. decic = models.objects.filter(device_id=_device_id).order_by('-id')[:1]
  497. # decic = DeviceData.objects.filter(device_id=_device_id).order_by('-addtime')[:1]
  498. for i in decic:
  499. try:
  500. iccid = eval(i.device_data)["iccid"]
  501. except:
  502. iccid = ""
  503. data.append({"iccid":iccid})
  504. elif types == "change":
  505. device.simid = iccid
  506. device.save()
  507. data.append({"iccid":iccid})
  508. else:
  509. raise PortError('d_id', "参数有误")
  510. return data