智慧路灯后台管理系统设计文档
Pris Lab/xxx Lab
Bupt
更新日志
2016/7/15 creaded by us
2016/8/12 add tcp server by us
目录
一、 总则 1
二、 功能概述 1
三、 关键问题 1
1. ip数字广播(一期实现技术) 1
2. 内网问题 2
四、 系统架构 2
五、 接口描述 3
1. 灯杆上报信息,可携带心跳信息 3
2. 灯杆心跳信息,不携带其他数据信息 5
3. 发送灯杆控制信息 5
3.1 喇叭发送控制 5
3.2灯开灯关控制 5
智慧路灯后台管理系统由于接收路灯上各种传感器数据,并向路灯设备发送相关指令和音视频数据,用于路灯设备的音视频播放。管理人员亦可通过该系统进行管理。
该文档由智慧路灯后台管理系统设计人员、开发人员和终端设计人员、开发人员使用和维护。
智慧路灯后台管理系统提供管理页面。管理人员登陆后可对所有路灯的各种资源进行管理,并进行相关业务处理。
界面上具体包括:
1. 用户管理
所有用户的管理
2. 资源管理
所有设备的管理,增删改查,设置分组,地理展示等等
3. 路灯控制
4. 广播控制
5. 广告视频及字幕控制(第一期暂时不做)
6. 摄像头控制(第一期暂时不做)
7. 感知数据浏览
8. 报警按钮控制
9. 关联控制
与终端的交互包括:
1. 向指定终端发送控制命令
2. 接收终端发来的数据
与其他服务器的交换包括:
1. 发送并控制音频流媒体
2. 接收并控制音频流媒体
3. 接收并控制视频流媒体
4. 发送并控制广告信息(流媒体,pps,字幕等)
功能有2个:
1.用户通过浏览器调用mac讲话,浏览器录音,用户可回放,可上传服务器存储成文件。
2.用户通过浏览器调用mac讲话,实时传给路灯喇叭播放。
2.用户选择播放文件,路灯喇叭播放。
4.用户选择播放文件,用户浏览器可进行试听。
实现思路一:灯杆箱部分不需要做任何开发
使用方式:路灯设备上只要浏览器访问指定url后,就不用做任何事情了。该操作在灯杆上部署应用时就已完成。用户在智慧路灯后台管理系统上选择播放方式,路灯设备就开始播放,直到播放结束。
实现原理:路灯上开启浏览器访问指定url,ajax定时访问web服务器,服务器上有播放需求,进行播放文件或实时语音。播放文件可通过js控制选择文件源。播放实时语音可使用webrtc。
实现思路二:灯杆箱部分需要做语音播放的开发
实际部署时,所有的灯杆箱有可能属于内网,有内网访问外网上的web server。这个没有问题。但server要想直接发命令到灯杆箱则需要NAT穿越的问题,处理起来比较困难。因此,可利用server对灯杆箱周期性的心跳反馈来处理,灯杆箱收到反馈,则进行相应的操作,如开关灯,摄像头等操作。这样处理起来最简单。
以上方案是比较简单的处理。实际应用开发还是应直接开发一个TCP Server作为汇聚服务器。该服务器部署于外网,接收所有灯杆发来的心跳和各种数据,写入数据库。同时,接收Web server发来的指令,并将指令转发给相应的灯杆箱。这样就解决了NAT穿越问题。
……
灯杆箱发送数据有两种方式,既可以直接http restful,也可以发给作为tcp server的汇聚服务器。汇聚服务器通过内存字典/数据库服务器内存表来维护各个灯杆箱和socket id的对应关系。
系统发送指令到灯杆箱则通过汇聚服务器。用户通过web 界面向特定灯杆箱发送指令,web server获得相应灯杆箱在汇聚服务器上的socket id后作为socket client转发给汇聚服务器,汇聚服务器直接选择相应的socket,将指令转发给灯杆箱。
灯杆箱部分需要开发一个对应的socket client。用于解析指令做相应处理。
汇聚服务器设计:
任务检测守护进程实时监测用户的任务,如何时开关灯,随时播放语音等控制
鉴权功能用于检测链接服务器的终端是否是伪造等。灯杆箱初次链接时,无socket id,若数据表不存在该灯杆箱,说明是新添设备,status=-1,插入设备信息。之后再发来数据,返回都是错误信息为not confirm。用户通过界面确认以后,status=0。之后再发来数据就可以接受处理了。Socket id为有效链接
若数据表存在该灯杆箱,说明是重新连接,重新记录有效的socket id。以后可加入密码等方式。
TCP Server用于接收所有灯杆箱的tcp 链接。并发送指令到指定灯杆箱。
灯杆上报方式既可以采用http restful接口,也可以直接通过socket向汇聚服务器发送。
http restful协议访问:http://xxxx/xxx/poleupload.php?r=json-string。
向汇聚服务器发送数据时,只需要通过tcp发送json-string即可。
举例1,上报灯杆箱上的所有灯的静态信息:
http://xxxx/xxx/poleupload.php?r={“ip”:”x.x.x.x”,“name”:”xxxx”,“light”:[{“name”:”xxx1” ,“info”:”xxxx”},{“name”:”xxx1” ,“info”:”xxxx”}]}
举例2,上报灯杆箱上的name为abc和cde两个的灯的亮度:
http://xxxx/xxx/poleupload.php?r={“ip”:”x.x.x.x”,“name”:”xxxx”,“light”:[{“name”:”abc” ,“brightness”:”20”,”brighttime”:”20160810171000”},{“name”:”cde” ,“brightness”:”90”,”brighttime”:”20160810171001”}]}
举例3,上报灯杆箱上的传感器名称为abc和cde的两个传感器采集的数据
http://xxxx/xxx/poleupload.php?r={“ip”:”x.x.x.x”,“name”:”xxxx”,“sensor”:[{“name”:”abc” ,“value”:”20”,”vtime”:”20160810171000”},{“name”:”cde” ,“value”:”90”,”vtime”:”20160810171001”}]}
完整的json-string如下。
{
“ip”:”x.x.x.x”, #灯杆箱的ip,必须字段
“name”:”xxxx”, #灯杆箱的唯一名称,必须字段
“heartbeat”:”on” #心跳信息,非必需字段,http restful方式该字段不处理
“pole”:{ #灯杆箱信息,非必需字段,有该信息则添加或更新数据库的t_lightpole表
”city”:””,
….,
”gps”:”x:123.23,y:123.23”
},
“light”:[#灯的信息,是数组, 非必需字段,有该信息则添加或更新数据库的t_light等表
{
“name”:”xxx” ,//灯的唯一名称或序号,必需字段
“info”:”xxxx”,
“brightness”:”20”,
“brighttime”:”20101212121212”,
“power”:”2.4”, #即时电量
“ptime”,”20101212121212” #与前一个字段成对出现
},
……,
{
….
}
]
“sensor”:[ #传感器信息,数组, 非必需字段,有该信息则添加或更新数据库的相应表
{
“name”:”xxx” ,//传感器的唯一名称或序号,必须字段
“type”:”xxxx”,
“remark”:”xxxx”,
“value”:”20”,
“vtime”:”20101212121212” #与前一个字段成对出现
},
……,
{
….
}
]
}
实际发送时,只发送需要发送的字段即可,如上例所示。
返回结果:
{
“status”:”ok”/”error”,
“info”:”xxxx”
}
灯杆心跳直接通过socket向汇聚服务器发送,只需要通过tcp发送json-string即可。
{
“ip”:”x.x.x.x”, #灯杆箱的ip,必须字段
“name”:”xxxx”, #灯杆箱的唯一名称,必须字段
“heartbeat”:”on” #心跳信息,必需字段
}
返回:
{
“status”:”ok”/”error”,
“info”:”xxxx”
}
(1) 喇叭发声可按方案一。不需要终端部分的开发,全部由管理系统完成。
(2) 比较好的方案:
Server守护进程检测到有语音发送,将语音数据通过汇聚服务器转发给灯杆箱。
(1)最简单的方法(不建议用)
每隔1~2s访问一下服务器指定url,根据返回的结果进行控制。url如下:
http restful协议访问:http://xxxx/xxx/lightget.php?r={“ip”:”x.x.x.x”, “name”:”xxxx”}
ip为本灯杆箱的ip,name为本灯杆箱的name。
返回结果如下:
{
“ip”:”x.x.x.x”, #灯杆箱的ip,必须字段
“name”:”xxxx”, #灯杆箱的唯一名称,必须字段
“light”:[
{
“name”:”xxx” ,//灯的唯一名称或序号,必需字段
“status”:”on”/”off”, //灯亮还是灭,必需字段
“begintime”:”20101212121212”, #状态开始时的时间,非必需字段
},
……,
{
….
}
]
}
(2)通用方法(建议按此开发)
汇聚服务器接收到web server发来的控制命令,直接通过维持的socket发送到灯杆箱。发送内容同上面的返回结果。