需要互连传感器工作的示例,即当一个传感器触发另一个传感器的动作/工作时
Need example of working of interconnected sensors, i.e. when one sensor is triggering action/ work of the other
我需要一个互连传感器工作的示例。
例如:
- 设备
X
向C8Y
平台发送事件,平台请求数据或触发某些程序设备Y
,
- 设备
X
直接触发设备Y
收集数据或运行程序。
卡塔林。我不确定为什么你的问题会被否决。这对我来说很有意义。
您会在 http://cumulocity.com/guides/reference/real-time-notifications/ 找到您要找的大部分内容。您需要进行握手、订阅和连接才能从另一台设备获取通知。在我的例子中,我还必须从设备的外部 ID 到它的 c8y ID 进行查找,以便我可以提供正确的订阅字符串。这里有一些 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()
请注意,我是从一个更大的实现中提取的,因此我不保证您可以按原样粘贴和 运行。但它应该为您提供一个框架,帮助您完成所追求的目标。
请注意,在“通知”网页的顶部,它显示您可以订阅多种不同的通知类型,而不仅仅是此处显示的测量值。
我需要一个互连传感器工作的示例。
例如:
- 设备
X
向C8Y
平台发送事件,平台请求数据或触发某些程序设备Y
, - 设备
X
直接触发设备Y
收集数据或运行程序。
卡塔林。我不确定为什么你的问题会被否决。这对我来说很有意义。
您会在 http://cumulocity.com/guides/reference/real-time-notifications/ 找到您要找的大部分内容。您需要进行握手、订阅和连接才能从另一台设备获取通知。在我的例子中,我还必须从设备的外部 ID 到它的 c8y ID 进行查找,以便我可以提供正确的订阅字符串。这里有一些 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()
请注意,我是从一个更大的实现中提取的,因此我不保证您可以按原样粘贴和 运行。但它应该为您提供一个框架,帮助您完成所追求的目标。
请注意,在“通知”网页的顶部,它显示您可以订阅多种不同的通知类型,而不仅仅是此处显示的测量值。