Нужен пример работы взаимосвязанных датчиков, т.е. когда один датчик запускает действие / работу другого - PullRequest
0 голосов
/ 23 мая 2018

Мне нужен пример работы взаимосвязанных датчиков.

Например:

  1. Устройство X отправляет событие платформе C8Y, платформа запрашивает данные или запускает некоторую процедуруустройство Y,
  2. Устройство X напрямую запускает устройство Y для сбора данных или запуска процедуры.

1 Ответ

0 голосов
/ 21 июня 2018

Каталин.Я не уверен, почему ваш вопрос получил отрицательные отзывы.Это имеет смысл для меня.

Вы найдете большую часть того, что ищете, на http://cumulocity.com/guides/reference/real-time-notifications/.. Вам необходимо выполнить рукопожатие, подписаться и подключиться, чтобы получать уведомления от другого устройства.В моем случае мне также пришлось выполнить поиск от внешнего идентификатора устройства до его идентификатора c8y, чтобы я мог предоставить правильную строку подписки.Вот некоторый код Node.js, который показывает все это:

const superagent = require('superagent')
const WebSocket = require('ws')
var ws = new WebSocket('ws://tenant.cumulocity.com/cep/realtime', {
    perMessageDeflate: false
})

// process websocket messages
ws.on('message', function incoming(data) {
    res = JSON.parse(data)
    if( res[0].channel === '/meta/handshake' ) {
        // process successful handshake
        wsClientId = res[0].clientId
        console.log('wsClientId = ' + wsClientId)
    } else if( res[0].channel === '/meta/subscribe' ) {
        // nothing to do here
    } else {
        // this is where you get the measurements from devices you are subscribed to
    }
}


function lookupDevice(serialNumber) {
  superagent.get(`https://tenant.cumulocity.com/identity/externalIds/c8y_Serial/${serialNumber}`)
    .set('Authorization', 'Basic ' + basicAuthBase64)
    .then(function (res) {
        success = res.statusCode
        if (success == 200) {
            devId = res.body.managedObject.id
            return devId
        } else {
            return null
        }
    })
}

async function wsHandshake() {
    let request = [{
        "channel": "/meta/handshake",
        "ext": {
            "com.cumulocity.authn": {
                "token": "bGVlLmdyZXl...6cXdlcjQzMjE="
            }
        },
        "version": "1.0",
        "mininumVersion": "1.0beta",
        "supportedConnectionTypes": ["websocket"],
        "advice": {"timeout": 120000, "interval": 30000}
    }]
    ws.send(JSON.stringify(request), function ack(err) {
        if( err )
            console.log('wsHandshake returned error '+err)
    })
}

async function wsSubscribe(subscriptionPath) {
    let request = [{
            "channel": "/meta/subscribe",
            "clientId": wsClientId,
            "subscription": subscriptionPath,
    }]
    ws.send(JSON.stringify(request), function ack(err) {
        if( err )
            console.log('wsSubscribe returned error '+err)
    })
}

async function wsConnect() {
    let request = [{
            "channel": "/meta/connect",
            "clientId": wsClientId,
            'connectionType': 'websocket',
            "advice": {"timeout":1200000,"interval":30000},
    }]
    ws.send(JSON.stringify(request), function ack(err) {
        if( err )
            console.log('wsConnect returned error '+err)
    })
}

// this is sort of pseudo-code that does not properly handle the asynchronous aspects of the flow
await wsHandshake()
let devId = lookupDevice('ABC123')
await wsSubscribe(`/measurements/${devId}`)
wsConnect()

Обратите внимание, что я извлек это из более крупной реализации, поэтому я не гарантирую, что вы можете вставить это и запустить его как есть,Но он должен предоставить вам основу для того, как выполнить то, что вам нужно.

Обратите внимание, что в верхней части веб-страницы уведомлений показано, что вы можете подписаться на несколько различных типов уведомлений, а не только измерения, какпоказано здесь.

...