通过给车辆安装gps定位器,实现车辆的监控管理

软件架构
软件架构说明 主要框架 python: django twisted 数据库:postgresql 前端:layui 进程守护:supervisor web服务器:nginx 中间件:redis

安装和使用教程
web服务器: 1、postgresql数据库新建 car 数据库,也可自行修改setting里面的数据库配置 2、运行python manage.py runserver 有缺少的库,自行安装下。

数据处理模块: data_handle文件夹 1、receive_serv.py,数据接收,并解析,解析出来时候放入redis,设备的监听是10808,默认协议是jt808部标通讯协议,目前也只解析了定位和一些基本参数。 2、store_serv.py,从redis接受解析好的数据,进行状态计算(超速报警,围栏报警等)和存储。



完整程序代码下载地址:python车辆定位调度管理系统
receive_serv.py

#! /usr/bin/python#-*- coding: UTF-8 -*-
# 三基类协议手环手表产品接收模块,
# 在analysis中引入redis,目前主要处理需要分包处理的数据
# Python代码大全,2022.7.1
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.threads import deferToThread
import time
import datetime
import redis
import re
import sys,os
import timeempty_table={'lbs': '0', 'mileage': '0', 'speed': '0', 'othermesg':{}, 'wifi': '0', 'oil_use': '0', 'dirct': '0', 'scanner': '0', 'rssi': '0', 'efence_alarm': '0', 'status': '0', 'remark': '0', 'heart_rate': '0', 'speed_alarm': '0', 'battery': '0', 'blood_pres': '0', 'stop_time': '0','sos_alarm': '0', 'step_count': '0', 'heart_alarm': '0', 'device_id':'0', 'dev_upload': '0', 'obd': '0', 'blood_alarm': '0', 'lng': '0', 'serv_receive': '0', 'track_type': '0', 'location': '0', 'lat': '0', 'hard_verson': '0'}pool_redis= redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)
mesg_redis=redis.Redis(connection_pool=pool_redis)def log_write(data):#日志log存储with open('sys_log/import_analysis_log','a') as f:f.write(data)f.write('&&')
#自动加载command文件夹里面的所有command命令文档,存储为字典{厂家型号:命令函数()},
#例如{'vk':lambda device_id,kind,param,model:vk_command(device_id,kind,param,model)}
analysis={}
first_handle={}
def impfile(filename):filelist,*_ = os.walk(filename,topdown=True)*_,filenames = filelistfor i in filenames:print(i)if i[-3:] == '.py' and i != '__init__.py':try:device_model=re.search(r'(?P<model>\w*)_',i).group('model')exc = 'from '+ filename+'.'+i[:-3] + ' import '+ '*'exec(exc,globals())print(i[:-3])# analysis[device_model]=lambda datas:eval(i[:-3])(datas)#本地可运行,服务器不可analysis[device_model]=i[:-3]first_handle[device_model]=device_model+'_first_handle'except Exception as e:analysis_log=str([i,e,datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')])log_write(analysis_log)#命令函数目录名
impfile('analysis')
print('analysis',analysis)
print('first_handle',first_handle)port_and_model={10712:'wz808',10808:'rby808',10809:'jt808'}
# port_and_model={23333:'jt808'}class Iot_Pro(Protocol):def __init__(self,tml_id,data_buffer,separate_package):self.tml_id=tml_idself.data_buffer=data_bufferself.separate_package=separate_packagedef connectionMade(self):print("new connect:",str(self.transport.client))param=mesg_redis.rpop('car_set_param')print('command_param==>',param)if param!=None:param=eval(param)self.handle_command(param)def connectionLost(self, reason):client_num=str(self.transport.client)if client_num in self.tml_id:print('lost connected...:',self.tml_id[client_num])offline_data={'device_id':self.tml_id[client_num],'othermesg':str({'on_off_line':'offline'}),'serv_receive':datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}save_talbe=empty_table.copy()save_talbe.update(offline_data)del self.tml_id[self.tml_id[client_num]]del self.tml_id[client_num]mesg_redis.rpush('car_gps_data',str(save_talbe))# print(empty_table)if client_num in self.data_buffer:del self.data_buffer[client_num]def dataReceived(self,origin_data):#接收数据,并进行初步处理,判断数据的完整性,完整的数据异步分发到下一步的处理模块,根据协议进行解析,不完整的数据,放到相应的缓冲地带protocol_num=self.transport.socket.getsockname()[1]print('org_data==>',origin_data)first_result=eval(first_handle[port_and_model[protocol_num]]+'(origin_data)')# print('first_result',first_result)if 'normal_data' in first_result:first_result=first_result['normal_data']for f_result in first_result:deferToThread(self.handle_data,f_result).addCallback(self.write_response)elif first_result=='buffer_data':buffer_id=self.transport.client# print('buffer_id',buffer_id)# print('self.data_buffer',self.data_buffer)if buffer_id in self.data_buffer:if self.data_buffer[buffer_id]==b'':self.data_buffer[buffer_id]=origin_dataelse:self.data_buffer[buffer_id]+=origin_datadata=self.data_buffer[buffer_id]buffer_result=eval(first_handle[port_and_model[protocol_num]]+'(data)')# print('buffer_result',buffer_result)if 'normal_data' in buffer_result:self.data_buffer[buffer_id]=b''for f_result in buffer_result['normal_data']:deferToThread(self.handle_data,f_result).addCallback(self.write_response)# 缓冲超过一定的数量,清零处理elif len(data)>12800000:self.data_buffer[buffer_id]=b''else:print('buffer_data_add')self.data_buffer[buffer_id]=origin_datadef handle_data(self, data):#对数据包进行二次处理,主要是第完整的数据包根据设备的协议进行解析,获得设备上传的主要数据protocol_num=self.transport.socket.getsockname()[1]client_num=str(self.transport.client)receive_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')d_done=''dev_id=self.tml_id.get(client_num)d_done=eval(analysis[port_and_model[protocol_num]]+'(data,receive_time,protocol_num,mesg_redis,dev_id)')if 'device_id' in d_done:self.tml_id[client_num]=d_done['device_id']self.tml_id[d_done['device_id']]=selfelse:d_done['device_id']=self.tml_id[client_num]print('d_done==>',d_done)response=d_done.pop('response')save_kind=d_done.pop('save_kind')if save_kind=='yes':print('send_data_to_redis')mesg_redis.rpush('car_gps_data',str(d_done))# print('serv_receive',d_done['serv_receive'])result={'device_id':d_done['device_id'],'response':response}#执行缓存命令,需要用到设备编号return resultdef write_response(self, result):#数据包的处理结果,并返回数据给客户端print("data_resule_:",result)response=result['response']device_id=result['device_id']if response!=b'0':self.transport.write(response)cache_command=mesg_redis.rpop(device_id+'cache_command')if cache_command!=None:cache_command=eval(cache_command)self.handle_command(cache_command)def handle_command(self,param):# 获取该设备的命令执行状态,正在执行命令的情况下,本次的命令转为缓存,等下次设备收到信息再执行device_id=param['device_id']command_excuting= mesg_redis.get(device_id+'command_excuting')# 设备在线,且没有执行其他命令的情况下,执行本次命令,否则缓存该命令,等下次设备收到信息再执行if device_id in self.tml_id and command_excuting==None:mesg_redis.set(device_id+'command_excuting','yes',ex=60)set_result=b'set_param,ok!'send_data=param['param']# 针对设备的数据包是分包发送的情况,分包好的数据整体推送到redis,执行的时候按顺序取下来发送给设备。if isinstance(send_data,dict):if send_data.get('voice_dict')!=None:mesg_redis.set(device_id+'voice_dict',str(send_data['voice_dict']),ex=60)# 发送分包数据的首包send_data=send_data['command']else:set_result=b'voice_rececving'if set_result==b'set_param,ok!':self.tml_id[device_id].transport.write(send_data)command_detail=param['command_detail']command_name=param['command_name']# 把命令执行表推送到redis,设备执行完毕的是,在analysis模块取下来更新执行结果mesg_redis.set(device_id+command_name,str(command_detail),ex=60)# 回复命令的下发情况self.transport.write(set_result)print('set_result====>',set_result)else:# 设备不在线的情况下,缓存命令,等上线再执行mesg_redis.lpush(device_id+'cache_command',str(param))self.transport.write(b'mission cache!')class Iot_Fact(Factory):def __init__(self):self.tml_id = {}self.data_buffer = {}self.separate_package={}def buildProtocol(self, addr):return Iot_Pro(self.tml_id,self.data_buffer,self.separate_package)   for port in port_and_model:reactor.listenTCP(port,Iot_Fact())   reactor.run()

完整程序代码下载地址:python车辆定位调度管理系统

python车辆定位调度管理系统,基于django+twisted相关推荐

  1. python做数据库管理系统_python+Django+mysql+bootstrap前端,数据库一次搞定)从头教你毕设实现一个简易好看的仓储物资管理之类系统...

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 废话不多说,这是产品接口,一篇文章澄清了Django的前端背景并实现了一个漂亮的系统,git直接拉到末尾^ _ ^ ...

  2. 电影推荐系统 python简书_基于django和协同过滤/cnn的电影推荐系统

    技术前端: bootstrap3 + vue + jquery 后端: django 2.2.1 +djangorestframework (MVC框架) 数据库: mysql 数据集: 1. 豆瓣数 ...

  3. python登录验证码(基于django框架)

    1. 前端页面(引入jquery与bootstrap.css) <div class="container"><div class="row" ...

  4. echarts python源码_基于Django快速集成Echarts代码示例

    1.在线定制下载echarts 2.创建一个django项目或者在已有的项目 配置文件中确保数据库配置.static配置.与添加项目名到INSTALLED_APPS下. 配置静态文件目录static, ...

  5. 4款基于Django框架的开源软件推荐

    Django是一款高性能的Python web框架,鼓励快速开发和干净.务实的设计.Django项目是一个定制框架,它源自一个在线新闻Web站点,于2005年以开源的形式被释放出来.Django的重点 ...

  6. 手把手教你:基于Django的用户画像可视化系统

    系列文章 第九章.手把手教你:个人信贷违约预测模型 第八章.手把手教你:基于LSTM的股票预测系统 第七章.手把手教你:基于深度残差网络(ResNet)的水果分类识别系统 目录 系列文章 一.项目简介 ...

  7. python管理系统设计_基于Python和Django框架的物联网智能设备管理系统的设计与实现

    杨武帅 万启元 桑贤伯 摘 要:针对目前日益增多的智能设备提出了兼容性好,稳定性高,易于管理的管理系统的设计方法.在服务器端使用Python和Django框架进行与设备的数据交互及设备管理网站的构架, ...

  8. 基于 Python 的开源Web开发框架django/哈工大学生成绩管理系统html实现/python结课大作业

    python结课大作业 (一)django安装 (1)django是什么 (2)基于django的网站 (3)django的设计理念 (4)django安装 (二)数据库安装 (1)数据库(DataB ...

  9. python基于django药房药品销售进销存管理系统

    药房药品管理系统能够通过互联网得到广泛的.全面的宣传,让尽可能多的用户了解和熟知药房药品管理系统的便捷高效,不仅为顾客提供了服务,而且也推广了自己,让更多的用户了解自己.对于药房而言,若拥有自己的系统 ...

最新文章

  1. struts学习笔记三-国际化
  2. ssl握手过程和ca证书验证
  3. 雍正继承帝位,给职场中的我们的启示 --- 我看电视剧《雍正王朝》
  4. 利用Oracle虚拟私有数据库进行整合
  5. java接口作用和好处,持续更新大厂面试笔试题
  6. 百度陆奇最新内部演讲:如何成为一个优秀的工程师?
  7. be2014备份oracle,veritas be 对oracle10g 备份异机恢复测试
  8. linux shell删除所有文件夹下指定扩展名(关键字)的所有文件
  9. 软件开发需要学好数学吗?
  10. HDU2025 查找最大元素【入门】
  11. 08-05-09pe_xscan 增加IE版本检测
  12. 华为LTC/IPD/ITR三大核心流程变革看一篇文章就全明白啦!
  13. 遇到问题---hosts不起作用问题的解决方法
  14. 11种方法检测软件可靠性
  15. HTAP的下一步?SoTP初探(上):从“大”数据到“小”而“宽”数据
  16. 注册icloud邮箱
  17. 李笑来《自学是门手艺》
  18. 学计算机的女生容易脱单,最容易让男生脱单的5个大学专业,特别是第3个,女生会倒追你!...
  19. MATLAB 级数计算
  20. 《小王爱迁移》文章链接

热门文章

  1. python好学吗 老程序员-学习python,难道是为了当一名苦逼的程序员吗?
  2. 学会php想转学java好学吗_Java和PHP哪个好学
  3. jqueryppt_jQuery幻灯片
  4. word中去除页眉中的横线
  5. swoole的初步学习
  6. adprw指令教程_三菱FX3U从入门到精通(全套)
  7. 修改Cisco交换机ntp服务器,Cisco交换机时间服务(NTP)的设置步驟
  8. tiny linux u盘_多系统U盘启动盘制作工具(YUMI)下载-多系统U盘启动盘制作工具(YUMI)PC版下载v2.0.7.6...
  9. linux执行sudo报错【/etc/sudo.conf is owned by uid 994, should be 0】
  10. 中国大学慕课公开课-《视听语言》-学习笔记-2