Brotli 壓縮與 Protobuf over MQTT

兩個獨立的小範例:從原始碼編譯 Brotli 壓縮函式庫,以及用 Protocol Buffers 序列化訊息後透過 MQTT 發送。

Brotli 函式庫建置

Brotli 是 Google 開發的壓縮演算法,壓縮率比 gzip 更高,被瀏覽器廣泛支援(Content-Encoding: br)。Nginx 要支援它需要先有 libbrotli

FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install git wget autoconf automake gcc -y
RUN git clone https://github.com/bagder/libbrotli
WORKDIR libbrotli
RUN apt-get install libtool -y
RUN apt-get install --reinstall build-essential -y
RUN ./autogen.sh
RUN ./configure --prefix=/usr
RUN make && make install
RUN ldconfig

編譯完成後,就可以搭配 ngx_brotli 模組重新編譯 Nginx:

brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript;

Protobuf over MQTT

用 Protocol Buffers 取代 JSON 當 MQTT payload,訊息體積更小、解析更快,適合頻寬受限的 IoT 場景。

Schema

company.proto 定義一個 Employee 訊息:

package Company;

message Employee{
    optional    string      name = 1;
    optional    uint32      id = 2;
}

發布端

app.js 把物件序列化成 binary buffer 後發布到公開測試 broker:

var ProtoBuf = require("protobufjs");
var mqtt = require('mqtt');
var builder = ProtoBuf.load('./company.proto'),
    Company = builder.build('Company'),
    Employee = Company.Employee;

var employee = new Employee("James Bond", 007);
var buffer_message = employee.toBuffer();

var client = mqtt.connect('mqtt://test.mosquitto.org');

client.on('connect', function() {
   client.publish('MyCompany', buffer_message);
   client.end();
});

執行

npm install protobufjs mqtt
node app.js

訂閱端收到的是 binary,要用同一份 .proto 反序列化:

var decoded = Employee.decode(payload);
console.log(decoded.name, decoded.id);

版本注意

上面的 builder.build(...) 是 protobufjs 5.x 的 API。protobufjs 6 以後改成:

protobuf.load("company.proto", function(err, root) {
    var Employee = root.lookupType("Company.Employee");
    var buffer = Employee.encode({ name: "James Bond", id: 7 }).finish();
});

相關資源


← 回到 Web 網頁伺服器

本目錄檔案