欢迎使用JTT808解析服务器
简单介绍JTT808原理及使用方式:
- 配置要求
- 工作原理
- 使用教程
- 共同开发
- 代码托管
目录
运行环境配置
1 创建虚拟运行环境
pip install virtualenv
mkdir jtt808
cd jtt808
virtualenv .
source ./bin/activate
2 安装必要python库
pip install tongue
pip install sqlalchemy
pip install mysql-python
3 建立开发目录
用于存放开发源代码
mkdir src
cd src
4 各个python包的简单概述
app
这里是你可以扩展的部分,你需要做的通常只是继承父类,然后重载一些属性,即可以解析大部分协议。这里还是你编写ORM模型的地方,你可以选择保存那些数据到你的数据库里。conf
这里只是简单配置,包含了协议配置。和服务器运行相关参数配置,例如数据库的名字及密码等。还有你需要监听的端口等~core
这是整个框架解析的核心,包含了一个强大的基类,如果你没有理解透这里代码运行的原理。不推荐轻易修改!docs
这个部分,目前尚未编写文档,目前只是预留。process_signal
信号处理部分,为了与终端实时交换。我们可以在没有完全编写完整个终端设备管理系统的情景下,通过命令的方式与终端设备交换。例如,你可以按下CTRL+Z即可以进入交互模式。交互模式相对比较人性化,通常你只需输入选项前的数字即代表你的命令,系统内部会产生应答数据回复终端。你完全可以在这里查询终端的设备信息。不过,你需要记住一点,这个调试模式运行时会阻塞所有当前事务。receiver
这里是数据的入口部分,也是决定服务器吞吐量的关口,目前设计了两种实现方案,一种是早期的suck_block_mode方式,这种方式主要是简单易于实现,不支持同时连接两个客户端,因此,其主要用于调试。第二种为suck_asyn_mode方式。这种方式能够同时支持多个连接,居然并发的能力!shortcuts
这里包含了自动回复终端设备的模板机制,相当于打包数据。注意,其内部会调用tongue.Code对打包好的数据进行编码,然后发送产生的二进制数据到终端设备。simulate
目前还未开发,主要用于模拟终端设备的运行。方便开发高并发的调试。utils
提供了多种函数,用于计算数据的完整性,加密性以及产生鉴权码等等。visual
终端视觉部分,主要提供各种不同颜色的提示方式,以区别不同数据以及错误提示等等。
服务器配置
1 服务器监听IP及端口配置
你可以在这里配置你接收数据的IP及端口号,还可以在这里配置你的数据库,等等!
cd jtt808/conf/
vim settings.py
配置好,就让咱们运行吧!
python suck_block_mode.py
2 解析的协议配置
这里是定义你需要解析的协议
vim /conf/protocols.py
例如,当我们使用的是JTT808-2013版的协议时,我们的协议定义如下表:
则我们在配置协议时可以这样配置,如下所示:
MSG_ID_ORIGINAL = pattern(
('0x0100', 'ter_reg_req'),
('0x8100', 'ser_reg_rsp'),
('0x0102', 'ter_aut_req'),
('0x8001', 'ser_com_rsp'),
('0x0200', 'position'),
('0x8104', 'get_ter_info'),
('0x0104', 'get_ter_info_rsp'),
('0x8107', 'get_ter_attr'),
('0x0107', 'get_ter_attr_rsp')
)
简单使用教程
假设我们需要查询我们终端属性
查表得知
消息ID: 0x8107
查询终端属性消息体为空
1 配置查询终端属性协议
vim /conf/protocols.py
添加如下
MSG_ID_ORIGINAL = pattern(
# Rest of Code ...
('0x8107', 'get_ter_attr'),
)
2 配置终端属性应答
我们下发终端查询属性的指令后,终端设备会回复我们,所以我们需要识别这个消息。因此我们接下来是配置这个终端属性应答。
MSG_ID_ORIGINAL = pattern(
# Rest of Code ...
('0x8107', 'get_ter_attr'),
('0x0107', 'get_ter_attr_rsp')
)
3 编写我们的视图函数
vim /app/views.py
添加代码如下:
def get_ter_attr(terminal_request):
template = 'get_ter_attr|sys_fixed_msg_attr2|client_dev_id|sys_product|'
return render(terminal_request, template)
详解所有名词
get_ter_attr
当然就是函数名了,你也可取其他名字,不过最好遵python命名规则。terminal_request
是一个字典,它包含了终端的所有当前上传的信息。例如template里面的client_dev_id就是我们从客户上传上来的数据中获得的。template
定义一个安装管道分割的字符串,你可以发现,它包含了 很容易理解的名字。这些都是为了让系统去查询相关的字典获取到数据后,组合起来。get_ter_attr
还记得吧!我们自己定义的get_ter_attr消息id它对应的就是0x8107sys_fixed_msg_attr2
这个是系统已经定义好的,其实你也可以自己定义。这个只是为了调试。它的意思是固定的系统消息属性。因为查询终端属性这条指令的消息体是空的,所以我们会看到(conf/protocols.py)里面定义的sys_fixed_msg_attr2为(0,0)所以协议中定义如下:
SYSTEM_CMD = pattern(
# Rest of C