[{"data":1,"prerenderedAt":336},["ShallowReactive",2],{"blog-post-zh-nanomq-newsletter-202304":3},{"post":4,"translationPath":-1},{"id":5,"title":6,"author":7,"body":8,"cover":319,"coverHeight":320,"coverWidth":70,"date":321,"description":322,"draft":323,"extension":324,"meta":325,"navigation":326,"path":327,"pinned":323,"seo":328,"sitemap":329,"stem":332,"tags":333,"__hash__":335},"blog_zh\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202304.md","SOME\u002FIP 代理，重连新增自动退避｜NanoMQ Newsletter 202304",null,{"type":9,"value":10,"toc":304},"minimark",[11,20,36,41,53,56,61,64,72,76,79,94,105,108,114,117,123,130,136,142,156,159,163,170,185,191,195,202,208,219,222,226,235,238,241,244,247,263,266,269,284,287,298,301],[12,13,14,19],"p",{},[15,16,18],"a",{"href":17},"\u002Fzh","NanoMQ"," 项目将在 5 月正式发布 0.18 版本。这一版本除了正式发布 SOME\u002FIP 协议转换代理功能外，主要聚焦于旧功能特性的优化和为项目增加更详细的文档和教程。",[12,21,22,23,29,30,35],{},"0.18 版本继续对 2 个重要功能进行升级：桥接功能新增自动退避重连参数配置选项，简化 DDS 协议代理功能的编译安装。另外 NanoSDK 新增了 ",[15,24,28],{"href":25,"rel":26},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fthe-easiest-guide-to-getting-started-with-mqtt",[27],"nofollow","MQTT"," over ",[15,31,34],{"href":32,"rel":33},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fquic-protocol-the-features-use-cases-and-impact-for-iot-iov",[27],"QUIC"," 支持和 C++ 封装。",[37,38,40],"h2",{"id":39},"someip-协议代理","SOME\u002FIP 协议代理",[12,42,43,44,48,49,52],{},"SOME\u002FIP（",[45,46,47],"strong",{},"Scalable service-Oriented MiddlewarE over IP","）由德国宝马公司开发，能够实现以服务为导向的通信方式，工作在车载以太网的应用层，为汽车电子采用 SOA (",[45,50,51],{},"Service-Oriented Architecture",") 架构来处理大量数据提供了网络通信支持。",[12,54,55],{},"有别于传统车载总线，SOME\u002FIP 作为面向服务的通信标准协议，不会始终不断地循环发送数据，而是只有当网络中至少存在一个接收方需要这些数据时，发送方才会发送数据，这大大提高了网络带宽的利用率。",[57,58,60],"h3",{"id":59},"someip-mqtt-共同应用场景","SOME\u002FIP + MQTT 共同应用场景",[12,62,63],{},"在新一代的软件定义汽车浪潮中，需要一个安全且高性能的数据总线来融合车内不同来源的数据，支持传统 TSP 平台对接并联系 ADAS 等新一代应用服务完成计算卸载转移。NanoMQ 已经支持 DDS\u002FSOME-IP 等 AUTOSAR 标准的数据通信方式，可以部署在车内中央网关中完成汇聚和与 TSP 平台的对接工作，并通过MQTT over QUIC\u002FTCP + TLS 加密连接保证网关的安全性。",[12,65,66],{},[67,68],"img",{"alt":60,"src":69,"width":70,"height":71},"\u002Fimages\u002Fblog\u002Fzh\u002Fnanomq-newsletter-202304\u002F01.webp",1520,729,[57,73,75],{"id":74},"nanomq-的-someip-代理安装使用示例","NanoMQ 的 SOME\u002FIP 代理安装使用示例",[12,77,78],{},"目前 SOME\u002FIP 协议代理转换功能处于实验阶段，目前并未默认开启，需要自行编译安装，其过程步骤介绍如下。",[12,80,81,82,87,88,93],{},"NanoMQ 本身是一个 ",[15,83,86],{"href":84,"rel":85},"https:\u002F\u002Fwww.emqx.com\u002Fzh\u002Fblog\u002Fthe-ultimate-guide-to-mqtt-broker-comparison",[27],"MQTT broker","，各种协议转换代理网关例如 DDS\u002FZeroMQ 等都打包进其内置的命令行工具 nanomq_cli 中，SOME\u002FIP 也不例外。所以使用此功能时需要首先开启 nanomq_cli。NanoMQ 的 SOME\u002FIP 协议代理功能依赖于 GENIVI\u002FCOVESA (",[15,89,92],{"href":90,"rel":91},"https:\u002F\u002Fwww.covesa.global\u002F",[27],"COVESA",") 组织开源的 VSOME\u002FIP 库。由于此开源库为 MPL license，所以并未被直接集成到 NanoMQ 项目中，需要预先在系统中安装。",[95,96,101],"pre",{"className":97,"code":99,"language":100},[98],"language-text","\u002F\u002F可以采用源代码编译安装方式：\ngit clone https:\u002F\u002Fgithub.com\u002FCOVESA\u002Fvsomeip; cd vsomeip\nmkdir build; cd build\ncmake -DCMAKE_INSTALL_PREFIX:PATH=$YOUR_PATH ..\nmake\nmake install\n","text",[102,103,99],"code",{"__ignoreMap":104},"",[12,106,107],{},"然后通过以下命令在编译阶段为 NanoMQ 开启 SOME\u002FIP 协议转换功能:",[95,109,112],{"className":110,"code":111,"language":100},[98],"cmake -G Ninja -DBUILD_VSOMEIP_GATEWAY ..\nninja install\n",[102,113,111],{"__ignoreMap":104},[12,115,116],{},"开始使用前，首先通过 “etc\u002Fnanomq_vsomeip_gateway.conf” 独立配置文件来设置桥接的主题和需要请求的 SOME\u002FIP 服务地址。例如此处配置将从 SOME\u002FIP 服务接收到的数据转发至本地 MQTT Broker 的 topic\u002Fpub 主题，将从主题 topic\u002Fsub 收到的 MQTT 消息转发至 SOME\u002FIP 服务。",[95,118,121],{"className":119,"code":120,"language":100},[98],"##====================================================================\n# # Configuration for MQTT VSOMEIP Gateway\n# #====================================================================\ngateway.mqtt {\n    \u002F\u002F Address of Broker\n    address = \"mqtt-tcp:\u002F\u002Flocalhost:1883\"\n    sub_topic = \"topic\u002Fsub\"\n    sub_qos = 0\n    proto_ver = 4\n    keepalive = 60\n    clean_start = true\n    username = \"username\"\n    password = \"passwd\"\n    clientid = \"vsomeip_gateway\"\n    forward = \"topic\u002Fpub\"\n    parallel = 2\n}\ngateway.vsomeip {\n    service_id = \"0x1111\"\n    service_instance_id = \"0x2222\"\n    service_method_id = \"0x3333\"\n    conf_path = \"\u002Fetc\u002Fvsomeip.json\"\n}\n",[102,122,120],{"__ignoreMap":104},[12,124,125,126,129],{},"以 VSOMEIP 项目提供的例程服务 ",[102,127,128],{},"hello_world_service"," 为需要连接和转发的 SOME\u002FIP 服务，启动 SOME\u002FIP gateway 将 NanoMQ 和其对接。",[131,132,133],"blockquote",{},[12,134,135],{},"如何安装启动此示例服务请参考 VSOMEIP 项目文档，该服务也可以更换成其他 SOME\u002FIP 兼容的服务。",[95,137,140],{"className":138,"code":139,"language":100},[98],"hello_world_service  \u002F\u002F 启动 SOME\u002FIP Server\nnanomq start         \u002F\u002F 启动 NanoMQ MQTT Broker\nnanomq_cli vsomeip_gateway --conf \u002Fetc\u002Fnanomq_vsomeip_gateway.conf \u002F\u002F 启动SOME\u002FIP proxy\n",[102,141,139],{"__ignoreMap":104},[12,143,144,145,148,149,152,153,155],{},"之后在 ",[102,146,147],{},"topic\u002Fpub"," 主题发消息就能在对应的 ",[102,150,151],{},"topic\u002Fsub"," 收到 ",[102,154,128],{}," 回复的消息。",[12,157,158],{},"目前还只能提供透传服务，后续会根据用户使用的数据序列化\u002F反序列化格式工具，如 IDL\u002FFIDL 提供类似于 DDS Proxy Gateway 一样的自动代码生成+序列化功能。而 DDS Proxy 功能本月也得到了加强。",[57,160,162],{"id":161},"dds-proxy-新增通过-cmake-工具配置-idl","DDS proxy 新增通过 CMake 工具配置 IDL",[12,164,165,166,169],{},"在上一个版本中， DDS Proxy 需要手动将自动生成的生成的 IDL 序列化代码文件拷贝到编译目录，在这个版本中进一步简化了这一过程。如今用户只需要提前安装好 ",[102,167,168],{},"idl-serial-code-gen"," 工具后，就能在 NanoMQ 中通过 CMake 制定 IDL 文件来自动化这一过程。",[12,171,172,173,176,177,180,181,184],{},"通过cmake参数",[102,174,175],{},"IDL_FILE_PATH","指定",[102,178,179],{},"idl","文件路径 (不指定则默认为 工程路径下的 ",[102,182,183],{},"etc\u002Fidl\u002Fdds_type.idl",")",[95,186,189],{"className":187,"code":188,"language":100},[98],"$ git clone https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnanomq.git\n$ cd nanomq\n$ mkdir build && cd build\n$ cmake -G Ninja -DIDL_FILE_PATH={IDL_PATH} -DCMAKE_PREFIX_PATH={DDS_LIBRARY_PATH} -DBUILD_DDS_PROXY=ON ..\n$ ninja\n$ sudo ninja install\n",[102,190,188],{"__ignoreMap":104},[37,192,194],{"id":193},"nanomqnanosdk-新增自动重连退避选项","NanoMQ\u002FNanoSDK 新增自动重连退避选项",[12,196,197,198,201],{},"NanoMQ 和 NanoSDK 采用 ",[102,199,200],{},"dialer"," 机制来管理 MQTT 连接，隐藏了重连操作，不需要用户根据链接断开回调另外编程来完成重连。但并未提供自动退避选项导致客户端重连过于频繁，这可能造成 Broker 受到 DDOS 攻击。在这一版本中，新增了内置的自动指数退避算法，用户只需设置一个最大退避时间即可启动：",[95,203,206],{"className":204,"code":205,"language":100},[98],"nng_dialer_setopt_ms(dialer, NNG_OPT_MQTT_RECONNECT_BACKOFF_MAX, 240000);\n",[102,207,205],{"__ignoreMap":104},[12,209,210,211,214,215,218],{},"将最大退避时间设置为 24s，客户端会自动得出一个 2 以内的随机数作为等待时长： ",[102,212,213],{},"timeout","，之后每次尝试重连都会等待 ",[102,216,217],{},"timeout*2"," 直至增至最大值。",[12,220,221],{},"此选项已在 NanoMQ TCP 桥接功能中默认生效。NanoSDK 最新版也已经支持。",[37,223,225],{"id":224},"nanosdk-新增-c-binding-和-mqtt5-over-quic-支持","NanoSDK 新增 C++ binding 和 MQTT5 over QUIC 支持",[12,227,228,229,234],{},"除了新增了自动退避选项，NanoSDK 还增加了 MQTT5 over QUIC的支持，并提供了一个独立的 C++ 封装库：",[15,230,233],{"href":231,"rel":232},"https:\u002F\u002Fgithub.com\u002Fnanomq\u002Fnanosdk-cpp",[27],"NanoSDK-CPP","，这是一个基于 C++ 语法和用户习惯改进的实现，内部提供了一个 C++ 版本的 MQTT5 over QUIC 例程 。",[37,236,237],{"id":237},"安全性修复和文档更新",[12,239,240],{},"物联网应用对底层基础设施有着极高的安全性和稳定性要求。NanoMQ 通过持续的模糊测试，增强并保证了其在边缘场景下的可靠性和健壮性。通过模拟运行时的不合理或异常输入，不断测试并完善了 NanoMQ对非预期输入的响应和处理流程。",[57,242,243],{"id":243},"持续集成单元测试",[12,245,246],{},"为了提升开发效率，我们对持续集成的基础设施进行了更新，主要包括：",[248,249,250,254,257,260],"ul",{},[251,252,253],"li",{},"GitHub action 增加了nng.mqtt_tcp 单元测试，检查 NanoSDK 可用性。",[251,255,256],{},"GitHub action 增加了针对客户端例程的黑盒测试。",[251,258,259],{},"GitHub action 增加了nng.mqtt_broker_tcp 单元测试，检查 MQTT Broker 传输层可用性。",[251,261,262],{},"GitHub action 增加了 nng.supplemental.core.mqtt_test 和 nng.sp.protocol.mqtt.mqtt_parser_test 单元测试，检查 MQTT 相关函数可用性。",[12,264,265],{},"在这里我们特别感谢来自山东大学网络安全实验室的用户 @songxpu 和 @ZuoYuanP 在 GitHub 社区上对增强 NanoMQ 健壮性作出的贡献。",[12,267,268],{},"其他功能更新和优化：",[270,271,272,275,278,281],"ol",{},[251,273,274],{},"新增了支持 Grafana 的 Metrics Exporter HTTP API。",[251,276,277],{},"修改了 nanomq_cli 的 pub 流程，现在发布完消息后会自动断开连接。",[251,279,280],{},"移除了 HOCON 配置文件中的 enable\u002Fdisable 选项来简化配置。",[251,282,283],{},"新增了专门针对 MQTT over TCP\u002FQUIC 桥接的配置文档和使用教程。",[12,285,286],{},"此外还有一些问题修复：",[270,288,289,292,295],{},[251,290,291],{},"修复了 MQTT5 的 No Local 功能。",[251,293,294],{},"修复高并发更新和删除 Retain 消息导致的数据竞争问题。",[251,296,297],{},"修正了 NanoSDK 在高并发下会因为队列拥塞导致回复 message id 为0 的非法 ACK 问题。",[37,299,300],{"id":300},"即将到来",[12,302,303],{},"应多位用户的呼声，NanoMQ 在下一个版本中会增加动态桥接功能，用户能够通过 HTTP REST API 来修改桥接配置并 Reload\u002F重连桥接来生效，方便更灵活的数据路由管理。另外，在之前 Demo Day 中展示的 NFTP + MQTT 文件传输功能也计划作为标准功能内置到 nanomq_cli 中。",{"title":104,"searchDepth":305,"depth":305,"links":306},2,[307,313,314,315,318],{"id":39,"depth":305,"text":40,"children":308},[309,311,312],{"id":59,"depth":310,"text":60},3,{"id":74,"depth":310,"text":75},{"id":161,"depth":310,"text":162},{"id":193,"depth":305,"text":194},{"id":224,"depth":305,"text":225},{"id":237,"depth":305,"text":237,"children":316},[317],{"id":243,"depth":310,"text":243},{"id":300,"depth":305,"text":300},"\u002Fimages\u002Fblog\u002Fzh\u002Fnanomq-newsletter-202304\u002Fcover.webp",684,"2023-05-08","NanoMQ 项目将在 5 月正式发布 0.18 版本。这一版本除了正式发布 SOME\u002FIP 协议转换代理功能外，主要聚焦于旧功能特性的优化和为项目增加更详细的文档和教程。",false,"md",{},true,"\u002Fzh\u002Fblog\u002Fnanomq-newsletter-202304",{"title":6,"description":322},{"loc":327,"images":330,"lastmod":321},[331],{"loc":69},"zh\u002Fblog\u002Fnanomq-newsletter-202304",[334],"NanoMQ Newsletter","sdkxAgOpD32AzUVN7-QWzmyd6A5St97QvWvnopqD02Q",1794542897053]