重要代码:
808server服务
@Component(value = "gpsServer808")
public class GpsServer808 implements Runnable {
private ChannelFuture future = null;
private EventLoopGroup bossGroup;
private EventLoopGroup workerGroup;
@Value("#{configs['server808.port']}")
private int port = 8808;
@Resource
private GpsServerInitializer808 gpsServerInitializer808;
public void startServer() throws Exception {
bossGroup = new NioEventLoopGroup();
workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);
b.channel(NioServerSocketChannel.class);
b.childOption(ChannelOption.RCVBUF_ALLOCATOR,
new AdaptiveRecvByteBufAllocator(64, 2048, 65536));
b.childHandler(gpsServerInitializer808);
// 服务器绑定端口监听
future = b.bind(port).sync();
future.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
@Component
public class GpsServerInitializer808 extends ChannelInitializer<SocketChannel> {
@Resource
private GpsHandler gpsHandler;
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
// 字符串解码 和 编码
pipeline.addLast("decoder", new ProtocolDecoder());
pipeline.addLast(new ReadTimeoutHandler(360));
pipeline.addLast("encoder", new ByteArrayEncoder());
// 自己的逻辑Handler
pipeline.addLast("handler", gpsHandler);
}
}
@Sharable
@Component
public class GpsHandler extends SimpleChannelInboundHandler<byte[]> implements IGpsHandler {
public static final Logger log = LoggerFactory.getLogger("GpsHandler");
public static AtomicInteger connectCount = new AtomicInteger();
@Override
protected void channelRead0(ChannelHandlerContext ctx, byte[] msg) {
String msgStr = HexUtils.bytesToHex(msg, msg.length);
dataTransmission(msgStr);
dataForward(msg);
printMsg(msgStr);
saveMsg(msgStr);
for (IProtocol protocol : this.protocols) {
try {
if (protocol.matching(msgStr)) {
String tid = protocol.getTid(msgStr);
ctx.attr(AttributeKey.valueOf("TID")).set(tid);
Session session = Session.sessions.getIfPresent(tid);
if (session == null) {
session = new IoSession(ctx, protocol);
} else {
session.setChannelHandlerContext(ctx);
}
Session.sessions.put(tid, session);
if (session.getAttribute("tid") == null) {
session.setAttribute("tid", tid);
}
//通用
QueueBean bean = new QueueBean();
bean.setData(msg);
bean.setTid(tid);
Queue.GPS_DATA_QUEUE.add(bean);
}
} catch (Exception e) {
System.out.println(msgStr);
e.printStackTrace();
}
}
}
1078视频服务
public class App {
public static final boolean AUDIO_ENABLE = true;
public static void main(String[] args) {
String portVideo = "6802", wsVideo = "6899",
portAudio = "6805", wsAudio = "6806", portHttp = "6809";
// 视频推流
Jt1078MediaServer jt1078 = new Jt1078MediaServer(Integer.parseInt(portVideo),
MediaChannelTypeEnum.VIDEO);
jt1078.start();
// 取流(视频播放器取flv) websocket
FlvWebSocketServer flvWs = new FlvWebSocketServer(Integer.parseInt(wsVideo));
flvWs.start();
// 音频
Jt1078AudioServer audioServer = new Jt1078AudioServer(Integer.parseInt(portAudio));
audioServer.start();
// 音频 websocket
AudioWebsocketServer audioWs = new AudioWebsocketServer(Integer.parseInt(wsAudio));
audioWs.start();
HttpServer http = new HttpServer(Integer.parseInt(portHttp));
new Thread(http).start();
}
public class Jt1078MediaServer extends Thread {
private static final Logger log = LogManager.getLogger(Jt1078MediaServer.class);
private int port;
private MediaChannelTypeEnum mediaChannelType;
private Channel serverChannel;
public Jt1078MediaServer(int port, MediaChannelTypeEnum mediaChannelType) {
this.port = port;
this.mediaChannelType = mediaChannelType;
}
@Override
public void run() {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new Jt1078MediaFrameDecoder()); //解析出一个完整的rtp包(不确定)
ch.pipeline().addLast(new Jt1078MediaHandler(mediaChannelType));
}
})
.option(ChannelOption.SO_BACKLOG, 1024)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.TCP_NODELAY, true);
try {
log.info("JT1078流媒体服务启动,端口:{},mediaType:{}", port, mediaChannelType);
serverChannel = b.bind(new InetSocketAddress(port)).sync().channel().closeFuture().sync()
.channel();
} catch (Exception e) {
log.error("JT1078流媒体服务启动失败,端口:{},mediaType:{}", port,
mediaChannelType, e);
System.exit(-1);
}
}
}
public class FlvWebSocketServer extends Thread {
private static final Logger log = LogManager.getLogger(FlvWebSocketServer.class);
public FlvWebSocketServer(int port) {
this.port = port;
}
private int port;
@Override
public void run() {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("http-codec",
new HttpServerCodec());
ch.pipeline().addLast("aggregator",
new HttpObjectAggregator(65536));
ch.pipeline().addLast("http-chunked",
new ChunkedWriteHandler());
ch.pipeline().addLast("handler",
new FlvWebSocketHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 1024)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.TCP_NODELAY, true);
try {
log.info("FlvWebSocket流媒体服务启动,端口:{}", port);
b.bind(new InetSocketAddress(port)).sync().channel().closeFuture().sync().channel();
} catch (Exception e) {
log.error("FlvWebSocket服务启动失败,端口:{}", port, e);
System.exit(-1);
}
}
}
校车管理
@Controller
@RequestMapping("/bus")
public class CarController extends BaseController {
private String CAR_PREFIX = "/modular/car/";
@Autowired
private CarTypeService carTypeService;
@Autowired
private BusService busService;
@Autowired
private Jt808Service jt808Service;
@RequestMapping("/search")
@ResponseBody
public AutoComInfo search(@RequestParam(required = false) String keywords) {
AutoComInfo autoComInfo = new AutoComInfo();
autoComInfo.setData(busService.search(keywords));
return autoComInfo;
}
/**
* 车辆信息页面
*
* @return
*/
@RequestMapping("")
public String index() {
return CAR_PREFIX + "car.html";
}
/**
* 车辆编辑页面
*
* @return
*/
@Permission
@RequestMapping("/edit")
public String edit() {
return CAR_PREFIX + "car_edit.html";
}
/**
* 车辆新增页面
*
* @return
*/
@Permission
@RequestMapping("/add")
public String add() {
return CAR_PREFIX + "car_add.html";
}
/**
* 车辆列表查询
*
* @param cardNo
* @param carTypeId
* @param openFlag
* @return
*/
@RequestMapping("/list")
@ResponseBody
public LayuiPageInfo list(String cardNo, String carTypeId, String openFlag) {
return busService.getList(cardNo, carTypeId, openFlag);
}
/**
* 列表导出
*
* @param cardNo
* @param carTypeId
* @param openFlag
* @return
*/
@RequestMapping("/export")
@ResponseBody
public void export(String cardNo,
String carTypeId,
String openFlag,
HttpServletResponse response) {
//模拟从数据库获取需要导出的数据
List<CarResult> carList = busService.getListAll(cardNo, carTypeId,
openFlag);
String yyyyMMddHHmmss = DateUtil.format(new Date(), "yyyyMMddHHmmss");
//导出操作
ExcelUtils.exportExcel(carList, "车辆列表", "车辆列表", CarResult.class,
yyyyMMddHHmmss + "车辆列表.xls", response);
}
/**
* 车辆新增
*
* @param bus
* @return
*/
@RequestMapping("/addItem")
@ResponseBody
public ResponseData addItem(Bus bus, String cid) {
busService.add(bus, cid.trim());
return ResponseData.success();
}
/**
* 车辆详细信息
*
* @param rowId
* @return
*/
@RequestMapping("/detail")
@ResponseBody
public ResponseData detail(String rowId) {
return ResponseData.success(busService.getCarById(rowId));
}
/**
* 车辆编辑
*
* @param bus
* @return
*/
@RequestMapping("/editItem")
@ResponseBody
public ResponseData editItem(Bus bus, String cid) {
if (StrUtil.isBlank(bus.getIcon())) {
bus.setIcon(null);
}
busService.edit(bus, cid.trim());
return ResponseData.success();
}
/**
* 车辆删除
*
* @param rowId
* @return
*/
@Permission
@RequestMapping("/deleteItem")
@ResponseBody
public ResponseData deleteItem(String rowId) {
busService.delete(rowId);
return ResponseData.success();
}
/**
* 车辆启用停用
*
* @return
*/
@Permission
@RequestMapping("/modifyStatus")
@ResponseBody
public ResponseData modifyStatus(String rowId, Boolean openFlag) {
busService.update(Wrappers.<Bus>lambdaUpdate().eq(Bus::getRowId, rowId).set(Bus::getOpenFlag,
openFlag).set(Bus::getUpdateTime, LocalDateTime.now()));
return ResponseData.success();
}
/**
* 车辆是否重点
* @return
*/
@Permission
@RequestMapping("/modifyWhetherPoint")
@ResponseBody
public ResponseData modifyWhetherPoint(String rowId, Boolean whetherPoint){
busService.update(Wrappers.<Bus>lambdaUpdate().eq(Bus::getRowId, rowId).set(Bus::getWhetherPoint,
whetherPoint).set(Bus::getUpdateTime, LocalDateTime.now()));
return ResponseData.success();
}
/**
* 车型下拉框
*
* @return
*/
@RequestMapping("/getCarTypeList")
@ResponseBody
public ResponseData getCarTypeList() {
return ResponseData
.success(carTypeService.list(Wrappers.lambdaQuery()));
}
@RequestMapping("/getServer808CarList")
@ResponseBody
public ResponseData getServer808CarList(){
busService.saveOrUpdateJt808Car();
return ResponseData.success();
}
}
站点管理
@Controller
@RequestMapping("/station")
public class StationController extends BaseController {
private String PREFIX = "/modular/station/";
@Autowired
private StationService stationService;
/**
* 列表页面
*/
@RequestMapping("")
public String index() {
return PREFIX + "station.html";
}
/**
* 新增页面
*/
@RequestMapping("/add")
public String add() {
return PREFIX + "/station_add.html";
}
/**
* 编辑页面
*/
@RequestMapping("/edit")
public String edit() {
return PREFIX + "/station_edit.html";
}
/**
* 列表接口
*
* @param name
* @return
*/
@RequestMapping("/list")
@ResponseBody
public LayuiPageInfo list(@RequestParam(value = "name", required = false) String name) {
return stationService.findPageBySpec(name);
}
/**
* 新增接口
*/
@RequestMapping("/addItem")
@ResponseBody
public ResponseData addItem(Station station) {
stationService.add(station);
return ResponseData.success();
}
/**
* 编辑接口
*/
@RequestMapping("/editItem")
@ResponseBody
public ResponseData editItem(Station station) {
stationService.update(station);
return ResponseData.success();
}
/**
* 删除接口
*/
@RequestMapping("/delete")
@ResponseBody
public ResponseData delete(String id) {
stationService.delete(id);
return ResponseData.success();
}
/**
* 查看详情接口
*/
@RequestMapping("/detail")
@ResponseBody
public ResponseData detail(String id) {
Station detail = stationService.getById(id);
return ResponseData.success(detail);
}
/**
* 站点列表
*
* @param routeId 路线Id
*/
@RequestMapping("/stationList")
@ResponseBody
public ResponseData stationList(@RequestParam String routeId) {
List<Station> stationList = stationService.list(Wrappers.<Station>lambdaQuery()
.select(Station::getRowId, Station::getStationName).eq(Station::getRouteId, routeId)
.orderByAsc(Station::getSequence));
return ResponseData.success(stationList);
}
}
学生管理
@Controller
@RequestMapping("/student")
public class StudentController extends BaseController {
private String PREFIX = "/modular/student/";
@Autowired
private StudentService studentService;
/**
* 详情页面
*/
@RequestMapping("/detail")
public String detail() {
return PREFIX + "student_detail.html";
}
/**
* 学生列表页面
*
* @return
*/
@RequestMapping("")
public String index() {
return PREFIX + "student_list.html";
}
/**
* 从学生列表跳转至学生详情页面
*
* @return
*/
@RequestMapping("/info")
public String info() {
return PREFIX + "student_list_info.html";
}
/**
* 查看详情接口
*/
@RequestMapping("/detailItem")
@ResponseBody
public ResponseData detail(String id) {
StudentResult studentResult = studentService.detail(id);
return ResponseData.success(studentResult);
}
@RequestMapping("/toEdit")
@Permission
public String toEdit() {
return PREFIX + "student_edit.html";
}
@PostMapping("/editItem")
@ResponseBody
public ResponseData edit(@RequestBody AppStudentAddParams appStudentAddParams) {
if (StrUtil.isBlank(appStudentAddParams.getPhoto())) {
appStudentAddParams.setPhoto(null);
}
studentService.edit(appStudentAddParams);
return ResponseData.success();
}
/**
* 是否拉黑
*
* @param student
* @return
*/
@Permission
@PostMapping("/statusItem")
@ResponseBody
public ResponseData statusItem(Student student) {
Student student1 = new Student();
student1.setStatus(student.getStatus());
student1.setRowId(student.getRowId());
studentService.updateById(student1);
return ResponseData.success();
}
/**
* 修改时根据id获取详细信息
*
* @param id
* @return
*/
@RequestMapping("/getEditDetail")
@ResponseBody
public ResponseData getEditDetail(String id) {
AppStudentResult student = studentService.getEditDetail(id);
return ResponseData.success(student);
}
@RequestMapping("/allotItem")
@ResponseBody
public ResponseData allotItem(@RequestBody List<Map<String,Object>> rowList){
studentService.allotItem(rowList);
return ResponseData.success();
}
/**
* 学生列表
*
* @param studentName
* @param parentName
* @return
*/
@RequestMapping("/list")
@ResponseBody
public LayuiPageInfo list(@RequestParam(required = false) String studentName,
@RequestParam(required = false) String parentName,
@RequestParam(required = false) String status,
@RequestParam(required = false) String schoolId) {
return studentService.getList(studentName, parentName, status,schoolId);
}
/**
* 列表导出
*
* @return
*/
@RequestMapping("/export")
@ResponseBody
public void export(String studentName, String parentName, String status,String schoolId,
HttpServletResponse response) {
//模拟从数据库获取需要导出的数据
List<StudentPageResult> list = studentService.getListAll(studentName, parentName, status,schoolId);
String yyyyMMddHHmmss = DateUtil.format(new Date(), "yyyyMMddHHmmss");
String str = "学生列表";
//导出操作
ExcelUtils.exportExcel(list, str, str, StudentPageResult.class,
yyyyMMddHHmmss + str + ".xls", response);
}
/**
* 学生删除
*
* @return
*/
@Permission
@RequestMapping("/deleteItem")
@ResponseBody
public ResponseData deleteItem(String rowId) {
studentService.deleteItem(rowId);
return ResponseData.success();
}
/**
* 从学生列表查看学生详细信息
*
* @param rowId
* @return
*/
@RequestMapping("/getStudentById")
@ResponseBody
public ResponseData getStudentById(String rowId) {
return ResponseData.success(studentService.getStudentById(rowId));
}
}
学校管理
@Controller
@RequestMapping("/school")
public class SchoolController extends BaseController {
private String PREFIX = "/modular/school/";
@Autowired
private SchoolService schoolService;
@Autowired
private AreaService areaService;
@Autowired
private ProvinceService provinceService;
@Autowired
private CityService cityService;
@Autowired
private SemesterService semesterService;
@Autowired
private RouteService routeService;
@Autowired
private PackagePriceService packagePriceService;
@Autowired
private PackageInfoService packageInfoService;
@Autowired
private GradeService gradeService;
/**
* 学校列表一览页面
*
* @return
*/
@RequestMapping("")
public String index() {
return PREFIX + "school.html";
}
/**
* 新增页面
*/
@Permission
@RequestMapping("/add")
public String add() {
return PREFIX + "school_add.html";
}
/**
* 编辑页面
*/
@Permission
@RequestMapping("/edit")
public String edit() {
return PREFIX + "school_edit.html";
}
/**
* 跳转学期设置列表页面
*
* @return
*/
@RequestMapping("/toTermSetting")
public String toTermSetting() {
return PREFIX + "school_term_setting.html";
}
/**
* 跳转拥有路线页面
*
* @return
*/
@RequestMapping("/toOwnRoute")
public String toOwnRoute() {
return PREFIX + "school_own_route.html";
}
/**
* 列表分页查询
*
* @param mobile 手机号
* @param schoolName 学校名称
* @return
*/
@GetMapping("/list")
@ResponseBody
public LayuiPageInfo list(@RequestParam(required = false) String mobile,
@RequestParam(required = false) String schoolName) {
return schoolService.getList(mobile, schoolName);
}
/**
* 列表导出
*
* @return
*/
@RequestMapping("/export")
@ResponseBody
public void export(String mobile, String schoolName,
HttpServletResponse response) {
//模拟从数据库获取需要导出的数据
List<SchoolResult> list = schoolService.getListAll(mobile, schoolName);
String yyyyMMddHHmmss = DateUtil.format(new Date(), "yyyyMMddHHmmss");
String str = "学校列表";
//导出操作
ExcelUtils.exportExcel(list, str, str, SchoolResult.class,
yyyyMMddHHmmss + str + ".xls", response);
}
/**
* 学校包含的学期列表
*
* @param schoolId
* @return
*/
@GetMapping("/getTermSettingList")
@ResponseBody
public LayuiPageInfo getTermSettingList(@RequestParam String schoolId) {
return semesterService.getTermSettingList(schoolId);
}
/**
* 跳转到学期编辑页面
*
* @return
*/
@Permission
@RequestMapping("/toTermSettingEdit")
public String toTermSettingEdit() {
return PREFIX + "school_term_setting_edit.html";
}
/**
* 跳转到学期新增页面
*
* @return
*/
@Permission
@RequestMapping("/toTermSettingAdd")
public String toTermSettingAdd() {
return PREFIX + "school_term_setting_add.html";
}
/**
* 学期编辑接口
*
* @param semesterParam
* @return
*/
@RequestMapping("/editTermSetting")
@ResponseBody
public ResponseData editTermSetting(@RequestBody SemesterParam semesterParam) {
semesterService.editTermSetting(semesterParam);
return ResponseData.success();
}
/**
* 学期新增接口
*
* @param semesterParam
* @return
*/
@RequestMapping("/addTermSetting")
@ResponseBody
public ResponseData addTermSetting(@RequestBody SemesterParam semesterParam) {
semesterService.addTermSetting(semesterParam);
return ResponseData.success();
}
/**
* 学期详情接口
*
* @param rowId
* @return
*/
@RequestMapping("/getTermSettingDetail")
@ResponseBody
public ResponseData getTermSettingDetail(String rowId) {
return ResponseData.success(semesterService.getTermSettingDetail(rowId));
}
/**
* 年级列表
*
* @return
*/
@RequestMapping("/getGradeListBySemester")
@ResponseBody
public ResponseData getGradeListBySemester() {
return ResponseData.success(gradeService.getGradeListBySemester());
}
/**
* 学校新增
*
* @param school
* @return
*/
@RequestMapping("/addItem")
@ResponseBody
public ResponseData addItem(School school) {
schoolService.addItem(school);
return ResponseData.success();
}
/**
* 学校编辑
*
* @param school
* @return
*/
@RequestMapping("/editItem")
@ResponseBody
public ResponseData editItem(School school) {
schoolService.editItem(school);
return ResponseData.success();
}
/**
* 根据学校id查询拥有路线
*
* @param routeParam
* @return
*/
@RequestMapping("/getRouteListBySchoolId")
@ResponseBody
public LayuiPageInfo getRouteListBySchoolId(RouteParam routeParam) {
return routeService.findPageBySpec(routeParam);
}
/**
* 查看详情接口
*
* @param rowId
* @return
*/
@RequestMapping("/detailItem")
@ResponseBody
public ResponseData detailItem(@RequestParam String rowId) {
return ResponseData.success(schoolService.detailItem(rowId));
}
/**
* 获取全部省下拉框
*
* @return
*/
@RequestMapping("/getProvinceList")
@ResponseBody
public ResponseData getProvinceList() {
return ResponseData.success(provinceService.getList());
}
/**
* 根据省获取市下拉框
*
* @return
*/
@RequestMapping("/getCityList")
@ResponseBody
public ResponseData getCityList(String provinceId) {
return ResponseData.success(cityService.getList(provinceId));
}
/**
* 根据市获取区下拉框
*
* @return
*/
@RequestMapping("/getAreaList")
@ResponseBody
public ResponseData getAreaList(String cityId) {
return ResponseData.success(areaService.getList(cityId));
}
/**
* 根据区获取市 省
*
* @return
*/
@RequestMapping("/getCityByAreaId")
@ResponseBody
public ResponseData getCityByAreaId(String areaId) {
return ResponseData.success(cityService.getCityByAreaId(areaId));
}
/**
* 删除学校
*
* @param rowId
* @return
*/
@Permission
@RequestMapping("/deleteItem")
@ResponseBody
public ResponseData deleteItem(String rowId) {
schoolService.deleteItem(rowId);
return ResponseData.success();
}
/**
* 状态启用停用
*
* @param rowId
* @param openFlag
* @return
*/
@RequestMapping("/statusItem")
@ResponseBody
@Permission
public ResponseData statusItem(String rowId, Boolean openFlag) {
schoolService.statusItem(rowId, openFlag);
return ResponseData.success();
}
/**
* 学期删除
*
* @param rowId
* @return
*/
@Permission
@RequestMapping("/deleteTermSetting")
@ResponseBody
public ResponseData deleteTermSetting(String rowId) {
semesterService.deleteTermSetting(rowId);
return ResponseData.success();
}
/**
* 获取当前学期的套餐包以及套餐包价格
*
* @param semesterId
* @return
*/
@RequestMapping("/getPackageInfoAndPriceList")
@ResponseBody
public LayuiPageInfo getPackageInfoAndPriceList(String semesterId) {
return packagePriceService.getPackageInfoAndPriceList(semesterId);
}
/**
* 获取套餐下拉框
*
* @return
*/
@RequestMapping("/getPackageInfoList")
@ResponseBody
public ResponseData getPackageInfoList() {
return ResponseData.success(packageInfoService.getPackageInfoList());
}
}