监测数据采集物联网应用解决方案
本方案主要应用于数据采集、传输、及平台展示一体化解决方案中软件技术框架部分。本方案软件技术框架具有以下特点:开发时间短、效率高、兼容性强、部署简单。本方案软件技术框架涉及两大部分:平台接收及数据展示和物联网设备数据采集端;
平台端开发:java+mysql
设备端开发:python3.6+sqlite3
技术联系方式:QQ(591033633)
微信(15858293899)
目录
1. 前言描述 3
2. 技术方案总体架构 4
3. 平台接收及数据展示 5
3.1. 技术特点 6
3.2. 接口定义步骤流程图 8
3.3. 代码调用案例 11
3.3.1. 用户登录接口 11
3.3.2. 获取用户信息 13
3.4. 接口展示界面 14
3.4.1. 登陆及首页 14
3.4.2. 数据源配置 15
3.4.3. 接口名称 18
3.4.4. 输入参数 23
3.4.5. 输出参数 25
3.4.6. 返回值 25
3.4.7. 应用平台信息 27
3.4.8. 应用平台授权 28
3.4.9. 平台用户信息 29
3.4.10. 平台用户授权 31
3.4.11. APP应用模板 32
3.4.12. APP应用模板明细 34
3.4.13. 系统参数配置 35
3.4.14. TCP长连接socket通讯模式 36
3.4.15. 延时数据请求模式 37
3.5. 错误信息 39
3.6. 压力测试报告 42
3.6.1、 测试报告一 42
3.6.2、 测试报告二 43
3.7. 业务展示web应用案例 44
4. 物联网设备数据采集 47
4.1. 技术特点 47
4.2. 运行环境 49
4.3. 设计说明 49
本方案主要应用于数据采集、传输、及平台展示一体化解决方案中软件技术框架部分。本方案软件技术框架具有以下特点:开发时间短、效率高、兼容性强、部署简单。
本方案软件技术框架涉及两大部分:平台接收及数据展示和物联网设备数据采集端;
2.技术方案总体架构
3.平台接收及数据展示
本平台技术框架作为关系型数据库接口配置管理系统,可通过图形化界面配置各类数据接口,无需编写任何后台java或.net代码,实现可视化配置即结果模式,易于扩展;可将程序开发人员的重复接口定义工作从繁琐的重复性后台代码中解脱出来,让程序开发人员更专注于数据业务的分析和理解。使用该系统人员需要对数据库具有一定应用基础知识,熟练掌握各类数据库SQL语句及存储过程编写能力。
该系统程序部署简单,分为轻量级应用部署和重量级应用部署;
轻量级应用部署:
程序简小,不包含jar包,程序文件大小约为 30M
CenterDataRunNode_lib 支持java程序运行的jar包
Chrome 免安装版google浏览器
jre7_32 免安装版jre7(32位)
web、center_data、CenterDataRunNode.jar、dbconfig.properties 为程序文件
windows操作系统服务器程序运行:双击run_jar.bat
linux操作系统服务器命令运行:
java -jar CenterDataRunNode.jar &
程序运行界面:
重量级应用部署:
部署于tomcat下运行;
3.1技术特点
1)支持多数据源(最多9个)数据库接入;(sql server2005及以上版本、Oracle10g及以上版本、MYSQL5.0及以上版本、Sqlite桌面型数据库、Access桌面型数据库);
2)数据接口定义完全图形化操作,无需编写任何开发代码;便于后期无限接口业务扩展;
3)接口数据调用权限化管理,包含接口调用期限,次数限值,IP绑定等接口权限管理功能;
4) 支持前端Javascript跨域获取数据操作,支持java、C#等主流开发语言后端获取数据或传递数据模式;
5)调用方式为web page(get、post均支持)方式,返回结果以json数据格式展示,支持基于html5的前端展示系统的数据接入;特殊字段采用url编码格式进行特殊字符编码转义处理;
6) 支持双权限认证模式(sub_code和sub_usercode);
7)用户接口时效性认证;
8)支持TCP长连接socket通讯方式获取数据;
9)针对运算复杂数据接口支持延迟获取数据请求模式(初次请求数据命令,延时5分钟或10分钟请求数据结果);
10)支持动态配置数据传输编码格式(UTF-8,GBK, iso-8859-1 ..);
11)支持插件式接口扩展开发,满足不同业务数据接口需求;
3.2接口定义步骤流程图
接口参数描述:
http://xx.xx.x.x:xxxx/CenterData?sub_code=xxxxxx&sub_usercode=xxxxxx¶m_name=A01_xxxxx¶m_value1=13xxxxx¶m_value2=xxxxx
sub_code :见3.7应用平台code
sub_usercode :见3.9平台用户code
param_name :见3.3接口名称
param_value1 :见3.4输入参数,按顺序输入
param_value2 :同上
......
http://xx.xx.x.xx:8080/CenterData/getdata.jsp?sub_code=FF0731CC39614C90A5D474BC17253713&sub_usercode=114A6DB3BBE6419DA3768E6E25127310¶m_name=D01_select_tb1¶m_value1=50
JS调用测试代码:
$.ajax({
type: "POST",
async: false,
url: "http://xx.x.x.xx:8080/CenterData/getdata.jsp?sub_code=FF0731CC39614C90A5D474BC17253713&sub_usercode=114A6DB3BBE6419DA3768E6E25127310",
data:{param_name:"D01_select_tb1"
,param_value1:"50"},
//跨域请求的URL
dataType: "jsonp",
jsonp: "jsoncallback",
jsonpCallback: "data_result",
success: function(data) {
},
error: function() {
if(confirm("网络故障,请刷新网络"))
window.location.reload();
},
// 请求完成后的回调函数 (请求成功或失败之后均调用)
complete: function(XMLHttpRequest, textStatus) {
}
});
function data_result(input_data)
{
alert(JSON.stringify(input_data));
}
3.3代码调用案例
3.3.1用户登录接口
接口url:
http://xx.xx.x.x:xxxx/CenterData/getdata.jsp?sub_code=xxxxxxxxxxx&sub_usercode=xxxxxxxxxx
提交方法(UTF-8编码):
post、get
提交参数:
param_name=A01_xxxxxx 接口名称
param_value1=136DD00D2E 用户手机号
param_value2=DD00D2E3 用户密码
提交案例:
http://xx.xx.x.x:xxxx/CenterData?sub_code=xxxxxx&sub_usercode=xxxxxx¶m_name=A01_xxxxx¶m_value1=13xxxxx¶m_value2=xxxxx
返回参数:
s_result /*成功或失败 0:失败 1:成功*/
error_desc /*失败原因*/
login_id /*用户登录账号*/
nickname /*用户名称*/
session_id /*用户session_id*/
测试成功结果demo:
{"A01_xxxxxx":[{"s_result":"1","error_desc":"","login_id":"136xxxx","nickname":"xxxx"}]}
测试失败结果demo:
{"A01_ xxxxxx ":[{"s_result":"0","error_desc":"错误,登陆账号或密码错误","login_id":"","nickname":""}]}
3.3.2获取用户信息
接口url:
http://xx.xx.x.x:xxxx/CenterData/getdata.jsp?sub_code=xxxxxxxxxxx&sub_usercode=xxxxxxxxxx
提交方法(UTF-8编码):
post、get
提交参数:
param_name=A01_xxxx 接口名称
param_value1=136xxxx 用户登录手机号
session_id=xxxxx
提交案例: http://xx.xx.x.x:xxxx/CenterData?sub_code=xxxxxx&sub_usercode=xxxxxx¶m_name=A01_xxxxx¶m_value1=13xxxxx&session_id=xxxxx
返回参数:
login_id /*用户注册手机号*/
nickname /*用户姓名*/
测试成功结果demo:
{"A01_xxxx":[{"login_id":"136xxx,"nickname":"xxxxx"}]}
测试失败结果demo:
{"A01_xxxx":[]}
或
{'A01_xxxx':[{'session_id':'','s_result':'0','error_desc':'用户未登陆,请登陆'}]}
3.4接口展示界面
3.4.1登陆及首页
3.4.2数据源配置
清除冗余数据按钮:系统自动清除配置信息中冗余数据为系统进行瘦身,建议一年执行一次;
读取全局变量信息按钮:添加、修改或删除数据源时触发此按钮以进行系统自动加载缓存信息;
添加数据源界面见下图:
子系统驱动:
SqlServer2005 |
com.microsoft.jdbc.sqlserver.SQLServerDriver |
SqlServer2008 |
com.microsoft.sqlserver.jdbc.SQLServerDriver |
MySql |
com.mysql.jdbc.Driver |
Oracle10g |
oracle.jdbc.driver.OracleDriver |
Access |
sun.jdbc.odbc.JdbcOdbcDriver |
sqlite |
org.sqlite.JDBC |
子系统url:
SqlServer2005 |
jdbc:microsoft:sqlserver://x.x.x.x:1433;DatabaseName=DB_Name |
SqlServer2008 |
jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=DB_Name |
Oracle10g |
jdbc:oracle:thin:@x.x.x.x:1521:orcl |
MySql |
jdbc:mysql://x.x.x.x:3306/DB_Name?autoReconnect=true &characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull |
Access |
jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\..\\..\\DB_Name.mdb |
Sqlite |
dbc:sqlite:D:\\......\\DbName.db |
子系统登录账号:填写正确的账号(本测试界面中以*显示)
子系统登录密码:填写正确的密码(本测试界面中以*显示)
子系统版本号:随便填写
子系统编码:随便填写
3.4.3接口名称
接口中文名称:随便填写
接口英文名称:英文(区分大小写)+下滑线+数字,不要有特殊字符
SQL语句:对应接口SQL语句,如:select SID,VALUE1 from tb_1 where SID = ? and VALUE1 = ?
或
insert into tb_1(SID,VALUE1) values(?,?)
类型:选择"SQL语句"或"存储过程",当选择"SQL语句"时,填写的SQL语句生效,当选择"存储过程"时,填写的SQL语句无效,同时接口英文名称必须与存储过程名一致;
备注:随便填写
url中参数param_name
3.4.3.1.接口调试
建议阅读完3.4.3--3.4.10后进行接口调试;
见接口名称中的“接口调试”按钮
选中应用平台列表记录
3.4.4输入参数
接口输入参数中文名称:随便输入
接口输入参数英文名称:随便输入
接口输入参数值类型:INT STRING。。类型
接口输入参数大小:默认50
接口输入参数顺序与3.4.3接口中参数一致,如:
insert into tb_1(SID,VALUE1) values(?,?)这个接口SQL语句中,先定义输入参数:SID,在定义输入参数VALUE1,否则系统参数会错乱;
url中参数以param_value1,param_value2,Param_value3,…………
3.4.5输出参数
输出参数一般针对接口为存储过程类型接口具有输出参数模式;
返回值或输出参数需与SQL语句或存储过程值一致(区分大小写)
3.4.6返回值
返回值或输出参数需与SQL语句或存储过程值一致(区分大小写)
3.4.7应用平台信息
3.4.8应用平台授权
3.4.9平台用户信息
3.4.10平台用户授权
3.4.11APP应用模板
3.4.11.1摸板调试
3.4.12 APP应用模板明细
页面对应输入参数:页面url参数与该子项接口输入参数对应值。
如:页面参数起始序号丛2开始,页面有参数(param_value2、param_value3、param_value4),其中接口1对应输入参数有2个对应页面参数分别为(param_value2、param_value3),接口2对应输入参数有2个对应页面参数分别为(param_value4、param_value2),接口3对应输入参数有1个对应页面参数为(param_value3);
接口1页面对应输入参数:param_value2,param_value3
接口2页面对应输入参数:param_value4,param_value2
接口3页面对应输入参数:param_value3
各类系统参数配置。
3.4.14TCP长连接socket通讯模式
测试通讯服务器IP及端口信息
xx.x.x.xxx:8090
数据协议案例:
@##ST=04&DATATIME=20190409101900&sub_code=FF0731CC39614C90A5D474BC17253713&sub_usercode=114A6DB3BBE6419DA3768E6E25127310¶m_name=D01_select_tb1¶m_value1=50##@
3.4.15延时数据请求模式
http://xx.x.x.xx:8080/CenterData/getdata.jsp?sub_code=FF0731CC39614C90A5D474BC17253713&sub_usercode=114A6DB3BBE6419DA3768E6E25127310¶m_name=xxxxxx¶m_value1=34&delay_code=76FA05F0B1AB4ECDB0A0DC74C0EEA798&delay_data=0
delay_code 随机生成32位GUID
delay_data 0:请求数据 1:获取数据结果
请求命令成功:
{"s_result":"1","error_desc":"请求延时数据成功,请稍候获取数据"}
http://xx.x.x.xx:8080/CenterData/getdata.jsp?sub_code=FF0731CC39614C90A5D474BC17253713&sub_usercode=114A6DB3BBE6419DA3768E6E25127310¶m_name=xxxxxx&delay_code=76FA05F0B1AB4ECDB0A0DC74C0EEA798&delay_data=1
获取延时数据结果:
{"D01_select_tb1":[{"SID":1,"VALUE3":"正确","VALUE2":"速度","VALUE1":"测试"},{"SID":2,"VALUE3":"正确","VALUE2":"速度","VALUE1":"测试"},{"SID":3,"VALUE3":"正确","VALUE2":"速度","VALUE1":"测试"},{"SID":25,"VALUE3":"cc","VALUE2":"bb","VALUE1":"aa"},{"SID":27,"VALUE3":"cc","VALUE2":"bb","VALUE1":"测试"},{"SID":28,"VALUE3":"正确","VALUE2":"速度","VALUE1":"测试"}]}
3.5错误信息
错误提示:数据库主键冲突,输入数据主键不唯一;
错误提示:数据库主键冲突,输入数据主键不唯一;
错误提示:输入参数字符串"a3"错误,(定义3.4.4章节)此输入参数为INT或FLOAT类型,请检查输入参数类型;
错误提示:sub_code错误,(定义3.4.7、3.4.8、3.4.9、3.4.10章节)或应用平台未授权该接口权限;
错误提示:(定义3.4.3章节)接口未定义或输入错误param_name;
错误提示:(定义3.4.4章节)输入参数个数超过sql语句参数;
错误提示:sql语句缺少(定义6.4章节)参数或输入参数未定义;
错误提示:sql语句中某个返回值为STRING类型,(定义3.4.6章节)但定义返回值却为INT型;
错误提示:(定义6.6章节)返回值"s4"未发现,确认返回值字段"s4"与sql语句中返回字段是否一致
3.6压力测试报告
3.6.1测试报告一
测试部署描述 |
参考值 |
备注 |
程序部署环境 |
个人PC |
|
运行方式 |
桌面jar双击运行 |
Sqlite配置库 |
并发访问线程数 |
80个 |
2台PC测试机,本地网络访问 |
压力测试用时 |
18小时 |
|
请求数据接口类型 |
Select语句 |
|
线程访问频率 |
随机5--15秒/次 |
|
总请求接口次数 |
375939 |
|
请求成功次数 |
375926 |
|
请求失败次数 |
13 |
|
数据请求成功率 |
99.99% |
|
结论: |
满足并发数80个要求 |
3.6.2测试报告二
测试部署描述 |
参考值 |
备注 |
程序部署环境 |
云服务器 |
|
运行方式 |
tomcat服务运行 |
Mysql配置库 |
并发访问线程数 |
500个 |
2台PC测试机,公网网络访问 |
压力测试用时 |
12 |
|
请求数据接口类型 |
Insert语句 |
|
线程访问频率 |
随机5--15秒/次 |
|
总请求接口次数 |
7061833 |
|
请求成功次数 |
7061817 |
|
请求失败次数 |
16 |
|
数据请求成功率 |
99.99% |
|
结论: |
满足并发数500个要求 |
3.7业务展示web应用案例
4物联网设备数据采集
物联网设备数据采集程序主框架基于Python3.6开发,静态配置库采用Sqlite3桌面型数据库配置。支持ARM架构或X86架构主板设备,操作系统支持Linux操作系统及windows操作系统。
可通过图形化界面配置各类数据接口,实现可视化配置即结果模式,易于扩展;各类接口协议扩展采用插件式模式,方便快捷进行各类扩展性开发。
程序简小,程序文件大小约为 30M
windows操作系统服务器程序运行:双击e9goRun.bat
linux操作系统服务器命令运行:
python e9gomain.pyc &
4.1技术特点
1)数据接口定义完全图形化操作,无需编写任何开发代码;便于后期无限接口业务扩展;
2)接口数据调用权限化管理,包含接口调用期限,次数限值,IP绑定等接口权限管理功能;
3) 支持前端Javascript跨域获取数据操作,支持java、C#等主流开发语言后端获取数据或传递数据模式;
4)调用方式为web page(get、post均支持)方式,返回结果以json数据格式展示,支持基于html5的前端展示系统的数据接入;特殊字段采用url编码格式进行特殊字符编码转义处理;
5) 支持双权限认证模式(sub_code和sub_usercode);
6)用户接口时效性认证;
7)支持TCP长连接socket通讯方式获取数据;
8)针对运算复杂数据接口支持延迟获取数据请求模式(初次请求数据命令,延时5分钟或10分钟请求数据结果);
9)支持动态配置数据传输编码格式(UTF-8,GBK, iso-8859-1 ..);
10)支持插件式接口扩展开发,满足不同业务数据接口需求;
11)支持版本自动更新,减少大量设备程序部署更新运维操作; 12)支持设备数据一点多发;
13)支持业务数据web展示;
14)支持远程web模式进行debug调试;
15)支持设备远程重起;
接口定义及配置参见:3.4
4.2运行环境
硬件环境:X86架构工业控机、ARM架构工控机
操作系统:winodws操作系统、Linux操作系统
运行环境:Python3、Sqlite3
基础组件库:pycryptodome、pyserial-3.4
4.3设计说明
4.4设备界面效果图