ບັນທຶກການສ້າງ MQTT broker ສຳລັບເຊື່ອມຕໍ່ອຸປະກອນ IOT ດ້ວຍ Nodejs
ສະບາຍດີທຸກຄົນຫ່າງຫາຍກັນໄປນານອັນເນື່ອງມາຈາກຜູ້ຂຽນຫຍຸງຍາກກັບບັນຫາສ່ວນໂຕ. ແລະມາມື້ນີ້ກໍ່ເປັນໂອກາດດີຈຶ່ງກັບມາ 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 ຄື 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
ອະທິບາຍ 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'); //certexports.mqttsetting = {
...
port: 1883
secure : {
port: 8883,
keyPath: SECURE_KEY,
certPath: SECURE_CERT
},
allowNonSecure: true
...
}
ມາເບິ່ງສ່ວນຂອງການຈັດການເລື່ອງຂອງ authenticate ແລະ authorize
mqttAuth.js
ເມື່ອ 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
run ດ້ວຍ command
$ node testmqtt.js
ຖ້າເຊື່ອມຕໍ່ສຳເລັດ ແລະ ບໍ່ມີບັນຫາໃດໆກໍ່ຈະໄດ້ຜົນຮັບດັ່ງນີ້
Connected
Current time is: Thu Sep 14 2017 23:53:38 GMT+0700 (SE Asia Standard Time)
ກໍ່ເປັນອັນວ່າ MQTT ຂອງເຮົາພ້ອມໃຊ້ງານແລ້ວທີ່ເຫຼືອກໍ່ແມ່ນການນຳໄປປະຍຸກໃຊ້ໃນການເຊື່ອມຕໍ່ອຸປະກ່ອນ IOT ຕ່າງໆ. ໂອເຄ!. ມາຮອດນີ້ກໍ່ເປັນອັນວ່າບົດຄວາມນີ້ຈົບລົງເທົ່ານີ້ ແລ້ວເຈີກັນໄໝ່ໃນບົດຄວາມໝ້າ.