ບັນທຶກການສ້າງ MQTT broker ສຳລັບເຊື່ອມຕໍ່ອຸປະກອນ IOT ດ້ວຍ Nodejs

xangnam phiasakha
VtCamp
Published in
3 min readMay 19, 2018
why?

ສະບາຍດີທຸກຄົນຫ່າງຫາຍກັນໄປນານອັນເນື່ອງມາຈາກຜູ້ຂຽນຫຍຸງຍາກກັບບັນຫາສ່ວນໂຕ. ແລະມາມື້ນີ້ກໍ່ເປັນໂອກາດດີຈຶ່ງກັບມາ update blog ຂອງຕົວເອງ ໂດຍຈະມາ share ຄວາມຮູ້ໃນການສ້າງ MQTT broker ທີ່ໃຊ້ເຊື່ອມຕໍ່ອຸປະກອນ IOT ຕ່າງໆໃຫ້ສາມາດລົມກັນໄດ້ຢ່າງສະດວກແລະໄດ້ມາດຕະຖານ.

ແມ່ນຫຍັງຄື MQTT

MQTT ຫຍໍ້ມາຈາກ Message Queue Telemetry Transport ເປັນ protocol ໃນການເຊື່ອມຕໍ່ແບບ machine-to-machine (M2M) ທີ່ຖືກພັດທະນາເພື່ອໃຊ້ງານກັບ "Internet Of Things" ທີ່ເຮັດໃຫ້ອຸປະກອນທີ່ເປັນ IOT ສາມາດສື່ສານກັນໄດ້ຢ່າງມີປະສິດຕິພາບໂດຍໃຊ້ concept publish/subscribe ໃນສົ່ງ ແລະ ຮັບຂໍ້ມູນ (ຄ້າຍໆການ chat ລົມກັນ)
MQTT ຈະມີສອງຟ່າຍຄື MQTT broker ແລະ MQTT Client. ເຊິ່ງ MQTT Client ຈະເປັນຟ່າຍທີ່ຕິດຕໍ່ເຂົ້າໄປທີ່ MQTT broker ຫຼັງຈາກນັ້ນ MQTT broker ຈະເປັນຕົວກາງກະຈາຍ Message ຕ່າງໆຂອງ Client ຕາມການ subscribe.

ເຫດຜົນທີ່ຕ້ອງສ້າງ MQTT broker ຂຶ້ນມາໃຊ້ເອງ

MQTT broker ຄື server ທີ່ເປັນຕົວກາງໃນການສື່ສານລະຫວ່າງອຸປະກອນ IOT ເຊິ່ງໃນປັດຈຸບັນມີໃຫ້ເລືອກໃຊ້ກັນຢ່າງຫຼວງຫຼາຍຕົວຢ່າງເຊັ່ນ : Netpie, Thingker ໃນຂະນະທີ່ຜູ້ຂຽນໄດ້ພັດທະນາລະບົບ IOT ໂດຍໃຊ້ Netpie ທີ່ເປັນຂອງປະເທດເພື່ອນບ້ານ (Thailand) ເຊິ່ງຖືໄດ້ວ່າເຮັດອອກມາໄດ້ດີ ແລະ ມີ library ໃຫ້ໃຊ້ສະດວກສະບາຍ
ໃນການ coding ເຊື່ອມຕໍ່ກັບລະບົບ. ແຕ່ວ່າມີຂໍ້ດີກໍ່ມີຂໍ້ເສຍນັ້ນກໍ່ຄືເລື່ອງຂອງລາຄາທີ່ແພງຫູດັບຕັບໄໝກັນເລີຍທີ່ດຽວຖ້າຈະນຳໄປພັດທະນາເປັນ Production ທີ່ເນັ້ນຈຳນວນຫຼາຍໆນັ້ນຈະເຮັດໃຫ້ຕົ້ນທືນສິ້ນຄ້າສູງເກີນໄປທີ່ຈະຈ່າຍ ດັງນັ່ນຜູ້ຂຽນຈື່ງຄິດສ້າງ MQTT broker ຂຶ້ນມາໃຊ້ເອງເພາະຜູ້ຂຽນຕ້ອງການແຕ່ການເຊື່ອມຕໍ່ອຸປະກອນ IOT ດ້ວຍ MQTT protocol ເທົ່ານັ້ນບໍ່ຕ້ອງການໜ້າເວັບຈັດການໃດໆ.ແຕ່ມັນກໍ່ລຳບາກໃນການ coding ສົມຄວນ.

ມາສ້າງ MQTT broker ກັນເລີຍ

software ທີ່ນຳມາສ້າງ mqtt broker ທີ່ໄດ້ຮັບຄວາມນິຍົມສູງ ແລະ ເປັນ open source ມີສອງເຈົ້າໃຫຍ່ໆຄື : mosquitto ແລະ mosca ແລະ ພິເສດສຳລັບ Mosca ທີ່ຖືກພັດທະນາດ້ວຍ Nodejs ຍໍ້າອີກຄັ້ງ Nodejs ຜູ້ຂຽນມັກ nodejs ຢູ່ແລ້ວດັ່ງນັ້ນຜູ້ຂຽນຈຶ່ງເລືອກໃຊ້ mosca ໃນການສ້າງ mqtt broker ຜູ້ອ່ານສາມາດໃຊ້ຕົວອື່ນກໍ່ໄດ້ບໍ່ວ່າກັນ.

ກ່ອນຈະເລີ່ມຕ້ອງແນ່ໃຈວ່າຜູ້ອ່ານມີຄວາມຮູ້ເລື່ອງ nodejs ມາສົມຄວນເພາະຄ້ານອະທິບາຍຫຼາຍ! ເມື່ອຍ! (ອຸຄິ ອຸຄິ).

  • ຕິດຕັ້ງ mosca ມະຫາກາບແມງວັນຫົວຂຽວ

mosca ສາມາຕິດຕັ້ງໄດ້ສອງແບບຄື Standalone ແລະ Embedded.

Standalone

npm install mosca pino -g
mosca -v | pino

Embedded

npm install mosca --save ຫຼື yarn add mosca

ສຳລັບ Standalone ນັ້ນຈະເຮັດວຽກດ້ວຍການສັ່ງງານຜ່ານ command line ຖ້າໃຜມັກໃຊ້ແບບ command line ກໍ່ຈັດໄປຢ່າໃຫ້ເສຍ. ແຕ່ສຳລັບຜູ້ຂຽນມັກ coding ຫຼາຍກວ່າດັ່ງນັ້ນຈຶ່ງເລືອກເອົາ Embedded install ແລະ ດຳເນີນການ coding ໄດ້ເລີຍ.

ກ່ອນການ coding ເຮົາມາວ່າງໂຄງສ້າງ ແລະ ຄຸນສົມບັດຂອງ MQTT broker ຂອງເຮົາເສຍກ່ອນເຊິ່ງຜູ້ຂຽນໄດ້ວ່າງຄຸນສົມບັດຂອງ MQTT broker ດັ່ງນີ້:

  • ເຮັດວຽກໃນ port ມາດຕະຖານຄື 1883
  • ຕ້ອງມີການ Authentication ກ່ອນການເຂົ້າໃຊ້ງານ broker ແລະ ການ authorization Topic ຕາມ user ທີ່ເຂົ້າໃຊ້ງານ
  • Support ການເຊື່ອມຕໍ່ແບບ LTS/SSL ຜ່ານ port 8883

ເມື່ອກຳນົດຄຸນສົມບັດຂອງ broker ແລ້ວກໍ່ມາ coding.

start.js

start.js running mqtt broker

start.js ຄື js file ທີ່ເຮົາຈະໃຊ້ run MQTT broker ຂອງເຮົາຂຶ້ນມາໃຊ້ງານ ໃນນີ້ຈະເຫັນ var server = new mosca.Server(setting.mqttsetting); ໃຫ້ສັ່ງເກດວ່າຕ້ອງມີການສົ່ງຜ່ານ JavaScript object ເຂົ້າໄປໃນ constructor ແລະ ສ່ວນຂອງການ Authentication/authorization

// fired when the mqtt server is ready
function setup() {
console.log('Mosca server is up and running');
server.authenticate = authentication.authenticate;
server.authorizePublish = authentication.authorizePublish;
server.authorizeSubscribe = authentication.authorizeSubscribe;
}

ກ່ອນອຶ່ນ ເຮົາມາເບິ່ງສ່ວນຂອງການ setting MQTT broker

mqttConfig.js

config mqtt broker

ອະທິບາຍ code ໃນສ່ວນຂອງການຕັ້ງຄ່າ MQTT broker

var mongodb_url = "";if(process.env.NODE_ENV === 'production'){
mongodb_url = "mongodb://xangnam:passwd@mongodb:27017/mqtt";
}else{
mongodb_url = "mongodb://localhost:27017/mqtt";
}
var ascoltatore = {
//using ascoltatore
type: 'mongo',
url: mongodb_url,
pubsubCollection: 'pubsub',
mongo: {}
};

ເມື່ອເຫັນ code ຈະເຫັນວ່າມີການເຊື່ອມຕໍ່ຖານຂໍ້ມູນເຊິ່ງໃນທີ່ນີ້ຜູ້ຂຽນໃຊ້ Mongodb ເປັນຖານຂໍ້ມູນໃນການເກັບຂໍ້ມູນຕ່າງໆຂອງ broker
ແລ້ວກຳນົດລົງ backend key ໃນສ່ວນຂອງ setting ດັ່ງສະແດງຢູ່ລຸ່ມນີ້

exports.mqttsetting = {
port: 1883,
backend: ascoltatore,
persistence: {
factory: mosca.persistence.Mongo,
url: mongodb_url
},
logger: {
name: "secureBroker",
level: 40,
},
...
}

code ລຸ່ມນີ້ສະແດງການຕັ້ງຄ່າໃຫ້ MQTT broker ຂອງເຮົາໃຊ້ການເຊື່ອມຕໍ່ແບບ TLS/SSL ຜ່ານ port 8883

var SECURE_KEY = path.join(__dirname ,'/secure' ,'/parallel.key'); // cert key
var SECURE_CERT = path.join(__dirname ,'/secure','/parallel.crt'); //cert
exports.mqttsetting = {
...
port: 1883
secure : {
port: 8883,
keyPath: SECURE_KEY,
certPath: SECURE_CERT
},
allowNonSecure: true
...
}

ມາເບິ່ງສ່ວນຂອງການຈັດການເລື່ອງຂອງ authenticate ແລະ authorize

mqttAuth.js

mqtt authentication

ເມື່ອ coding ທຸກຢ່າງສຳເລັດ ກໍ່ເປັນການນຳໄປ deploy ເຊິ່ງຜູ້ຂຽນໃຊ້ການ deploy ແບບ micro service ດ້ວຍ Docker ວ່າແລ້ວກໍ່ສ້າງ
Dockerfile ກັນເລີຍ.

ແລ້ວກໍ່ build ໃຫ້ມັນເປັນ Image ດ້ວຍ command

$ docker build -t xang/mqtt .

ຫຼັງຈາກ build ສຳເລັດກໍ່ run ແຕ່ລະ node ຂຶ້ນມາເຊິ່ງປະກອບມີ 2 node ດ້ວຍກັນຄື :

  • mongodb
  • mqtt

mongodb

$ docker run -d \
--restart="always" \
--name mqtt_db \
-e MONGODB_USER="xang" \
-e MONGODB_DATABASE="mqtt" \
-e MONGODB_PASS="passwd" \
-v /etc/localtime:/etc/localtime \
-v /var/data_server/db:/data/db \
tutum/mongodb

mqtt broker

$ docker run -d --name broker -p 1883:1883 -p 8883:8883 --link mqtt_db:mongodb xang/mqtt:latest

ເມື່ອທຸກຢ່າງສຳເລັດບໍ່ມີ error ຫຍັງເກີດຂຶ້ນກໍ່ເປັນເວລາທົດສອບຕິດຕໍ່ເຂົ້າໄປຫາ broker ຂອງເຮົາໂດຍໃຊ້ MQTT Client ທີ່ support ຫຼາຍພາສາແຕ່ຜູ້ຂຽນຂໍ້ເລືອກໃຊ້ nodejs ແລະໃຊ້ MQTT.js module ເປັນ mqtt client
ວ່າແລ້ວກໍ່ຕິດຕາມ code ລຸ່ມນີ້.

testmqtt.js

test connect mqtt broker

run ດ້ວຍ command

$ node testmqtt.js

ຖ້າເຊື່ອມຕໍ່ສຳເລັດ ແລະ ບໍ່ມີບັນຫາໃດໆກໍ່ຈະໄດ້ຜົນຮັບດັ່ງນີ້

Connected
Current time is: Thu Sep 14 2017 23:53:38 GMT+0700 (SE Asia Standard Time)

ກໍ່ເປັນອັນວ່າ MQTT ຂອງເຮົາພ້ອມໃຊ້ງານແລ້ວທີ່ເຫຼືອກໍ່ແມ່ນການນຳໄປປະຍຸກໃຊ້ໃນການເຊື່ອມຕໍ່ອຸປະກ່ອນ IOT ຕ່າງໆ. ໂອເຄ!. ມາຮອດນີ້ກໍ່ເປັນອັນວ່າບົດຄວາມນີ້ຈົບລົງເທົ່ານີ້ ແລ້ວເຈີກັນໄໝ່ໃນບົດຄວາມໝ້າ.

--

--