我如何保持subprocess在Node JS中运行和父进程通信?

我在我的树莓派上使用了一个用Node JS编写的blynk客户端,它连接并authentication了blynk服务器。 我有另一个进程,我想运行扫描BLE信号的同时保持连接到服务器和轮询button按下。 我让他们都在同一时间执行,但通信只有当我改变虚拟引脚“V0”的状态。 我是新的Node JS,也许我误解,但是,为什么一旦subprocess进行身份validation,它会停止我的父进程,并不会执行父进程的输出,除非我改变状态“V0”

//Parent Process var Bleacon = require('./index'); var uuid = '3247ff7d3f0d4b2c9df61189398eb85e'; var arr = []; var ledPin = 17; var math = require('mathjs'); var child_process=require('child_process'); const child = child_process.fork("doorlock.js"); console.log("child scanning..."); Bleacon.startScanning(uuid); Beacon() function Beacon() { Bleacon.on('discover', function(bleacon) { if (bleacon.uuid == uuid) { console.log("uuid matches"); if (bleacon.proximity == 'immediate') { console.log('immediate: ' + bleacon.rssi); arr.push(bleacon.rssi); //console.log(arr); //console.log(math.mean(arr)); if (arr.length>=20 && math.mean(arr)>=-65) { child.send('unlock door'); arr = []; } } else if (bleacon.proximity == 'near') { console.log('near: ' + bleacon.rssi); arr.push(bleacon.rssi); //console.log('avg rssi: ' + math.mean(arr)); //console.log(arr); if (arr.length>=20 && math.mean(arr)<=-65) { child.send('lock door'); arr = []; } } else { arr = []; } } //console.log('bleacon found: ' + JSON.stringify(bleacon)); }); } 

孩子的过程:

  #!/usr/bin/env node //Child Process //*** SMARTPHONE DOORLOCK ***// var unlockedState = 825; var lockedState = 2100; var motorPin = 18; var buttonPin = 4; var ledPin = 17; var blynkToken = '191d2e5c8f754fad9af08a3b9cc81eaa'; var arr = []; var len = 20; var Bleacon = require('./index'); var math = require('mathjs'); var uuid = '3247ff7d3f0d4b2c9df61189398eb85e'; // *** Start code *** // var locked = true; //Setup servo var Gpio = require('pigpio').Gpio, motor = new Gpio(motorPin, {mode: Gpio.OUTPUT}), button = new Gpio(buttonPin, { mode: Gpio.INPUT, pullUpDown: Gpio.PUD_DOWN, edge: Gpio.FALLING_EDGE }), led = new Gpio(ledPin, {mode: Gpio.OUTPUT}); //Setup blynk var Blynk = require('blynk-library'); var blynk = new Blynk.Blynk(blynkToken); var v0 = new blynk.VirtualPin(0); var v1 = new blynk.VirtualPin(1); console.log("locking door") lockDoor() process.on('message', function(message) { console.log('[child] received message from server:', message); if (message == 'unlock door') { console.log('I read from parent that I am to unlock the door'); } }); button.on('interrupt', function (level) { console.log("level: " + level + " locked: " + locked) if (level == 0) { if (locked) { unlockDoor() } else { lockDoor() } } }); v0.on('write', function(param) { console.log('V0:', param); if (param[0] === '0') { //unlocked unlockDoor() } else if (param[0] === '1') { //locked lockDoor() } else { blynk.notify("Door lock button was pressed with unknown parameter"); } }); blynk.on('connect', function() { //console.log("Blynk ready."); }); blynk.on('disconnect', function() { console.log("DISCONNECT"); }); function lockDoor() { motor.servoWrite(lockedState); led.digitalWrite(1); locked = true //notify blynk.notify("Door has been locked!"); //After 1.5 seconds, the door lock servo turns off to avoid stall current setTimeout(function(){motor.servoWrite(0)}, 1500) } function unlockDoor() { motor.servoWrite(unlockedState); led.digitalWrite(0); locked = false //notify blynk.notify("Door has been unlocked!"); //After 1.5 seconds, the door lock servo turns off to avoid stall current setTimeout(function(){motor.servoWrite(0)}, 1500) } 

Interesting Posts