Skip to content

Commit

Permalink
feat(bacnet-asn1): implement all BACNET string encodings
Browse files Browse the repository at this point in the history
  • Loading branch information
fh1ch committed Oct 8, 2017
1 parent 304f760 commit 14699e2
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 3 deletions.
8 changes: 5 additions & 3 deletions lib/bacnet-asn1.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,18 @@ var getEncodingType = function(encoding, decodingBuffer, decodingOffset) {
case baEnum.BacnetCharacterStringEncodings.CHARACTER_UTF8:
return 'utf8';
case baEnum.BacnetCharacterStringEncodings.CHARACTER_UCS2:
if ((decodingBuffer[decodingOffset] === 0xFF) && (decodingBuffer[decodingOffset + 1] === 0xFE)) {
if (decodingBuffer && decodingBuffer[decodingOffset] === 0xFF && decodingBuffer[decodingOffset + 1] === 0xFE) {
return 'ucs2';
}
return; //UCS-2BE
return 'UTF-16BE'; // Default to big-endian
case baEnum.BacnetCharacterStringEncodings.CHARACTER_ISO8859_1:
return 'latin1';
case baEnum.BacnetCharacterStringEncodings.CHARACTER_UCS4:
return 'utf8'; // HACK: There is currently no support for UTF-32
case baEnum.BacnetCharacterStringEncodings.CHARACTER_MS_DBCS:
return 'cp850';
case baEnum.BacnetCharacterStringEncodings.CHARACTER_JISX_0208:
return;
return 'Shift_JIS';
default:
return 'utf8';
}
Expand Down
72 changes: 72 additions & 0 deletions test/unit/bacnet-services.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,78 @@ describe('bacstack - Services layer', function() {
});
});

it('should successfully encode and decode a character-string value with UCS2 encoding', function() {
var buffer = utils.getBuffer();
baServices.encodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{type: 7, value: '', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_UCS2},
{type: 7, value: 'Test1234$äöü', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_UCS2}
]);
var result = baServices.decodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 7, value: '', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_UCS2, len: 2},
{type: 7, value: 'Test1234$äöü', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_UCS2, len: 27}
]
});
});

it('should successfully encode and decode a character-string value with Codepage850 encoding', function() {
var buffer = utils.getBuffer();
baServices.encodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{type: 7, value: '', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_MS_DBCS},
{type: 7, value: 'Test1234$äöü', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_MS_DBCS}
]);
var result = baServices.decodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 7, value: '', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_MS_DBCS, len: 2},
{type: 7, value: 'Test1234$äöü', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_MS_DBCS, len: 15}
]
});
});

it('should successfully encode and decode a character-string value with JISX-0208 encoding', function() {
var buffer = utils.getBuffer();
baServices.encodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{type: 7, value: '', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_JISX_0208},
{type: 7, value: 'できます', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_JISX_0208}
]);
var result = baServices.decodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 7, value: '', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_JISX_0208, len: 2},
{type: 7, value: 'できます', encoding: baEnum.BacnetCharacterStringEncodings.CHARACTER_JISX_0208, len: 11}
]
});
});

it('should successfully encode and decode a bit-string value', function() {
var buffer = utils.getBuffer();
baServices.encodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
Expand Down

0 comments on commit 14699e2

Please sign in to comment.