Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00018 #ifndef _MBUS_PROTOCOL_H_
00019 #define _MBUS_PROTOCOL_H_
00020
00021 #include <stdlib.h>
00022 #include <sys/types.h>
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 typedef struct _mbus_frame {
00069
00070 u_char start1;
00071 u_char length1;
00072 u_char length2;
00073 u_char start2;
00074 u_char control;
00075 u_char address;
00076 u_char control_information;
00077
00078 u_char checksum;
00079 u_char stop;
00080
00081 u_char data[252];
00082 size_t data_size;
00083
00084 int type;
00085
00086
00087
00088 } mbus_frame;
00089
00090 typedef struct _mbus_slave_data {
00091
00092 int state_fcb;
00093 int state_acd;
00094
00095 } mbus_slave_data;
00096
00097 #define NITEMS(x) (sizeof(x)/sizeof(x[0]))
00098
00099
00100
00101
00102
00103
00104 #define MBUS_DIB_DIF_EXTENSION_BIT 0x80
00105 #define MBUS_DIB_VIF_EXTENSION_BIT 0x80
00106
00107 typedef struct _mbus_data_information_block {
00108
00109 u_char dif;
00110 u_char dife[10];
00111 size_t ndife;
00112
00113 } mbus_data_information_block;
00114
00115 typedef struct _mbus_value_information_block {
00116
00117 u_char vif;
00118 u_char vife[10];
00119 size_t nvife;
00120
00121 } mbus_value_information_block;
00122
00123 typedef struct _mbus_data_record_header {
00124
00125 mbus_data_information_block dib;
00126 mbus_value_information_block vib;
00127
00128 } mbus_data_record_header;
00129
00130 typedef struct _mbus_data_record {
00131
00132 mbus_data_record_header drh;
00133
00134 u_char data[234];
00135 size_t data_len;
00136
00137 void *next;
00138
00139 } mbus_data_record;
00140
00141
00142
00143
00144 typedef struct _mbus_data_variable_header {
00145
00146
00147
00148
00149
00150
00151
00152 u_char id_bcd[4];
00153 u_char manufacturer[2];
00154 u_char version;
00155 u_char medium;
00156 u_char access_no;
00157 u_char status;
00158 u_char signature[2];
00159
00160 } mbus_data_variable_header;
00161
00162
00163
00164
00165 typedef struct _mbus_data_variable {
00166
00167 mbus_data_variable_header header;
00168
00169 mbus_data_record *record;
00170 size_t nrecords;
00171
00172 u_char *data;
00173 size_t data_len;
00174
00175
00176 u_char mdh;
00177 u_char *mfg_data;
00178 size_t mfg_data_len;
00179
00180 } mbus_data_variable;
00181
00182
00183
00184
00185 typedef struct _mbus_data_fixed {
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 u_char id_bcd[4];
00200 u_char tx_cnt;
00201 u_char status;
00202 u_char cnt1_type;
00203 u_char cnt2_type;
00204 u_char cnt1_val[4];
00205 u_char cnt2_val[4];
00206
00207 } mbus_data_fixed;
00208
00209
00210
00211
00212 #define MBUS_DATA_TYPE_FIXED 1
00213 #define MBUS_DATA_TYPE_VARIABLE 2
00214 typedef struct _mbus_frame_data {
00215
00216 mbus_data_variable data_var;
00217 mbus_data_fixed data_fix;
00218
00219 int type;
00220
00221 } mbus_frame_data;
00222
00223
00224
00225
00226 typedef struct _mbus_data_secondary_address {
00227
00228
00229
00230
00231
00232
00233
00234 u_char id_bcd[4];
00235 u_char manufacturer[2];
00236 u_char version;
00237 u_char medium;
00238
00239 } mbus_data_secondary_address;
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 #define MBUS_FRAME_TYPE_ANY 0x00
00253 #define MBUS_FRAME_TYPE_ACK 0x01
00254 #define MBUS_FRAME_TYPE_SHORT 0x02
00255 #define MBUS_FRAME_TYPE_CONTROL 0x03
00256 #define MBUS_FRAME_TYPE_LONG 0x04
00257
00258 #define MBUS_FRAME_ACK_BASE_SIZE 1
00259 #define MBUS_FRAME_SHORT_BASE_SIZE 5
00260 #define MBUS_FRAME_CONTROL_BASE_SIZE 9
00261 #define MBUS_FRAME_LONG_BASE_SIZE 9
00262
00263 #define MBUS_FRAME_BASE_SIZE_ACK 1
00264 #define MBUS_FRAME_BASE_SIZE_SHORT 5
00265 #define MBUS_FRAME_BASE_SIZE_CONTROL 9
00266 #define MBUS_FRAME_BASE_SIZE_LONG 9
00267
00268 #define MBUS_FRAME_FIXED_SIZE_ACK 1
00269 #define MBUS_FRAME_FIXED_SIZE_SHORT 5
00270 #define MBUS_FRAME_FIXED_SIZE_CONTROL 6
00271 #define MBUS_FRAME_FIXED_SIZE_LONG 6
00272
00273
00274
00275
00276 #define MBUS_FRAME_ACK_START 0xE5
00277 #define MBUS_FRAME_SHORT_START 0x10
00278 #define MBUS_FRAME_CONTROL_START 0x68
00279 #define MBUS_FRAME_LONG_START 0x68
00280 #define MBUS_FRAME_STOP 0x16
00281
00282
00283
00284
00285 #define MBUS_MAX_PRIMARY_SLAVES 256
00286
00287
00288
00289
00290 #define MBUS_CONTROL_FIELD_DIRECTION 0x07
00291 #define MBUS_CONTROL_FIELD_FCB 0x06
00292 #define MBUS_CONTROL_FIELD_ACD 0x06
00293 #define MBUS_CONTROL_FIELD_FCV 0x05
00294 #define MBUS_CONTROL_FIELD_DFC 0x05
00295 #define MBUS_CONTROL_FIELD_F3 0x04
00296 #define MBUS_CONTROL_FIELD_F2 0x03
00297 #define MBUS_CONTROL_FIELD_F1 0x02
00298 #define MBUS_CONTROL_FIELD_F0 0x01
00299
00300 #define MBUS_CONTROL_MASK_SND_NKE 0x40
00301 #define MBUS_CONTROL_MASK_SND_UD 0x53
00302 #define MBUS_CONTROL_MASK_REQ_UD2 0x5B
00303 #define MBUS_CONTROL_MASK_REQ_UD1 0x5A
00304 #define MBUS_CONTROL_MASK_RSP_UD 0x08
00305
00306 #define MBUS_CONTROL_MASK_FCB 0x20
00307 #define MBUS_CONTROL_MASK_FCV 0x10
00308
00309 #define MBUS_CONTROL_MASK_ACD 0x20
00310 #define MBUS_CONTROL_MASK_DFC 0x10
00311
00312 #define MBUS_CONTROL_MASK_DIR 0x40
00313 #define MBUS_CONTROL_MASK_DIR_M2S 0x40
00314 #define MBUS_CONTROL_MASK_DIR_S2M 0x00
00315
00316
00317
00318
00319 #define MBUS_ADDRESS_BROADCAST_REPLY 0xFE
00320 #define MBUS_ADDRESS_BROADCAST_NOREPLY 0xFF
00321 #define MBUS_ADDRESS_NETWORK_LAYER 0xFD
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 #define MBUS_CONTROL_INFO_DATA_SEND 0x51
00347 #define MBUS_CONTROL_INFO_DATA_SEND_MSB 0x55
00348 #define MBUS_CONTROL_INFO_SELECT_SLAVE 0x52
00349 #define MBUS_CONTROL_INFO_SELECT_SLAVE_MSB 0x56
00350 #define MBUS_CONTROL_INFO_APPLICATION_RESET 0x50
00351 #define MBUS_CONTROL_INFO_SYNC_ACTION 0x54
00352 #define MBUS_CONTROL_INFO_SET_BAUDRATE_300 0xB8
00353 #define MBUS_CONTROL_INFO_SET_BAUDRATE_600 0xB9
00354 #define MBUS_CONTROL_INFO_SET_BAUDRATE_1200 0xBA
00355 #define MBUS_CONTROL_INFO_SET_BAUDRATE_2400 0xBB
00356 #define MBUS_CONTROL_INFO_SET_BAUDRATE_4800 0xBC
00357 #define MBUS_CONTROL_INFO_SET_BAUDRATE_9600 0xBD
00358 #define MBUS_CONTROL_INFO_SET_BAUDRATE_19200 0xBE
00359 #define MBUS_CONTROL_INFO_SET_BAUDRATE_38400 0xBF
00360 #define MBUS_CONTROL_INFO_REQUEST_RAM_READ 0xB1
00361 #define MBUS_CONTROL_INFO_SEND_USER_DATA 0xB2
00362 #define MBUS_CONTROL_INFO_INIT_TEST_CALIB 0xB3
00363 #define MBUS_CONTROL_INFO_EEPROM_READ 0xB4
00364 #define MBUS_CONTROL_INFO_SW_TEST_START 0xB6
00365
00366 #define MBUS_CONTROL_INFO_RESP_FIXED 0x73
00367 #define MBUS_CONTROL_INFO_RESP_FIXED_MSB 0x77
00368
00369 #define MBUS_CONTROL_INFO_RESP_VARIABLE 0x72
00370 #define MBUS_CONTROL_INFO_RESP_VARIABLE_MSB 0x73
00371
00372
00373
00374
00375 #define MBUS_DATA_FIXED_STATUS_FORMAT_MASK 0x80
00376 #define MBUS_DATA_FIXED_STATUS_FORMAT_BCD 0x00
00377 #define MBUS_DATA_FIXED_STATUS_FORMAT_INT 0x80
00378 #define MBUS_DATA_FIXED_STATUS_DATE_MASK 0x40
00379 #define MBUS_DATA_FIXED_STATUS_DATE_STORED 0x40
00380 #define MBUS_DATA_FIXED_STATUS_DATE_CURRENT 0x00
00381
00382
00383
00384
00385
00386 #define MBUS_DATA_RECORD_DIF_MASK_INST 0x00
00387 #define MBUS_DATA_RECORD_DIF_MASK_MIN 0x10
00388
00389 #define MBUS_DATA_RECORD_DIF_MASK_TYPE_INT32 0x04
00390 #define MBUS_DATA_RECORD_DIF_MASK_STORAGE_NO 0x40
00391 #define MBUS_DATA_RECORD_DIF_MASK_EXTENTION 0x80
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401 #define MBUS_VARIABLE_DATA_MEDIUM_OTHER 0x00
00402 #define MBUS_VARIABLE_DATA_MEDIUM_OIL 0x01
00403 #define MBUS_VARIABLE_DATA_MEDIUM_ELECTRICITY 0x02
00404 #define MBUS_VARIABLE_DATA_MEDIUM_GAS 0x03
00405 #define MBUS_VARIABLE_DATA_MEDIUM_HEAT 0x04
00406 #define MBUS_VARIABLE_DATA_MEDIUM_STEAM 0x05
00407 #define MBUS_VARIABLE_DATA_MEDIUM_HOT_WATER 0x06
00408 #define MBUS_VARIABLE_DATA_MEDIUM_WATER 0x07
00409 #define MBUS_VARIABLE_DATA_MEDIUM_HEAT_COST 0x08
00410 #define MBUS_VARIABLE_DATA_MEDIUM_COMPR_AIR 0x09
00411 #define MBUS_VARIABLE_DATA_MEDIUM_COOL_OUT 0x0A
00412 #define MBUS_VARIABLE_DATA_MEDIUM_COOL_IN 0x0B
00413 #define MBUS_VARIABLE_DATA_MEDIUM_BUS 0x0E
00414 #define MBUS_VARIABLE_DATA_MEDIUM_COLD_WATER 0x16
00415 #define MBUS_VARIABLE_DATA_MEDIUM_DUAL_WATER 0x17
00416 #define MBUS_VARIABLE_DATA_MEDIUM_PRESSURE 0x18
00417 #define MBUS_VARIABLE_DATA_MEDIUM_ADC 0x19
00418
00419
00420
00421
00422
00423 mbus_data_record *mbus_data_record_new();
00424 void mbus_data_record_free(mbus_data_record *record);
00425 void mbus_data_record_append(mbus_data_variable *data, mbus_data_record *record);
00426
00427
00428
00429
00430 mbus_frame *mbus_frame_new(int frame_type);
00431 int mbus_frame_free(mbus_frame *frame);
00432
00433 mbus_frame_data *mbus_frame_data_new();
00434 void mbus_frame_data_free(mbus_frame_data *data);
00435
00436
00437
00438
00439 int mbus_frame_calc_checksum(mbus_frame *frame);
00440 int mbus_frame_calc_length (mbus_frame *frame);
00441
00442
00443
00444
00445 int mbus_parse(mbus_frame *frame, u_char *data, size_t data_size);
00446
00447 int mbus_data_fixed_parse (mbus_frame *frame, mbus_data_fixed *data);
00448 int mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data);
00449
00450 int mbus_frame_data_parse (mbus_frame *frame, mbus_frame_data *data);
00451
00452 int mbus_frame_pack(mbus_frame *frame, u_char *data, size_t data_size);
00453
00454 int mbus_frame_verify(mbus_frame *frame);
00455
00456 int mbus_frame_internal_pack(mbus_frame *frame, mbus_frame_data *frame_data);
00457
00458
00459
00460
00461 const char *mbus_data_record_function(mbus_data_record *record);
00462 const char *mbus_data_fixed_function(int status);
00463
00464
00465
00466
00467 int mbus_frame_type(mbus_frame *frame);
00468
00469
00470
00471
00472 mbus_slave_data *mbus_slave_data_get(size_t i);
00473
00474
00475
00476
00477 char *mbus_data_xml(mbus_frame_data *data);
00478 char *mbus_data_variable_xml(mbus_data_variable *data);
00479 char *mbus_data_fixed_xml(mbus_data_fixed *data);
00480 char *mbus_frame_data_xml(mbus_frame_data *data);
00481
00482 char *mbus_data_variable_header_xml(mbus_data_variable_header *header);
00483
00484
00485
00486
00487
00488 int mbus_frame_print(mbus_frame *frame);
00489 int mbus_frame_data_print(mbus_frame_data *data);
00490 int mbus_data_fixed_print(mbus_data_fixed *data);
00491 int mbus_data_variable_header_print(mbus_data_variable_header *header);
00492 int mbus_data_variable_print(mbus_data_variable *data);
00493
00494 char *mbus_error_str();
00495 void mbus_error_str_set(char *message);
00496 void mbus_error_reset();
00497
00498
00499
00500
00501 int mbus_data_manufacturer_encode(u_char *m_data, u_char *m_code);
00502 const char *mbus_decode_manufacturer(u_char byte1, u_char byte2);
00503
00504 int mbus_data_bcd_encode(u_char *bcd_data, size_t bcd_data_size, int value);
00505 int mbus_data_int_encode(u_char *int_data, size_t int_data_size, int value);
00506
00507 long mbus_data_bcd_decode(u_char *bcd_data, size_t bcd_data_size);
00508 int mbus_data_int_decode(u_char *int_data, size_t int_data_size);
00509 long mbus_data_long_decode(u_char *int_data, size_t int_data_size);
00510
00511 void mbus_data_str_decode(u_char *dst, const u_char *src, size_t len);
00512
00513 const char *mbus_data_fixed_medium(mbus_data_fixed *data);
00514 const char *mbus_data_fixed_unit(int medium_unit_byte);
00515 const char *mbus_data_variable_medium_lookup(u_char medium);
00516 const char *mbus_unit_prefix(int exp);
00517
00518
00519 const char *mbus_vib_unit_lookup(mbus_value_information_block *vib);
00520 const char *mbus_vif_unit_lookup(u_char vif);
00521
00522 u_char mbus_dif_datalength_lookup(u_char dif);
00523
00524 char *mbus_frame_get_secondary_address(mbus_frame *frame);
00525 int mbus_frame_select_secondary_pack(mbus_frame *frame, char *address);
00526
00527 #endif
00528