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

时间:2017-03-24 20:19:08

标签: javascript node.js raspberry-pi parent-child

我正在使用在我的覆盆子pi上用Node JS编写的blynk客户端连接并验证blynk服务器。我有另一个我想要运行的进程,在保持连接到服务器和轮询按下按钮的同时扫描BLE信标。我让他们两个同时执行,但只有当我改变虚拟引脚“V0”的状态时才会进行通信。我是Node JS的新手,也许我误解了,但是,为什么一旦子进程进行身份验证就停止我的父进程,并且除非我改变状态“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)
        }

0 个答案:

没有答案