Skip to content

Commit 2a3f481

Browse files
Merge pull request #629 from thomasnordquist/dubyte/add_sparkplug
Add sparkplug b support
2 parents f8f1ddf + ed492cc commit 2a3f481

File tree

14 files changed

+5170
-5380
lines changed

14 files changed

+5170
-5380
lines changed

app/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
"d3-shape": "^1.3.5",
2929
"diff": "^4.0.1",
3030
"dot-prop": "^5.0.0",
31-
"file-loader": "6",
3231
"get-value": "^3.0.1",
3332
"immutable": "^4.0.0-rc.12",
3433
"in-viewport": "^3.6.0",
@@ -73,6 +72,7 @@
7372
"chai": "^4.2.0",
7473
"cross-env": "^7.0.2",
7574
"css-loader": "^3.0.0",
75+
"file-loader": "^6.2.0",
7676
"html-webpack-plugin": "^5.5.0",
7777
"lodash": "^4.17.21",
7878
"mocha": "^9.2.1",
@@ -90,4 +90,4 @@
9090
"peerDependencies": {
9191
"electron": "^17"
9292
}
93-
}
93+
}

app/src/components/Sidebar/ValueRenderer/ActionButtons.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function ActionButtons(props: {
4040
</Tooltip>
4141
</ToggleButton>
4242
<ToggleButton className={props.classes.toggleButton} value="raw" id="valueRendererDisplayMode-raw">
43-
<Tooltip title="Raw / formatted JSON">
43+
<Tooltip title="Raw / formatted JSON / formatted sparkplugb protojson">
4444
<span>
4545
<Reorder className={props.classes.toggleButtonIcon} />
4646
</span>

app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import CodeDiff from '../CodeDiff'
44
import { AppState } from '../../../reducers'
55
import { Base64Message } from '../../../../../backend/src/Model/Base64Message'
66
import { connect } from 'react-redux'
7-
import { default as ReactResizeDetector } from 'react-resize-detector'
87
import { ValueRendererDisplayMode } from '../../../reducers/Settings'
9-
import { Typography, Fade, Grow } from '@material-ui/core'
8+
import { Fade } from '@material-ui/core'
9+
import { Decoder } from '../../../../../backend/src/Model/Decoder'
1010

1111
interface Props {
1212
message: q.Message
@@ -83,7 +83,10 @@ class ValueRenderer extends React.Component<Props, State> {
8383
}
8484

8585
public render() {
86-
return <div style={{ padding: '0px 0px 8px 0px', width: '100%' }}>{this.renderValue()}</div>
86+
return <div style={{ padding: '0px 0px 8px 0px', width: '100%' }}>
87+
{this.props.message?.payload?.decoder === Decoder.SPARKPLUG && "Decoded SparkplugB"}
88+
{this.renderValue()}
89+
</div>
8790
}
8891

8992
public renderValue() {

app/src/components/TopicPlot.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ function nodeToHistory(startTime: number | undefined, history: q.MessageHistory)
3737
function nodeDotPathToHistory(startTime: number | undefined, history: q.MessageHistory, dotPath: string) {
3838
return filterUsingTimeRange(startTime, history.toArray())
3939
.map((message: q.Message) => {
40-
let json = {}
40+
let json: any = {}
4141
try {
4242
json = message.payload ? JSON.parse(Base64Message.toUnicodeString(message.payload)) : {}
43-
} catch (ignore) {}
43+
} catch (ignore) { }
4444

4545
const value = dotProp.get(json, dotPath)
4646

app/yarn.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2054,13 +2054,13 @@ faye-websocket@^0.11.3:
20542054
dependencies:
20552055
websocket-driver ">=0.5.1"
20562056

2057-
file-loader@6:
2058-
version "6.0.0"
2059-
resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz"
2060-
integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==
2057+
file-loader@^6.2.0:
2058+
version "6.2.0"
2059+
resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz"
2060+
integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
20612061
dependencies:
20622062
loader-utils "^2.0.0"
2063-
schema-utils "^2.6.5"
2063+
schema-utils "^3.0.0"
20642064

20652065
fill-range@^7.0.1:
20662066
version "7.0.1"
@@ -3766,7 +3766,7 @@ schema-utils@^2.6.5:
37663766
ajv "^6.12.0"
37673767
ajv-keywords "^3.4.1"
37683768

3769-
schema-utils@^3.1.0, schema-utils@^3.1.1:
3769+
schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
37703770
version "3.1.1"
37713771
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
37723772
integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==

backend/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
"fs-extra": "^8.0.1",
4343
"js-base64": "^2.5.1",
4444
"lowdb": "^1.0.0",
45-
"mqtt": "^3.0.0"
45+
"mqtt": "^3.0.0",
46+
"protobufjs": "~6.11.2",
47+
"long": "^4.0.0"
4648
}
4749
}

backend/src/Model/Base64Message.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
const { Base64 } = require('js-base64')
1+
import { Base64 } from 'js-base64'
2+
import { Decoder } from './Decoder'
23

34
export class Base64Message {
45
private base64Message: string
56
private unicodeValue: string
6-
7+
public decoder: Decoder
78
public length: number
89

910
private constructor(base64Str: string) {
1011
this.base64Message = base64Str
1112
this.unicodeValue = Base64.decode(base64Str)
1213
this.length = base64Str.length
14+
this.decoder = Decoder.NONE
1315
}
1416

1517
public static toUnicodeString(message: Base64Message) {

backend/src/Model/Decoder.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum Decoder {
2+
NONE,
3+
SPARKPLUG
4+
}

backend/src/Model/sparkplugb.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { readFileSync } from 'fs'
2+
import * as protobuf from 'protobufjs'
3+
import { Base64Message } from './Base64Message';
4+
import { Decoder } from './Decoder';
5+
6+
const buffer = readFileSync(require.resolve('../../../../res/sparkplug_b.proto'));
7+
const root = protobuf.parse(buffer.toString()).root
8+
export let SparkplugPayload = root.lookupType('com.cirruslink.sparkplug.protobuf.Payload')
9+
10+
export const SparkplugDecoder = {
11+
decode(input: Buffer): Base64Message | undefined {
12+
try {
13+
let message = Base64Message.fromString(
14+
JSON.stringify(
15+
SparkplugPayload.toObject(SparkplugPayload.decode(new Uint8Array(input)))
16+
)
17+
)
18+
message.decoder = Decoder.SPARKPLUG
19+
return message
20+
} catch {
21+
// ignore
22+
}
23+
}
24+
}

backend/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
makePublishEvent,
1111
removeConnection,
1212
} from '../../events'
13+
import { SparkplugDecoder } from './Model/sparkplugb'
1314

1415
export class ConnectionManager {
1516
private connections: { [s: string]: DataSource<any> } = {}
@@ -48,7 +49,7 @@ export class ConnectionManager {
4849

4950
backendEvents.emit(messageEvent, {
5051
topic,
51-
payload: Base64Message.fromBuffer(buffer),
52+
payload: SparkplugDecoder.decode(buffer) ?? Base64Message.fromBuffer(buffer),
5253
qos: packet.qos,
5354
retain: packet.retain,
5455
messageId: packet.messageId,

0 commit comments

Comments
 (0)