JAVA Netty開(kāi)發(fā)蘇標(biāo)主動(dòng)安全附件服務(wù)器

  • 蘇標(biāo)是江蘇省交通廳2018年發(fā)布的道路運(yùn)輸車輛主動(dòng)安全智能防控系統(tǒng)的平臺(tái)技術(shù)規(guī)范颂砸,是繼部標(biāo)1078流媒體后這兩年最火熱的規(guī)范早直,今年深圳展會(huì)幾乎所有參展商都以主動(dòng)安全報(bào)警作為亮點(diǎn)靶橱。
  • 蘇標(biāo)的主動(dòng)安全實(shí)現(xiàn)是通過(guò)終端視頻算法分析阶淘,主動(dòng)判斷出司機(jī)駕駛行為是否違反駕駛行為規(guī)范利耍,并觸發(fā)報(bào)警望抽,如前向碰撞報(bào)警肺蔚、車道偏離報(bào)警煌妈、車距過(guò)近報(bào)警、疲勞駕駛報(bào)警宣羊、分神駕駛報(bào)警璧诵、接打電話報(bào)警、抽煙報(bào)警仇冯、駕駛員異常報(bào)警之宿、胎壓異常報(bào)警等。在發(fā)生報(bào)警的時(shí)候苛坚,可以上傳違章證據(jù)到服務(wù)器平臺(tái)比被,如視頻,圖片和記錄儀數(shù)據(jù)等炕婶。
  • 蘇標(biāo)的報(bào)警是通過(guò)擴(kuò)展部標(biāo)JT808協(xié)議0x0200位置上報(bào)的附加數(shù)據(jù)上報(bào)的姐赡,平臺(tái)判斷附件數(shù)量大于0,則下發(fā)蘇標(biāo)0x9208附件上傳指令讓終端把證據(jù)文件發(fā)到附件服務(wù)器柠掂。
  • 附件上傳的協(xié)議使用了2種:(1) 0x1210報(bào)警附件信息消息项滑、0x1211文件信息上傳、0x1212文件上傳完成消息采用部標(biāo)JT808協(xié)議涯贞。(2) 文件數(shù)據(jù)上傳采用蘇標(biāo)自定義的格式枪狂。


    image.png
  • 因?yàn)椴繕?biāo)上傳的文件有3處:808多媒體文件、1078錄像上傳FTP宋渔、蘇標(biāo)附件州疾,我們將這3塊整合在一起,程序起名為file-server皇拣,既能處理FTP錄像文件又能處理蘇標(biāo)附件严蓖,還提供了http文件訪問(wèn)接口給前端。JT808協(xié)議解析可以直接復(fù)用JT808網(wǎng)關(guān)程序的氧急,已經(jīng)兼容了JT808-2019國(guó)標(biāo)協(xié)議颗胡。
public class Jt808Message extends BaseMessage {
    /**
     * 消息ID
     */
    private int msgId;

    /**
     * 終端手機(jī)號(hào)
     */
    private String phoneNumber;

    /**
     * 終端手機(jī)號(hào)數(shù)組
     */
    private byte[] phoneNumberArr;

    /**
     * 協(xié)議版本號(hào)
     */
    private int protocolVersion;

    /**
     * 消息流水號(hào)
     */
    private int msgFlowId;

    /**
     * 是否分包
     */
    private boolean multiPacket;

    /**
     * 版本標(biāo)識(shí)
     */
    private int versionFlag;

    /**
     * 加密方式,0:不加密吩坝,1:RSA加密
     */
    private int encryptType;

    /**
     * 消息總包數(shù)
     */
    private int packetTotalCount;

    /**
     * 包序號(hào)
     */
    private int packetOrder;
}
  • 我們?cè)诘讓幼隽艘粋€(gè)消息服務(wù)處理的provider毒姨,每條指令的處理服務(wù)在程序啟動(dòng)時(shí)自動(dòng)注冊(cè)到provider。當(dāng)每條消息解析成vo傳遞到netty的handler時(shí)钉寝,會(huì)根據(jù)消息ID從provider找到對(duì)應(yīng)的處理服務(wù)弧呐。市面上開(kāi)源的或者賣的源碼闸迷,基本上都用if/else去判斷消息ID處理,造成處理類非常龐大俘枫,而且很難維護(hù)腥沽。
@Slf4j
@Sharable
public class Jt808BusinessHandler extends SimpleChannelInboundHandler<Jt808Message> {

    private MessageServiceProvider messageServiceProvider;

    public static final Jt808BusinessHandler INSTANCE = new Jt808BusinessHandler();

    private Jt808BusinessHandler() {
        messageServiceProvider = SpringBeanService.getBean(MessageServiceProvider.class);
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Jt808Message msg) throws Exception {
        //獲取對(duì)應(yīng)的消息處理器
        int messageId = msg.getMsgId();
        BaseMessageService messageService = messageServiceProvider.getMessageService(messageId);
        ByteBuf msgBodyBuf = Unpooled.wrappedBuffer(msg.getMsgBodyArr());
        try {
            Object result = messageService.process(ctx, msg, msgBodyBuf);
            log.info("收到{}({}),終端手機(jī)號(hào):{},消息流水號(hào):{},內(nèi)容:{}", messageService.getDesc(), CommonUtil.formatMessageId(messageId), msg.getPhoneNumber(), msg.getMsgFlowId(), result);
        } catch (Exception e) {
            Jt808PacketUtil.reply8001(ctx, msg, Jt808ReplyResultEnum.MSG_ERROR);
            printExceptionLog(msg, messageService, e);
        } finally {
            ReferenceCountUtil.release(msgBodyBuf);
        }
    }
}
image.png
  • 文件路徑入庫(kù)的時(shí)候,我們把路徑用base64編碼保存崩哩,前端查詢時(shí)根據(jù)base64的路徑請(qǐng)求巡球,后臺(tái)把base64路徑解碼后直接獲取到多媒體文件數(shù)據(jù)返回前端言沐,這樣就省去了查詢數(shù)據(jù)庫(kù)的步驟邓嘹。


    image.png
@Api(tags = {"文件管理"})
@RestController
@RequestMapping({"/api/v1/files/"})
public class FileController {
    @Autowired
    private ResourceLoader resourceLoader;

    @ApiOperation("顯示文件")
    @GetMapping("/display")
    public ResponseEntity<Resource> show(@ApiParam("路徑") @RequestParam String path) {
        try {
            byte[] pathArr = Base64.getDecoder().decode(path);
            String filePath = new String(pathArr, "UTF8");
            log.info("顯示文件,路徑:{}", filePath);
            return ResponseEntity.ok(resourceLoader.getResource("file:" + filePath));
        } catch (Exception e) {
            return ResponseEntity.notFound().build();
        }
    }
  • 由于file-server做了跨域處理,所以前端直接調(diào)用接口沒(méi)有問(wèn)題险胰,也可以使用nginx做反向代理汹押,前端頁(yè)面和接口都用同一個(gè)端口,前后端分離一般都用這種方案實(shí)現(xiàn)起便。


    image.png

    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棚贾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子榆综,更是在濱河造成了極大的恐慌妙痹,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼻疮,死亡現(xiàn)場(chǎng)離奇詭異怯伊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)判沟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門耿芹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挪哄,你說(shuō)我怎么就攤上這事吧秕。” “怎么了迹炼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵砸彬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我斯入,道長(zhǎng)砂碉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任咱扣,我火速辦了婚禮绽淘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闹伪。我一直安慰自己沪铭,他們只是感情好壮池,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著杀怠,像睡著了一般椰憋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赔退,一...
    開(kāi)封第一講書(shū)人閱讀 49,906評(píng)論 1 290
  • 那天橙依,我揣著相機(jī)與錄音,去河邊找鬼硕旗。 笑死窗骑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漆枚。 我是一名探鬼主播创译,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼墙基!你這毒婦竟也來(lái)了软族?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤残制,失蹤者是張志新(化名)和其女友劉穎立砸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體初茶,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颗祝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纺蛆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吐葵。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桥氏,靈堂內(nèi)的尸體忽然破棺而出温峭,到底是詐尸還是另有隱情,我是刑警寧澤字支,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布凤藏,位于F島的核電站,受9級(jí)特大地震影響堕伪,放射性物質(zhì)發(fā)生泄漏揖庄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一欠雌、第九天 我趴在偏房一處隱蔽的房頂上張望蹄梢。 院中可真熱鬧,春花似錦富俄、人聲如沸禁炒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)幕袱。三九已至暴备,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間们豌,已是汗流浹背涯捻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留望迎,地道東北人障癌。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像擂煞,于是被迫代替她去往敵國(guó)和親混弥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容