Compare commits

...
809 Commits
Author SHA1 Message Date
hxy 3e316b718a Merge pull request #2947 from hxy7yx/zgh-2.15
feat(plugin): add ThingsNeural north plugin
2026-10-26 10:31:12 +08:00
hxy7yx b7211ebe9d feat(plugin): add ThingsNeural north plugin 2026-10-25 19:04:51 -07:00
fengzeroz 6750b7f828 Refactor tags_check_symbol function for clarity 2026-09-09 09:48:15 +08:00
fengzeroz 36a86a20a0 Merge pull request #2942 from fengzeroz/v2.15
tags symbol check
2026-09-07 15:33:10 +08:00
fengzero 14228785ef tags symbol check 2026-09-07 07:30:42 +00:00
fengzeroz 5f5a649b6e Merge pull request #2940 from fengzeroz/v2.15
http check body length
2026-09-07 14:15:35 +08:00
fengzero 0cfb222b6b 2.15.4 2026-09-07 06:01:22 +00:00
fengzero 99c86f9b39 http check body length 2026-09-07 05:59:19 +00:00
fengzeroz 8df5acf090 Merge pull request #2935 from fengzeroz/v2.15
2.15.3
2026-08-21 11:42:33 +08:00
fengzero 3ea402369c 2.15.3 2026-08-21 03:37:18 +00:00
fengzeroz 44dd8bd44c Merge pull request #2933 from ZhouBox/v2.15
[v2.15]restful: support querying nodes by multiple plugins
2026-08-21 09:55:36 +08:00
xiang.zhou 2e6205389e restful: support querying nodes by multiple plugins 2026-08-14 15:52:26 +08:00
fengzeroz e797d3bab8 Merge pull request #2932 from fengzeroz/v2.15
load node after load single node
2026-08-12 17:05:16 +08:00
fengzero 66f4ce362c load node after load single node 2026-08-12 09:03:39 +00:00
fengzeroz 9eaab8ba4c Merge pull request #2930 from fengzeroz/v2.15
filter license server store
2026-08-12 15:39:51 +08:00
fengzero 48c3fc3416 filter license server store 2026-08-12 07:37:18 +00:00
fengzeroz 2294f35393 Merge pull request #2927 from fengzeroz/v2.15
schema support int/bool/float
2026-08-12 10:58:40 +08:00
fengzero 1752dbd66d store single node 2026-08-12 02:35:53 +00:00
fengzero aca0d6cf18 schema support int/bool/float 2026-08-11 06:46:06 +00:00
fengzeroz b2a9ef3940 Merge pull request #2924 from fengzeroz/v2.15
2.15.2
2026-08-10 10:21:54 +08:00
fengzero fdd30c1123 2.15.2 2026-08-10 02:19:38 +00:00
fengzeroz 56e503bf9c Merge pull request #2923 from fengzeroz/v2.15
filter license server
2026-08-06 17:22:19 +08:00
fengzero 911b8f91b1 filter license server 2026-08-06 09:21:14 +00:00
fengzeroz f6fa891978 Merge pull request #2921 from fengzeroz/v2.15
return all plugin
2026-08-06 15:06:01 +08:00
fengzero 6f1f4a88d9 return all plugin 2026-08-06 07:02:48 +00:00
fengzeroz 56b091b393 Merge pull request #2919 from fengzeroz/v2.15
ekuiper: filters no tags write
2026-07-22 15:21:18 +08:00
fengzero 2100b2b7ee ekuiper: filters no tags write 2026-07-22 06:41:48 +00:00
fengzeroz 048cf8dacb Merge pull request #2909 from fengzeroz/v2.15
rm system api
2026-07-17 17:29:49 +08:00
fengzero e3d25d2e2f bool: parse option 2026-07-17 09:25:47 +00:00
fengzero de165bd136 rm system api 2026-07-16 09:21:43 +00:00
fengzeroz 7fd6f349a7 Merge pull request #2902 from fengzeroz/v2.15
tpy: parse varconfig & symbols
2026-07-13 17:05:26 +08:00
fengzero f972cc6d74 tpy: parse varconfig & symbols 2026-07-13 08:52:28 +00:00
fengzeroz e0ae5d471e Merge pull request #2895 from fengzeroz/v2.15
check array length
2026-07-02 17:28:04 +08:00
fengzero 57ca8d434e check array length 2026-07-02 09:10:20 +00:00
fengzeroz 5126d73524 Merge pull request #2891 from fengzeroz/v2.15
mqtt check item case
2026-07-02 17:00:41 +08:00
fengzero 63fd5aa45b mqtt check item case 2026-07-02 08:12:46 +00:00
fengzeroz bfc1c02d7e Merge pull request #2887 from fengzeroz/v2.15
cid: check depth
2026-07-02 16:10:58 +08:00
fengzero 2fef05eb6a cid: check depth 2026-07-02 07:54:42 +00:00
fengzeroz e2e8dd6912 Merge pull request #2883 from fengzeroz/v2.15
fix array string check null
2026-07-02 15:50:12 +08:00
fengzero 50b5632c39 fix array string check null 2026-07-02 07:03:29 +00:00
fengzeroz d1bbc7f730 Merge pull request #2879 from fengzeroz/v2.15
limit path & fix memory check
2026-07-02 14:37:04 +08:00
fengzero 833b0a7c88 limit path & fix memory check 2026-07-02 06:04:01 +00:00
fengzeroz e5e6596350 Merge pull request #2874 from fengzeroz/v2.15
fix double free
2026-07-01 17:34:04 +08:00
fengzero 68f195da2e fix double free 2026-07-01 09:05:34 +00:00
fengzeroz ebcaf5da2d Merge pull request #2869 from fengzeroz/v2.15
fix null point
2026-07-01 16:47:19 +08:00
fengzero 1220ba8a47 fix null point 2026-07-01 08:33:08 +00:00
fengzeroz 5e82360848 Merge pull request #2864 from fengzeroz/v2.15
enable pie
2026-07-01 16:29:56 +08:00
fengzero 77f26a6f4e enable pie 2026-07-01 08:18:41 +00:00
fengzeroz 7eff12034d Merge pull request #2855 from fengzeroz/v2.15
fix memory overflow
2026-07-01 15:57:33 +08:00
fengzeroz 88432c90d0 Merge pull request #2859 from ZhouBox/v2.15
refactor json array decode
2026-07-01 15:49:30 +08:00
ZhouBox b15928fc10 refactor json array decode 2026-07-01 15:23:09 +08:00
fengzero b59e0ec319 fix memory overflow 2026-07-01 07:19:01 +00:00
fengzeroz 0f9db96e76 Merge pull request #2851 from fengzeroz/v2.15
replace strcpy with snprintf
2026-07-01 14:16:07 +08:00
fengzero 178d77639a replace strcpy with snprintf 2026-07-01 06:04:28 +00:00
fengzeroz 6827a07e27 Merge pull request #2848 from fengzeroz/v2.15
replace strcpy with snprintf
2026-07-01 13:51:13 +08:00
fengzero 207e91fa2e replace strcpy with snprintf 2026-07-01 03:56:53 +00:00
fengzeroz 2c60d17bf3 Merge pull request #2837 from fengzeroz/v2.15
compile with strong protector
2026-07-01 11:43:32 +08:00
fengzero 112360905f compile with strong protector 2026-07-01 02:38:35 +00:00
fengzeroz d5dba08b37 Merge pull request #2831 from fengzeroz/v2.15
fix default group interval 30
2026-06-25 11:53:19 +08:00
fengzero 2a03122145 fix default group interval 30 2026-06-25 03:34:16 +00:00
fengzeroz 62570906e8 Merge pull request #2826 from hxy7yx/v2.15-1
[v2.15]fix(ft):mqtt configuration
2026-06-25 11:20:05 +08:00
hxy7yx e84d3d945e fix(ft):mqtt configuration 2026-06-23 22:59:52 -07:00
fengzeroz a46d6f95a4 Merge pull request #2817 from hxy7yx/v2.15-1
[v2.15]fix(mqtt): require CA for TLS and verify broker certificates
2026-06-24 10:40:13 +08:00
fengzeroz 3e45c76b3c Merge pull request #2824 from fengzeroz/v2.15
return error before add tags
2026-06-24 10:38:41 +08:00
fengzero ae1b34ec0b return error before add tags 2026-06-24 02:22:24 +00:00
fengzeroz f92e1a6f39 Merge pull request #2813 from ZhouBox/v2.15
[v2.15]change array value length type from uint8_t to uint16_t
2026-06-22 17:38:45 +08:00
hxy7yx 8528db6b9b fix(mqtt): require CA for TLS and verify broker certificates 2026-06-22 02:09:09 -07:00
ZhouBox 78aaada2cb change array value length type from uint8_t to uint16_t 2026-06-22 16:49:21 +08:00
fengzeroz b55f9277a5 Merge pull request #2810 from fengzeroz/v2.15
version: 2.15.1
2026-06-22 13:56:12 +08:00
fengzero b6d6e01895 version: 2.15.1 2026-06-22 05:55:34 +00:00
fengzeroz 4cb6722e7c Merge pull request #2809 from fengzeroz/v2.15
remove the range check for bias
2026-06-22 11:31:53 +08:00
fengzero 07040cbc2e remove the range check for bias 2026-06-22 03:11:22 +00:00
fengzeroz b3497ff7cc Merge pull request #2804 from fengzeroz/v2.15
rm neuron.key pem
2026-06-17 15:20:45 +08:00
fengzero 68c8ecde57 rm neuron.key pem 2026-06-17 07:16:43 +00:00
fengzeroz be3dc53cf5 Merge pull request #2800 from fengzeroz/v2.15
response all results when add and check tags
2026-06-15 17:37:49 +08:00
fengzero 08edfc5748 rm dup error 2026-06-15 09:11:34 +00:00
fengzero 8d720e0def fix add tags 2026-06-15 09:11:28 +00:00
fengzero b7a8c86d03 refactor check tag 2026-06-15 09:11:22 +00:00
fengzeroz 4f49e68c20 Merge pull request #2796 from fengzeroz/v2.15
fix crash
2026-06-11 17:59:34 +08:00
fengzero de310ff6d0 fix crash 2026-06-11 09:05:26 +00:00
fengzeroz 4a2fd7c7d6 Merge pull request #2794 from fengzeroz/v2.15
fix test interval limit
2026-06-11 16:09:51 +08:00
fengzero 4f6669bed9 fix test interval limit 2026-06-11 08:08:06 +00:00
fengzeroz d7a6340ad5 Merge pull request #2791 from fengzeroz/v2.15
add/update tag mult result
2026-06-11 15:52:02 +08:00
fengzero 68ebb71dd5 add/update tag mult result 2026-06-11 07:51:16 +00:00
fengzeroz 99cbd76d1e Merge pull request #2788 from fengzeroz/v2.15
update jwt
2026-06-11 15:19:40 +08:00
fengzero 20e4518aab update jwt 2026-06-11 07:19:08 +00:00
fengzeroz 422c1a6147 Merge pull request #2784 from fengzeroz/v2.15
V2.15
2026-06-11 13:58:26 +08:00
fengzero 64b1d00384 interval limit 30ms 2026-06-11 05:56:50 +00:00
fengzero 667ef68ffc add api: check name dup before add tag 2026-06-11 05:56:41 +00:00
fengzeroz fd3b96a568 Merge pull request #2779 from fengzeroz/v2.15
version: 2.15.0
2026-06-02 17:07:47 +08:00
fengzero 36fe84ab6e version: 2.15.0 2026-06-02 09:06:51 +00:00
fengzeroz ccc9492f82 Merge pull request #2776 from fengzeroz/v2.15
refactor: replace strcpy with strncpy
2026-06-02 16:27:18 +08:00
fengzero 4b97979d38 refactor: replace strcpy with strncpy 2026-06-02 08:10:30 +00:00
fengzeroz 2a4e6a39e9 Merge pull request #2772 from fengzeroz/v2.15
api(cid,tpy,db): enable validate jwt
2026-05-29 14:50:42 +08:00
fengzero b1bf3830ad api(cid,tpy,db): enable validate jwt 2026-05-29 06:26:18 +00:00
fengzeroz 0e850fe85a Merge pull request #2767 from fengzeroz/v2.15
fix(mqtt): replace strcpy with strncpy
2026-05-29 14:24:15 +08:00
fengzero 8ac388f414 fix(mqtt): replace strcpy with strncpy 2026-05-29 06:09:54 +00:00
fengzeroz 3400c7546f Merge pull request #2765 from hxy7yx/v2.15-1
[2.15]feat(mqtt): add connection watchdog and reason-code logging
2026-05-26 10:23:23 +08:00
hxy7yx a4b863818f feat(mqtt): add connection watchdog and reason-code logging 2026-05-24 18:47:25 -07:00
fengzeroz 62ed730ba6 Merge pull request #2761 from fengzeroz/v2.15
fix(mqtt): verify the length of the data received from protobuf
2026-05-25 09:37:32 +08:00
fengzero e9c318296b fix(mqtt): verify the length of the data received from protobuf 2026-05-22 08:47:49 +00:00
fengzeroz 848a38e962 Merge pull request #2752 from fengzeroz/v2.15
delete api related to log file (deprecated)
2026-05-22 15:51:37 +08:00
fengzero dd689ca4d2 delete api related to log file (deprecated) 2026-05-22 07:34:04 +00:00
fengzeroz e878a3fd8e Merge pull request #2746 from fengzeroz/v2.15
version: 2.15.0-beta3
2026-05-18 09:39:21 +08:00
fengzero 8b1d72b9dc version: 2.15.0-beta3 2026-05-18 01:38:37 +00:00
fengzeroz 638a2d08f9 Merge pull request #2745 from fengzeroz/v2.15
version: 2.15.0-beta2
2026-05-11 13:51:47 +08:00
fengzero 7000e3f7a6 version: 2.15.0-beta2 2026-05-11 05:51:14 +00:00
fengzeroz 9e9b5be252 Merge pull request #2744 from fengzeroz/v2.15
branch v2.15
2026-05-06 14:19:34 +08:00
fengzero ed67628e92 branch v2.15 2026-05-06 06:06:30 +00:00
fengzeroz 9f8f4db9e0 Merge pull request #2741 from hxy7yx/main-1
feat(azure):support offline data caching
2026-05-06 10:45:57 +08:00
hxy7yx c42e0a8be5 feat(azure):support offline data caching 2026-04-26 20:41:16 -07:00
fengzeroz 6e243ab60f Merge pull request #2736 from moruoxian/upstream-modbus-wswr
modbus: add 64-bit byte order support for WS and WR
2026-04-21 10:36:28 +08:00
wangjun c99999b8c9 modbus: add 64-bit byte order support for WS and WR
Add support for WS (34 12 78 56) and WR (56 78 12 34) as additional 64-bit byte orders for Modbus int64, uint64, and double tags.

This change extends address suffix parsing, updates 64-bit endian conversion in the Modbus read/write paths, updates the Modbus TCP/RTU schemas, and adds functional test coverage.

Signed-off-by: wangjun <794997265@qq.com>
2026-04-16 13:59:53 +08:00
fengzeroz af61f406c0 Merge pull request #2735 from hxy7yx/main-1
kafka:add libzstd & libsasl2
2026-04-16 13:51:28 +08:00
hxy7yx 243778b229 kafka:add libzstd & libsasl2 2026-04-13 01:25:15 -07:00
fengzeroz 207da6dbc1 Merge pull request #2727 from hxy7yx/main-1
feat:add kafka plugin
2026-04-13 11:25:00 +08:00
hxy7yx 7c03aba923 mqtt: report driver node state immediately 2026-04-12 18:55:21 -07:00
fengzeroz 522db9fc9d Merge pull request #2731 from ZhouBox/main
fix(core): correct parameter order in neu_req_del_tag_copy
2026-04-09 10:56:41 +08:00
ZhouBox 118dfc08b8 fix(core): correct parameter order in neu_req_del_tag_copy
- Fix reversed parameter order in neu_req_del_tag_copy call at manager.c:1488
- Add missing return statement on strdup failure in neu_req_del_tag_copy function
2026-04-09 10:10:58 +08:00
fengzeroz 84b0a5c6a2 Merge pull request #2728 from ZhouBox/main
fix bug:json object equality check failed
2026-04-08 14:15:36 +08:00
ZhouBox a485bb6f56 fix bug:json object equality check failed 2026-04-08 13:53:33 +08:00
hxy7yx feca615f61 feat:add kafka plugin 2026-04-07 20:37:05 -07:00
fengzeroz f300668e76 Merge pull request #2724 from fengzeroz/main
fix: read tag with unit in read_group_paginate
2026-03-27 15:47:17 +08:00
fengzero 8cce511761 fix: read tag with unit in read_group_paginate 2026-03-27 07:43:55 +00:00
fengzeroz 0c9ff7fb8c Merge pull request #2723 from fengzeroz/main
fix: read tag with unit
2026-03-27 15:22:06 +08:00
fengzero 937f536194 fix: read tag with unit 2026-03-27 07:05:41 +00:00
fengzeroz 3cc99d9b00 Merge pull request #2722 from fengzeroz/main
tag: option unit
2026-03-27 14:31:31 +08:00
fengzero ae4623ed7e tag: option unit 2026-03-27 06:17:27 +00:00
fengzeroz b8a9ce4b4e Merge pull request #2718 from hxy7yx/main-1
feat(tag):supports renaming tags
2026-03-25 09:32:26 +08:00
fengzeroz f730eb0369 Merge pull request #2720 from hxy7yx/main-2
datalayers:switch to asynchronous connection
2026-03-25 09:31:55 +08:00
hxy7yx 2dcdadc40e datalayers:switch to asynchronous connection 2026-03-22 23:58:36 -07:00
hxy7yx 4174f3eee4 feat(tag):supports renaming tags 2026-03-22 20:08:34 -07:00
fengzeroz 0ff2c57bfd Merge pull request #2719 from fengzeroz/main
tag desc length: 256
2026-03-23 11:02:11 +08:00
fengzero 8a5426b707 tag desc length: 256 2026-03-23 02:35:14 +00:00
fengzeroz 3f6517a8b9 Merge pull request #2709 from hxy7yx/main-1
upgrade nanosdk
2026-03-13 17:07:21 +08:00
fengzeroz 171b1226e9 Merge pull request #2710 from ZhouBox/main
log errno detail on message forward failure
2026-03-13 17:06:35 +08:00
ZhouBox 39c39a5371 fix monitor ready check to use abstract socket name index 2026-03-13 16:39:33 +08:00
ZhouBox e40aa30a83 log errno detail on message forward failure 2026-03-13 15:29:12 +08:00
hxy7yx f6dd2bdb94 upgrade nanosdk 2026-03-10 18:30:46 -07:00
fengzeroz 32325490c8 Merge pull request #2706 from fengzeroz/main
filter array in metas
2026-03-10 14:13:46 +08:00
fengzero 24fb80efd7 filter array in metas 2026-03-10 03:13:34 +00:00
fengzeroz 317463b816 Merge pull request #2702 from ZhouBox/main
compile:support gcc 14
2026-03-10 10:53:55 +08:00
ZhouBox 878d1d42c7 compile:support gcc 14 2026-03-10 09:47:17 +08:00
fengzeroz b506fdceb6 Merge pull request #2700 from ZhouBox/main
fixbug:heap use after free
2026-03-03 13:38:11 +08:00
xiang.zhou aebbf6cfd3 fixbug:heap use after free 2026-03-03 11:10:24 +08:00
xiang.zhou a5ae436104 Merge branch 'main' of github.com:ZhouBox/neuron 2026-02-27 10:30:27 +08:00
fengzeroz b4ef7d631c Merge pull request #2694 from ZhouBox/opcua
update scan tags api
2026-02-26 17:28:18 +08:00
fengzeroz f17068886b Merge pull request #2692 from ZhouBox/main
update disconnect error status code and update scan node api
2026-02-25 15:26:10 +08:00
fengzeroz e490fe3980 Merge pull request #2693 from fengzeroz/main
core(driver): try connect device when no tags
2026-02-24 15:02:09 +08:00
fengzero f3eecd01af core(driver): try connect device when no tags 2026-02-24 06:38:10 +00:00
xiang.zhou a9beb81c41 update scan tags api 2026-02-11 15:09:04 +08:00
xiang.zhou 0159b2590b update scan tags api 2026-02-11 15:03:50 +08:00
xiang.zhou 98dfb6601c update disconnect error status code and update scan node api 2026-02-09 13:34:40 +08:00
fengzeroz a2bb561cd6 Merge pull request #2689 from fengzeroz/main
fix crash & import tags
2026-02-03 14:04:00 +08:00
fengzero a6764d7395 rm mqtt db cache 2026-02-03 03:50:59 +00:00
fengzero 9687801d5a reuse tcp server port 2026-02-03 03:35:05 +00:00
fengzero 9d2f763bea fix: import apps crash && import empty tags 2026-02-03 03:35:05 +00:00
fengzeroz 3dee50ddeb Merge pull request #2687 from fengzeroz/main
fix: import apps crash
2026-01-29 16:07:43 +08:00
fengzero c9bae5e737 fix: import apps crash 2026-01-29 07:52:23 +00:00
fengzeroz 4533901078 Merge pull request #2682 from fengzeroz/main
default log config
2026-01-27 18:10:11 +08:00
fengzero 2231d4eac7 core(cache): update_im_f_m, filter dup value 2026-01-27 09:30:52 +00:00
fengzero 533c01d07d modify default log config 2026-01-27 09:16:07 +00:00
fengzeroz 4b26d00106 Merge pull request #2678 from fengzeroz/main
fix tag & simulator bug
2026-01-27 10:33:15 +08:00
fengzero 355cfd589b simulator: close fd & exit when recv signal 2026-01-27 02:16:15 +00:00
fengzero a6fdcb545f test query nodes by tags 2026-01-26 03:30:55 +00:00
fengzero de03827d6b fix import tags in defalut node 2026-01-26 03:30:31 +00:00
fengzeroz b6e707fb23 Merge pull request #2675 from fengzeroz/main
simulator: close fd
2026-01-23 14:49:46 +08:00
fengzero 0bca9e39a5 export app: include static tags 2026-01-23 02:41:59 +00:00
fengzero 3086974da4 modbus tag address range 2026-01-22 06:04:12 +00:00
fengzero 938efcfa0b simulator: close fd 2026-01-22 03:39:01 +00:00
fengzeroz 1eb1332989 Merge pull request #2672 from fengzeroz/main
node tags test
2026-01-21 13:51:05 +08:00
fengzero ebc11baafd node tags test 2026-01-21 02:54:38 +00:00
fengzero 4a13b39ec6 node tags: filter spec symbol 2026-01-21 02:35:04 +00:00
fengzeroz 66ab7bc2eb Merge pull request #2671 from ZhouBox/main
memery leak
2026-01-20 15:10:49 +08:00
fengzeroz 7490e6a42e Merge pull request #2663 from fengzeroz/main
node tags
2026-01-20 15:00:59 +08:00
fengzero 9d93a4d410 fix query by tags 2026-01-20 06:48:22 +00:00
fengzero e3d2cb7336 fix query by tags 2026-01-20 06:48:16 +00:00
fengzero abb76d3e80 get nodes: rm query tags 2026-01-20 06:48:07 +00:00
xiang.zhou 0b3f0f8088 memery leak 2026-01-20 14:47:54 +08:00
fengzero f080ec2711 write tag log 2026-01-19 06:56:13 +00:00
fengzero f6921ee2fb get nodes by tags 2026-01-19 06:56:06 +00:00
fengzero c52fae40c8 nodes: support tags 2026-01-19 06:56:00 +00:00
fengzeroz 3bb42f900f Merge pull request #2655 from fengzeroz/main
cid name len
2026-01-06 14:31:07 +08:00
fengzero bbda93038c cid name len 2026-01-06 06:25:20 +00:00
fengzeroz 9a5c1862b8 Merge pull request #2652 from hxy7yx/main-2
chore:update key from nodes to apps
2025-12-26 10:15:32 +08:00
hxy7yx 0652bbe00b chore:update key from nodes to apps 2025-12-25 18:04:31 -08:00
fengzeroz 6c088356f6 Merge pull request #2648 from hxy7yx/main-2
feat:export&import apps
2025-12-25 10:09:46 +08:00
fengzeroz 7441908f3a Merge pull request #2651 from fengzeroz/main
fix(group): free group context with old group
2025-12-25 10:08:54 +08:00
hxy7yx 0a32d72fcd feat:export&import apps 2025-12-24 18:06:39 -08:00
fengzero bda5ef1b2e fix(group): free group context with old group 2025-12-25 02:03:55 +00:00
fengzeroz 6b47dc6a4a Merge pull request #2645 from fengzeroz/main
update readme
2025-12-24 15:17:39 +08:00
fengzero 16ad3f6873 update readme 2025-12-24 06:28:16 +00:00
fengzeroz 63f9a0eb9c Merge pull request #2644 from fengzeroz/main
readme: remove cn
2025-12-24 14:18:44 +08:00
fengzeroz 942fcf8663 Merge pull request #2643 from hxy7yx/main-2
feat:export&import apps
2025-12-24 14:18:12 +08:00
fengzero 05b6d6be5a readme: about NeuronEX 2025-12-24 06:16:31 +00:00
fengzero 6c34076976 readme: remove cn 2025-12-24 05:50:43 +00:00
hxy7yx 96ebfa4034 feat:export&import apps 2025-12-21 18:57:19 -08:00
fengzeroz 2ca52aecec Merge pull request #2642 from fengzeroz/main
fix(connection): close fd if ip invalid
2025-12-19 15:08:56 +08:00
fengzero 989421f000 fix(connection): close fd if ip invalid 2025-12-19 07:00:57 +00:00
fengzeroz 88e5fc85b7 Merge pull request #2632 from fengzeroz/main
cid: parse float array
2025-12-12 17:31:09 +08:00
fengzeroz 14b55309e4 Merge pull request #2631 from hxy7yx/main-1
fix(simulator):increase update frequency
2025-12-12 17:30:57 +08:00
fengzero f761bb9c85 cid: parse float array 2025-12-12 03:37:46 +00:00
hxy7yx c38ae03b2b fix(simulator):increase update frequency 2025-12-11 17:57:47 -08:00
fengzeroz b522583f51 Merge pull request #2630 from fengzeroz/main
cid: parse VisString65
2025-12-09 16:06:19 +08:00
fengzero 9f2b04300f cid: parse VisString65 2025-12-09 07:00:25 +00:00
fengzeroz d94afeedf6 Merge pull request #2623 from ZhouBox/main
fixbug:double free about json obj
2025-12-04 17:22:12 +08:00
xiang.zhou ffe0316e5f fixbug:double free about json obj 2025-12-04 15:20:34 +08:00
fengzeroz 7457543471 Merge pull request #2622 from fengzeroz/main
event log
2025-11-28 13:47:29 +08:00
fengzero 82615c0908 event: log category 2025-11-28 03:00:12 +00:00
fengzero 584732fe8c rm unused node cache sql 2025-11-26 02:55:41 +00:00
fengzeroz 8c11f83540 Merge pull request #2621 from hxy7yx/main-1
feat:add modbus-tcp simulator
2025-11-26 10:55:28 +08:00
hxy7yx c9bf291fa2 feat:add modbus-tcp simulator 2025-11-24 02:09:43 -08:00
fengzeroz ae959acc52 Merge pull request #2617 from ZhouBox/main
ekuiper:add warn log
2025-11-20 10:01:53 +08:00
xiang.zhou d1b3838695 ekuiper:add warn log 2025-11-19 16:37:11 +08:00
fengzeroz 159be9f511 Merge pull request #2614 from hxy7yx/main-2
add notice log for write tag/tags/gtags
2025-11-19 14:39:06 +08:00
hxy7yx e07e5ad2e8 add notice log for write tag/tags/tags 2025-11-18 22:24:31 -08:00
fengzeroz 68c9dc0b0e Merge pull request #2610 from ZhouBox/main
ekuiper:add log
2025-11-19 11:04:15 +08:00
xiang.zhou ef859090bb ekuiper:add log 2025-11-19 10:28:25 +08:00
fengzeroz 04defee4da Merge pull request #2605 from hxy7yx/main-1
add info logging for driver write tags
2025-11-12 10:17:44 +08:00
hxy7yx 811ba04408 add info logging for driver write tags 2025-11-10 18:12:12 -08:00
fengzeroz 1dc53e3ff1 Merge pull request #2603 from ZhouBox/main
reporting incomplete trace when timeout
2025-11-06 10:03:12 +08:00
xiang.zhou 14326c8da1 reporting incomplete trace when timeout 2025-11-04 15:04:13 +08:00
fengzeroz d0f7335c2b Merge pull request #2596 from hxy7yx/main-1
fix msg_internal.h
2025-10-22 10:01:53 +08:00
hxy7yx 157618269f fix msg_internal.h 2025-10-21 18:39:50 -07:00
fengzeroz c8f5feb28e Merge pull request #2591 from ZhouBox/main
1.update cert schema 2.add datatag when sub app frist sending
2025-10-22 09:31:46 +08:00
fengzeroz acd9f87ee8 Merge pull request #2595 from fengzeroz/main
export db: skip load failed data
2025-10-21 16:47:10 +08:00
xiang.zhou 763783b4d9 add index 2025-10-21 16:18:36 +08:00
fengzero 4d42b2ab16 export db: skip load failed data 2025-10-21 07:31:49 +00:00
xiang.zhou 472044a2a3 1.update cert schema 2.add datatag when sub app frist sending 2025-10-21 14:48:50 +08:00
fengzeroz 87817e080d Merge pull request #2589 from hxy7yx/main-1
fix(log):global config
2025-10-21 13:34:58 +08:00
hxy7yx 65b87e37ff fix(log):global config 2025-10-20 19:38:19 -07:00
fengzeroz 6c8b684f80 Merge pull request #2581 from fengzeroz/main
fix: arm32 compile error
2025-10-20 14:53:57 +08:00
fengzero 161172632c replace tar with zip db data 2025-10-20 03:29:29 +00:00
fengzero 84ecdde3d4 fix: arm32 compile error 2025-10-17 06:38:42 +00:00
fengzeroz 544cd8a593 Merge pull request #2574 from fengzeroz/main
import tpy & export db & udp connection
2025-10-17 11:22:59 +08:00
fengzeroz 694d108ff2 Merge branch 'main' into main 2025-10-17 11:16:00 +08:00
fengzeroz 7bb39d3503 Merge pull request #2575 from ZhouBox/opcua_server
1. add cert manager 2. op msg trans
2025-10-15 17:43:22 +08:00
fengzero b2e313b544 connect(udpto): get local port 2025-10-14 03:30:32 +00:00
xiang.zhou e50b945531 merge error 2025-10-14 11:20:26 +08:00
xiang.zhou 3a9e8ca2a7 build error:modify include path 2025-10-14 10:09:43 +08:00
Xiang Zhou 4d694e6f88 Merge branch 'main' into opcua_server 2025-10-14 10:00:23 +08:00
xiang.zhou 4ad1da2a80 1. add cert manager 2. op msg trans 2025-10-14 09:54:11 +08:00
fengzero f10cb0ea1d connect: get udp bind port 2025-10-13 07:13:30 +00:00
fengzero 7a71654423 api: export db 2025-10-13 07:13:24 +00:00
fengzeroz f17b6bdc4a Merge pull request #2569 from hxy7yx/main-1
fix:datalayers
2025-09-23 17:14:45 +08:00
hxy7yx 3ce85f2379 fix:datalayers 2025-09-23 01:46:51 -07:00
fengzeroz c3fef977c9 Merge pull request #2568 from fengzeroz/main
api: import tpy file
2025-09-22 11:31:27 +08:00
fengzero 93bd66323b api: import tpy file 2025-09-22 03:30:14 +00:00
fengzeroz d3900c674e Merge pull request #2567 from hxy7yx/main-1
feat(log):global config
2025-09-19 10:01:38 +08:00
hxy7yx b1c600e0f1 feat(log):global config 2025-09-14 20:36:43 -07:00
fengzeroz 8233d1082b Merge pull request #2564 from hxy7yx/main-1
feat:support builtin tags
2025-09-11 10:03:06 +08:00
hxy7yx 394de07e6f feat:support builtin tags 2025-09-09 19:30:17 -07:00
fengzeroz ce6544743d Merge pull request #2560 from L-607/fix-typo
fix typo
2025-09-08 14:45:42 +08:00
fengzeroz fc5129c57a Merge pull request #2562 from fengzeroz/main
update readme
2025-09-08 14:45:19 +08:00
fengzero c82c12713b update readme 2025-09-05 07:02:01 +00:00
L 03bccde483 fix typo 2025-09-05 13:34:59 +08:00
fengzeroz 67b630b05d Merge pull request #2558 from fengzeroz/main
api docs
2025-08-29 14:12:08 +08:00
fengzero e931d5320c api docs 2025-08-29 06:09:23 +00:00
fengzeroz c3d7c4d154 Merge pull request #2556 from fengzeroz/main
quick start
2025-08-28 15:17:13 +08:00
fengzero b56f203e9a quick start 2025-08-28 06:43:46 +00:00
fengzeroz 26b7c06133 Merge pull request #2554 from fengzeroz/main
readme: docker run
2025-08-27 17:13:14 +08:00
fengzero c7cec1fe7e readme: docker run 2025-08-27 09:11:10 +00:00
fengzeroz 2d1c3038d3 Merge pull request #2553 from fengzeroz/main
conn: disconnect when connected and recv error
2025-08-27 16:55:58 +08:00
fengzero a79247423e update readme 2025-08-27 08:54:08 +00:00
fengzero c1a089e893 conn: disconnect when connected and recv error 2025-08-27 06:44:25 +00:00
fengzeroz 6f24a54218 Merge pull request #2549 from moruoxian/main
fix modbus-tcp change  server to client config crash.
2025-08-26 17:37:52 +08:00
moruoxian 9c98e072ea fix modbus-tcp change server to client config crash. 2025-08-23 14:06:01 +08:00
fengzeroz 11506c3e4a Merge pull request #2546 from fengzeroz/main
subs api: response ok when request empty
2025-08-21 15:23:20 +08:00
fengzero eca6dd81fa get subs: match sub string 2025-08-21 05:53:30 +00:00
fengzero 8a3314b24d subs api: response ok when request empty 2025-08-21 03:00:16 +00:00
fengzeroz 99a0501a3b Merge pull request #2543 from hxy7yx/main-1
move unused drivers to manual check workflow
2025-08-21 10:13:51 +08:00
hxy7yx 9e6ab7d895 move unused drivers to manual check workflow 2025-08-19 23:59:16 -07:00
fengzeroz 5b416b2df0 Merge pull request #2540 from fengzeroz/main
app: get all groups
2025-08-20 14:45:37 +08:00
fengzeroz 07a58794d1 Merge pull request #2539 from hxy7yx/main-1
fix(mqtt):handle errors when no subACK code is received
2025-08-20 14:18:58 +08:00
fengzero ece0392f63 app: get all groups 2025-08-20 06:16:47 +00:00
hxy7yx dc51ba1c31 fix(mqtt):handle errors when no subACK code is received 2025-08-19 19:41:58 -07:00
fengzeroz d623fff030 Merge pull request #2537 from fengzeroz/main
event name
2025-08-19 15:24:25 +08:00
fengzero 7f7472d261 event name 2025-08-19 07:01:47 +00:00
fengzeroz 3eddf7f6dc Merge pull request #2530 from ZhouBox/main
json:object array support
2025-08-08 14:14:23 +08:00
xiang.zhou 6087e072b7 json:object array support 2025-08-08 14:04:11 +08:00
fengzeroz e39c29b051 Merge pull request #2525 from ZhouBox/main
memery leak
2025-07-23 16:13:00 +08:00
xiang.zhou 4c85bb0067 memery leak 2025-07-23 15:32:13 +08:00
xiang.zhou 1af2bc3f7e memery leak 2025-07-23 15:32:06 +08:00
fengzeroz 6133cbc47a Merge pull request #2515 from moruoxian/main
Optimize OpenSSL references in CMakeLists by using standard CMake inclusion methods
2025-07-14 14:55:06 +08:00
moruoxian 2ca3a490cb add OPENSSL_USE_STATIC_LIBS for static oepnssl lib 2025-07-08 09:24:27 +08:00
fengzeroz 60ef477e58 Merge pull request #2513 from hxy7yx/main-1
fix(datalayers):queue
2025-07-07 14:54:51 +08:00
fengzeroz 79eb2dec79 Merge pull request #2514 from ZhouBox/main
mem op when driver report callback
2025-07-07 14:53:15 +08:00
moruoxian e64d57e852 Optimize OpenSSL references in CMakeLists by using standard CMake inclusion methods 2025-07-07 08:52:18 +08:00
xiang.zhou 880ee51fad mem op when driver report callback 2025-07-03 18:06:45 +08:00
hxy7yx e2cf0bf895 fix(datalayers):queue 2025-06-26 19:05:07 -07:00
fengzeroz 8e85204725 Merge pull request #2511 from fengzeroz/main
report: pre alloc memory
2025-06-26 11:16:58 +08:00
fengzero 559ebc00c1 report: pre alloc memory 2025-06-26 03:14:07 +00:00
fengzeroz 3aed329954 Merge pull request #2506 from moruoxian/main
Fix adapter thread exit crash issue to enable graceful adapter shutdown.
2025-06-23 18:03:01 +08:00
moruoxian 36a2a0740a Fix adapter thread exit crash issue to enable graceful adapter shutdown. 2025-06-23 09:10:02 +08:00
fengzeroz 23aa3db5e5 Merge pull request #2505 from moruoxian/main
fix: handle NULL json_str case to avoid undefined behavior
2025-06-18 14:48:50 +08:00
moruoxian 895528d164 fix: handle NULL json_str case to avoid undefined behavior 2025-06-18 12:59:01 +08:00
hxy7yx 28318e785b fix cache.c 2025-06-16 02:31:40 -07:00
fengzeroz a1bc9753ec Merge pull request #2493 from fengzeroz/main
fix: mqtt disable subscribe topic
2025-06-16 11:31:10 +08:00
fengzeroz 410975a8a6 Merge pull request #2499 from hxy7yx/main-1
feat(modbus):support endianess of 8-Byte data
2025-06-16 11:24:35 +08:00
fengzero fba83e6519 fix cppcheck 2025-06-16 03:13:46 +00:00
hxy7yx 750ac85102 feat(modbus):support endianess of 8-Byte data 2025-06-15 19:47:15 -07:00
fengzero 43aa8288ca fix: mqtt disable subscribe topic 2025-06-16 02:30:20 +00:00
fengzeroz b09bd03035 Merge pull request #2486 from fengzeroz/main
mqtt: rm / in topic
2025-06-12 11:25:02 +08:00
fengzero 9eaf8f0525 mqtt: rm / in topic 2025-06-12 03:09:08 +00:00
fengzeroz 7059252b32 Merge pull request #2485 from fengzeroz/main
mqtt: config enable_topic
2025-06-12 11:08:35 +08:00
fengzero 29eb961b17 mqtt: config enable_topic 2025-06-12 02:58:25 +00:00
fengzeroz e161e5a71f Merge pull request #2481 from fengzeroz/main
fix: filter error crash
2025-06-11 15:38:39 +08:00
fengzero 75f02faa15 fix: filter error crash 2025-06-11 03:01:06 +00:00
fengzeroz a6b041c1f6 Merge pull request #2477 from ZhouBox/main
startup optimization
2025-06-10 14:29:03 +08:00
xiang.zhou 58e70877c3 startup optimization 2025-06-10 14:04:28 +08:00
fengzeroz 3b9736ab90 Merge pull request #2476 from ZhouBox/main
adapter:check state when do with trans data
2025-06-10 09:44:21 +08:00
xiang.zhou 5b05867c2b adapter:check state when do with trans data 2025-06-09 16:59:37 +08:00
Rory Z b9516ba4d0 ci: translate issue from Chinese to English
Signed-off-by: Rory Z <16801068+Rory-Z@users.noreply.github.com>
2025-05-29 11:07:33 +08:00
fengzeroz 585e108a85 Merge pull request #2468 from hxy7yx/main-1
start datalayers plugin without check
2025-05-29 09:41:20 +08:00
hxy7yx a302d217cb start datalayers plugin without check 2025-05-27 20:55:27 -07:00
fengzeroz af70a3e640 Merge pull request #2467 from hxy7yx/main-1
datalayers:cancel verifying connections before configuration
2025-05-28 10:04:37 +08:00
hxy7yx c189cf8d22 datalayers:cancel verifying connections before configuration 2025-05-27 00:15:59 -07:00
fengzeroz c95d37bf24 Merge pull request #2464 from hxy7yx/main-1
update api:sub info of datalayers plugin
2025-05-26 17:58:45 +08:00
hxy7yx 83d50d0b9b update api:sub info of datalayers plugin 2025-05-26 02:45:25 -07:00
fengzeroz 13d1ed3f44 Merge pull request #2458 from hxy7yx/main-1
datalayers:use preparestatment
2025-05-22 17:18:58 +08:00
hxy7yx f49af0f879 datalayers:call doget to trigger SQL execution 2025-05-22 01:51:23 -07:00
hxy 562c74307e Merge pull request #2457 from hxy7yx/main-1
datalayers:remove doget in excute
2025-05-22 11:02:06 +08:00
hxy7yx 3e448e7139 datalayers:remove doget in excute 2025-05-21 19:57:19 -07:00
Xiang Zhou 5ea8f5531d Merge pull request #2456 from ZhouBox/main
otel:trace flag assignment error
2025-05-21 16:15:28 +08:00
xiang.zhou 3b6e689e0b otel:trace flag assignment error 2025-05-21 16:04:21 +08:00
hxy 509c540175 Merge pull request #2452 from hxy7yx/main-1
fix(datalayers):exit gracefully
2025-05-21 14:55:56 +08:00
Xiang Zhou dc94545e58 Merge pull request #2454 from ZhouBox/main
refactor the array type && otel:ensure the uniqueness of ctx
2025-05-21 14:46:41 +08:00
hxy7yx e9f958c43c fix(datalayers):fix inserted value 2025-05-20 23:43:38 -07:00
xiang.zhou 0d507761fa otel:ensure the uniqueness of ctx 2025-05-21 14:19:15 +08:00
xiang.zhou fb0bcbf116 refactor the array type 2025-05-21 14:19:03 +08:00
hxy7yx da7623fed1 fix(datalayers):exit gracefully 2025-05-20 18:35:06 -07:00
fengzeroz e7a0c2da3e Merge pull request #2448 from ZhouBox/main
filter node name
2025-05-20 14:36:13 +08:00
xiang.zhou 1063ed7fd2 filter node name 2025-05-20 11:35:40 +08:00
fengzeroz 853cceb63c Merge pull request #2446 from hxy7yx/main-2
update datalayers schema name
2025-05-19 16:17:28 +08:00
hxy7yx e6f7effeb5 update datalayers schema name 2025-05-15 03:05:03 -07:00
fengzeroz b65021a5d4 Merge pull request #2444 from wu1045718093/main
fix(connection): conn->param.params.tcp_server.ip and conn->tcp_serve…
2025-05-15 14:44:35 +08:00
fengzeroz db02f571d9 Merge pull request #2445 from emqx/hxy7yx-patch-2
Update datalayers_plugin.c
2025-05-15 14:43:36 +08:00
hxy 1eb240c5d8 Update datalayers_plugin.c 2025-05-15 14:15:23 +08:00
teng.wu 8eadd7574f fix(connection): conn->param.params.tcp_server.ip and conn->tcp_server.clients heap-use-after-free 2025-05-15 10:57:44 +08:00
fengzeroz a8951c1337 Merge pull request #2443 from ZhouBox/main
node&group support filter
2025-05-14 09:58:40 +08:00
xiang.zhou ee91c2698a Merge branch 'main' of github.com:ZhouBox/neuron 2025-05-13 12:43:23 +08:00
xiang.zhou 1253b182d1 node&group support filter 2025-05-13 12:42:54 +08:00
fengzeroz 2c61ab1436 Merge pull request #2441 from hxy7yx/main-2
rename Datalayers to DataStorage
2025-05-09 15:45:14 +08:00
hxy7yx edded61904 rename Datalayers to DataStorage 2025-05-09 00:12:54 -07:00
fengzeroz 123f12bfba Merge pull request #2439 from ZhouBox/otel
otel:span optimization
2025-05-08 14:13:15 +08:00
xiang.zhou 193b4b96e1 otel:span optimization 2025-05-08 12:39:36 +08:00
fengzeroz fdfd008858 Merge pull request #2437 from hxy7yx/main-2
fix(datalayers):restore connection
2025-05-07 17:05:47 +08:00
hxy7yx a999c9f80c fix(datalayers):restore connection 2025-05-07 01:56:36 -07:00
fengzeroz e38df4cd90 Merge pull request #2432 from hxy7yx/main-1
update Install-dependencies.md
2025-04-30 15:47:18 +08:00
fengzeroz dbba047880 Merge pull request #2434 from hxy7yx/main-2
feat(datalayers):support array type
2025-04-30 15:47:01 +08:00
hxy7yx 684598cd46 feat(datalayers):support array type 2025-04-30 00:31:23 -07:00
hxy7yx b0063a7a08 update Install-dependencies.md 2025-04-29 18:56:47 -07:00
fengzeroz ab8756dac9 Merge pull request #2426 from hxy7yx/main-2
feat(api&app): support datalayers
2025-04-27 14:36:45 +08:00
hxy7yx 73cf93fe40 Merge remote-tracking branch 'upstream/main' into main-2 2025-04-26 19:14:56 -07:00
fengzeroz 025233a4b6 Merge pull request #2430 from ZhouBox/fix-ci-error
1.update ci runner os version 2.optimize and reduce CI resource usage
2025-04-22 17:57:33 +08:00
xiang.zhou 801d43e4a0 1.update os version
2.optimize and reduce CI resource usage
2025-04-21 16:08:23 +08:00
hxy7yx 412016f2b4 feat(api):support datalayers 2025-04-17 20:07:38 -07:00
fengzeroz 66d891b032 Merge pull request #2422 from fengzeroz/main
get nodes: query state/link, sort delay
2025-04-15 10:48:43 +08:00
fengzeroz d98392e850 Merge pull request #2427 from ZhouBox/main
memory leak
2025-04-14 09:31:40 +08:00
xiang.zhou cdef60c540 memory leak 2025-04-14 09:22:23 +08:00
hxy7yx 39a35f5fe3 add app:datalayers 2025-04-02 01:13:45 -07:00
fengzero dd9af2e819 get nodes: query state/link, sort delay 2025-04-02 05:52:19 +00:00
fengzeroz 90d36bcb12 Merge pull request #2417 from gc87/value-size
chore: set neu_value_size 512 -> 256
2025-03-28 16:11:18 +08:00
gc87 9d8e39cfef chore: set neu_value_size 512 -> 256 2025-03-28 15:19:16 +08:00
fengzeroz 431c90309b Merge pull request #2407 from hxy7yx/main-2
add functions for datalayer
2025-03-20 13:52:03 +08:00
hxy7yx 8023823b0c add function for datalayer 2025-03-19 02:40:57 -07:00
fengzeroz 6de92faa9b Merge pull request #2415 from ZhouBox/main
ekuiper:support precision
2025-03-19 16:00:18 +08:00
fengzeroz f4eff32cbf Merge pull request #2409 from hxy7yx/main-1
fix(allow float-tag to write integers)
2025-03-19 15:59:05 +08:00
xiang.zhou 66cd4da4d6 ekuiper:support precision 2025-03-19 13:36:44 +08:00
hxy7yx 15ec9992b7 fix(allow float-tag to write integers) 2025-03-18 20:26:25 -07:00
fengzeroz 6db6cc74de Merge pull request #2403 from hxy7yx/main-1
allow float-tag to write integers
2025-03-18 11:26:18 +08:00
hxy7yx 37a5d33421 allow float-tag to write integers 2025-03-16 19:55:13 -07:00
fengzeroz 25effebb8a Merge pull request #2401 from fengzeroz/main
core: write tags resp
2025-03-03 14:48:44 +08:00
fengzero 7c2a8c6b84 launch test 2025-03-03 06:37:07 +00:00
fengzero 9c74044305 core: write tags resp 2025-03-03 03:37:02 +00:00
fengzeroz cd315cef25 Merge pull request #2400 from moruoxian/main
Script for automatically installing dependency libraries
2025-03-03 11:34:44 +08:00
moruoxian 1f447fc9ec add install_dependencies.sh 2025-02-27 09:02:13 +00:00
fengzeroz a523209116 Merge pull request #2399 from hxy7yx/main-1
fix monitor
2025-02-25 16:48:22 +08:00
hxy7yx df7080e3f5 fix monitor 2025-02-25 00:45:17 -08:00
fengzeroz 7a778f3871 Merge pull request #2398 from fengzeroz/main
fix: check array size
2025-02-25 15:23:59 +08:00
fengzero e8dba7a4ac fix: check array size 2025-02-25 07:22:54 +00:00
fengzeroz f34d3e9d5c Merge pull request #2392 from hxy7yx/main-1
feat(monitor):add plugin monitor
2025-02-24 15:15:38 +08:00
fengzeroz 06e8f77a55 Merge pull request #2396 from ZhouBox/main
otel:remove duplicate ctx
2025-02-21 13:46:55 +08:00
xiang.zhou 6eb98c67f9 otel:remove duplicate ctx 2025-02-21 13:25:02 +08:00
hxy 0833500237 feat(monitor):add plugin monitor 2025-02-20 17:42:34 -08:00
fengzeroz 530963668d Merge pull request #2388 from fengzeroz/main
drop table
2025-02-20 11:29:21 +08:00
fengzero e7ca8e62b6 version: 2.12.0-alpha 2025-02-20 03:21:54 +00:00
fengzero 78cac4378b value size 1024 2025-02-20 02:50:56 +00:00
fengzero d83addb61f Revert "rm file plugin"
This reverts commit 0e89e61d8c.
2025-02-20 02:50:40 +00:00
fengzero 4196ef7c6e drop table 2025-02-19 07:37:46 +00:00
fengzeroz d937edab9e Merge pull request #2384 from fengzeroz/main
mqtt protobuf
2025-02-18 09:57:48 +08:00
fengzero 9653512c4a cppcheck: exclude protobuf 2025-02-17 08:05:05 +00:00
fengzero 70fc46903c rm unused schema 2025-02-17 07:21:58 +00:00
fengzero 7e40408f41 rm unused schema 2025-02-17 07:21:43 +00:00
fengzero 9c7f41cf79 fix memory leak 2025-02-17 07:21:43 +00:00
fengzero 719568cb6c mqtt protobuf 2025-02-17 07:21:43 +00:00
fengzeroz 33bc59b871 Merge pull request #2382 from hxy7yx/main-1
fix(ptr): memory leak
2025-02-17 14:53:30 +08:00
hxy 5b439064db fix(ptr): memory leak 2025-02-17 10:35:08 +08:00
fengzeroz 90bd1df4e4 Merge pull request #2377 from hxy7yx/main-1
fix(mqtt):convert array&object to string format in ECP format
2025-02-11 11:24:53 +08:00
fengzeroz 219881e48e Merge pull request #2376 from fengzeroz/main
mqtt: download/upload file
2025-02-10 15:42:53 +08:00
hxy 6c12c051c3 fix(mqtt):convert array&object to string format in ECP format 2025-02-10 15:33:18 +08:00
fengzero 391632f819 download file 2025-02-10 07:25:34 +00:00
fengzero d2a049428f fup file 2025-02-08 09:12:49 +00:00
fengzero 821af257f3 get directory 2025-02-07 07:51:33 +00:00
fengzero d3b4b3a625 file msg 2025-02-07 03:07:37 +00:00
fengzero bdf142ca22 mqtt driver topic prefix 2025-02-07 03:07:37 +00:00
fengzeroz 2a7c7edee8 Merge pull request #2374 from hxy7yx/main-1
fix(mqtt): fix ECP format when the first tag reads incorrect data
2025-02-07 11:07:14 +08:00
hxy 1a8868d08c fix(mqtt): fix ECP format when the first tag reads incorrect data 2025-02-07 10:46:19 +08:00
fengzeroz 4395f03e2b Merge pull request #2371 from fengzeroz/main
mqtt schema & ci
2025-02-06 14:24:22 +08:00
fengzero 10226a1a4f ci: fix daily release 2025-02-06 06:18:11 +00:00
fengzero db36fc56db ci upload v4 2025-02-06 06:17:40 +00:00
fengzero 9ba80017b3 mqtt schema deep 3 2025-02-06 06:17:32 +00:00
fengzero 11d716eb9b mqtt schema support values format 2025-02-06 06:17:25 +00:00
fengzeroz 1344584aa8 Merge pull request #2366 from gc87/tongtech-user-api
fix: pass->password
2025-01-24 16:31:27 +08:00
fengzeroz 3695a50a09 Merge pull request #2368 from ZhouBox/main
otel:op
2025-01-24 16:30:58 +08:00
xiang.zhou 6af83d7254 otel:op 2025-01-24 16:22:03 +08:00
gc87 21a4cdbd7e fix: pass->password 2025-01-23 15:22:38 +08:00
fengzeroz 15627ad9ae Merge pull request #2363 from fengzeroz/main
ut&description
2025-01-08 17:05:02 +08:00
fengzero 6dbd8d1a08 mqtt format description 2025-01-08 08:43:37 +00:00
fengzero fa1964304f mqtt schema test 2025-01-08 06:54:33 +00:00
fengzeroz 5711d5ca46 Merge pull request #2360 from hxy7yx/main-2
chore(scan tag): rename tag_type to type
2025-01-08 13:56:32 +08:00
hxy aba218dade chore(scan tag): rename tag_type to type 2025-01-08 11:54:21 +08:00
fengzeroz 392a72bd0b Merge pull request #2357 from hxy7yx/main-1
feat(scan tag):add type
2025-01-07 17:22:21 +08:00
hxy 9258276aa2 feat(scan tag):add type 2025-01-07 17:13:36 +08:00
fengzeroz d7feb2f514 Merge pull request #2356 from fengzeroz/main
mqtt custom format
2025-01-06 15:22:56 +08:00
fengzero 80803c7af6 static tags 2025-01-06 02:43:52 +00:00
fengzero 32e3c57601 mqtt custom format 2025-01-02 08:16:10 +00:00
fengzeroz afb5e55aa1 Merge pull request #2355 from ZhouBox/main
fix:build error when using a higher version of the compiler
2024-12-27 15:05:56 +08:00
xiang.zhou cea84c12d5 fix:build error when using a higher version of the compiler 2024-12-27 14:50:06 +08:00
fengzeroz bc6eb48fcb Merge pull request #2353 from ZhouBox/main
plugin:using copy file replace rename
2024-12-26 15:49:32 +08:00
xiang.zhou 06667e0352 plugin:using copy file replace rename 2024-12-26 10:54:25 +08:00
fengzeroz d4d17f74ff Merge pull request #2343 from ZhouBox/main
key files into code, no include in package
2024-12-24 09:51:06 +08:00
fengzeroz f91571f10e Merge pull request #2344 from hxy7yx/main-1
fix(modbus):clear recv buf before sending
2024-12-24 09:50:33 +08:00
hxy7yx d33fff5986 fix(modbus):clear recv buf before sending 2024-12-23 17:10:38 +08:00
xiang.zhou 0c833f0343 key files into code, no include in package 2024-12-23 11:07:44 +08:00
fengzeroz 15a10f5b02 Merge pull request #2339 from gc87/tongtech-user-api
feat: add tongtech user management api
2024-12-19 10:33:05 +08:00
fengzeroz 2054b8f3b1 Merge pull request #2340 from hxy7yx/main-1
mqtt: add logs for ecp-format
2024-12-19 10:32:48 +08:00
fengzeroz 38c44c4b41 Merge pull request #2341 from ZhouBox/main
support array string
2024-12-19 10:32:27 +08:00
xiang.zhou bb9d5a71dc support array string 2024-12-19 09:58:37 +08:00
hxy7yx 7dad96261a matt: add logs for ecp-format 2024-12-18 11:38:53 +08:00
gc87 03cfc049e5 fix: pass->password 2024-12-17 15:31:28 +08:00
gc87 7889e6b13f fix: url path user->users 2024-12-17 11:30:51 +08:00
gc87 f547a79900 feat: ready 2024-12-17 10:04:03 +08:00
fengzeroz cab2f92e70 Merge pull request #2338 from hxy7yx/main-1
feat(mqtt):filter tags with errors when uploading
2024-12-16 15:08:28 +08:00
hxy7yx a087f53d04 feat(mqtt):support ECP format 2024-12-16 14:24:38 +08:00
gc87 1b5c8528e2 feat: user management api -add user 2024-12-16 08:01:00 +08:00
gc87 8671b4baaa feat: add tongtech user management api 2024-12-13 16:37:58 +08:00
hxy7yx 6df00a37d6 feat(mqtt):filter tags with errors when uploadind 2024-12-13 10:19:47 +08:00
fengzeroz 2499657f8d Merge pull request #2336 from fengzeroz/main
action: driver to node
2024-12-11 15:53:30 +08:00
fengzeroz db92a94781 Merge pull request #2337 from ZhouBox/main
fixbug:use after free
2024-12-11 14:57:27 +08:00
xiang.zhou 12dd8d79fe fixbug:use after free 2024-12-11 14:49:07 +08:00
fengzeroz 48b935a70b Merge pull request #2335 from gc87/tongtech-log-api
feat: log file api
2024-12-11 14:18:12 +08:00
fengzeroz 154d2783d3 Merge pull request #2334 from emqx/hxy7yx-patch-1
Update Install-dependencies.md
2024-12-11 14:17:54 +08:00
fengzero 702fae369c cid: timestamp -> uint64 2024-12-11 03:25:07 +00:00
fengzero a7b9736380 action: driver to node 2024-12-11 03:03:30 +00:00
gc87 39bbdf882d feat: tongtech log api 2024-12-10 17:59:56 +08:00
hxy 6838811fa7 Update Install-dependencies.md 2024-12-09 11:20:59 +08:00
fengzeroz 3d6f0d02d0 Merge pull request #2328 from fengzeroz/main
cid: control tag
2024-12-02 17:35:25 +08:00
fengzero 8f3d1ce100 cid: control tag 2024-12-02 09:22:21 +00:00
fengzeroz a5cb64ccb4 Merge pull request #2331 from ZhouBox/main
fix bug:json incref when some sub apps
2024-11-29 15:07:53 +08:00
xiang.zhou b7bb822d16 fix bug:json incref when some sub apps 2024-11-29 15:04:35 +08:00
fengzeroz 44d3e94088 Merge pull request #2330 from ZhouBox/main
ekuiper:check encode json str
2024-11-29 13:46:18 +08:00
xiang.zhou d21131f584 ekuiper:check encode json str 2024-11-29 13:22:30 +08:00
fengzeroz 68d7b2e1d3 Merge pull request #2329 from ZhouBox/main
api:add new api about system exit
2024-11-29 11:25:52 +08:00
xiang.zhou 1e27430f88 api:add new api about system exit 2024-11-29 10:08:30 +08:00
fengzeroz eaa6a1bf75 Merge pull request #2326 from ZhouBox/main
write:check custom
2024-11-28 14:57:59 +08:00
xiang.zhou 119e15974c write:check custom 2024-11-28 14:45:49 +08:00
fengzeroz befb48c3b8 Merge pull request #2325 from fengzeroz/main
2.11.0 alpha
2024-11-28 10:38:22 +08:00
fengzero c8552b167a 2.11.0 alpha 2024-11-28 02:31:27 +00:00
fengzeroz 20f04d0a1c Merge pull request #2324 from ZhouBox/main
fix bug:data memory error
2024-11-28 09:36:53 +08:00
xiang.zhou 4573fb5c52 fix bug:data Memory error 2024-11-27 18:21:06 +08:00
fengzeroz d35acb3f12 Merge pull request #2321 from fengzeroz/main
parse cid
2024-11-27 15:20:34 +08:00
fengzero 14a50e7824 fix cid ut 2024-11-27 07:01:15 +00:00
fengzero 96b169a01d mqtt: action 2024-11-27 06:54:05 +00:00
fengzero 4667a4c051 rename plugin action 2024-11-27 06:54:05 +00:00
fengzero aff4a51560 cid format to tag 2024-11-27 06:54:05 +00:00
fengzero a6c3918640 cid write tag 2024-11-27 06:54:05 +00:00
fengzero 00fa869c54 cid: parse all 2024-11-27 06:54:05 +00:00
fengzeroz f2ef867b61 Merge pull request #2322 from ZhouBox/main
fix mem leak
2024-11-27 14:28:38 +08:00
xiang.zhou d52ee1bbca fix mem leak 2024-11-27 14:16:12 +08:00
fengzeroz c0e16f41d4 Merge pull request #2320 from ZhouBox/main
support json obj and array
2024-11-25 11:25:17 +08:00
xiang.zhou ef6bb14809 support json obj and array 2024-11-25 11:12:56 +08:00
fengzeroz 2ce73e527f Merge pull request #2314 from hxy7yx/main-1
feat(modbus-tcp):support backup ip
2024-11-20 13:54:12 +08:00
hxy7yx adaad8d900 feat(modbus-tcp):support backup ip 2024-11-19 17:01:16 +08:00
fengzeroz 2e5372d430 Merge pull request #2315 from hxy7yx/main-2
fix(mqtt):separate MQTT and API for JSON(read resp)
2024-11-19 10:07:21 +08:00
hxy7yx 3b85d2b9cd fix(mqtt):separate MQTT and API for JSON(read resp) 2024-11-19 09:28:52 +08:00
fengzeroz 3d6cdf5fe5 Merge pull request #2311 from fengzeroz/main
#2288: avoiding duplicate release resources
2024-11-11 17:07:44 +08:00
fengzero 5575529863 #2288: avoiding duplicate release resources 2024-11-11 09:02:52 +00:00
fengzeroz b52dbb88f9 Merge pull request #2310 from fengzeroz/main
conn buf size: 8192
2024-11-11 16:39:58 +08:00
fengzero bf6d7340cb conn buf size: 8192 2024-11-11 08:29:54 +00:00
fengzeroz abd58afc16 Merge pull request #2268 from gc87/attributes
fix: support iec61850 data format
2024-11-11 13:46:16 +08:00
fengzeroz d60e9293fb Merge pull request #2306 from fengzeroz/main
mqtt filter tag & driver cmd
2024-11-11 11:40:51 +08:00
fengzero b291e49611 mqtt: driver cmd 2024-11-11 03:31:09 +00:00
gc87 08eea75ac8 fix(cid): co's address missing prefix and inst 2024-11-11 11:31:01 +08:00
gc87 a8ba929457 feat: cyclic reporting for 61850 gi 2024-11-11 10:39:31 +08:00
gc87 c59d557535 fix: add attributes field for update meta 2024-11-11 10:39:31 +08:00
fengzero ebc91b0ce1 mqtt read group filter tags 2024-11-08 06:42:40 +00:00
fengzeroz 141b3f56b1 Merge pull request #2304 from fengzeroz/main
fix value: array bool
2024-11-07 18:11:19 +08:00
fengzero 9fd7e7687b fix value: array bool 2024-11-07 10:08:01 +00:00
fengzeroz c722ee8624 Merge pull request #2302 from fengzeroz/main
ft array type
2024-11-07 16:51:59 +08:00
fengzero 5e4d0ee231 ft array type 2024-11-07 08:44:59 +00:00
fengzeroz a0ffe7eb8c Merge pull request #2300 from fengzeroz/main
json_value: array bool
2024-11-07 15:06:01 +08:00
fengzero d20b810269 json_value: array bool 2024-11-07 06:56:01 +00:00
fengzeroz aee8160291 Merge pull request #2299 from fengzeroz/main
fix: fix_value case neu_type_array_char
2024-11-07 13:51:01 +08:00
fengzero 912cf14173 fix: fix_value case neu_type_array_char 2024-11-07 05:37:29 +00:00
fengzeroz a60657bb29 Merge pull request #2297 from fengzeroz/main
fix_value array
2024-11-07 11:42:03 +08:00
fengzero 065b0179b2 fix_value array 2024-11-07 03:30:46 +00:00
fengzeroz 12779ef4d4 Merge pull request #2295 from fengzeroz/main
db array
2024-11-07 11:15:27 +08:00
fengzero 83dfa3a2e6 db array 2024-11-07 03:07:10 +00:00
fengzeroz b5784a9d3c Merge pull request #2293 from fengzeroz/main
uint8 array
2024-11-07 10:32:23 +08:00
fengzero 1982dacbdb uint8 array 2024-11-07 02:26:09 +00:00
fengzeroz ec8d7c87f0 Merge pull request #2292 from fengzeroz/main
support array type
2024-11-06 18:53:26 +08:00
fengzero 8d90cb7d08 support array type 2024-11-06 10:44:21 +00:00
fengzeroz 2f04a3478e Merge pull request #2290 from fengzeroz/main
check decimal/precision/bias when add tags
2024-11-06 14:09:36 +08:00
fengzero c699d5a156 check decimal/precision/bias when add tags 2024-11-06 03:41:20 +00:00
fengzeroz 4de5e0ae85 Merge pull request #2286 from ZhouBox/main
plugin:buffer overflow
2024-11-05 09:51:07 +08:00
xiang.zhou 3e3a583d72 plugin:buffer overflow 2024-11-05 08:43:47 +08:00
fengzeroz 0b6c5bef39 Merge pull request #2285 from fengzeroz/main
mqtt port limit
2024-11-04 17:00:31 +08:00
fengzero dd46b6fe9e mqtt port limit 2024-11-04 08:54:54 +00:00
fengzeroz 1e0f51058e Merge pull request #2282 from fengzeroz/main
check plugin schema exist
2024-11-04 15:58:34 +08:00
fengzero c9ce39747e #2281: check plugin schema exist 2024-11-04 07:48:27 +00:00
fengzeroz 654a409538 Merge pull request #2275 from fengzeroz/main
update_im: not check subscribe
2024-11-01 13:50:05 +08:00
fengzeroz 8f684e4089 Merge pull request #2271 from hxy7yx/main-1
update install dependencies
2024-11-01 11:40:18 +08:00
fengzeroz d6839f42e3 Merge pull request #2269 from hankchan/patch-1
Update Install-dependencies.md
2024-11-01 11:40:01 +08:00
fengzeroz cd5c3900a4 Merge pull request #2274 from hxy7yx/main-2
fix(write):correct write value verification
2024-11-01 11:39:23 +08:00
fengzero 5b8c4173df update_im: not check subscribe 2024-11-01 03:34:27 +00:00
hxy7yx 11a95166f4 fix(write):correct write value verification 2024-11-01 11:25:07 +08:00
hxy7yx a07c042bf6 update install dependencies 2024-10-31 16:19:07 +08:00
Hank Chan 54aa872279 Update Install-dependencies.md
add "sudo"  before "make install"
2024-10-30 12:57:19 +08:00
fengzeroz cd5f750ce1 Merge pull request #2267 from fengzeroz/main
write tags: optional name
2024-10-25 11:05:50 +08:00
fengzero 4d7b3e0d80 write tags: optional name 2024-10-24 08:15:21 +00:00
fengzeroz 958e0f30f4 Merge pull request #2266 from ZhouBox/sm
mqtt:support keypass
2024-10-24 14:19:16 +08:00
xiang.zhou efc6cd3761 mqtt:support keypass 2024-10-24 13:55:01 +08:00
fengzeroz e1b33bc586 Merge pull request #2264 from fengzeroz/main
cid ut
2024-10-23 14:23:20 +08:00
fengzeroz e85b0be2c8 Merge pull request #2265 from hxy7yx/main-3
remove attribute: STATIC
2024-10-23 14:00:47 +08:00
hxy7yx ee5687527a remove attribute: STATIC 2024-10-23 13:41:19 +08:00
fengzero cc75d8ce8e cid ut 2024-10-23 03:15:25 +00:00
fengzeroz 2a79f11a39 Merge pull request #2263 from fengzeroz/main
import cid
2024-10-22 17:14:47 +08:00
fengzero ae30128dd3 cid: import and parse 2024-10-22 08:57:07 +00:00
fengzeroz 2f3462f46b Merge pull request #2260 from hxy7yx/main-1
feat(modbus):support opentelemetry
2024-10-22 15:43:40 +08:00
hxy7yx 4a608906ad feat(modbus):support opentelemetry 2024-10-22 14:11:11 +08:00
fengzeroz 5f5a376859 Merge pull request #2257 from ZhouBox/main
otel:add new api and support ns
2024-10-16 10:31:22 +08:00
xiang.zhou 51333961d6 otel:support ns and add span status 2024-10-16 10:18:25 +08:00
xiang.zhou a4f2671867 otel:add api and use new api 2024-10-16 10:18:18 +08:00
fengzeroz caec4d1585 Merge pull request #2251 from hxy7yx/main-1
feat(modbus):support device degradation
2024-10-15 10:24:22 +08:00
hxy7yx c22aaf25d4 feat(modbus):support start address base 0 or 1 2024-10-14 17:13:57 +08:00
hxy7yx 64467a28a7 feat(modbus):supoort configuring endianness in node configuration 2024-10-14 14:06:44 +08:00
hxy7yx 965c4ef081 feat(modbus):support device degradation 2024-10-14 10:54:46 +08:00
fengzeroz 5866f6ac7a Merge pull request #2250 from ZhouBox/main
plugin:rm so and schema file when remove custom plugin && mqtt trace:add resp playload
2024-09-30 10:44:10 +08:00
xiang.zhou 7a1198014b mqtt trace:add resp playload 2024-09-29 16:32:28 +08:00
xiang.zhou aeee3083aa plugin:rm so and schema file when remove custom plugin 2024-09-29 16:31:54 +08:00
fengzeroz 3f5caf1431 Merge pull request #2247 from ZhouBox/main
plugin:modify schema file path when update plugins
2024-09-29 14:01:05 +08:00
xiang.zhou b3c400782a plugin:modify schema file path when update plugins 2024-09-29 13:31:26 +08:00
fengzeroz fa70f58562 Merge pull request #2242 from hxy7yx/main-1
update mqtt schema
2024-09-26 14:14:44 +08:00
hxy7yx 7ede720318 update mqtt schema 2024-09-26 13:33:59 +08:00
fengzeroz d728490a7a Merge pull request #2233 from ZhouBox/feat-sample
feat(otel):add sample support
2024-09-25 15:00:18 +08:00
xiang.zhou efefc1233c otel:mqtt trace and update uuid imple 2024-09-25 13:21:26 +08:00
xiang.zhou 7636aa849c otel:rm log 2024-09-24 15:48:16 +08:00
fengzeroz 737107eae8 Merge pull request #2238 from fengzeroz/main
custom type
2024-09-24 15:16:35 +08:00
fengzero c4921a0fd4 custom type 2024-09-24 06:16:35 +00:00
xiang.zhou bbe24b812b otel:del cache 2024-09-23 17:41:47 +08:00
xiang.zhou edd062a393 rm debug log 2024-09-23 17:41:38 +08:00
xiang.zhou 6fa636f45d feat(otel):add sample support 2024-09-23 15:15:42 +08:00
fengzero 3d0d427c81 custom type 2024-09-23 06:49:16 +00:00
fengzeroz 00b82696e8 Merge pull request #2229 from fengzeroz/main
rm file plugin
2024-09-20 10:52:02 +08:00
fengzero a84414aab5 rm file plugin 2024-09-20 02:32:14 +00:00
fengzero cc5b772819 fix str cpy 2024-09-20 02:00:40 +00:00
fengzeroz ea772a0517 Merge pull request #2228 from fengzeroz/main
meta size 8
2024-09-19 14:42:02 +08:00
fengzero c0c66d2d64 meta size 8 2024-09-19 06:38:52 +00:00
fengzeroz 24fffc48c1 Merge pull request #2220 from hxy7yx/main-1
fix(read paginate):handle only_write tags
2024-09-19 10:46:30 +08:00
hxy7yx 2143f91220 fix(read paginate):handle only_write tags 2024-09-18 15:54:38 +08:00
fengzeroz ae693ada96 Merge pull request #2216 from ZhouBox/main
otel:add new api and modify old api
2024-09-14 10:38:24 +08:00
xiang.zhou 8301028684 otel:add new api and modify old api 2024-09-14 10:28:03 +08:00
fengzeroz 0f3974e1b6 Merge pull request #2214 from hxy7yx/main-1
ft(mqtt):upload driver states
2024-09-14 10:23:19 +08:00
hxy7yx 402f8b48e9 ft(mqtt):upload driver states 2024-09-12 16:02:22 +08:00
fengzeroz 27d021b972 Merge pull request #2213 from fengzeroz/main
read/write file
2024-09-12 15:30:19 +08:00
fengzero 9c1baebb0d read/write file 2024-09-12 06:59:42 +00:00
fengzeroz 1f0355f8ca Merge pull request #2212 from hxy7yx/mqtt
feat(mqtt):upload driver states
2024-09-12 13:51:17 +08:00
fengzeroz 6dde07b35e Merge pull request #2211 from ZhouBox/main
feat(otel):comm rest api,mqtt,ekuiper
2024-09-12 10:51:46 +08:00
fengzeroz 2f74cba1a2 Merge pull request #2210 from hxy7yx/mqtt5
MQTT plugin defaults to v311, Azure&AWS fixes v311
2024-09-12 10:37:53 +08:00
hxy7yx e4f6409bfa feat(mqtt):upload driver states 2024-09-12 10:09:44 +08:00
xiang.zhou 8ff3dc5f16 otel:api modify 2024-09-11 16:41:12 +08:00
xiang.zhou 9095e3bd32 feat(otel):comm rest api,mqtt,ekuiper 2024-09-10 14:54:29 +08:00
hxy7yx f0638afa3b mqtt default version: V311 2024-09-10 11:23:10 +08:00
fengzeroz b91c10dedb Merge pull request #2204 from fengzeroz/main
ci: clang-format
2024-09-09 10:57:45 +08:00
fengzero 44ee1fcfd0 format 2024-09-09 02:54:13 +00:00
fengzero 3d60180098 ci: clang-format 2024-09-09 02:52:51 +00:00
fengzeroz 85b5211958 Merge pull request #2201 from hxy7yx/mqtt5
MQTT default version v5
2024-09-09 10:38:57 +08:00
hxy7yx a64e844349 MQTT default version v5 2024-09-06 13:50:03 +08:00
fengzeroz bcbdeb3433 Merge pull request #2200 from hxy7yx/mqtt5
mqtt supports otel
2024-09-06 10:07:54 +08:00
hxy7yx ef2099414e mqtt supports otel 2024-09-05 11:56:31 +08:00
fengzeroz 2eb8801db2 Merge pull request #2199 from ZhouBox/main
feat(otel):new api
2024-09-05 10:41:29 +08:00
fengzeroz 8e4c5eba39 Merge pull request #2198 from hxy7yx/main-1
feat(mqtt): support mqtt v5 for otel tracing
2024-09-05 10:24:29 +08:00
xiang.zhou b17274917c feat(otel):new api 2024-09-04 17:41:31 +08:00
hxy7yx 4981173cee feat(mqtt): support mqtt v5 for otel tracing 2024-09-04 16:46:52 +08:00
fengzeroz 79f6c300cb Merge pull request #2197 from emqx/QQDQ-patch-1
Update README.md
2024-09-03 16:38:32 +08:00
QQDQ 7f981841b8 Update README.md 2024-09-03 16:18:27 +08:00
fengzeroz d8f51626bf Merge pull request #2195 from ZhouBox/main
add api about doing with basic data type
2024-08-30 16:56:39 +08:00
fengzeroz 7f63995367 Merge pull request #2194 from ZhouBox/feat-otel
feat(otel):add traces
2024-08-30 15:32:06 +08:00
xiang.zhou d4b2feebe4 add api about doing with basic data type 2024-08-29 14:28:41 +08:00
xiang.zhou fe772b6e63 feat(otel):add traces 2024-08-29 10:50:48 +08:00
fengzeroz 2364e82861 Merge pull request #2184 from hxy7yx/main-1
chore(mqtt): add reason for connection & disconnection
2024-08-20 16:20:08 +08:00
hxy7yx 49a1f7891e chore(mqtt): add reason for connection & disconnection 2024-08-20 14:40:02 +08:00
fengzeroz cbb3f3e8b5 Merge pull request #2176 from hxy7yx/main-1
guard against empty mqtt subscription topic
2024-08-15 10:03:25 +08:00
hxy7yx 2b162b8479 guard against empty mqtt subscription topic 2024-08-14 14:46:49 +08:00
fengzeroz 2f13b1f97a Merge pull request #2173 from hxy7yx/main-1
fix(modbus):clear value when update
2024-08-07 10:11:39 +08:00
fengzeroz 824cb12678 Merge pull request #2171 from eeff/main
feat(mqtt): remove mqtt cache db when node deleted
2024-08-07 10:11:19 +08:00
hxy7yx 7a7ff99e60 fix(modbus):clear value when update 2024-08-02 17:14:52 +08:00
eeff bd0f786406 feat(mqtt): remove mqtt cache db when node deleted 2024-08-01 15:50:49 +08:00
fengzeroz 333d4398c6 Merge pull request #2168 from hxy7yx/main-2
feat(modbus tcp):configure optional message header verification
2024-07-29 14:31:12 +08:00
fengzeroz ac664f90fc Merge pull request #2150 from hxy7yx/main-1
feat:core subscription supports filtering error tags
2024-07-29 14:30:13 +08:00
hxy7yx 5eb09ce853 feat(modbus tcp):configure optional message header verification 2024-07-29 10:58:35 +08:00
fengzeroz b74e23fc14 Merge pull request #2167 from eeff/main
chore: clean setting description
2024-07-29 10:00:41 +08:00
eeff cc84c7f620 chore(mqtt): clean setting description 2024-07-28 23:25:09 +08:00
eeff 5cf55b8a71 chore(modbus): clean setting description 2024-07-28 23:19:54 +08:00
hxy7yx 8e3ee3fde4 feat:core subscription supports filtering error messages 2024-07-26 15:30:51 +08:00
fengzeroz 384676b522 Merge pull request #2166 from fengzeroz/main
Revert "cyclic reporting does not detect change"
2024-07-26 15:24:39 +08:00
fengzero c107ea22fc Revert "cyclic reporting does not detect change"
This reverts commit b819021a6f.
2024-07-26 07:22:35 +00:00
fengzeroz 59f814134f Merge pull request #2164 from fengzeroz/main
2.10.0 alpha
2024-07-24 16:07:00 +08:00
fengzero 0c644d39e7 fix plugin ut 2024-07-24 08:00:47 +00:00
fengzeroz 4b333976a7 Merge pull request #2163 from ZhouBox/main
feat(rest):add api about configure status
2024-07-24 13:59:30 +08:00
fengzero b819021a6f cyclic reporting does not detect change 2024-07-24 05:58:28 +00:00
fengzero 81a742ac00 2.10.0 alpha 2024-07-24 05:57:01 +00:00
xiang.zhou 0108a36236 feat(rest):add api about configure status 2024-07-24 13:29:17 +08:00
fengzeroz c2656ae4f0 Merge pull request #2159 from hxy7yx/main-3
fix:correction of field name length detection
2024-07-24 10:25:00 +08:00
fengzeroz f831468ade Merge pull request #2155 from hxy7yx/main-2
fix(modbus):reconnect when recv error messages
2024-07-24 10:24:22 +08:00
hxy7yx e108f9d543 fix:correction of field name length detection 2024-07-23 17:24:39 +08:00
hxy7yx 824f856b85 fix(modbus):reconnect when recv error messages 2024-07-23 16:30:03 +08:00
fengzeroz d653145ac8 Merge pull request #2142 from hxy7yx/main-1
refactor(read paginate): optimize efficiency without filtering errors
2024-07-18 10:12:13 +08:00
hxy7yx 216d02e35f refactor(read paginate): optimize efficiency without filtering errors 2024-07-15 14:35:05 +08:00
fengzeroz c723a113dc Merge pull request #2141 from gc87/scan-tags
fix(scan): add ctx field to scan ft api
2024-07-15 14:21:09 +08:00
gc87 1acd50c821 fix(scan): add ctx field to scan api 2024-07-15 13:58:16 +08:00
fengzeroz cdd4ff8ae0 Merge pull request #2137 from gc87/scan-tags
fix(scan): rm tags type field
2024-07-12 09:42:58 +08:00
gc87 b7f6512b84 fix(scan): rm tags type field 2024-07-11 17:04:22 +08:00
fengzeroz 0624437afb Merge pull request #2132 from gc87/scan-tags
fix(scan): add ctx field
2024-07-10 16:02:53 +08:00
fengzeroz 34bfac36af Merge pull request #2133 from eeff/main
fix(core): set metric to init value when reset
2024-07-10 10:08:48 +08:00
gc87 3f72cfbed2 fix(scan): tag type 2024-07-09 23:02:10 +08:00
eeff 3e0ba09495 fix(core): set metric to init value when reset 2024-07-09 15:17:58 +08:00
fengzeroz 1c8bac3721 Merge pull request #2130 from eeff/main
fix(core): event loop check stop flag
2024-07-09 11:33:07 +08:00
gc87 005439c1da fix(scan): add ctx field 2024-07-08 17:16:56 +08:00
eeff 501d68a78e fix(core): event loop check stop flag 2024-07-08 10:17:39 +08:00
fengzeroz 5e25f90556 Merge pull request #2120 from eeff/main
chore: add error code `NEU_ERR_BODY_TOO_BIG`
2024-07-01 09:56:57 +08:00
eeff 12c93d175c chore: add error code NEU_ERR_BODY_TOO_BIG 2024-06-27 00:03:01 +08:00
fengzeroz 1ebafcc429 Merge pull request #2116 from hxy7yx/main-2
refactor(modbus)
2024-06-25 14:21:37 +08:00
fengzeroz 6c16dae529 Merge pull request #2105 from hxy7yx/main-1
modbus: support read sync
2024-06-25 14:20:55 +08:00
hxy7yx 6c508f9f00 refactor(modbus) 2024-06-21 16:18:57 +08:00
fengzeroz 9b861fadc8 Merge pull request #2114 from ZhouBox/main
add notice log about node,group,sub
2024-06-21 10:09:14 +08:00
xiang.zhou 40b87e1605 add notice log about node,group,sub 2024-06-18 17:00:00 +08:00
fengzeroz cdf3b4af31 Merge pull request #2106 from hxy7yx/main-2
rename precision when read floating-tag
2024-06-18 13:59:47 +08:00
hxy7yx cf6bf33a2c rename precision when read floating-tag 2024-06-18 13:46:54 +08:00
hxy7yx 997ac04c63 modbus: support read sync 2024-06-17 15:59:05 +08:00
fengzeroz e0ea70ddc6 Merge pull request #2099 from hxy7yx/main-2
fix(test read): stop group timer while testing
2024-06-14 15:29:51 +08:00
fengzeroz 412003f9db Merge pull request #2101 from hxy7yx/main-1
fix(manager): exit after sending uninit msg failed
2024-06-14 15:28:39 +08:00
hxy7yx 18e0d51373 fix(manager): exit even if send uninit msg failed 2024-06-14 14:58:42 +08:00
hxy7yx 12d53feb9c fix(test read): stop group timer while testing 2024-06-14 11:12:29 +08:00
fengzeroz ee589eeb7f Merge pull request #2094 from ZhouBox/main
display optimization for float and double types when setting bias
2024-06-14 09:52:25 +08:00
fengzeroz 0ee05461fd Merge pull request #2092 from eeff/main
fix(core): read_report_group add tag bias
2024-06-14 09:51:57 +08:00
eeff cd4daa52b9 fix(core): read_report_group add tag bias 2024-06-13 14:57:13 +08:00
xiang.zhou 682b499279 display optimization for float and double types when setting bias 2024-06-13 14:55:19 +08:00
fengzeroz a872ad3460 Merge pull request #2089 from hxy7yx/main-1
fix(write): write *.0
2024-06-13 13:46:06 +08:00
hxy7yx 62de43327a fix(write): write *.0 2024-06-13 10:54:50 +08:00
fengzeroz 492bafa0d7 Merge pull request #2087 from hxy7yx/main-1
ft(test read)
2024-06-12 09:40:52 +08:00
fengzeroz 5a548ff634 Merge pull request #2088 from eeff/main
feat(core): add `interval` field to struct neu_plugin_group
2024-06-12 09:40:36 +08:00
eeff d8f7980586 feat(core): add interval field to struct neu_plugin_group 2024-06-12 01:02:39 +08:00
hxy7yx 71216aeceb ft(test read) 2024-06-11 17:57:19 +08:00
fengzeroz f51e8817ff Merge pull request #2086 from gc87/jwt-exp
fix(jwt): add jwt encode for test
2024-06-11 16:15:35 +08:00
gc87 46ba471c9b fix(jwt): add jwt encode for test 2024-06-11 15:33:04 +08:00
fengzeroz 6689c31f72 Merge pull request #2076 from hxy7yx/main-1
feat(core & modbus tcp): test read tag
2024-06-11 14:35:42 +08:00
fengzeroz 6eaf49957b Merge pull request #2082 from gc87/jwt-exp
fix(jwt): replacing expired tokens
2024-06-11 14:33:22 +08:00
gc87 14aeaa0688 fix(jwt): replacing expired tokens 2024-06-11 14:17:36 +08:00
fengzeroz a09b0f773c Merge pull request #2080 from ZhouBox/main
async queue:add api about length
2024-06-07 15:44:00 +08:00
xiang.zhou 64fe2e1994 async queue:add api about length 2024-06-07 15:24:55 +08:00
hxy7yx 5925bf257a feat(core & modbus tcp): test read tag 2024-06-07 14:51:25 +08:00
fengzeroz 4b0532fedc Merge pull request #2054 from hxy7yx/main-3
feat(read):support pagination and filter(error) when reading tags
2024-06-05 15:42:21 +08:00
fengzeroz f5a3e0fc3b Merge pull request #2070 from fengzeroz/main
set node start if loading node state is ready
2024-06-05 14:54:18 +08:00
fengzero f9770052c2 fix init msg state init 2024-06-05 06:36:13 +00:00
fengzero 13a953a8cb start node if node state is ready 2024-06-05 06:30:26 +00:00
fengzeroz 584cd3c77d Merge pull request #2067 from eeff/main
feat(mqtt): schema client-id and write req/resp topic default value
2024-06-05 10:43:26 +08:00
eeff 2a686ed283 feat(mqtt): schema client-id and write req/resp topic default value 2024-06-05 10:40:02 +08:00
hxy7yx 411cdc4f02 feat(read):support pagination and filter(error) when reading tags 2024-06-04 15:53:12 +08:00
fengzeroz a5f912b658 Merge pull request #2058 from ZhouBox/main
display optimization for float and double types
2024-06-03 17:24:14 +08:00
xiang.zhou c768652274 display optimization for float and double types 2024-06-03 17:09:24 +08:00
fengzeroz d71610da30 Merge pull request #2050 from hxy7yx/main-3
fix: memory leak
2024-05-31 15:12:56 +08:00
hxy7yx c7c60e461d fix: memory leak 2024-05-31 14:40:22 +08:00
fengzeroz 085f9dcc33 Merge pull request #2044 from fengzeroz/main
fix(update): update error when value is error
2024-05-30 11:24:24 +08:00
fengzero ac779c9f87 fix(update): update error when value is error 2024-05-30 03:11:27 +00:00
fengzeroz bcf21ab507 Merge pull request #2039 from hxy7yx/main-1
check and handle NaN for float and double in read and report operations
2024-05-29 17:29:50 +08:00
hxy7yx 8b5bd7f92a check and handle NaN for float and double in read and report operations 2024-05-29 16:55:02 +08:00
fengzeroz 859c84ceae Merge pull request #2033 from hxy7yx/main-3
metric: reset send&recv bytes when restart node
2024-05-29 14:48:14 +08:00
fengzeroz c48ce41298 Merge pull request #2035 from eeff/main
fix: update trans_data metric only when plugin is started
2024-05-29 14:47:36 +08:00
eeff ffd149a970 fix(mqtt): update trans_data metric only when plugin is started 2024-05-29 14:27:52 +08:00
eeff 2b3f2f94d4 fix(ekuiper): update trans_data metric only when plugin is started 2024-05-29 14:27:09 +08:00
hxy7yx d851eb1ad5 metric: reset send&recv bytes when restart node 2024-05-29 13:35:05 +08:00
fengzeroz 0c346d0542 Merge pull request #2008 from gc87/scan-tags
feat: add scan tags reqest & response
2024-05-24 09:48:44 +08:00
fengzeroz 4c73f227f7 Merge pull request #2013 from ZhouBox/main
driver:change log level
2024-05-24 09:48:12 +08:00
fengzeroz 75ef81e21c Merge pull request #2016 from hxy7yx/main-2
fix(write): write *.0
2024-05-24 09:47:56 +08:00
hxy7yx eb243d6cfc feat(read): response precision when read float or double tags 2024-05-23 17:55:38 +08:00
hxy7yx c361580254 fix(write): write *.0 2024-05-23 12:01:34 +08:00
xiang.zhou 22ddf97eaa driver:change log level 2024-05-21 15:20:47 +08:00
gc87 1d9d5b2181 feat: add scan tags api 2024-05-20 17:55:55 +08:00
gc87 0effd044d2 feat: add scan tags reqest & response 2024-05-20 16:01:53 +08:00
fengzeroz 7461693cff Merge pull request #2004 from eeff/main
feat(aws-iot): remove config default value
2024-05-17 15:52:37 +08:00
eeff 8dd2d1d9c0 feat(aws-iot): remove config default value 2024-05-17 15:43:22 +08:00
fengzeroz 86e2ed532f Merge pull request #1992 from hxy7yx/main-1
check if the written value conforms to the standard
2024-05-17 10:21:26 +08:00
fengzeroz d1ef1c06ab Merge pull request #1996 from ZhouBox/main
prgfile:add del flag
2024-05-16 14:15:55 +08:00
xiang.zhou 20855be480 prgfile:add del flag 2024-05-16 13:16:45 +08:00
hxy7yx 0b19e0b17b check if the written value conforms to the standard 2024-05-15 17:04:29 +08:00
fengzeroz baf1cbe3d4 Merge pull request #1991 from ZhouBox/main
prgfile:modify msg struct about upload prgfile
2024-05-15 16:35:09 +08:00
xiang.zhou 7183e37d2e prgfile:modify msg struct about upload prgfile 2024-05-15 16:27:41 +08:00
fengzeroz 6bac9517a6 Merge pull request #1990 from ZhouBox/main
dlclose dl when release version
2024-05-15 16:17:44 +08:00
xiang.zhou 11272bcc2a dlclose dl when release version 2024-05-15 15:53:06 +08:00
fengzeroz c86adfb1a9 Merge pull request #1984 from ZhouBox/main
fixbug:no close dl when del node
2024-05-14 16:58:35 +08:00
xiang.zhou df1c7f38e7 check handle 2024-05-14 15:58:57 +08:00
xiang.zhou 7a10c697d0 fixbug:no close dl when del node 2024-05-14 15:38:32 +08:00
fengzeroz 2e7c046116 Merge pull request #1978 from hxy7yx/main-1
ft:test launch configuration
2024-05-10 13:54:47 +08:00
hxy7yx c3309a5a29 ft:test launch configuration 2024-05-09 10:31:41 +08:00
fengzeroz 263c996991 Merge pull request #1977 from eeff/main
test(azure): add ft
2024-05-09 09:45:18 +08:00
eeff 68ca03f197 ci: Azure IoT plugin codecov report 2024-05-07 15:35:40 +08:00
eeff c39747b585 test(azure): add ft 2024-05-07 14:26:52 +08:00
eeff f2d851a5fa fix(azure): clean configuration keys 2024-05-07 14:26:52 +08:00
eeff ea8369ae98 feat(core): mqtt client subscription support wildcard 2024-05-07 14:26:52 +08:00
fengzeroz 3e1e6d0269 Merge pull request #1976 from hxy7yx/main-1
increase test coverage
2024-05-07 09:43:55 +08:00
hxy7yx f9718bc63a increase test coverage 2024-05-06 18:13:48 +08:00
fengzeroz dc041d102c Merge pull request #1966 from eeff/main
feat: add Azure IoT plugin
2024-05-06 09:46:47 +08:00
fengzeroz 8d6696fb78 Merge pull request #1972 from ZhouBox/main
fixbug:incomplete value print
2024-05-06 09:44:48 +08:00
fengzeroz b7205e1309 Merge pull request #1973 from eeff/eeff/dev
fix(restful): invalid free
2024-05-06 09:43:52 +08:00
eeff 8779c6558f fix(restful): invalid free 2024-04-30 16:27:06 +08:00
xiang.zhou bde8459aa2 fixbug:incomplete value print 2024-04-30 16:23:15 +08:00
eeff 19c44a0735 feat(azure): handle data upload 2024-04-29 16:07:43 +08:00
fengzeroz bbbb7c2b1a Merge pull request #1965 from hxy7yx/main-2
increase test coverage
2024-04-29 15:55:31 +08:00
eeff 8b9d275834 feat: add Azure IoT plugin 2024-04-29 15:06:03 +08:00
fengzeroz d724c52cb2 Merge pull request #1963 from eeff/main
fix: reset metrics when node stopped
2024-04-29 09:43:44 +08:00
hxy7yx 407f650fe1 increase test coverage 2024-04-28 17:35:38 +08:00
eeff 0ac0e0aa86 fix: start/stop group timer when driver started/stopped 2024-04-26 15:40:37 +08:00
eeff 2350cb87b0 feat: add metric type no reset flag 2024-04-26 15:34:24 +08:00
fengzeroz 1e30eea3f6 Merge pull request #1958 from fengzeroz/main
change update log level
2024-04-24 14:34:36 +08:00
fengzero 94023446c7 change update log level 2024-04-24 05:50:19 +00:00
fengzeroz 600e5ee56f Merge pull request #1956 from hxy7yx/main-1
test(tag):fix utf8 check & improve ft cov
2024-04-23 13:43:55 +08:00
fengzeroz f0d19af977 Merge pull request #1957 from eeff/main
chore: add AWS IoT to default plugins
2024-04-23 13:43:20 +08:00
eeff 0b4fed4693 chore: add AWS IoT to default plugins 2024-04-23 11:44:43 +08:00
hxy7yx 4c10678318 test(tag):fix utf8 check & improve ft cov 2024-04-22 15:07:43 +08:00
fengzeroz 719653c132 Merge pull request #1950 from hxy7yx/main-1
ft:add api for modbus address_base configuration
2024-04-22 09:38:13 +08:00
fengzeroz 84e0a6554c Merge pull request #1952 from hxy7yx/main-2
locating core dump files
2024-04-22 09:37:54 +08:00
fengzeroz 24789945d5 Merge pull request #1951 from eeff/main
feat(aws-iot): add aws-iot plugin
2024-04-22 09:36:25 +08:00
hxy7yx 8eb945e5f9 locating core dump files, adapting to NeuronEX 2024-04-19 17:56:51 +08:00
hxy7yx ee6199f2e5 ft:add api for modbus address_base configuration 2024-04-18 16:38:18 +08:00
eeff 27113aaeb4 feat(aws-iot): add aws-iot plugin 2024-04-17 18:25:53 +08:00
eeff ad5fa417ca refactor(mqtt): split plugin interface callback into separate translation unit 2024-04-16 15:27:12 +08:00
fengzeroz 7c611fd151 Merge pull request #1946 from eeff/main
fix(restful): read api invalid free
2024-04-15 15:35:34 +08:00
fengzeroz 0cc9631c9d Merge pull request #1944 from hxy7yx/main-2
remove the default values that carry variables in the schema
2024-04-15 11:38:57 +08:00
fengzeroz 8e0cc62c29 Merge pull request #1943 from hxy7yx/main-1
Revert "check if the written value conforms to the standard"
2024-04-15 11:38:13 +08:00
eeff 020026ae04 fix(restful): read api invalid free 2024-04-15 11:29:38 +08:00
hxy7yx 2a05178800 remove the default values that carry variables in the schema 2024-04-15 11:12:43 +08:00
hxy7yx 245a019082 Revert "check if the written value conforms to the standard"
This reverts commit d9157687ed.
2024-04-15 10:41:58 +08:00
fengzeroz 35d34721a4 Merge pull request #1941 from eeff/main
feat(ekuiper): support write multiple tags
2024-04-12 15:19:33 +08:00
eeff 173aa17eb9 test: add eKuiper write tags ft 2024-04-12 09:44:08 +08:00
eeff 0b67a088c1 feat(ekuiper): support write multiple tags 2024-04-12 09:44:08 +08:00
fengzeroz 6c43d599bc Merge pull request #1936 from eeff/main
feat(core): add tag bias field
2024-04-11 10:08:08 +08:00
eeff 1ed9a7d595 test: add ft for reading tag bias value 2024-04-10 14:42:36 +08:00
eeff 43aec2e5f2 feat(core): return bias tag value if needed 2024-04-10 14:42:36 +08:00
eeff 96bebcd81e test: tag bias ft 2024-04-10 14:42:36 +08:00
eeff bb793f6e14 feat(core): add tag bias field 2024-04-10 14:42:36 +08:00
eeff 7f9aa4cfc8 feat(persist): persist tag bias field 2024-04-10 14:42:36 +08:00
eeff 76914637c9 feat(persist): add SQL schema for tag bias field 2024-04-10 14:42:36 +08:00
fengzeroz 6f0ff2a862 Merge pull request #1937 from hxy7yx/main-1
determine whether tag(string) set endianness
2024-04-10 13:42:39 +08:00
hxy7yx 94d4a8db6e determine whether tag(string) set endianness 2024-04-10 11:47:59 +08:00
Rory 5d26cb1d77 ci: add code cov token in workflow (#1940)
Signed-off-by: Rory Z <16801068+Rory-Z@users.noreply.github.com>
2024-04-10 10:33:37 +08:00
fengzeroz 5f20e6dde3 Merge pull request #1932 from hxy7yx/main-1
supoort configuring endianness in node configuration
2024-03-29 16:57:31 +08:00
hxy7yx fbff7e68fd supoort configuring endianness in node configuration 2024-03-29 16:51:39 +08:00
fengzeroz 05d3e324d7 Merge pull request #1929 from hxy7yx/main-1
determine whether tag set endianness
2024-03-29 14:40:53 +08:00
hxy7yx c09b401e4a determine whether tag set endianness 2024-03-29 13:40:53 +08:00
fengzeroz 3d2d169935 Merge pull request #1924 from eeff/main
fix(ekuiper): check received aio NULL msg
2024-03-27 10:02:36 +08:00
eeff f831e71ad3 fix(ekuiper): check received aio data race 2024-03-26 10:29:47 +08:00
fengzeroz 6a13aeed8a Merge pull request #1923 from fengzeroz/main
ft time type
2024-03-25 10:19:45 +08:00
fengzero 76ce5acaf3 ft time type 2024-03-25 02:17:06 +00:00
fengzeroz 0c2c4fa920 Merge pull request #1919 from eeff/main
feat(core): add NEU_TYPE_TIME and NEU_TYPE_DATA_AND_TIME
2024-03-22 16:27:32 +08:00
eeff e76d24cd15 feat(persist): add SQL schema for NEU_TYPE_TIME/NEU_TYPE_DATA_AND_TIME 2024-03-22 16:08:15 +08:00
eeff a98e9ae904 feat(core): add NEU_TYPE_TIME and NEU_TYPE_DATA_AND_TIME 2024-03-22 16:08:15 +08:00
fengzeroz ce1e53d653 Merge pull request #1916 from fengzeroz/main
fix(conn): check offset reset
2024-03-21 09:54:27 +08:00
fengzero bf5fbdb31d fix(conn): check offset reset 2024-03-21 01:37:23 +00:00
fengzeroz ef991d9a6e Merge pull request #1913 from eeff/main
feat(modbus_tty_simlator): enhance command line interface
2024-03-19 15:45:58 +08:00
eeff 3eba902519 feat(modbus_tty_simlator): enhance command line interface 2024-03-19 11:53:41 +08:00
fengzeroz 7f3b698f69 Merge pull request #1910 from hxy7yx/main-1
move MAX_GROUPS check to validate function
2024-03-15 13:49:46 +08:00
hxy7yx 68d5bcec71 move MAX_GROUPS check to validate function 2024-03-15 12:03:53 +08:00
fengzeroz 5019983ce3 Merge pull request #1905 from hxy7yx/main-1
plugin(modbus): fix invalid message check
2024-03-14 16:57:11 +08:00
hxy7yx afd72ce259 plugin(modbus): fix invalid message check 2024-03-14 16:52:41 +08:00
fengzeroz 840f1aac3d Merge pull request #1900 from hxy7yx/main-1
plugin(modbus): fix modbus rtu slave check
2024-03-13 16:37:13 +08:00
hxy7yx 1d5d6de72c plugin(modbus): fix modbus rtu slave check 2024-03-13 16:15:09 +08:00
fengzeroz 7039ec3055 Merge pull request #1899 from hxy7yx/main-1
ft: move robotframework tests to pytest
2024-03-13 10:29:38 +08:00
hxy7yx 2eb52906e9 ft: move robotframework tests to pytest 2024-03-12 13:37:47 +08:00
fengzeroz c14b1e96e6 Merge pull request #1893 from hxy7yx/main-2
fix(add gtags): correct tag count when tag name conflict
2024-03-08 17:48:21 +08:00
hxy7yx d37bb5aa50 fix(add gtags): correct tag count when tag name conflict 2024-03-08 17:38:45 +08:00
fengzeroz 8ad0fdcf73 Merge pull request #1885 from eeff/main
fix(core): eliminate NEU_REQ_ADD_DRIVERS request data race
2024-03-08 13:52:23 +08:00
eeff 5478fd0fc5 fix(core): eliminate NEU_REQ_ADD_DRIVERS request data race 2024-03-08 11:34:26 +08:00
fengzeroz 74b45c91ee Merge pull request #1882 from eeff/main
fix(core): persist group when adding gtags
2024-03-07 17:34:01 +08:00
eeff 79fca4b18f fix(core): persist group when adding gtags 2024-03-07 17:30:47 +08:00
fengzeroz 142f31beff Merge pull request #1878 from eeff/main
feat(core): set domain socket to block mode and 1s timeout
2024-03-07 11:08:14 +08:00
eeff f17ab92e1f feat(core): set domain socket to block mode and 1s timeout 2024-03-07 10:45:15 +08:00
fengzeroz 32b4a251ae Merge pull request #1877 from fengzeroz/main
test
2024-03-06 18:11:59 +08:00
fengzero 8271e93af6 Revert "test"
This reverts commit 0c9c12c0e4.
2024-03-06 09:47:36 +00:00
fengzeroz a117ee2ba4 Merge pull request #1876 from fengzeroz/main
test
2024-03-06 17:20:24 +08:00
fengzero 0c9c12c0e4 test 2024-03-06 09:14:24 +00:00
fengzeroz b3d1b56084 Merge pull request #1875 from ZhouBox/main
check module name when update plugin
2024-03-06 11:20:58 +08:00
xiang.zhou 26e480982d check module name when update plugin 2024-03-06 10:59:59 +08:00
fengzeroz 45fa293fbc Merge pull request #1869 from eeff/main
fix: notify north app about driver group deletion
2024-03-06 09:44:49 +08:00
eeff b996ad1ac5 fix(ekuiper): handle NEU_REQ_DEL_GROUP 2024-03-05 17:59:41 +08:00
eeff 579df5c023 test(mqtt): data upload when driver group deleted 2024-03-05 17:59:41 +08:00
eeff 025fb8c30a fix(mqtt): handle NEU_REQ_DEL_GROUP 2024-03-05 17:59:41 +08:00
eeff f7d0be2e05 fix(core): notify app about driver group deletion 2024-03-05 17:59:41 +08:00
505 changed files with 195988 additions and 440681 deletions
+162 -74
View File
@@ -9,24 +9,25 @@ on:
jobs:
clang_format_check:
runs-on: ubuntu-20.04
runs-on: ubuntu-24.04
steps:
# checkout
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
submodules: recursive
- name: Run clang-format style check for C/C++ programs.
uses: DoozyX/clang-format-lint-action@v0.12
uses: DoozyX/clang-format-lint-action@v0.18
with:
source: 'src plugins include tests'
exclude: 'include/neuron/utils/uthash.h include/neuron/utils/utarray.h include/neuron/utils/utlist.h include/neuron/utils/zlog.h'
clangFormatVersion: 10
exclude: 'include/neuron/utils/uthash.h include/neuron/utils/utarray.h include/neuron/utils/utlist.h include/neuron/utils/zlog.h src/otel/trace.pb-c.h src/otel/trace.pb-c.c src/otel/resource.pb-c.h src/otel/resource.pb-c.c src/otel/common.pb-c.c src/otel/common.pb-c.h plugins/mqtt/ptformat.pb-c.h plugins/mqtt/ptformat.pb-c.c'
style: file
clangFormatVersion: 10
cppcheck:
runs-on: ubuntu-20.04
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-v2.15
steps:
- uses: actions/checkout@v4
@@ -35,13 +36,25 @@ jobs:
- name: cppcheck
run: |
sudo apt install cppcheck
cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=unusedFunction ./plugins ./src
sudo apt install -y cppcheck
cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=unusedFunction --suppress=*:src/otel/trace.pb-c.c --suppress=*:src/otel/common.pb-c.c --suppress=*:src/otel/resource.pb-c.c ./plugins ./src
cppcheck --enable=all --error-exitcode=2 --inline-suppr --suppress=missingInclude --suppress=variableScope ./simulator
ut:
runs-on: ubuntu-20.04
container: ghcr.io/neugates/build:x86_64-main
flawfinder:
name: Flawfinder Scan
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: flawfinder_scan
uses: david-a-wheeler/flawfinder@2.0.20
with:
arguments: '--minlevel=3 .'
build:
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-v2.15
steps:
- uses: actions/checkout@v4
@@ -53,11 +66,35 @@ jobs:
git config --global --add safe.directory $(pwd)
mkdir -p build && cd build
cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
make -j4
make -j4
- uses: actions/upload-artifact@v4
with:
name: neuron-build
path: |
build
ut:
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-v2.15
needs: [build]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: actions/download-artifact@v4
with:
name: neuron-build
path: ./build
- name: unit test
run: |
chmod -R +x ./build/
cd build
cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
ctest --output-on-failure
- name: create cov report
@@ -68,65 +105,21 @@ jobs:
./create_cov_report.sh ut
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
with:
verbose: true
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./cov_report/
files: cov-ut.info
ft:
runs-on: ubuntu-20.04
container: ghcr.io/neugates/build:x86_64-main
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: compile
run: |
git config --global --add safe.directory $(pwd)
mkdir -p build && cd build
cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
make -j4
- name: function test
run: |
sudo apt-get install -y mosquitto
mosquitto -v &
python3 -m pip install -U pip
python3 -m pip install -r ft/requirements.txt
python3 -m robot --maxerrorlines=600 -P ft/ -d ft/reports ft
- uses: actions/upload-artifact@v3
with:
name: ft_result
path: |
build/neuron.log
- name: create cov report
run: |
sudo apt-get update
sudo apt-get -y install lcov
mkdir -p cov_report
./create_cov_report.sh ft
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
verbose: true
fail_ci_if_error: true
directory: ./cov_report/
files: cov-ft.info
files: ./cov_report/cov-ut.info
pft:
runs-on: ubuntu-20.04
container: ghcr.io/neugates/build:x86_64-main
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-v2.15
needs: [build]
strategy:
matrix:
plugin: [core, ekuiper, modbus, mqtt, metrics]
steps:
- uses: actions/checkout@v4
with:
@@ -134,27 +127,32 @@ jobs:
- name: setup dependencies
run: |
if [ "${{ matrix.plugin }}" = "mqtt" ]; then
sudo apt-get install -y mosquitto
fi
sudo apt-get install -y mosquitto
pip install -U pytest requests prometheus-client gmqtt pynng sniffio
sudo apt-get install -y socat
- name: compile
run: |
git config --global --add safe.directory $(pwd)
mkdir -p build && cd build
cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
make -j4
- uses: actions/download-artifact@v4
with:
name: neuron-build
path: ./build
- name: function test
run: |
chmod -R +x ./build/
cd build
cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
cd ..
if [ "${{ matrix.plugin }}" = "core" ]; then
pytest -s -v tests/ft \
--ignore=tests/ft/app/test_ekuiper.py \
--ignore=tests/ft/app/test_mqtt.py \
--ignore=tests/ft/app/test_azure.py \
--ignore=tests/ft/app/test_kafka.py \
--ignore=tests/ft/driver/test_modbus.py \
--ignore=tests/ft/metrics/test_metrics.py
--ignore=tests/ft/metrics/test_metrics.py \
--ignore=tests/ft/login/test_launch.py \
--ignore=tests/ft/login/test_filter_error.py \
--ignore=tests/ft/login/test_login.py
elif [ "${{ matrix.plugin }}" = "ekuiper" ]; then
pytest -s -v tests/ft/app/"test_ekuiper.py"
elif [ "${{ matrix.plugin }}" = "modbus" ]; then
@@ -173,8 +171,98 @@ jobs:
./create_cov_report.sh ${{ matrix.plugin }}
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
with:
verbose: true
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./cov_report/
files: cov-${{ matrix.plugin }}.info
files: ./cov_report/cov-${{ matrix.plugin }}.info
pft_kafka:
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-v2.15
needs: [build]
services:
kafka:
image: apache/kafka:3.7.0
env:
KAFKA_NODE_ID: "1"
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1"
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: "0"
CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk
ports:
- 9092:9092
options: >-
--health-cmd "bash -c 'echo > /dev/tcp/localhost/9092'"
--health-interval 10s
--health-timeout 5s
--health-retries 10
--health-start-period 30s
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup dependencies
run: |
python3 -m pip install --upgrade pip
pip install -U pytest requests confluent-kafka==2.3.0
- uses: actions/download-artifact@v4
with:
name: neuron-build
path: ./build
- name: debug kafka plugin deps
run: |
echo "=== libs in staging prefix ==="
ls -la /home/neuron/v2.15/libs/x86_64-linux-gnu/lib/librdkafka* || echo "no librdkafka"
ls -la /home/neuron/v2.15/libs/x86_64-linux-gnu/lib/libzstd* || echo "no libzstd"
ls -la /home/neuron/v2.15/libs/x86_64-linux-gnu/lib/libsasl2* || echo "no libsasl2"
echo "=== libs in /usr/local/lib ==="
ls -la /usr/local/lib/librdkafka* /usr/local/lib/libzstd* /usr/local/lib/libsasl2* 2>/dev/null || echo "none yet"
echo "=== ldd librdkafka from staging ==="
ldd /home/neuron/v2.15/libs/x86_64-linux-gnu/lib/librdkafka.so.1 || true
echo "=== ldd plugin-kafka from build ==="
chmod -R +x ./build/ 2>/dev/null || true
ldd ./build/plugins/libplugin-kafka.so || true
- name: function test
env:
KAFKA_BROKER: kafka:9092
run: |
chmod -R +x ./build/
cd build
cmake -DUSE_GCOV=1 .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
cd ..
ldconfig
echo "=== post-ldconfig ldd check ==="
ldd ./build/plugins/libplugin-kafka.so || true
ldd /usr/local/lib/librdkafka.so.1 || true
echo "=== try manual dlopen ==="
python3 -c "import ctypes; ctypes.CDLL('./build/plugins/libplugin-kafka.so')" 2>&1 || true
pytest -s -v tests/ft/app/test_kafka.py
- name: create cov report
run: |
sudo apt-get update
sudo apt-get -y install lcov
mkdir -p cov_report
./create_cov_report.sh kafka
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
verbose: true
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./cov_report/
files: ./cov_report/cov-kafka.info
+16 -14
View File
@@ -8,20 +8,18 @@ on:
- published
env:
VERSION: 2.7.0
VERSION: 2.15.4
UI_VERSION: 2.6.1
BRANCH: main
BRANCH: v2.15
jobs:
cross-build:
runs-on: ubuntu-20.04
runs-on: ubuntu-24.04
strategy:
matrix:
arch:
- [aarch64-linux-gnu, aarch64, arm64]
- [arm-linux-gnueabihf, armv4, armhf]
- [x86_64-linux-gnu, x86_64, amd64]
container: ghcr.io/neugates/build:${{ matrix.arch[1] }}-main
container: ghcr.io/neugates/build:${{ matrix.arch[1] }}-v2.15
steps:
- uses: actions/checkout@v4
@@ -52,19 +50,19 @@ jobs:
run: |
./package-sdk.sh -p ${{ matrix.arch[2] }} -n neuron-sdk-$VERSION
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: neuron-sdk
name: neuron-sdk-${{ matrix.arch[2] }}
path: |
neuron-sdk-*.tar.gz
build-debug-sdk:
runs-on: ubuntu-20.04
runs-on: ubuntu-24.04
strategy:
matrix:
arch:
- [x86_64-linux-gnu, x86_64, amd64]
container: ghcr.io/neugates/build:${{ matrix.arch[1] }}-main
container: ghcr.io/neugates/build:${{ matrix.arch[1] }}-v2.15
steps:
- uses: actions/checkout@v4
@@ -83,9 +81,9 @@ jobs:
run: |
./package-sdk.sh -p ${{ matrix.arch[2] }} -n neuron-sdk-debug-$VERSION
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: neuron-sdk
name: neuron-sdk-debug
path: |
neuron-sdk-debug-*.tar.gz
@@ -102,9 +100,13 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4
with:
name: neuron-sdk
name: neuron-sdk-debug
- uses: actions/download-artifact@v4
with:
name: neuron-sdk-amd64
- uses: softprops/action-gh-release@v1
env:
+22
View File
@@ -0,0 +1,22 @@
name: Translate Issue from Chinese to English
on:
workflow_dispatch:
inputs:
issue_number:
description: 'The issue number to translate'
required: true
type: string
issues:
types: [opened]
jobs:
translate:
runs-on: ubuntu-latest
permissions:
issues: write # Grant permission to edit issues
steps:
- uses: emqx/translate-issue-action@ee63ec619dfc5808ee2093dba93dfd7ac3beb437 # v1.0.2
with:
issue_number: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.issue_number || github.event.issue.number }}
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
@@ -0,0 +1,71 @@
name: manual check
on:
workflow_dispatch:
inputs:
plugins:
description: 'Comma separated list of plugins to test (default: all unused plugins)'
required: false
default: 'azure,launch'
jobs:
build:
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-main
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: compile
run: |
git config --global --add safe.directory $(pwd)
mkdir -p build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
make -j4
- uses: actions/upload-artifact@v4
with:
name: neuron-build-unused-plugins
path: |
build
unused_plugins_test:
runs-on: ubuntu-24.04
container: ghcr.io/neugates/build:x86_64-main
needs: [build]
strategy:
matrix:
plugin: [azure, launch]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup dependencies
run: |
sudo apt-get install -y mosquitto
pip install -U pytest requests prometheus-client gmqtt pynng sniffio
sudo apt-get install -y socat
- uses: actions/download-artifact@v4
with:
name: neuron-build-unused-plugins
path: ./build
- name: function test
run: |
chmod -R +x ./build/
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/x86_64-linux-gnu.cmake
cd ..
if [ "${{ matrix.plugin }}" = "azure" ]; then
pytest -s -v tests/ft/app/"test_azure.py"
elif [ "${{ matrix.plugin }}" = "launch" ]; then
pytest -s -v tests/ft/login
fi
- name: Test completed
run: |
echo "Testing for ${{ matrix.plugin }} completed successfully"
+2 -1
View File
@@ -19,4 +19,5 @@ neuron-sdk
.vscode
log.html
output.xml
report.html
report.html
*.cache
+45 -8
View File
@@ -40,8 +40,13 @@ if(USE_GCOV)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
endif(USE_GCOV)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -g")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=format-truncation")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O0")
add_compile_options(-fstack-protector-strong)
add_link_options(-fstack-protector-strong)
add_link_options(-pie -Wl,-z,relro,-z,now)
if(NOT DISABLE_ASAN)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -fsanitize=address")
@@ -54,14 +59,19 @@ add_custom_target(neuron-version
${CMAKE_CURRENT_SOURCE_DIR}/cmake/neuron-version.cmake)
find_package(nng CONFIG REQUIRED)
find_package(LibXml2 REQUIRED)
find_package(Threads)
set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL REQUIRED)
if (CMAKE_STAGING_PREFIX)
include_directories(${CMAKE_STAGING_PREFIX}/include)
link_directories(${CMAKE_STAGING_PREFIX}/lib)
include_directories(${CMAKE_STAGING_PREFIX}/include/libxml2)
else()
include_directories(/usr/local/include)
link_directories(/usr/local/lib)
include_directories(/usr/local/include/libxml2)
endif()
set(PERSIST_SOURCES
@@ -69,6 +79,7 @@ set(PERSIST_SOURCES
src/persist/sqlite.c
src/persist/json/persist_json_plugin.c)
aux_source_directory(src/parser NEURON_SRC_PARSE)
aux_source_directory(src/otel NEURON_SRC_OTEL)
set(NEURON_BASE_SOURCES
src/base/tag.c
src/base/neu_plugin_common.c
@@ -89,6 +100,9 @@ set(NEURON_BASE_SOURCES
src/utils/base64.c
src/utils/async_queue.c
src/utils/log.c
src/utils/cid.c
src/utils/tpy.c
src/utils/neu_path.c
${PERSIST_SOURCES})
if (SMART_LINK)
@@ -103,13 +117,24 @@ if (CLIB)
endif()
if (USE_MQTT_SM)
message(STATUS "use mqtt sm")
add_definitions(-DNEU_USE_MQTT_SM)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
message(STATUS "build release")
add_definitions(-DNEU_RELEASE)
endif()
add_library(neuron-base SHARED)
target_sources(neuron-base PRIVATE ${NEURON_BASE_SOURCES} ${NEURON_SRC_PARSE})
target_sources(neuron-base PRIVATE ${NEURON_BASE_SOURCES} ${NEURON_SRC_PARSE} ${NEURON_SRC_OTEL})
target_include_directories(neuron-base
PRIVATE include/neuron src)
target_link_libraries(neuron-base libssl.a libcrypto.a)
target_link_libraries(neuron-base nng libzlog.so jansson jwt
${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(neuron-base OpenSSL::SSL OpenSSL::Crypto)
target_link_libraries(neuron-base nng libzlog.so jansson jwt xml2
${CMAKE_THREAD_LIBS_INIT} -lm protobuf-c)
add_dependencies(neuron-base neuron-version)
# dependency imposed by nng
@@ -131,6 +156,7 @@ set(NEURON_SOURCES
src/adapter/adapter.c
src/adapter/driver/cache.c
src/adapter/driver/driver.c
plugins/restful/cert_handle.c
plugins/restful/handle.c
plugins/restful/log_handle.c
plugins/restful/metric_handle.c
@@ -142,14 +168,21 @@ set(NEURON_SOURCES
plugins/restful/group_config_handle.c
plugins/restful/plugin_handle.c
plugins/restful/version_handle.c
plugins/restful/scan_handle.c
plugins/restful/otel_handle.c
plugins/restful/cid_handle.c
plugins/restful/tpy_handle.c
plugins/restful/datalayers_handle.c
plugins/restful/rest.c
plugins/restful/user.c)
plugins/restful/user.c
plugins/restful/simulator_handle.c
simulator/modbus_tcp_simulator.c)
set(CMAKE_BUILD_RPATH ./)
add_executable(neuron)
target_sources(neuron PRIVATE ${NEURON_SOURCES})
target_include_directories(neuron PRIVATE include/neuron src plugins)
target_link_libraries(neuron dl neuron-base sqlite3 -lm)
target_link_libraries(neuron dl neuron-base sqlite3 -lm xml2)
target_link_options(neuron PRIVATE "LINKER:--dynamic-list-data")
#copy file for run
@@ -158,15 +191,18 @@ file(COPY ${CMAKE_SOURCE_DIR}/dev.conf DESTINATION ${CMAKE_BINARY_DIR}/config)
file(COPY ${CMAKE_SOURCE_DIR}/neuron.json DESTINATION ${CMAKE_BINARY_DIR}/config)
file(COPY ${CMAKE_SOURCE_DIR}/.gitkeep DESTINATION ${CMAKE_BINARY_DIR}/logs)
file(COPY ${CMAKE_SOURCE_DIR}/.gitkeep DESTINATION ${CMAKE_BINARY_DIR}/persistence)
file(COPY ${CMAKE_SOURCE_DIR}/neuron.key DESTINATION ${CMAKE_BINARY_DIR}/config)
file(COPY ${CMAKE_SOURCE_DIR}/neuron.pem DESTINATION ${CMAKE_BINARY_DIR}/config)
file(GLOB SQL_SCHEMAS ${CMAKE_SOURCE_DIR}/persistence/*.sql)
file(COPY ${SQL_SCHEMAS} DESTINATION ${CMAKE_BINARY_DIR}/config)
file(COPY ${CMAKE_SOURCE_DIR}/default_plugins.json DESTINATION ${CMAKE_BINARY_DIR}/config)
add_subdirectory(plugins/modbus)
add_subdirectory(plugins/mqtt)
add_subdirectory(plugins/thingsneural)
add_subdirectory(plugins/ekuiper)
add_subdirectory(plugins/file)
add_subdirectory(plugins/monitor)
add_subdirectory(plugins/datalayers)
add_subdirectory(plugins/kafka)
add_subdirectory(simulator)
@@ -177,6 +213,7 @@ endif()
add_subdirectory(tests/plugins/c1)
add_subdirectory(tests/plugins/s1)
add_subdirectory(tests/plugins/sc1)
add_subdirectory(tests/plugins/demo_app)
# Set sane defaults for multi-lib linux systems
include(GNUInstallDirs)
+72 -1
View File
@@ -28,7 +28,7 @@ $ cmake -DUSE_SHARED_MBEDTLS_LIBRARY=OFF -DENABLE_TESTING=OFF -DCMAKE_POSITION_I
[NanoSDK](https://github.com/neugates/NanoSDK.git)
```shell
$ git clone -b neuron https://github.com/neugates/NanoSDK.git
$ git clone https://github.com/neugates/NanoSDK.git
$ cd NanoSDK && mkdir build && cd build
$ cmake -DBUILD_SHARED_LIBS=OFF -DNNG_TESTS=OFF -DNNG_ENABLE_SQLITE=ON -DNNG_ENABLE_TLS=ON .. && make && sudo make install
```
@@ -55,3 +55,74 @@ $ tar xzf sqlite3.tar.gz --strip-components=1 -C sqlite3
$ cd sqlite3
$ ./configure CFLAGS=-fPIC && make && sudo make install
```
[protobuf](https://github.com/protocolbuffers/protobuf)
```shell
$ wget --no-check-certificate --content-disposition https://github.com/protocolbuffers/protobuf/releases/download/v3.20.1/protobuf-cpp-3.20.1.tar.gz
$ tar -xzvf protobuf-cpp-3.20.1.tar.gz
$ cd protobuf-3.20.1
$ ./configure --enable-shared=no CFLAGS=-fPIC CXXFLAGS=-fPIC
$ make && sudo make install
```
[protobuf-c](https://github.com/protobuf-c/protobuf-c.git)
```shell
$ git clone -b v1.4.0 https://github.com/protobuf-c/protobuf-c.git
$ cd protobuf-c
$ ./autogen.sh
$ ./configure --disable-protoc --enable-shared=no CFLAGS=-fPIC CXXFLAGS=-fPIC
$ make && sudo make install
```
[cyrus-sasl](https://github.com/cyrusimap/cyrus-sasl.git)
```shell
$ git clone -b cyrus-sasl-2.1.28 https://github.com/cyrusimap/cyrus-sasl.git
$ cd cyrus-sasl
$ autoreconf -fi
$ ./configure --enable-shared --disable-static --disable-sample \
--disable-checkapop --disable-cram --disable-digest --disable-otp \
--disable-srp --disable-gssapi --disable-sql \
--enable-plain --enable-scram --enable-login \
--with-dblib=none --without-saslauthd --without-authdaemond
$ make && sudo make install
```
[zstd](https://github.com/facebook/zstd.git)
```shell
$ git clone -b v1.5.6 https://github.com/facebook/zstd.git
$ cd zstd/build/cmake && mkdir builddir && cd builddir
$ cmake -DZSTD_BUILD_PROGRAMS=OFF -DZSTD_BUILD_TESTS=OFF -DZSTD_BUILD_SHARED=ON -DZSTD_BUILD_STATIC=OFF -DCMAKE_BUILD_TYPE=Release .. && make && sudo make install
```
[librdkafka](https://github.com/confluentinc/librdkafka.git)
```shell
$ git clone -b v2.6.1 https://github.com/confluentinc/librdkafka.git
$ cd librdkafka && mkdir build && cd build
$ cmake -DRDKAFKA_BUILD_STATIC=OFF -DRDKAFKA_BUILD_EXAMPLES=OFF -DRDKAFKA_BUILD_TESTS=OFF -DWITH_SSL=ON -DWITH_ZLIB=ON -DWITH_SASL=ON -DWITH_ZSTD=ON -DWITH_CURL=OFF -DCMAKE_BUILD_TYPE=Release .. && make && sudo make install
```
[libxml2](https://github.com/GNOME/libxml2.git)
```shell
$ git clone -b v2.9.14 https://github.com/GNOME/libxml2.git
$ cd libxml2
$ ./autogen.sh
$ ./configure --enable-shared=no CFLAGS=-fPIC CXXFLAGS=-fPIC
$ make && sudo make install
```
[arrow](https://github.com/apache/arrow)
To build Apache Arrow C++ for the datalayers plugin, please refer to the [official Arrow](https://github.com/apache/arrow) for the most up-to-date information on dependencies, configuration, and build steps.
You must enable the following features at a minimum for the datalayers plugin:
```cmake
-DARROW_FLIGHT=ON \
-DARROW_FLIGHT_SQL=ON
```
Required Dependencies:
When enabling DARROW_FLIGHT and DARROW_FLIGHT_SQL, you must ensure the following dependencies are installed on your system at least: \
gRPC \
Boost \
Thrift
-146
View File
@@ -1,146 +0,0 @@
# Neuron
[![GitHub Release](https://img.shields.io/github/release/neugates/neuron?color=brightgreen&label=Release)](https://github.com/neugates/neuron/releases)
[![Docker Pulls](https://img.shields.io/docker/pulls/emqx/neuron?label=Docker%20Pulls)](https://hub.docker.com/r/emqx/neuron)
[![Slack](https://img.shields.io/badge/Slack-Neuron-39AE85?logo=slack)](https://slack-invite.emqx.io/)
[![Discord](https://img.shields.io/discord/931086341838622751?label=Discord&logo=discord)](https://discord.gg/xYGf3fQnES)
[![Twitter](https://img.shields.io/badge/Follow-EMQ-1DA1F2?logo=twitter)](https://twitter.com/EMQTech)
[![YouTube](https://img.shields.io/badge/Subscribe-EMQ-FF0000?logo=youtube)](https://www.youtube.com/channel/UC5FjR77ErAxvZENEWzQaO5Q)
[English](https://github.com/neugates/neuron/blob/main/README.md) | 简体中文
Neuron 是一款开源的、轻量级工业协议网关软件,支持数十种工业协议的一站式设备连接、数据接入、MQTT 协议转换,为工业设备赋予工业 4.0 时代关键的物联网连接能力。
![neuron-overview](docs/pictures/neuron-final.png)
以下是 Neuron 的一些重要特性:
- 具有实时能力的边缘原生应用程序可以利用边缘端的低延迟网络。
- 松耦合模块化 [架构设计](https://neugates.io/docs/zh/latest/introduction/architecture/architecture.html) 通过可插拔模块扩展更多功能服务。
- 支持可以在运行时更新设备和应用程序模块的热插件。
- 支持多种工业设备协议,包括 Modbus、OPCUA、Ethernet/IP、IEC104、BACnet 等 [更多协议](https://neugates.io/docs/zh/latest/configuration/south-devices/south-devices.html)。
- 支持同时连接大量不同协议的工业设备。
- 结合[eKuiper](https://www.lfedge.org/projects/ekuiper)提供的规则引擎功能,快速实现基于规则的设备控制或 AI/ML 分析。
- 通过 [SparkplugB](https://neugates.io/docs/zh/latest/use-cases/use_cases.html#mqtt-sparkplugb-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88) 解决方案支持对工业应用程序的数据访问,例如 MES 或 ERP、SCADA、historian 和数据分析软件。
- 具有非常低的内存占用,小于 10M 的内存占用和 CPU 使用率,可以在 ARM、x86 和 RISC-V 等资源有限的硬件上运行。
- 支持在本地安装可执行文件或部署在容器化环境中。
- 控制工业设备,通过[HTTP API](https://neugates.io/docs/zh/latest/http-api/http-api.html)和[MQTT API](https://neugates.io/docs/en/latest/north-apps/mqtt/api.html) 服务更改参数和数据标签。
- 与其他 EMQ 产品高度集成,包括 [EMQX](https://www.emqx.com/zh/products/emqx)、[NanoMQ](https://nanomq.io/zh)、[eKuiper](https://ekuiper.org/zh)。
- 核心框架和 Modbus、MQTT 和 eKuiper 的代码在 LGPLv3 的许可下开源。商业模块需要 [EMQ 许可证](https://neugates.io/docs/zh/latest/introduction/license-describe.html) 才能运行。
获取更多信息,请访问 [Neuron 官网](https://neugates.io/zh)。
## 快速开始
#### 使用 Docker 运行 Neuron
```
docker run -d --name neuron -p 7000:7000 -p 7001:7001 -p 9081:9081 --privileged=true --restart=always emqx/neuron:latest
```
接下来请参考 [快速入门](https://neugates.io/docs/zh/latest/quick-start/hardware-specifications.html) 开启您的 Neuron 之旅。
> **提示**
>
> Neuron 开源版只包含 Modbus 和 MQTT 驱动。
>
> 您可以[免费申请 15 天试用期限的 License](https://www.emqx.com/zh/apply-licenses/neuron),加载所有的驱动。
#### 更多安装方式
您可以从 [neugates.io/zh/downloads?os=Linux](https://neugates.io/zh/downloads?os=Linux) 下载不同格式的 Neuron 安装包进行手动安装。
也可以直接访问 [Neuron 安装文档](https://neugates.io/docs/zh/latest/installation/installation.html) 查看不同安装方式的操作步骤。
## 文档
Neuron 文档地址:[https://neugates.io/docs/zh/latest/](https://neugates.io/docs/zh/latest/)。
## 社区
- 访问 [Neuron 论坛](https://askemq.com/c/neuron/8) 以获取帮助,也可以分享您的想法或项目。
- 添加小助手微信号 `emqmkt`,加入 Neuron 微信技术交流群。
- 加入我们的 [Discord](https://discord.gg/xYGf3fQnES),参于实时讨论。
- 关注我们的 [bilibili](https://space.bilibili.com/522222081),获取最新物联网技术分享。
- 关注我们的 [微博](https://weibo.com/emqtt) 或 [Twitter](https://twitter.com/EMQTech),获取 Neuron 最新资讯。
## 从源码构建
**安装依赖**
请参考 [Install-dependencies](https://github.com/emqx/neuron/blob/main/Install-dependencies.md)
**编译**
```
$ git clone https://github.com/emqx/neuron
$ cd neuron
$ mkdir build && cd build
$ cmake .. && make
```
**安装 Dashboard**
在 [neuron-dashboard](https://github.com/emqx/neuron-dashboard/releases) 页面下载最新的 `neuron-dashboard.zip`,解压后放到 Neuron 可执行目录下的 dist 目录中。
**运行**
```
$ cd build
$ ./neuron
```
>**修改日志级别**
>
>在 zlog.conf 文件的规则中更改日志级别。可用的日志级别包括 INFO,DEBUG,NOTICE,WARN,ERROR 和 FATAL。
## 测试
### 单元测试
运行所有的单元测试
```shell
$ cd build
$ ctest --output-on-failure
```
### 功能测试
运行所有的功能测试
```shell
$ sudo apt-get install -y mosquitto
$ mosquitto -v &
$ python3 -m pip install -U pip
$ python3 -m pip install -r ft/requirements.txt
$ python3 -m robot --maxerroelines=600 -P ft/ -d ft/reports ft
```
### 压力测试
在目录`ft/data/persistence/`中有压力测试的数据集。
运行压力测试
```shell
# 安装依赖
$ pip3 install -r ft/requirements.txt
# 使用http接口在数据集total-10k上进行测试
$ python3 -m robot -P ft/ --variable neuron_api:http --variable dataset:total-10k -d ft/http-total-10k ft/pressure.test
# 使用http接口在数据集total-50k上进行测试
$ python3 -m robot -P ft/ --variable neuron_api:http --variable dataset:total-50k -d ft/http-total-50k ft/pressure.test
# 如果使用mqtt接口则需要MQTT服务器,此例为mosquitto
$ mosquitto -v &
# 使用mqtt接口在数据集simple-1k上进行测试
$ python3 -m robot -P ft/ --variable neuron_api:mqtt --variable dataset:simple-1k -d ft/mqtt-simple-1k ft/pressure.test
```
## 开源许可
详见 [LICENSE](./LICENSE)。
+106 -56
View File
@@ -8,90 +8,140 @@
[![Twitter](https://img.shields.io/badge/Follow-EMQ-1DA1F2?logo=twitter)](https://twitter.com/EMQTech)
[![YouTube](https://img.shields.io/badge/Subscribe-EMQ-FF0000?logo=youtube)](https://www.youtube.com/channel/UC5FjR77ErAxvZENEWzQaO5Q)
Neuron is an Industrial IoT (IIoT) connectivity server for modern big data and AI/ML technology to leverage the power of Industrial 4.0. It supports one-stop access to dozens of industrial protocols and converts them into MQTT protocol and realize the interconnection between IIoT platforms and various industrial devices.
Neuron is an Industrial IoT (IIoT) connectivity server that bridges industrial devices and modern data platforms. It supports dozens of industrial protocols and converts them into MQTT for seamless integration between IIoT platforms and shop-floor devices.
![neuron-overview](docs/pictures/neuron-final.png)
The following are some important features of Neuron:
Key features:
- Edge native application with real-time capability to leverage the low latency network of edge side.
- Loosely-coupled modularity [architecture design](https://neugates.io/docs/en/latest/introduction/architecture/architecture.html) for extending more functional services by pluggable modules.
- Support hot plugins that can update device and application modules during runtime.
- Support numerous protocols for industrial devices, including Modbus, OPCUA, Ethernet/IP, IEC104, BACnet and [more](https://neugates.io/docs/en/latest/configuration/south-devices/south-devices.html).
- Support simultaneous connection of a large number of industrial devices with different protocols.
- Combine with the rule engine function provided by [eKuiper](https://www.lfedge.org/projects/ekuiper) to quickly implement rule-based device control or AI/ML analytics.
- Support data access to industrial applications, such as MES or ERP, SCADA, historian and data analytics software via [SparkplugB](https://neugates.io/docs/en/latest/use-cases/sparkplug/sparkplug.html) solution.
- Has very low memory footprint, less than 10M, and CPU usage, can run on limited resource hardware like ARM, x86 and RISC-V.
- Support installation of native executable or deployed in containerized enviornment.
- Control industrial devices, and make changes to the parameters and data tags through [HTTP API](https://neugates.io/docs/en/latest/api/configuration.html) and [MQTT API](https://neugates.io/docs/en/latest/configuration/north-apps/mqtt/api.html) services.
- Highly integrated with other EMQ products, including [EMQX](https://www.emqx.com/en/products/emqx), [NanoMQ](https://nanomq.io/), [eKuiper](https://ekuiper.org/).
- The code of the core framework and Modbus, MQTT and eKuiper are licensed under open source LGPLv3. Commercial modules require a [EMQ License](https://neugates.io/docs/en/latest/installation/license-install/license-install.html) to run.
- Edge-native application with real-time capability and low latency at the edge.
- Loosely coupled modular architecture with pluggable modules for easy extension.
- Hot-pluggable plugins: update device and application modules at runtime.
- Broad protocol support: Modbus, OPC UA, Ethernet/IP, IEC 60870-5-104, BACnet, and more.
- High concurrency: connect many devices with heterogeneous protocols simultaneously.
- Built-in stream processing via [eKuiper](https://www.lfedge.org/projects/ekuiper) for rules and AI/ML analytics.
- Northbound access for MES/ERP, SCADA, historians, and analytics via Sparkplug B.
- Tiny footprint (<10 MB) and low CPU usage; runs on ARM, x86, and RISC-V.
- Flexible deployments: native binaries or containers.
- Manage devices and tags via [HTTP API](docs/api/english/http.md) and [MQTT API](docs/api/english/mqtt.md).
- Works well with [EMQX](https://www.emqx.com/en/products/emqx), [NanoMQ](https://nanomq.io/), and [eKuiper](https://ekuiper.org/).
- Core framework and Modbus/MQTT/eKuiper plugins are available under LGPLv3.
For more information, please visit [Neuron homepage](https://neugates.io/).
## About NeuronEX
## Get Started
[NeuronEX](https://www.emqx.com/en/products/emqx-neuron) is the commercial distribution of Neuron, offering extended capabilities and professional support. Compared to the open-source Neuron:
#### Run Neuron using Docker
- **Extended protocol support**: Additional industrial protocols (e.g., OPC UA, Siemens S7, Ethernet/IP, etc.)
- **Advanced dashboard**: Full-featured web UI with enhanced visualization and management capabilities
- **Enterprise plugins**: More southbound device adapters, northbound application connectors, and rule engines
- **Cloud integration**: Direct connectors for major cloud platforms (AWS, Azure, Google Cloud, etc.)
- **Data security**: Enhanced encryption, auditing, and compliance features
```
docker run -d --name neuron -p 7000:7000 -p 7001:7001 -p 9081:9081 --privileged=true --restart=always emqx/neuron:latest
For more details, visit the [NeuronEX documentation](https://docs.emqx.com/en/neuronex/latest/).
## Table of Contents
- [Quick Start](#quick-start)
- [Installation](#installation)
- [Binaries](#binaries)
- [Build from Source](#build-from-source)
- [Configuration](#configuration)
- [Documentation](#documentation)
- [Dashboard](#dashboard)
- [Community](#community)
- [Contributing](#contributing)
- [Security](#security)
- [License](#license)
## Quick Start
Default credentials: username `admin`, password `0000`.
### Download
You can download from [Release](https://github.com/emqx/neuron/releases).
```bash
$ tar xvf neuron-{version}-linux-amd64.tar.gz
$ cd neuron
$ ./neuron --log
```
Next, please follow the [getting started guide](https://neugates.io/docs/en/latest/quick-start/hardware-specifications.html) to tour the Neuron features.
Open a browser and navigate to `http://localhost:7000` to access the Neuron web interface.
> **Limitations**
>
> Neuron open source edition only includes Modbus and MQTT drivers.
>
> [Apply for a 15-day trial license](https://www.emqx.com/en/apply-licenses/neuron) to load all drivers.
## Installation
#### More installation options
### Binaries
If you prefer to install and manage Neuron yourself, you can download the latest version from [neugates.io/downloads?os=Linux](https://neugates.io/downloads?os=Linux).
Download the latest release from [Releases](https://github.com/emqx/neuron/releases), then extract and run as shown above.
For more installation options, see the [Neuron installation documentation](https://neugates.io/docs/en/latest/installation/installation.html).
### Build from Source
1. [Install Dependencies](./Install-dependencies.md)
2. Build Neuron
```bash
$ git clone https://github.com/emqx/neuron
$ cd neuron && mkdir build && cd build
$ cmake .. && make
```
3. Download and Unzip Dashboard
```bash
$ wget https://github.com/emqx/neuron-dashboard/releases/download/2.6.3/neuron-dashboard.zip
# Unzip neuron-dashboard.zip to the build directory
$ unzip neuron-dashboard.zip
```
4. Run Neuron
```bash
$ ./neuron --log
```
On the first startup, Neuron will automatically generate `neuron.key` and `neuron.key.pub` in the config directory if they do not exist yet.
If you want to pre-generate the key pair manually, you can still run:
```bash
$ bash ./generate_rsa_keypair.sh ./build/config
```
5. Open a browser and navigate to `http://localhost:7000` to access the Neuron web interface.
## Configuration
- Web UI: `http://localhost:7000` (default credentials above)
- Main config: `neuron.conf`
- Default plugins: `default_plugins.json`
- Logging: `zlog.conf` / `sdk-zlog.conf`
See the quick start for a hands-on walkthrough.
## Documentation
The Neuron documentation is available at [neugates.io/docs/en/latest/](https://neugates.io/docs/en/latest/).
- Quick start: [Modbus TCP collection and MQTT publishing](./docs/quick_start/quick_start.md)
- APIs: [HTTP](docs/api/english/http.md), [MQTT](docs/api/english/mqtt.md)
## Get Involved
## Dashboard
The open-source version of the [Dashboard](https://github.com/emqx/neuron-dashboard) is currently at version 2.6.3, which has been suspended for development and maintenance. This version is also the one integrated by default with Neuron. For a more complete and professional Dashboard, please use [NeuronEX](https://www.emqx.com/en/products/neuronex).
## Community
- Follow [@EMQTech on Twitter](https://twitter.com/EMQTech).
- If you have a specific question, check out our [discussion forums](https://github.com/emqx/neuron/discussions).
- For general discussions, join us on the [official Discord](https://discord.gg/xYGf3fQnES) team.
- Keep updated on [EMQ YouTube](https://www.youtube.com/channel/UC5FjR77ErAxvZENEWzQaO5Q) by subscribing.
## Build From Source
## Contributing
**Install required dependencies**
Contributions are welcome! Feel free to open issues and pull requests to improve Neuron. If you plan a larger change, please start a discussion first to align on direction.
[Install-dependencies](https://github.com/emqx/neuron/blob/main/Install-dependencies.md)
## Security
**Build**
If you believe you have found a security vulnerability, please avoid creating a public issue. Instead, contact the maintainers privately (e.g., via GitHub Security Advisories) so we can investigate and fix it responsibly.
```
$ git clone https://github.com/emqx/neuron
$ cd neuron
$ mkdir build && cd build
$ cmake .. && make
```
**Install Dashboard**
Download the latest `neuron-dashboard.zip` from the [neuron-dashboard](https://github.com/emqx/neuron-dashboard/releases) page, unzip it and put it to the `dist` directory under the Neuron executable directory.
**Run**
```
$ cd build
$ ./neuron
```
>**Log level**
>
>Change the log level in the rules in the zlog.conf file. Available levels include INFO, DEBUG, NOTICE, WARN, ERROR and FATAL.
>
## License
+7 -2
View File
@@ -1,7 +1,7 @@
set(CMAKE_SYSTEM_NAME Linux)
set(COMPILER_PREFIX aarch64-linux-gnu)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(LIBRARY_DIR /home/neuron/main/libs)
set(LIBRARY_DIR /home/neuron/v2.15/libs)
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)
@@ -21,4 +21,9 @@ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
link_directories(${CMAKE_STAGING_PREFIX})
file(COPY ${CMAKE_STAGING_PREFIX}/lib/libzlog.so.1.2 DESTINATION /usr/local/lib)
file(COPY ${CMAKE_STAGING_PREFIX}/lib/libzlog.so.1.2 DESTINATION /usr/local/lib)
file(COPY ${CMAKE_STAGING_PREFIX}/lib/librdkafka.so.1 DESTINATION /usr/local/lib)
file(GLOB ZSTD_LIBS "${CMAKE_STAGING_PREFIX}/lib/libzstd.so*")
file(COPY ${ZSTD_LIBS} DESTINATION /usr/local/lib)
file(GLOB SASL_LIBS "${CMAKE_STAGING_PREFIX}/lib/libsasl2.so*")
file(COPY ${SASL_LIBS} DESTINATION /usr/local/lib)
+6 -1
View File
@@ -1,7 +1,7 @@
set(CMAKE_SYSTEM_NAME Linux)
set(COMPILER_PREFIX arm-linux-gnueabi)
set(CMAKE_SYSTEM_PROCESSOR armv5tejl)
set(LIBRARY_DIR /home/neuron/main/libs)
set(LIBRARY_DIR /home/neuron/v2.15/libs)
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)
@@ -22,3 +22,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
link_directories(${CMAKE_STAGING_PREFIX})
file(COPY ${CMAKE_STAGING_PREFIX}/lib/libzlog.so.1.2 DESTINATION /usr/local/lib)
file(COPY ${CMAKE_STAGING_PREFIX}/lib/librdkafka.so.1 DESTINATION /usr/local/lib)
file(GLOB ZSTD_LIBS "${CMAKE_STAGING_PREFIX}/lib/libzstd.so*")
file(COPY ${ZSTD_LIBS} DESTINATION /usr/local/lib)
file(GLOB SASL_LIBS "${CMAKE_STAGING_PREFIX}/lib/libsasl2.so*")
file(COPY ${SASL_LIBS} DESTINATION /usr/local/lib)
+7 -2
View File
@@ -1,7 +1,7 @@
set(CMAKE_SYSTEM_NAME Linux)
set(COMPILER_PREFIX arm-linux-gnueabihf)
set(CMAKE_SYSTEM_PROCESSOR armv7l)
set(LIBRARY_DIR /home/neuron/main/libs)
set(LIBRARY_DIR /home/neuron/v2.15/libs)
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)
@@ -21,4 +21,9 @@ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
link_directories(${CMAKE_STAGING_PREFIX})
file(COPY ${CMAKE_STAGING_PREFIX}/lib/libzlog.so.1.2 DESTINATION /usr/local/lib)
file(COPY ${CMAKE_STAGING_PREFIX}/lib/libzlog.so.1.2 DESTINATION /usr/local/lib)
file(COPY ${CMAKE_STAGING_PREFIX}/lib/librdkafka.so.1 DESTINATION /usr/local/lib)
file(GLOB ZSTD_LIBS "${CMAKE_STAGING_PREFIX}/lib/libzstd.so*")
file(COPY ${ZSTD_LIBS} DESTINATION /usr/local/lib)
file(GLOB SASL_LIBS "${CMAKE_STAGING_PREFIX}/lib/libsasl2.so*")
file(COPY ${SASL_LIBS} DESTINATION /usr/local/lib)
+11 -1
View File
@@ -1,7 +1,7 @@
set(CMAKE_SYSTEM_NAME Linux)
set(COMPILER_PREFIX x86_64-linux-gnu)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(LIBRARY_DIR /home/neuron/main/libs)
set(LIBRARY_DIR /home/neuron/v2.15/libs)
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)
@@ -13,6 +13,11 @@ set(CMAKE_RANLIB ${COMPILER_PREFIX}-ranlib)
set(CMAKE_STAGING_PREFIX ${LIBRARY_DIR}/${COMPILER_PREFIX})
set(CMAKE_PREFIX_PATH ${CMAKE_STAGING_PREFIX})
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-lto")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-lto")
include_directories(SYSTEM ${CMAKE_STAGING_PREFIX}/include)
include_directories(SYSTEM ${CMAKE_STAGING_PREFIX}/openssl/include)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_STAGING_PREFIX})
@@ -22,3 +27,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
link_directories(${CMAKE_STAGING_PREFIX})
file(COPY ${CMAKE_STAGING_PREFIX}/lib/libzlog.so.1.2 DESTINATION /usr/local/lib)
file(COPY ${CMAKE_STAGING_PREFIX}/lib/librdkafka.so.1 DESTINATION /usr/local/lib)
file(GLOB ZSTD_LIBS "${CMAKE_STAGING_PREFIX}/lib/libzstd.so*")
file(COPY ${ZSTD_LIBS} DESTINATION /usr/local/lib)
file(GLOB SASL_LIBS "${CMAKE_STAGING_PREFIX}/lib/libsasl2.so*")
file(COPY ${SASL_LIBS} DESTINATION /usr/local/lib)
+9
View File
@@ -0,0 +1,9 @@
ignore:
- "src/otel/*.pb-c.c"
- "plugins/mqtt/azure_iot_plugin.c"
coverage:
status:
project:
default:
target: auto # the required coverage value
threshold: 0.1% # the leniency in hitting the target
+4
View File
@@ -39,6 +39,10 @@ case $1 in
lcov -c -d build/plugins/mqtt/CMakeFiles/plugin-mqtt.dir -o cov_report/cov-mqtt.info
cd cov_report
gen_trace -a cov-mqtt.info -o cov-mqtt.info;;
(azure)
lcov -c -d build/plugins/mqtt/CMakeFiles/plugin-azure-iot.dir -o cov_report/cov-azure.info
cd cov_report
gen_trace -a cov-azure.info -o cov-azure.info;;
(core)
cd cov_report
gen_trace -o cov-core.info;;
+7 -2
View File
@@ -1,8 +1,13 @@
{
"plugins": [
"libplugin-mqtt.so",
"libplugin-thingsneural.so",
"libplugin-aws-iot.so",
"libplugin-azure-iot.so",
"libplugin-ekuiper.so",
"libplugin-modbus-tcp.so",
"libplugin-modbus-rtu.so"
"libplugin-modbus-rtu.so",
"libplugin-file.so",
"libplugin-kafka.so"
]
}
}
+1 -2
View File
@@ -10,6 +10,5 @@ syslog = "<P>%d(%Y-%m-%dT%T%z) %H neuron[%p]: level=%v msg="[%c] %m" file="%f:%L
[rules]
*.* "./logs/%c.log", 25MB * 1 ~ "./logs/%c.#2r.log"; file_format
*.* "./logs/%c.log", 50MB * 2 ~ "./logs/%c.#2r.log"; file_format
*.* >stdout; stdout_format
*.* $remote_syslog,"%V"; syslog
View File
+2070
View File
File diff suppressed because it is too large Load Diff
+482
View File
@@ -0,0 +1,482 @@
# 数据上下行格式
以下内容描述 MQTT 插件如何上报采集的数据,以及如何通过 MQTT 插件实现读写点位数据。
## 数据上报
MQTT 插件将采集到的数据以 JSON 形式发布到指定的主题。
上报数据的具体格式由**上报数据格式**参数指定,有[**Values-format 格式**](#values-format-格式)、[**Tags-format 格式**](#tags-format-格式)、[**ECP-format 格式**](#ecp-format-格式)、[**Custom 自定义格式**](#custom-自定义格式)多种格式可选。
### 上报主题
上报主题在北向节点订阅中指定,其默认值为 **/neuron/{MQTT driver name}** ,见下图
### Values-format 格式
在 **Values-format** 格式中, 上报的数据由以下字段构成:
* `timestamp` : 数据采集时的 UNIX 时间戳。
* `node` : 被采集的南向节点的名字。
* `group` : 被采集的南向节点的点位组的名字。
* `values` : 存储采集成功的点位值的字典。
* `errors` : 存储采集失败的错误码的字典。
* `metas` : 驱动相关的元数据信息。
以下为使用 **values-format** 格式的数据样例,采集成功的点位数据值存放在`values`键中,采集失败的点位错误码存放在`errors`键中。
```json
{
"timestamp": 1650006388943,
"node": "modbus",
"group": "grp",
"values":
{
"tag0": 123
},
"errors":
{
"tag1": 2014
},
"metas":{}
}
```
::: tip 注意
当点位采集成功时,返回采集到的数据。当点位采集发生错误时,返回错误码,不再返回数值。
当 MQTT 插件配置项 **上报点位错误码** 为 **False** 时,不上报点位错误码。
:::
### Tags-format 格式
在 **Tags-format** 格式中, 上报的数据由以下字段构成:
* `timestamp` : 数据采集时的 UNIX 时间戳。
* `node` : 被采集的南向节点的名字。
* `group` : 被采集的南向节点的点位组的名字。
* `tags` : 点位数据数组,每个元素对应一个点位。
* `name` : 具体的点位名称字段。
* `value` : 具体点位对应的值。
* `error` : 具体点位对应的错误码。
以下为使用 **Tags-format** 格式的数据样例,其中所有点位数据存放在一个数组中,每个数组元素包含点位的名字,采集成功时的数据值或者采集失败时的错误码。
```json
{
"timestamp": 1647497389075,
"node": "modbus",
"group": "grp",
"tags": [
{
"name": "tag0",
"value": 123,
},
{
"name": "tag1",
"error": 2014
}
]
}
```
::: tip 注意
当点位采集成功时,返回采集到的数据。当点位采集发生错误时,返回错误码,不再返回数值。
当 MQTT 插件配置项 **上报点位错误码** 为 **False** 时,不上报点位错误码。
:::
### ECP-format 格式
在 **ECP-format** 格式中, 上报的数据由以下字段构成:
* `timestamp` : 数据采集时的 UNIX 时间戳。
* `node` : 被采集的南向节点的名字。
* `group` : 被采集的南向节点的点位组的名字。
* `tags` : 点位数据数组,每个元素对应一个点位。
* `name` : 具体的点位名称字段。
* `value` : 具体点位对应的值。
* `type` : 具体点位对应的数据类型,共包含布尔、整型、浮点型、字符串四种数据类型。
以下为使用 *ECP-format* 格式的数据样例,其中所有点位数据存放在一个数组中,每个数组元素包含点位的名字,点位的数据类型和采集成功时的数据值,不包含采集失败的点位。
数据类分为布尔、整型、浮点型、字符串四种。
* type = 1 布尔
* type = 2 整型
* type = 3 浮点型
* type = 4 字符串
```json
{
"timestamp": 1647497389075,
"node": "modbus",
"group": "grp",
"tags": [
{
"name": "tag_boolean",
"value": true,
"type": 1,
},
{
"name": "tag_int32_",
"value": 123,
"type": 2,
},
{
"name": "tag_float",
"value": 1.23,
"type": 3,
},
{
"name": "tag_string",
"value": "abcd",
"type": 4,
}
]
}
```
::: tip 注意
ECP-format 格式不支持上报点位错误码。
不管 MQTT 插件配置项 **上报点位错误码** 为 **False** 或为 **True** ,都不上报点位错误码。
:::
### Custom 自定义格式
在自定义格式中,可以使用内置支持的变量自定义数据上报格式。
![custom-format](./assets/custom-format.png)
#### 内置变量
| **变量名称** | **说明** |
| ------------------ | ---------------------- |
| `${timestamp}` | 数据采集时的 UNIX 时间戳。 |
| `${node}` | 南向采集点位所属的南向驱动名称。<br> 示例:`modbus` |
| `${group}` | 南向采集点位所属的南向驱动的采集组的名称。<br> 示例:`group` |
| `${tags}` | 南向采集点位有效值的数组集合。<br> 示例:`[{"name": "tag1", "value": 123}, {"name": "tag2", "value": 456}]` |
| `${tag_values}` | 南向采集点位有效值的Json集合。<br> 示例:`{"tag1": 123, "tag2": 456}` |
| `${tag_errors}` | 南向采集点位报错值的数组集合。<br> 示例:`[{"name": "tag3", "error": 2014}, {"name": "tag4", "error": 2015}]` |
| `${tag_error_values}` | 南向采集点位报错值的Json集合。<br> 示例:`{"tag3": 2014, "tag4": 2015}` |
| `${static_tags}` | 订阅采集组时,自定义配置的静态点位的数组集合。<br> 示例: `[{"name": "static_tag1", "value": "abc"}, {"name": "static_tag2", "value": "def"}]` <br> 详见 [静态点位](#静态点位)|
| `${static_tag_values}` | 订阅采集组时,自定义配置的静态点位的Json集合。<br> 示例: `{"static_tag1": "abc", "static_tag2": "def"}`<br> 详见 [静态点位](#静态点位) |
::: tip 注意
`${tags}` 和 `${tag_values}` 是采集数据点的2种不同格式,`${tags}` 是数组格式,`${tag_values}` 是Json格式。一般在构建自定义数据上报格式时,使用 `${tags}` 或 `${tag_values}` 中的一种即可。
`${static_tags}` 和 `${static_tag_values}`、`${tag_errors}`和`${tag_error_values}` 同理,使用其中一种即可。
MQTT 插件配置项 **上报点位错误码** 为 **False** 时,即使配置了`${tag_errors}` 和或 `${tag_error_values}`,也不上报点位错误码信息。
:::
上表中示例部分,原始南向驱动`modbus1`采集组`group1`下,包含4个点位,其中`tag1`和`tag2`的点位采集数据正常,`tag3`和`tag4`的点位采集数据异常。在北向节点订阅时,自定义配置的静态点位为`static_tag1`和`static_tag2`,其值分别为`abc`和`def`。
以上配置,以 Values-format 数据格式上报时,内容如下:
```json
{
"timestamp": 1650006388943,
"node": "modbus1",
"group": "group1",
"values": {"tag1": 123, "tag2": 456, "static_tag1": "abc", "static_tag2": "def"},
"errors": {"tag3": 2014, "tag4": 2015},
"metas":{}
}
```
以下示例通过设定不同的 Custom 配置,将上面 Json 报文输出为不同的数据上报格式。
#### 示例一
将数据点位转换为数组格式,并自定义Json 键名。
```json
{
"timestamp": "${timestamp}",
"node": "${node}",
"group": "${group}",
"custom_tag_name": "${tags}",
"custom_tag_errors": "${tag_errors}",
}
```
实际输出结果如下:
```json
{
"timestamp": 1650006388943,
"node": "modbus1",
"group": "group1",
"custom_tag_name": [{"name": "tag1", "value": 123}, {"name": "tag2", "value": 456}],
"custom_tag_errors": [{"name": "tag3", "error": 2014}, {"name": "tag4", "error": 2015}]
}
```
#### 示例二
通过自定义数据格式,添加全局静态点位。该静态点位在所有驱动采集组上报数据时,均会携带。如 NeuronEX 部署在一个物理网关上,可将网关的SN号、IP地址、位置信息等信息,添加到所有驱动采集组中。
```json
{
"timestamp": "${timestamp}",
"node": "${node}",
"group": "${group}",
"values": "${tag_values}",
"gateway_info": {
"ip": "192.168.1.100",
"sn": "SN123456789",
"location": "shanghai"
}
}
```
实际输出结果如下:
```json
{
"timestamp": 1650006388943,
"node": "modbus1",
"group": "group1",
"values": {"tag1": 123, "tag2": 456},
"gateway_info": {
"ip": "192.168.1.100",
"sn": "SN123456789",
"location": "shanghai"
}
}
```
#### 示例三
将采集数据点位、静态点位、驱动、采集组信息放入 Json 子节点中,可自定义 Json 节点名称。目前自定义数据结构做多支持三层子层级。
```json
{
"timestamp": "${timestamp}",
"data": {
"child_node": {
"node": "${node}",
"group": "${group}",
"tag_values": "${tag_values}",
"static_tag_values": "${static_tag_values}",
"tag_error_values": "${tag_error_values}"
}
}
}
```
数据上报的格式为:
```json
{
"timestamp": 1650006388943,
"data": {
"child_node": {
"node": "modbus",
"group": "group",
"tag_values": {"tag1": 123, "tag2": 456},
"static_tag_values": {"static_tag1": "abc", "static_tag2": "def"},
"tag_error_values": {"tag3": 2014, "tag4": 2015}
}
}
}
```
## 静态点位
静态点位功能,支持在南向驱动数据上报时,由用户在**北向应用组列表**页面手动配置静态点位,在数据上报时,将静态点位数据一并上报。
![static-tags](./assets/static-tags.png)
静态点位配置,需输入标准JSON格式内容,每个静态点位均为JSON对象中的键值对。静态点位将根据配置的数据上报格式(Values-format、Tags-format、ECP-format)与采集组数据一并上报。
```json
{
"location": "sh",
"sn_number": "123456"
}
```
每个南向采集组,可分别配置不同静态点位。表示该采集组代表的物理设备,具有哪些静态属性信息。
静态点位功能支持布尔、整型、浮点型、字符串四种数据类型。复杂数据类型,如数组、结构体等,将以字符串形式上报。
如果添加的静态点位,为 NeuronEX 实例中所有采集组共用,既可以勾选**所有采集组**,添加静态点位,也可以在 Custom 自定义格式中,统一添加静态点位,参考 [自定义格式:示例二](#自定义格式)。
::: tip 注意
静态点位命名,不能和南向驱动采集的点位名称相同。
如命名相同,则如果选择`Values-format`上报数据时,静态点位数据将覆盖南向驱动采集的点位数据.
如果选择`Tags-format`、`ECP-format`或`Custom`上报数据时,静态点位数据将和南向驱动采集的点位数据一起重复上报。
:::
## 读 Tags
### 请求
通过发送 JSON 形式的请求到 MQTT 主题 **/neuron/{node_name}/read/req**,您可以读取一组点位数据。
#### 请求体
读请求体由以下字段构成:
* `uuid` : 唯一的标志,会在响应中原样返回用以区分对应的请求。
* `node` : 某个南向节点名字。
* `group` : 南向节点的某个组的名字。
以下为一个读请求样例:
```json
{
"uuid": "bca54fe7-a2b1-43e2-a4b4-1da715d28eab",
"node": "modbus",
"group": "grp"
}
```
### 响应
读响应会发布到 MQTT 主题 **/neuron/{node_name}/read/resp** 。
#### 响应体
读响应体由以下字段构成:
* `uuid` : 对应请求中所设置的唯一标志。
* `tags` : 点位数据数组,和 [tags 格式](#tags-格式)中的表示方法一样。
以下为一个读响应样例:
```json
{
"uuid": "bca54fe7-a2b1-43e2-a4b4-1da715d28eab",
"tags": [
{
"name": "tag0",
"value": 4,
},
{
"name": "tag1",
"error": 2014
}
]
}
```
::: tip
当点位采集成功时,返回采集到的数据。当点位采集发生错误时,返回错误码,不再返回数值。
:::
## 写 Tag
### 请求
通过发送 JSON 形式的请求到**写请求主题**参数指定的 MQTT 主题,您可以写一个点位数据。可在 MQTT 参数配置中配置写请求的主题,默认为为 **/neuron/{random_str}/write/req**。
#### 请求体
#### 写一个 Tag
写请求体由以下字段构成:
* `uuid` : 唯一的标志,会在响应中原样返回用以区分对应的请求。
* `node` : 某个南向节点名字。
* `group` : 南向节点的某个组的名字。
* `tag` : 要写入的点位名字。
* `value` : 要写入的数据值。
以下为一个写请求样例:
```json
{
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"node": "modbus",
"group": "grp",
"tag": "tag0",
"value": 1234
}
```
#### 写多个 Tag
Neuron 提供了对多点位写入的支持。要在一次请求中可以写入多个点位数据, 写请求体应由以下字段构成:
* `uuid` : 唯一的标志,会在响应中原样返回用以区分对应的请求。
* `node` : 某个南向节点名字。
* `group` : 南向节点的某个组的名字。
* `tags` : 点位数据数组,每个元素对应一个点位。
以下为一个写请求样例:
```json
{
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"node": "modbus",
"group": "grp",
"tags": [
{
"tag": "tag0",
"value": 1234
},
{
"tag": "tag1",
"value": 5678
}
]
}
```
### 响应
写响应会发布到**写响应主题**参数指定的 MQTT 主题。默认**写响应主题**参数为 **/neuron/{random_str}//write/resp**。
#### 响应体
写响应体由以下字段构成:
* `uuid` : 对应请求中所设置的唯一标志。
* `error` : 错误码。0 代表成功,非零代表失败。
以下为一个读响应样例:
```json
{
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"error": 0
}
```
## 驱动状态上报
上报所有南向驱动状态到指定的 MQTT 主题。
### 状态上报主题
上报主题在北向节点配置中指定,其默认值为 **/neuron/{random_str}/state/update**
### 状态上报间隔
状态上报间隔在北向节点配置中指定,指每条消息之间间隔的秒数,其默认值为 1,允许的范围为 1-3600。
### 上报消息格式
上报的数据由以下字段构成:
* `timestamp` : 数据采集时的 UNIX 时间戳。
* `states` : 节点状态信息的数组。
以下是一个驱动状态上报消息样例。
```json
{
"timestamp": 1658134132237,
"states": [
{
"node": "modbus-tcp",
"link": 1,
"running": 3
},
{
"node": "modbus-rtu",
"link": 1,
"running": 3
}
]
}
```
File diff suppressed because it is too large Load Diff
+492
View File
@@ -0,0 +1,492 @@
# Upstream/Downstream Data Format
The following contents describe how MQTT plugin publishes collected data, and how to read or write data through MQTT plugin.
## Data Upload
The MQTT plugin publishes collected data in JSON format to some user-defined topics. The exact format of the data reported is controlled by the **Upload Format** parameter. There are four formats, [**Values-format**](#values-format), [**Tags-format**](#tags-format), [**ECP-format**](#ecp-format), and [**Custom**](#custom-format).
### Upload Topic
The upload topic is specified by the **upload-topic** parameter, and the default one set through the dashboard is **/neuron/{MQTT driver name}**.
### Values Format
In **Values-format**, the upload data has the following fields:
* `timestamp`: the Unix timestamp when the data was collected
* `node`: name of the south node from which data was collected
* `group`: name of the south node group that the tags belong to
* `values`: dictionary storing tags with successfully collected values
* `errors`: dictionary storing tags with encountered error codes
* `metas`: driver related metadata information
The following example is in **Values-format**, where tag values collected successfully are stored in a dictionary, while error codes in another.
```json
{
"timestamp": 1650006388943,
"node": "modbus",
"group": "grp",
"values":
{
"tag0": 123
},
"errors":
{
"tag1": 2014
},
"metas":{}
}
```
::: tip
When a tag is collected successfully, the collected data is returned. When a tag collection fails, the error code is returned instead of the value.
When the **Upload Tag Error Code** parameter is set to **False**, the error code is not reported.
:::
### Tags Format
In **Tags-format**, the upload data has the following fields:
* `timestamp`: the Unix timestamp when the data was collected
* `node`: name of the south node from which data was collected
* `group`: name of the south node group that the tags belong to
* `tags`: tags data array where each element corresponds to one tag in the group
* `name`: the name of the tag
* `value`: the value of the tag
* `error`: the error code of the tag
The following example is in **Tags-format**, where tag data are stored in an array. Each element has the name of the tag, and the tag value or error code if something went wrong.
```json
{
"timestamp": 1647497389075,
"node": "modbus",
"group": "grp",
"tags": [
{
"name": "tag0",
"value": 123,
},
{
"name": "tag1",
"error": 2014
}
]
}
```
::: tip
Tag value is returned only when the tag is read successfully. If something goes wrong when reading a tag, the error code is returned.
When the **Upload Tag Error Code** parameter is set to **False**, the error code is not reported.
:::
### ECP Format
In **ECP-format**, the upload data has the following fields:
* `timestamp`: the Unix timestamp when the data was collected
* `node`: name of the south node from which data was collected
* `group`: name of the south node group that the tags belong to
* `tags`: tags data array where each element corresponds to one tag in the group
* `name`: the name of the tag
* `value`: the value of the tag
* `type`: the type of the tag, which can be Boolean, Integer, Float, or String
The following example data is in **ECP-format**, where tag data are stored in an array. Each element has the name of the tag, the tag type and the tag value, excluding tags where collection failed.
Data classes are divided into four types: Boolean, Integer, Float, and String.
* type = 1 Boolean
* type = 2 Integer
* type = 3 Float
* type = 4 String
```json
{
"timestamp": 1647497389075,
"node": "modbus",
"group": "grp",
"tags": [
{
"name": "tag_boolean",
"value": true,
"type": 1,
},
{
"name": "tag_int32_",
"value": 123,
"type": 2,
},
{
"name": "tag_float",
"value": 1.23,
"type": 3,
},
{
"name": "tag_string",
"value": "abcd",
"type": 4,
}
]
}
```
::: tip
ECP-format does not support reporting tag error codes.
Regardless of whether the **Upload Tag Error Code** parameter is set to **False** or **True**, tag error codes are not reported.
:::
### Custom Format
In the custom format, use built-in variables to define the data upload format.
![custom-format](./assets/custom-format-en.png)
#### Variables
| *variable* | *description* |
| ------------------ | ---------------------- |
| `${timestamp}` | The UNIX timestamp when the data was read. |
| `${node}` | The name of the southbound node. <br> Example: `modbus` |
| `${group}` | The name of the group. <br> Example: `group` |
| `${tags}` | The array of valid tag values. <br> Example: `[{"name": "tag1", "value": 123}, {"name": "tag2", "value": 456}]` |
| `${tag_values}` | The array of valid tag values, Value Format <br> Example: `{"tag1": 123, "tag2": 456}` |
| `${tag_errors}` | The array of error codes. <br> Example: `[{"name": "tag3", "error": 2014}, {"name": "tag4", "error": 2015}]` |
| `${tag_error_values}` | The array of error codes, Value Format <br> Example: `{"tag3": 2014, "tag4": 2015}` |
| `${static_tags}` | The array of static tags. <br> Example: `[{"name": "static_tag1", "value": "abc"}, {"name": "static_tag2", "value": "def"}]` <br> See [Static Tags](#static-tags) |
| `${static_tag_values}` | The array of static tags, Value Format <br> Example: `{"static_tag1": "abc", "static_tag2": "def"}` <br> See [Static Tags](#static-tags) |
::: tip
`${tags}` and `${tag_values}` are two different formats for tag values. `${tags}` is an Array format, and `${tag_values}` is a JSON format. In most cases, use one of them.
`${static_tags}` and `${static_tag_values}`, `${tag_errors}` and `${tag_error_values}` are similar. Use one of them.
When the **Upload Tag Error Code** parameter is set to **False**, even if `${tag_errors}` and `${tag_error_values}` are configured, tag error codes are not reported.
:::
The example above is based on the original southbound driver `modbus1` and group `group1`, which contains 4 tags. `tag1` and `tag2` are collected successfully, while `tag3` and `tag4` are collected with errors. When subscribing to the northbound node, the static tags are configured as `static_tag1` and `static_tag2`, with values of `abc` and `def` respectively.
The above configuration, when reported in **Values-format** data format, is as follows:
```json
{
"timestamp": 1650006388943,
"node": "modbus1",
"group": "group1",
"values": {"tag1": 123, "tag2": 456, "static_tag1": "abc", "static_tag2": "def"},
"errors": {"tag3": 2014, "tag4": 2015},
"metas":{}
}
```
The following example shows how to output the above JSON message in different data reporting formats by setting different **Custom** configurations.
#### Example One
Convert tag data to array format and customize the Json key name.
```json
{
"timestamp": "${timestamp}",
"node": "${node}",
"group": "${group}",
"custom_tag_name": "${tags}",
"custom_tag_errors": "${tag_errors}",
}
```
The actual output result is as follows:
```json
{
"timestamp": 1650006388943,
"node": "modbus1",
"group": "group1",
"custom_tag_name": [{"name": "tag1", "value": 123}, {"name": "tag2", "value": 456}],
"custom_tag_errors": [{"name": "tag3", "error": 2014}, {"name": "tag4", "error": 2015}]
}
```
#### Example Two
Add global static tags through custom data format. These static tags will be carried in all driver group data reporting. For example, if NeuronEX is deployed on a gateway hardware, you can add the gateway's SN number, IP address, and location information to all driver groups.
```json
{
"timestamp": "${timestamp}",
"node": "${node}",
"group": "${group}",
"values": "${tag_values}",
"gateway_info": {
"ip": "192.168.1.100",
"sn": "SN123456789",
"location": "shanghai"
}
}
```
The actual output result is as follows:
```json
{
"timestamp": 1650006388943,
"node": "modbus1",
"group": "group1",
"values": {"tag1": 123, "tag2": 456},
"gateway_info": {
"ip": "192.168.1.100",
"sn": "SN123456789",
"location": "shanghai"
}
}
```
#### Example Three
Put tag data, static tags, driver, and group information into a Json sub-node, and customize the Json node name. Currently, the custom data structure supports up to three sub-levels.
```json
{
"timestamp": "${timestamp}",
"data": {
"child_node": {
"node": "${node}",
"group": "${group}",
"tag_values": "${tag_values}",
"static_tag_values": "${static_tag_values}",
"tag_error_values": "${tag_error_values}"
}
}
}
```
The data reporting format is as follows:
```json
{
"timestamp": 1650006388943,
"data": {
"child_node": {
"node": "modbus",
"group": "group",
"tag_values": {"tag1": 123, "tag2": 456},
"static_tag_values": {"static_tag1": "abc", "static_tag2": "def"},
"tag_error_values": {"tag3": 2014, "tag4": 2015}
}
}
}
```
## Static Tags
The static tag feature supports configuring static tags manually in the **North Application Group List** page, and reporting static tag data together with the collected data.
![static-tags](./assets/static-tags-en.png)
Static tag configuration requires inputting standard JSON format content, where each static tag is a key-value pair in the JSON object. Static tags will be reported together with the collected data according to the configured data reporting format (Values-format, Tags-format, ECP-format).
```json
{
"location": "sh",
"sn_number": "123456"
}
```
Each southbound collection group can configure different static tags. This represents the physical device represented by the collection group, with which static attribute information.
Static tag feature supports **Boolean**, **Integer**, **Float**, and **String** data types. Complex data types, such as arrays and structures, will be reported as **String**.
If the static tags added are shared by all collection groups in the NeuronEX instance, you can select **All Collection Groups** to add static tags, or add static tags in the **Custom** custom format, as shown in [Custom Format: Example Two](#example-two).
::: tip
Static tag names must not be the same as the tag names collected by the southbound driver.
If the names are the same:
- When using `Values-format` for data upload, the static tag data will overwrite the tag data collected by the southbound driver.
- When using `Tags-format`, `ECP-format`, or `Custom` for data upload, both the static tag data and the southbound driver collected tag data will be reported together (resulting in duplicate reporting).
:::
## Read Tag
### Request
You can read a group of tags by sending requests in JSON to the MQTT topic **/neuron/{node_name}/read/req**.
#### Body
The read request body should have the following fields:
* `uuid`: a unique identifier, which will be echoed back in the response to help identify the corresponding request
* `node`: the name of a southbound node
* `group`: the name of a group to read
Below is an example read request:
```json
{
"uuid": "bca54fe7-a2b1-43e2-a4b4-1da715d28eab",
"node": "modbus",
"group": "grp"
}
```
### Response
Read response will be published to the MQTT topic **/neuron/{node_name}/read/resp**.
#### Body
The read response body has the following fields:
* `uuid`: the same unique identifier which is set by the corresponding request
* `tags`: tags data array, same as that in [tags format](#tags-format)
Below is an example read response:
```json
{
"uuid": "bca54fe7-a2b1-43e2-a4b4-1da715d28eab",
"tags": [
{
"name": "tag0",
"value": 4,
},
{
"name": "tag1",
"error": 2014
}
]
}
```
::: tip
Tag value is returned only when the tag is read successfully. If something goes wrong when reading a tag, the error code is returned.
:::
## Write Tag
### Request
You could write a tag by sending requests in JSON to the MQTT topic designated by the **Write Request Topic** parameter.
::: tip
Before Neuron version 2.4.5, the write request topic was hard-coded to **/neuron/{random_str}/write/req**.
:::
#### Body
#### Write one tag
The write request body should have the following fields:
* `uuid`: a unique identifier, which will be echoed back in the response to help identify the corresponding request
* `node`: the name of a southbound node
* `group`: the name of a group
* `tag`: the name of a tag
* `value`: the value to write
Below is an example of write request:
```json
{
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"node": "modbus",
"group": "grp",
"tag": "tag0",
"value": 1234
}
```
#### Write multiple tags
Since Neuron version 2.6.0, write requests also support writing multiple tags at
a time. To write multiple tags at a time, the request body should have the
following fields:
* `uuid` : a unique identifier, which will be echoed back in the response to help identify the corresponding request.
* `node` : the name of a southbound node.
* `group` : the name of a group.
* `tags` : tags data array where each element corresponds to one tag in the group.
Below is an example write request:
```json
{
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"node": "modbus",
"group": "grp",
"tags": [
{
"tag": "tag0",
"value": 1234
},
{
"tag": "tag1",
"value": 5678
}
]
}
```
### Response
Write response will be published to the MQTT topic designated by the **Write Response Topic** parameter.
::: tip
Before Neuron version 2.4.5, the write response topic was hard-coded to **/neuron/{random_str}//write/resp**.
:::
#### Body
The write response body has the following fields:
* `uuid`: the same unique identifier which is set by the corresponding request.
* `error`: error code if something bad happens, `0` represents success.
Below is an example of write response:
```json
{
"uuid": "cd32be1b-c8b1-3257-94af-77f847b1ed3e",
"error": 0
}
```
## Driver Status Report
Reports status of all the southbound nodes to the specified topic.
### Status Report Topic
The status report topic is specified in the northbound node configuration. Its default value is **/neuron/{random_str}/state/update**.
### Status Report Interval
The status report interval is specified in the northbound node configuration, indicating the number of seconds between each message. The default value is 1, with an allowed range of 1-3600.
### Reporting Message Format
The reported data consists of the following fields:
* `timestamp`: The UNIX timestamp when the data was collected.
* `states`: An array of node status information.
Below is an example of a driver status reporting message.
```json
{
"timestamp": 1658134132237,
"states": [
{
"node": "modbus-tcp",
"link": 1,
"running": 3
},
{
"node": "modbus-rtu",
"link": 1,
"running": 3
}
]
}
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

+89
View File
@@ -0,0 +1,89 @@
# Quick Start
This document requires that you have successfully run Neuron according to the [Installation and Operation](https://github.com/emqx/neuron/README.md) guide, and that you can open the Neuron management panel in your browser.
## Start the Modbus TCP Simulator
Two types of Modbus TCP simulators are provided. You can run one of them according to your needs.
### Neuron's Built-in Simulator
The Neuron source code or release package includes a test simulator that runs on Linux, which can read and write some fixed points. The Slave ID is 1.
```bash
# If compiling from source, it's in the build/simulator directory
# In the release package, it's in the root directory
# Run the Modbus simulator, use TCP mode, and bind to 0.0.0.0:1502
$ ./modbus_simulator tcp 1502 ip_v4
```
### PeakHMI Slave Simulators
The PeakHMI simulator needs to run on a Windows system. [PeakHMI Official Website](https://hmisys.com)
After downloading and installing, run the Modbus TCP slave EX simulator. The default port for this simulator is 502, which will be blocked by the default Windows firewall. Make sure the firewall allows this port or disable the firewall.
![modbus-simulator](./assets/modbus-simulator.png)
## Create a Southbound Device in Neuron
### Create a Device
**Southbound Device Management** -> **Add Device**. In the pop-up dialog box, fill in the device information and create the device. Select `Modbus TCP` for the **Plugin** and enter `modbus-tcp-1` for the **Name**.
### Configure the Device
After creating the device, go to the device details page to configure the device parameters.
**IP Address**: Fill in the IP address of the machine running the Modbus TCP simulator. If Neuron and the simulator are running on the same machine, you can enter `127.0.0.1`.
**Port**: The default is 502. Modify it according to the listening port of the simulator.
Other parameters can be left as default.
### Configure Data Points
On the **Southbound Device Management** page, click the **Device Name** to enter the group page. Add a group and name it `group1`.
After entering the group, click the **Group Name** to enter the tag configuration page and create a tag.
![add-tag](./assets/tag-list-null.png)
**Name**: `tag-1`
**Address**: `1!40001` (Slave ID 1, holding register 40001)
**Attribute**: `Read` and `Write`
**Data Type**: `INT16`
### View Tag Values
After configuring the tags, go to the **Data Monitoring** page, select the device and group you just created, and you will see the values of the tags.
![data-monitor](./assets/data-monitoring.png)
## Create a Northbound Application
Use MQTT to send the data collected from the Modbus device to an MQTT Broker.
**Northbound Application Management** -> **Add Application**. In the pop-up dialog box, fill in the application information to create the application.
Select `MQTT` for the **Plugin** and enter `mqtt` for the **Name**.
### Configure the Northbound Application
After creating the northbound application, go to the northbound configuration page. The default server address is `broker.emqx.io` and the port is `1883`. If you need to connect to another MQTT Broker, please modify it according to the actual situation.
### Subscribe to Southbound Data Groups
On the **Northbound Application Management** page, click the northbound application to enter the **Subscription Management** page. Click **Add Subscription**, and in the pop-up dialog box, select the Modbus device and group you just created.
![subscribe](./assets/subscription-add.png)
Remember the topic used for the subscription, as you will need to subscribe to this topic later to see the data. The default topic format is `/neuron/{application_name}`.
At this point, the configuration for Neuron to collect data via Modbus TCP and send it via MQTT is complete.
## Use MQTTX to Subscribe to the Topic and View Data
After subscribing, open [MQTTX](https://mqttx.app/zh), create a new connection, and connect to `broker.emqx.io:1883` (modify according to the MQTT broker configured in the northbound application).
After a successful connection, subscribe to the topic `/neuron/mqtt` (modify according to the topic used in the northbound subscription), and you will see the tag data.
![mqttx](./assets/mqttx.png)
-258
View File
@@ -1,258 +0,0 @@
import asyncio
import time
from collections import defaultdict, deque
from robot.api import logger
from robot.api.deco import keyword, library
from gmqtt import Client as MQTTClient, Subscription
from gmqtt.mqtt.constants import MQTTv311
ROBOT_AUTO_KEYWORDS = False
@library
class Client:
"""A keyword library for Robot Framework. It provides keywords for
performing various operations on an MQTT broker. See http://mqtt.org/
for more details on MQTT specification.
This library uses gmqtt: Python async MQTT client. For more information
on underlying methods and documentation, see:
https://github.com/wialon/gmqtt
"""
ROBOT_LIBRARY_SCOPE = "GLOBAL"
ROBOT_LIBRARY_VERSION = "0.1.0"
def __init__(self, reconnect_retries=5, reconnect_delay=0):
"""
`reconnect_retries` number of reconnect attempt in case of lost
connections, default to 5
`reconnect_delay` delay between reconnect attemps in seconds,
default to 0
"""
self._client = None
self._reconnect_retries = reconnect_retries
self._reconnect_delay = reconnect_delay
self._messages = defaultdict(deque)
self._subcribed = asyncio.Event()
self._unsubcribed = asyncio.Event()
self._recved = asyncio.Event()
self._run = asyncio.get_event_loop().run_until_complete
@keyword
def connect(
self,
host,
port=1883,
client_id="",
username="",
password="",
keepalive=60,
clean_session=True,
):
"""Connect to an MQTT broker. This is a pre-requisite step for publish
and subscribe keywords.
`host` MQTT broker host
`port` broker port (default 1883)
`client_id` if not specified, a random id is generated
`username` user name, default to ""
`password` user password, default to ""
`keepalive` keepalive in seconds
`clean_session` specifies the clean session flag for the connection
Examples:
Connect to a broker with default port and client id
| Connect | 127.0.0.1 |
Connect to a broker by specifying the port and client id explicitly
| Connect | 127.0.0.1 | 1883 | test.client |
Connect to a broker with clean session flag set to false
| Connect | 127.0.0.1 | clean_session=${false} |
"""
client = MQTTClient(client_id, clean_session=clean_session)
client.on_connect = self._on_connect
client.on_message = self._on_message
client.on_disconnect = self._on_disconnect
client.on_subscribe = self._on_subscribe
client.on_unsubscribe = self._on_unsubscribe
client.set_config(
{
"reconnect_retries": self._reconnect_retries,
"reconnect_delay": self._reconnect_delay,
}
)
self._client = client
self._run(self._client.connect(host, port, version=MQTTv311))
@keyword
def disconnect(self):
"""Disconnect from MQTT Broker.
Example:
| Disconnect |
"""
self._run(self._client.disconnect())
self._messages.clear()
@keyword
def unsubscribe_all_and_clear_messages(self):
"""Unsubscribe all subscriptions and clear all messages in queue."""
for topic in self._messages:
self.unsubscribe(topic)
self._messages.clear()
@keyword
def subscribe(self, topic, qos=0, timeout=1):
"""Subscribe to a topic and return a message payload received
within the specified time.
`topic` topic to subscribe to
`qos` quality of service for the subscription, default to QoS 0
`timeout` duration of subscription, default to 1 second
Examples:
Subscribe and get a list of all messages received within 5 seconds
| ${messages}= | Subscribe | test/test | qos=1 | timeout=5 |
"""
timeout = 1 if timeout < 1 else timeout
self._client.subscribe(Subscription(topic, qos))
if self._wait(self._subcribed, timeout=timeout):
raise Exception(
"MQTT client subscribe timeout topic=%s qos=%s" % (topic, qos))
logger.info("MQTT client subscribed to topic=%s qos=%s" % (topic, qos))
@keyword
def unsubscribe(self, topic, timeout=1):
"""Unsubscribe the client from the specified topic.
`topic` topic to unsubscribe from
`timeout` duration of unsubscription, default to 1 second
Example:
| Unsubscribe | test/mqtt_test |
"""
timeout = 1 if timeout < 1 else timeout
self._client.unsubscribe(topic)
if self._wait(self._unsubcribed, timeout=timeout):
raise Exception("MQTT client unsubscribe timeout topic=%s" % topic)
logger.info("MQTT client unsubscribed topic=%s" % topic)
@keyword
def publish(self, topic, payload, qos=0, retain=False):
"""Publish a message to a topic with specified qos and retained flag.
It is required that a connection has been established using `Connect`
keyword before using this keyword.
`topic` topic to which the message will be published
`paylod` message payload to publish
`qos` qos of the message, default to QoS 0
`retain` retained flag
Examples:
| Publish | test/test | test message | 1 | ${false} |
"""
self._client.publish(topic, payload, qos=qos, retain=retain)
@keyword
def listen(self, topic, timeout=1):
"""Listen to a topic and return a message payload received within the
specified time. Requires an Subscribe to have been called previously.
`topic` topic to listen to
`timeout` duration to listen, default to 1 second
Examples:
Listen and get a message received within 5 seconds
| ${messages}= | Listen | test/test | timeout=5 |
"""
timeout = 1 if timeout < 1 else timeout
start = time.time()
while True:
if topic in self._messages and self._messages[topic]:
msg = self._messages[topic].popleft()
return msg
if (
self._wait(self._recved, timeout=timeout)
or (time.time() - start) >= timeout
):
break
def _wait(self, event, timeout):
"""Waits for the given event within timeout.
Returns true on timeout, false otherwise."""
try:
self._run(asyncio.wait_for(event.wait(), timeout))
event.clear()
except asyncio.TimeoutError:
return True
return False
def _on_connect(self, client, flags, rc, properties):
logger.info("MQTT client connected")
def _on_message(self, client, topic, payload, qos, properties):
logger.info("MQTT client received: topic=%s qos=%s payload=%s" %
(topic, qos, payload))
self._messages[topic].append(payload.decode())
self._recved.set()
return 0
def _on_disconnect(self, client, packet, exc=None):
logger.info("MQTT client disconnected")
def _on_subscribe(self, client, mid, qos, properties):
self._subcribed.set()
def _on_unsubscribe(self, client, mid, granted_qos):
self._unsubcribed.set()
if __name__ == "__main__":
# import logging
# logging.basicConfig(level=logging.DEBUG)
host = "127.0.0.1"
topic = "test/test_mqtt"
client = Client()
client.connect(host)
client.subscribe(topic)
for i in range(3):
client.publish(topic, "hello world %s" % i)
msg = client.listen(topic)
print("MQTT client receive: topic=%s msg=%s" % (topic, msg))
client.unsubscribe(topic)
client.disconnect()
-235
View File
@@ -1,235 +0,0 @@
from os import remove
import os
import random
import subprocess
import shutil
import time
def prepare_persistence_dir():
os.system("mkdir -p build/persistence")
class Neuron(object):
process = 0
profiler_process = None
def __init__(self):
pass
def Start_Neuron(self):
prepare_persistence_dir()
self.process = subprocess.Popen(['./neuron', '--log'], cwd='build/')
return self.process
def Stop_Neuron(self, remove_persistence_data=True):
if self.profiler_process is not None:
# wait for plotting
time.sleep(5)
self.process.kill()
if remove_persistence_data:
os.system("rm build/persistence/sqlite.db")
prepare_persistence_dir()
def End_Neuron(self, process):
process.kill()
def Remove_Persistence(self):
os.system("rm build/persistence/sqlite.db")
prepare_persistence_dir()
def Profile_Neuron(self, interval, result_dir):
cmd = [
'psrecord', str(self.process.pid),
'--interval', str(interval),
'--plot', result_dir + '/cpu_mem.svg'
]
self.profiler_process = subprocess.Popen(cmd)
class Tool(object):
def __init__(self):
pass
def Array_Len(self, array):
return len(array)
class Plugin(object):
def __init__(self):
pass
def Get_Plugin_By_Name(self, splugins, name):
for plugin in splugins:
if plugin['name'] == name:
return plugin['id']
return 0
def Plugin_With_Name_Sholud_Exist(self, splugins, name):
assert 0 != self.Get_Plugin_By_Name(splugins, name)
def Plugin_With_Name_Should_Not_Exist(self, splugins, name):
assert 0 == self.Get_Plugin_By_Name(splugins, name)
class GrpConfig(object):
def __init__(self):
pass
def Get_Interval_In_Group_Config(self, gconfigs, gname):
for gconfig in gconfigs[0]:
if gconfig['name'] == gname:
return gconfig['interval']
return 0
def Group_Config_Size(self, gconfigs):
size = 0
for gconfig in gconfigs[0]:
size = size + 1
return size
def Get_Random_Group_Config(self, gconfigs):
return random.choice(gconfigs)['name']
def Group_Config_Check(self, gconfigs, name, interval):
ret = -1
for gconfig in gconfigs:
if gconfig['name'] == name:
if gconfig['interval'] == int(interval):
ret = 0
break
return ret
def Get_Group_Config_By_Name(self, sgconfigs, name):
for gconfig in sgconfigs:
if gconfig['name'] == name:
return gconfig['name']
return 0
class Node(object):
def __init__(self):
pass
def Get_Node_By_Name(self, snodes, name):
for node in snodes:
if node['name'] == name:
return True
return False
def Node_Should_Exist(self, snodes, name):
assert True == self.Get_Node_By_Name(snodes, name)
def Node_Should_Not_Exist(self, snodes, name):
assert False == self.Get_Node_By_Name(snodes, name)
def Node_With_Name_Should_Not_Exist(self, snodes, name):
assert 0 == self.Get_Node_By_Name(snodes, name)
def Get_Random_Node(self, snodes):
return random.choice(snodes)['id']
class Tag(object):
def __init__(self):
pass
def Tag_Check(self, tags, name, type, group_config_name, attribute, address):
ret = -1
for tag in tags:
if tag['name'] == name:
if tag['type'] == int(type) and tag['group_config_name'] == group_config_name and tag['attribute'] == int(attribute) and tag['address'] == address:
ret = 0
break
return ret
def Tag_Find_By_Name(self, tags, name):
for tag in tags:
if tag['name'] == name:
return tag
return None
class Subscribe(object):
def __init__(self):
pass
def Subscribe_Check(self, groups, node_id, group_config_name):
ret = -1
for group in groups:
if group['node_id'] == int(node_id) and group['group_config_name'] == group_config_name:
ret = 0
break
return ret
class Read(object):
def __init__(self):
pass
def Compare_Tag_Value_Bool(self, tags, name, value):
ret = -1
for tag in tags:
if tag['name'] == name:
if isinstance(value, str):
if (tag['value'] == False and value.lower() == "false" or
tag['value'] == True and value.lower() == "true"):
ret = 0
elif tag['value'] == int(value):
ret = 0
break
return ret
def Compare_Tag_Value_Int(self, tags, name, value):
ret = -1
for tag in tags:
if tag['name'] == name:
if int(tag['value']) == int(value):
ret = 0
break
return ret
def Compare_Tag_Value_Float(self, tags, name, value):
ret = -1
for tag in tags:
if tag['name'] == name:
if float(tag['value']) <= float(value) + 0.1 and float(tag['value']) >= float(value) - 0.1:
ret = 0
break
return ret
def Compare_Tag_Value_String(self, tags, name, value):
ret = -1
for tag in tags:
if tag['name'] == name:
if tag['value'] == str(value):
ret = 0
break
return ret
def Compare_Tag_Value_Strings(self, tags, name, value):
ret = -1
for tag in tags:
if tag['name'] == name:
if "\"" + tag['value'] + "\"" == str(value):
ret = 0
break
return ret
def Check_Tag_Error(self, tags, name, value):
ret = -1
for tag in tags:
if tag['name'] == name:
if int(tag['error']) == int(value):
ret = 0
break
return ret
-35
View File
@@ -1,35 +0,0 @@
# Functional test
Functional testing uses the robotframework automated testing framework, providing templates for each test case of the northbound APP and southbound DRIVER types.
Testing is divided into the following categories.
|Test case|Description|
|-----|----------|
|Core interface test|Mainly including the addition, deletion, modification, query, subscription, and other operations of the HTTP API interface for core data(PLUGIN, NODE, GROUP, TAG)|
|Southbound DRIVER test||
|Northbound APP test||
|Plugin specific test case|Such as OPC UA specific device discovery, can different devices be connected normally|
To run all functional testers
Enter the neuron/build directory.
Install Mosquito software.
```shell
$ sudo apt-get install -y mosquitto
```
Start the mosquitto server.
```shell
$ mosquitto -v &
```
Install requirements.
```shell
$ python3 -m pip install -U pip
$ python3 -m pip install -r ft/requirements.txt
```
Run functional tests and generate test reports.
```shell
$ python3 -m robot --maxerroelines=600 -P ft/ -d ft/reports ft
```
@@ -1,10 +0,0 @@
{
"nodes": [
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0000",
"state": 1
}
]
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0000"
}
@@ -1,7 +0,0 @@
{
"params": {
"host": "127.0.0.1",
"port": 60502,
"connection_mode": 0
}
}
@@ -1,11 +0,0 @@
{
"params": {
"req-topic": "Neuron/req",
"res-topic": "Neuron/resp",
"ssl": "false",
"host": "127.0.0.1",
"port": 1883,
"username": "",
"password": ""
}
}
@@ -1,10 +0,0 @@
{
"subscriptions": [
{
"sub_adapter_name": "mqtt-0000",
"group_config_name": "group-0000",
"src_adapter_name": "modbus-tcp-0000",
"read_interval": 1000
}
]
}
@@ -1,3 +0,0 @@
{
"plugins": []
}
@@ -1,10 +0,0 @@
{
"nodes": [
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0000",
"state": 1
}
]
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0000"
}
@@ -1,7 +0,0 @@
{
"params": {
"host": "127.0.0.1",
"port": 60502,
"connection_mode": 0
}
}
@@ -1,11 +0,0 @@
{
"params": {
"req-topic": "Neuron/req",
"res-topic": "Neuron/resp",
"ssl": "false",
"host": "127.0.0.1",
"port": 1883,
"username": "",
"password": ""
}
}
@@ -1,10 +0,0 @@
{
"subscriptions": [
{
"sub_adapter_name": "mqtt-0000",
"group_config_name": "group-0000",
"src_adapter_name": "modbus-tcp-0000",
"read_interval": 1000
}
]
}
@@ -1,3 +0,0 @@
{
"plugins": []
}
-124
View File
@@ -1,124 +0,0 @@
{
"nodes": [
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0000",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0001",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0002",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0003",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0004",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0005",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0006",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0007",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0008",
"state": 1
},
{
"type": 1,
"plugin_name": "modbus-tcp",
"name": "modbus-tcp-0009",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0000",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0001",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0002",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0003",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0004",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0005",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0006",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0007",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0008",
"state": 1
},
{
"type": 1,
"plugin_name": "neuron-opcua-plugin",
"name": "opcua-0009",
"state": 1
}
]
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0000"
}
@@ -1,604 +0,0 @@
{
"tags": [
{
"type": 4,
"name": "modbus1",
"attribute": 3,
"address": "1!400001"
},
{
"type": 4,
"name": "modbus2",
"attribute": 3,
"address": "1!400002"
},
{
"type": 4,
"name": "modbus3",
"attribute": 3,
"address": "1!400003"
},
{
"type": 4,
"name": "modbus4",
"attribute": 3,
"address": "1!400004"
},
{
"type": 4,
"name": "modbus5",
"attribute": 3,
"address": "1!400005"
},
{
"type": 4,
"name": "modbus6",
"attribute": 3,
"address": "1!400006"
},
{
"type": 4,
"name": "modbus7",
"attribute": 3,
"address": "1!400007"
},
{
"type": 4,
"name": "modbus8",
"attribute": 3,
"address": "1!400008"
},
{
"type": 4,
"name": "modbus9",
"attribute": 3,
"address": "1!400009"
},
{
"type": 4,
"name": "modbus10",
"attribute": 3,
"address": "1!400010"
},
{
"type": 4,
"name": "modbus11",
"attribute": 3,
"address": "1!400011"
},
{
"type": 4,
"name": "modbus12",
"attribute": 3,
"address": "1!400012"
},
{
"type": 4,
"name": "modbus13",
"attribute": 3,
"address": "1!400013"
},
{
"type": 4,
"name": "modbus14",
"attribute": 3,
"address": "1!400014"
},
{
"type": 4,
"name": "modbus15",
"attribute": 3,
"address": "1!400015"
},
{
"type": 4,
"name": "modbus16",
"attribute": 3,
"address": "1!400016"
},
{
"type": 4,
"name": "modbus17",
"attribute": 3,
"address": "1!400017"
},
{
"type": 4,
"name": "modbus18",
"attribute": 3,
"address": "1!400018"
},
{
"type": 4,
"name": "modbus19",
"attribute": 3,
"address": "1!400019"
},
{
"type": 4,
"name": "modbus20",
"attribute": 3,
"address": "1!400020"
},
{
"type": 4,
"name": "modbus21",
"attribute": 3,
"address": "1!400021"
},
{
"type": 4,
"name": "modbus22",
"attribute": 3,
"address": "1!400022"
},
{
"type": 4,
"name": "modbus23",
"attribute": 3,
"address": "1!400023"
},
{
"type": 4,
"name": "modbus24",
"attribute": 3,
"address": "1!400024"
},
{
"type": 4,
"name": "modbus25",
"attribute": 3,
"address": "1!400025"
},
{
"type": 4,
"name": "modbus26",
"attribute": 3,
"address": "1!400026"
},
{
"type": 4,
"name": "modbus27",
"attribute": 3,
"address": "1!400027"
},
{
"type": 4,
"name": "modbus28",
"attribute": 3,
"address": "1!400028"
},
{
"type": 4,
"name": "modbus29",
"attribute": 3,
"address": "1!400029"
},
{
"type": 4,
"name": "modbus30",
"attribute": 3,
"address": "1!400030"
},
{
"type": 4,
"name": "modbus31",
"attribute": 3,
"address": "1!400031"
},
{
"type": 4,
"name": "modbus32",
"attribute": 3,
"address": "1!400032"
},
{
"type": 4,
"name": "modbus33",
"attribute": 3,
"address": "1!400033"
},
{
"type": 4,
"name": "modbus34",
"attribute": 3,
"address": "1!400034"
},
{
"type": 4,
"name": "modbus35",
"attribute": 3,
"address": "1!400035"
},
{
"type": 4,
"name": "modbus36",
"attribute": 3,
"address": "1!400036"
},
{
"type": 4,
"name": "modbus37",
"attribute": 3,
"address": "1!400037"
},
{
"type": 4,
"name": "modbus38",
"attribute": 3,
"address": "1!400038"
},
{
"type": 4,
"name": "modbus39",
"attribute": 3,
"address": "1!400039"
},
{
"type": 4,
"name": "modbus40",
"attribute": 3,
"address": "1!400040"
},
{
"type": 4,
"name": "modbus41",
"attribute": 3,
"address": "1!400041"
},
{
"type": 4,
"name": "modbus42",
"attribute": 3,
"address": "1!400042"
},
{
"type": 4,
"name": "modbus43",
"attribute": 3,
"address": "1!400043"
},
{
"type": 4,
"name": "modbus44",
"attribute": 3,
"address": "1!400044"
},
{
"type": 4,
"name": "modbus45",
"attribute": 3,
"address": "1!400045"
},
{
"type": 4,
"name": "modbus46",
"attribute": 3,
"address": "1!400046"
},
{
"type": 4,
"name": "modbus47",
"attribute": 3,
"address": "1!400047"
},
{
"type": 4,
"name": "modbus48",
"attribute": 3,
"address": "1!400048"
},
{
"type": 4,
"name": "modbus49",
"attribute": 3,
"address": "1!400049"
},
{
"type": 4,
"name": "modbus50",
"attribute": 3,
"address": "1!400050"
},
{
"type": 4,
"name": "modbus51",
"attribute": 3,
"address": "1!400051"
},
{
"type": 4,
"name": "modbus52",
"attribute": 3,
"address": "1!400052"
},
{
"type": 4,
"name": "modbus53",
"attribute": 3,
"address": "1!400053"
},
{
"type": 4,
"name": "modbus54",
"attribute": 3,
"address": "1!400054"
},
{
"type": 4,
"name": "modbus55",
"attribute": 3,
"address": "1!400055"
},
{
"type": 4,
"name": "modbus56",
"attribute": 3,
"address": "1!400056"
},
{
"type": 4,
"name": "modbus57",
"attribute": 3,
"address": "1!400057"
},
{
"type": 4,
"name": "modbus58",
"attribute": 3,
"address": "1!400058"
},
{
"type": 4,
"name": "modbus59",
"attribute": 3,
"address": "1!400059"
},
{
"type": 4,
"name": "modbus60",
"attribute": 3,
"address": "1!400060"
},
{
"type": 4,
"name": "modbus61",
"attribute": 3,
"address": "1!400061"
},
{
"type": 4,
"name": "modbus62",
"attribute": 3,
"address": "1!400062"
},
{
"type": 4,
"name": "modbus63",
"attribute": 3,
"address": "1!400063"
},
{
"type": 4,
"name": "modbus64",
"attribute": 3,
"address": "1!400064"
},
{
"type": 4,
"name": "modbus65",
"attribute": 3,
"address": "1!400065"
},
{
"type": 4,
"name": "modbus66",
"attribute": 3,
"address": "1!400066"
},
{
"type": 4,
"name": "modbus67",
"attribute": 3,
"address": "1!400067"
},
{
"type": 4,
"name": "modbus68",
"attribute": 3,
"address": "1!400068"
},
{
"type": 4,
"name": "modbus69",
"attribute": 3,
"address": "1!400069"
},
{
"type": 4,
"name": "modbus70",
"attribute": 3,
"address": "1!400070"
},
{
"type": 4,
"name": "modbus71",
"attribute": 3,
"address": "1!400071"
},
{
"type": 4,
"name": "modbus72",
"attribute": 3,
"address": "1!400072"
},
{
"type": 4,
"name": "modbus73",
"attribute": 3,
"address": "1!400073"
},
{
"type": 4,
"name": "modbus74",
"attribute": 3,
"address": "1!400074"
},
{
"type": 4,
"name": "modbus75",
"attribute": 3,
"address": "1!400075"
},
{
"type": 4,
"name": "modbus76",
"attribute": 3,
"address": "1!400076"
},
{
"type": 4,
"name": "modbus77",
"attribute": 3,
"address": "1!400077"
},
{
"type": 4,
"name": "modbus78",
"attribute": 3,
"address": "1!400078"
},
{
"type": 4,
"name": "modbus79",
"attribute": 3,
"address": "1!400079"
},
{
"type": 4,
"name": "modbus80",
"attribute": 3,
"address": "1!400080"
},
{
"type": 4,
"name": "modbus81",
"attribute": 3,
"address": "1!400081"
},
{
"type": 4,
"name": "modbus82",
"attribute": 3,
"address": "1!400082"
},
{
"type": 4,
"name": "modbus83",
"attribute": 3,
"address": "1!400083"
},
{
"type": 4,
"name": "modbus84",
"attribute": 3,
"address": "1!400084"
},
{
"type": 4,
"name": "modbus85",
"attribute": 3,
"address": "1!400085"
},
{
"type": 4,
"name": "modbus86",
"attribute": 3,
"address": "1!400086"
},
{
"type": 4,
"name": "modbus87",
"attribute": 3,
"address": "1!400087"
},
{
"type": 4,
"name": "modbus88",
"attribute": 3,
"address": "1!400088"
},
{
"type": 4,
"name": "modbus89",
"attribute": 3,
"address": "1!400089"
},
{
"type": 4,
"name": "modbus90",
"attribute": 3,
"address": "1!400090"
},
{
"type": 4,
"name": "modbus91",
"attribute": 3,
"address": "1!400091"
},
{
"type": 4,
"name": "modbus92",
"attribute": 3,
"address": "1!400092"
},
{
"type": 4,
"name": "modbus93",
"attribute": 3,
"address": "1!400093"
},
{
"type": 4,
"name": "modbus94",
"attribute": 3,
"address": "1!400094"
},
{
"type": 4,
"name": "modbus95",
"attribute": 3,
"address": "1!400095"
},
{
"type": 4,
"name": "modbus96",
"attribute": 3,
"address": "1!400096"
},
{
"type": 4,
"name": "modbus97",
"attribute": 3,
"address": "1!400097"
},
{
"type": 4,
"name": "modbus98",
"attribute": 3,
"address": "1!400098"
},
{
"type": 4,
"name": "modbus99",
"attribute": 3,
"address": "1!400099"
},
{
"type": 4,
"name": "modbus100",
"attribute": 3,
"address": "1!400100"
}
]
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0001",
"adapter_name": "modbus-tcp-0000"
}
@@ -1,604 +0,0 @@
{
"tags": [
{
"type": 4,
"name": "modbus101",
"attribute": 3,
"address": "1!400101"
},
{
"type": 4,
"name": "modbus102",
"attribute": 3,
"address": "1!400102"
},
{
"type": 4,
"name": "modbus103",
"attribute": 3,
"address": "1!400103"
},
{
"type": 4,
"name": "modbus104",
"attribute": 3,
"address": "1!400104"
},
{
"type": 4,
"name": "modbus105",
"attribute": 3,
"address": "1!400105"
},
{
"type": 4,
"name": "modbus106",
"attribute": 3,
"address": "1!400106"
},
{
"type": 4,
"name": "modbus107",
"attribute": 3,
"address": "1!400107"
},
{
"type": 4,
"name": "modbus108",
"attribute": 3,
"address": "1!400108"
},
{
"type": 4,
"name": "modbus109",
"attribute": 3,
"address": "1!400109"
},
{
"type": 4,
"name": "modbus110",
"attribute": 3,
"address": "1!400110"
},
{
"type": 4,
"name": "modbus111",
"attribute": 3,
"address": "1!400111"
},
{
"type": 4,
"name": "modbus112",
"attribute": 3,
"address": "1!400112"
},
{
"type": 4,
"name": "modbus113",
"attribute": 3,
"address": "1!400113"
},
{
"type": 4,
"name": "modbus114",
"attribute": 3,
"address": "1!400114"
},
{
"type": 4,
"name": "modbus115",
"attribute": 3,
"address": "1!400115"
},
{
"type": 4,
"name": "modbus116",
"attribute": 3,
"address": "1!400116"
},
{
"type": 4,
"name": "modbus117",
"attribute": 3,
"address": "1!400117"
},
{
"type": 4,
"name": "modbus118",
"attribute": 3,
"address": "1!400118"
},
{
"type": 4,
"name": "modbus119",
"attribute": 3,
"address": "1!400119"
},
{
"type": 4,
"name": "modbus120",
"attribute": 3,
"address": "1!400120"
},
{
"type": 4,
"name": "modbus121",
"attribute": 3,
"address": "1!400121"
},
{
"type": 4,
"name": "modbus122",
"attribute": 3,
"address": "1!400122"
},
{
"type": 4,
"name": "modbus123",
"attribute": 3,
"address": "1!400123"
},
{
"type": 4,
"name": "modbus124",
"attribute": 3,
"address": "1!400124"
},
{
"type": 4,
"name": "modbus125",
"attribute": 3,
"address": "1!400125"
},
{
"type": 4,
"name": "modbus126",
"attribute": 3,
"address": "1!400126"
},
{
"type": 4,
"name": "modbus127",
"attribute": 3,
"address": "1!400127"
},
{
"type": 4,
"name": "modbus128",
"attribute": 3,
"address": "1!400128"
},
{
"type": 4,
"name": "modbus129",
"attribute": 3,
"address": "1!400129"
},
{
"type": 4,
"name": "modbus130",
"attribute": 3,
"address": "1!400130"
},
{
"type": 4,
"name": "modbus131",
"attribute": 3,
"address": "1!400131"
},
{
"type": 4,
"name": "modbus132",
"attribute": 3,
"address": "1!400132"
},
{
"type": 4,
"name": "modbus133",
"attribute": 3,
"address": "1!400133"
},
{
"type": 4,
"name": "modbus134",
"attribute": 3,
"address": "1!400134"
},
{
"type": 4,
"name": "modbus135",
"attribute": 3,
"address": "1!400135"
},
{
"type": 4,
"name": "modbus136",
"attribute": 3,
"address": "1!400136"
},
{
"type": 4,
"name": "modbus137",
"attribute": 3,
"address": "1!400137"
},
{
"type": 4,
"name": "modbus138",
"attribute": 3,
"address": "1!400138"
},
{
"type": 4,
"name": "modbus139",
"attribute": 3,
"address": "1!400139"
},
{
"type": 4,
"name": "modbus140",
"attribute": 3,
"address": "1!400140"
},
{
"type": 4,
"name": "modbus141",
"attribute": 3,
"address": "1!400141"
},
{
"type": 4,
"name": "modbus142",
"attribute": 3,
"address": "1!400142"
},
{
"type": 4,
"name": "modbus143",
"attribute": 3,
"address": "1!400143"
},
{
"type": 4,
"name": "modbus144",
"attribute": 3,
"address": "1!400144"
},
{
"type": 4,
"name": "modbus145",
"attribute": 3,
"address": "1!400145"
},
{
"type": 4,
"name": "modbus146",
"attribute": 3,
"address": "1!400146"
},
{
"type": 4,
"name": "modbus147",
"attribute": 3,
"address": "1!400147"
},
{
"type": 4,
"name": "modbus148",
"attribute": 3,
"address": "1!400148"
},
{
"type": 4,
"name": "modbus149",
"attribute": 3,
"address": "1!400149"
},
{
"type": 4,
"name": "modbus150",
"attribute": 3,
"address": "1!400150"
},
{
"type": 4,
"name": "modbus151",
"attribute": 3,
"address": "1!400151"
},
{
"type": 4,
"name": "modbus152",
"attribute": 3,
"address": "1!400152"
},
{
"type": 4,
"name": "modbus153",
"attribute": 3,
"address": "1!400153"
},
{
"type": 4,
"name": "modbus154",
"attribute": 3,
"address": "1!400154"
},
{
"type": 4,
"name": "modbus155",
"attribute": 3,
"address": "1!400155"
},
{
"type": 4,
"name": "modbus156",
"attribute": 3,
"address": "1!400156"
},
{
"type": 4,
"name": "modbus157",
"attribute": 3,
"address": "1!400157"
},
{
"type": 4,
"name": "modbus158",
"attribute": 3,
"address": "1!400158"
},
{
"type": 4,
"name": "modbus159",
"attribute": 3,
"address": "1!400159"
},
{
"type": 4,
"name": "modbus160",
"attribute": 3,
"address": "1!400160"
},
{
"type": 4,
"name": "modbus161",
"attribute": 3,
"address": "1!400161"
},
{
"type": 4,
"name": "modbus162",
"attribute": 3,
"address": "1!400162"
},
{
"type": 4,
"name": "modbus163",
"attribute": 3,
"address": "1!400163"
},
{
"type": 4,
"name": "modbus164",
"attribute": 3,
"address": "1!400164"
},
{
"type": 4,
"name": "modbus165",
"attribute": 3,
"address": "1!400165"
},
{
"type": 4,
"name": "modbus166",
"attribute": 3,
"address": "1!400166"
},
{
"type": 4,
"name": "modbus167",
"attribute": 3,
"address": "1!400167"
},
{
"type": 4,
"name": "modbus168",
"attribute": 3,
"address": "1!400168"
},
{
"type": 4,
"name": "modbus169",
"attribute": 3,
"address": "1!400169"
},
{
"type": 4,
"name": "modbus170",
"attribute": 3,
"address": "1!400170"
},
{
"type": 4,
"name": "modbus171",
"attribute": 3,
"address": "1!400171"
},
{
"type": 4,
"name": "modbus172",
"attribute": 3,
"address": "1!400172"
},
{
"type": 4,
"name": "modbus173",
"attribute": 3,
"address": "1!400173"
},
{
"type": 4,
"name": "modbus174",
"attribute": 3,
"address": "1!400174"
},
{
"type": 4,
"name": "modbus175",
"attribute": 3,
"address": "1!400175"
},
{
"type": 4,
"name": "modbus176",
"attribute": 3,
"address": "1!400176"
},
{
"type": 4,
"name": "modbus177",
"attribute": 3,
"address": "1!400177"
},
{
"type": 4,
"name": "modbus178",
"attribute": 3,
"address": "1!400178"
},
{
"type": 4,
"name": "modbus179",
"attribute": 3,
"address": "1!400179"
},
{
"type": 4,
"name": "modbus180",
"attribute": 3,
"address": "1!400180"
},
{
"type": 4,
"name": "modbus181",
"attribute": 3,
"address": "1!400181"
},
{
"type": 4,
"name": "modbus182",
"attribute": 3,
"address": "1!400182"
},
{
"type": 4,
"name": "modbus183",
"attribute": 3,
"address": "1!400183"
},
{
"type": 4,
"name": "modbus184",
"attribute": 3,
"address": "1!400184"
},
{
"type": 4,
"name": "modbus185",
"attribute": 3,
"address": "1!400185"
},
{
"type": 4,
"name": "modbus186",
"attribute": 3,
"address": "1!400186"
},
{
"type": 4,
"name": "modbus187",
"attribute": 3,
"address": "1!400187"
},
{
"type": 4,
"name": "modbus188",
"attribute": 3,
"address": "1!400188"
},
{
"type": 4,
"name": "modbus189",
"attribute": 3,
"address": "1!400189"
},
{
"type": 4,
"name": "modbus190",
"attribute": 3,
"address": "1!400190"
},
{
"type": 4,
"name": "modbus191",
"attribute": 3,
"address": "1!400191"
},
{
"type": 4,
"name": "modbus192",
"attribute": 3,
"address": "1!400192"
},
{
"type": 4,
"name": "modbus193",
"attribute": 3,
"address": "1!400193"
},
{
"type": 4,
"name": "modbus194",
"attribute": 3,
"address": "1!400194"
},
{
"type": 4,
"name": "modbus195",
"attribute": 3,
"address": "1!400195"
},
{
"type": 4,
"name": "modbus196",
"attribute": 3,
"address": "1!400196"
},
{
"type": 4,
"name": "modbus197",
"attribute": 3,
"address": "1!400197"
},
{
"type": 4,
"name": "modbus198",
"attribute": 3,
"address": "1!400198"
},
{
"type": 4,
"name": "modbus199",
"attribute": 3,
"address": "1!400199"
},
{
"type": 4,
"name": "modbus200",
"attribute": 3,
"address": "1!400200"
}
]
}
@@ -1,7 +0,0 @@
{
"params": {
"host":"127.0.0.1",
"port":60502,
"connection_mode":0
}
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0001"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0001",
"adapter_name": "modbus-tcp-0001"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0002",
"adapter_name": "modbus-tcp-0001"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0003",
"adapter_name": "modbus-tcp-0001"
}
@@ -1,7 +0,0 @@
{
"params": {
"host":"127.0.0.1",
"port":60502,
"connection_mode":0
}
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0002"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0001",
"adapter_name": "modbus-tcp-0002"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0002",
"adapter_name": "modbus-tcp-0002"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0003",
"adapter_name": "modbus-tcp-0002"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0004",
"adapter_name": "modbus-tcp-0002"
}
@@ -1,7 +0,0 @@
{
"params": {
"host":"127.0.0.1",
"port":60502,
"connection_mode":0
}
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0003"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0001",
"adapter_name": "modbus-tcp-0003"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0002",
"adapter_name": "modbus-tcp-0003"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0003",
"adapter_name": "modbus-tcp-0003"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0004",
"adapter_name": "modbus-tcp-0003"
}
@@ -1,7 +0,0 @@
{
"params": {
"host":"127.0.0.1",
"port":60502,
"connection_mode":0
}
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0004"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0001",
"adapter_name": "modbus-tcp-0004"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0002",
"adapter_name": "modbus-tcp-0004"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0003",
"adapter_name": "modbus-tcp-0004"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0004",
"adapter_name": "modbus-tcp-0004"
}
@@ -1,7 +0,0 @@
{
"params": {
"host":"127.0.0.1",
"port":60502,
"connection_mode":0
}
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0000",
"adapter_name": "modbus-tcp-0005"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0001",
"adapter_name": "modbus-tcp-0005"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0002",
"adapter_name": "modbus-tcp-0005"
}
@@ -1,5 +0,0 @@
{
"read_interval": 1000,
"group_config_name": "group-0003",
"adapter_name": "modbus-tcp-0005"
}

Some files were not shown because too many files have changed in this diff Show More