天天看點

NB物聯網之天翼物聯(6)——移動電信NB的差別與相容開發

前言

電信是最早開通NB業務的營運商,兩年前我們公司就已經着手NB表具的開發工作,當時聯通和移動的NB業務還沒有開展,自然沒有考慮相容的問題,現在下定決心重新做一套肯定是要做一套相容的程式!那麼,收發機制完全不同的移動NB和電信NB怎樣才能實作相容呢?

找到不同點:

移動是直接向平台發送16進制字元串,平台将其自動轉為16進制碼流向表具發送16進制碼流,如下圖所示

NB物聯網之天翼物聯(6)——移動電信NB的差別與相容開發

電信是通過profile檔案向平台發送配置檔案中的json,再由編解碼插件轉為16進制碼流,再發向表具,如下圖所示

NB物聯網之天翼物聯(6)——移動電信NB的差別與相容開發

那我們隻需要将他們不同的地方做成一樣的就可以完成相容了!即應用應該向平台發送16進制碼流就可以了!!應用發送16進制碼流,就不需要編解碼插件了,但是它又必須存在,是以我們需要插件做“沒有意義”的轉換!!

實作準備

profile中的service有兩個清單,一個是屬性清單:AcceptService,一個是指令清單:CommandService

屬性清單用來接收編解碼插件中decode方法解碼出來的屬性

指令清單用來傳入編解碼插件中encode方法需要傳入的屬性

我們在定義profile的時候要把他們盡量分開

發送指令

CommandService 中隻編輯指令清單,因為我們要做到相容,就是不管下發什麼指令,我都隻發送一個16進制碼流,隻是根據不同的指令下發的碼流不同而已,是以我們隻定義一個send指令,指令中隻需定義一個value屬性用來存放我們要發送的碼流!

與之對應的是編解碼插件中的encode方法,而encode方法傳入一個ObjectNode(json)傳回一個byte數組,我們在encode中要做的就是将json中的value字元串拿出來轉換成byte數組

public byte[] encode(ObjectNode input) throws Exception {
        String hexString = input.get("paras").get("value").asText();
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < hexString.length() - 1; i += 2) {
            list.add(hexString.substring(i, i + 2));
        }
        byte[] byteArray = new byte[list.size()];
        for (int i = 0; i < list.size(); i++) {
            int dec_num = (int) Long.parseLong(list.get(i), 16);
            byteArray[i] = (byte) dec_num;
        }
        return byteArray;
    }

      

接收上傳資料

AcceptService 中隻編輯屬性清單,同樣我們的編解碼插件隻是起一個類型轉換的作用,隻需在該服務下定義一個value屬性,用來接收從編解碼插件中傳回的字元串

與之對應的是編解碼插件中的decode方法,decode方法傳入一個byte數組傳回一個ObjectNode(json),我們在decode中要做的就是将byte數組轉換成字元串放入AcceptService的value屬性中

public ObjectNode decode(byte[] binaryData) throws Exception {
        StringBuffer result = new StringBuffer();
        System.err.println( binaryData.length);
        for (int i = 0; i < binaryData.length; i++) {
            String hex = String.format("%02x", Byte.toUnsignedInt(binaryData[i]));
            result.append(hex);
        }
        //組裝body體,隻能為ObjectNode對象
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode root = mapper.createObjectNode();
        ArrayNode arrynode = mapper.createArrayNode();
        ObjectNode batteryNode = mapper.createObjectNode();
        batteryNode.put("serviceId", "AcceptService");
        ObjectNode batteryData = mapper.createObjectNode();
        batteryData.put("value", result.toString());
        batteryNode.put("serviceData", batteryData);
        arrynode.add(batteryNode);
        root.put("msgType", "deviceReq");
        root.put("data", arrynode);
        return root;
    }

      

測試

如下圖所示新增一個虛拟裝置

NB物聯網之天翼物聯(6)——移動電信NB的差別與相容開發

選中CommandService服務下的send指令,在value中填入16進制字元串:

NB物聯網之天翼物聯(6)——移動電信NB的差別與相容開發

如上圖所示,我們完成了發送什麼,裝置端就接收到什麼,測試接收服務在上圖“請輸入十六進制碼流”的窗體沒輸入裝置上傳的資料,在應用模拟器中就能夠看到接受到的内容!!

總結

如上我們就實作了電信NB和移動NB的相容,即他們都是應用根據不同的業務場景,編輯不同的16進制字元串,然後向平台發送一個16進制字元串,然後平台通過轉換向産品發送一個16進制碼流;接收資料都是接收16進制字元串然後解析字元串得到想要的資料!

兩種機制各有好處,作為一個中立的開發者來說:論開發效率,移動的模式甩電信10條街 - - ||