[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"primary-menu":20,"tags-cloud":109,"tagposts-digital-twin-1":293},{"config":4,"socialLinks":19},{"title":5,"subtitle":6,"logoUrl":7,"faviconUrl":8,"footerText":9,"beianIcp":10,"beianPublicSecurity":9,"seoDescription":11,"seoKeywords":12,"homepageTitle":13,"homepageSubtitle":14,"analyticsHeadCode":15,"planetQrcodeUrl":16,"planetIntroHtml":9,"planetCtaText":17,"updatedAt":18},"编码世界","用编码改变世界","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002F2f277021172f43f6bb34e1c115760b7f.png","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002Fdcbad022e68c4a729a5dc4997a9bba8a.png","","苏ICP备2026073884号","编码世界（mashangan.com）是面向 Java 后端与 Go 语言的系统化编程教程站：提供\nMyBatis Plus、Lombok、Java 8、IDEA、Docker 等原创图文教程，以及 JVM、并发、\nSpring、MySQL、Redis、消息队列、计算机网络等大厂面试八股题库，另有可落地的\n项目实战系列，帮你从入门到精通。","编码世界,Java教程,Go语言教程,Docker教程,MyBatis Plus教程,Lombok教程, Java 8新特性,IDEA教程,Java面试题,八股文,JVM面试题,Java并发面试题, MySQL面试题,Redis面试题,Spring面试题,消息队列面试题,高并发,分库分表, Netty面试题,计算机网络面试题,AI Agent,RAG,程序员学习路线","Java全栈系统化编程教程","覆盖 MyBatis Plus、Lombok、Java 8、IDEA、Go、Docker 等原创图文教程，配套大厂面试八股题库，从入门到精通，持续更新","\u003Cscript>\nvar _hmt = _hmt || [];\n(function() {\n  var hm = document.createElement(\"script\");\n  hm.src = \"https:\u002F\u002Fhm.baidu.com\u002Fhm.js?f00af7e56d956c02e11efed4131379b0\";\n  var s = document.getElementsByTagName(\"script\")[0]; \n  s.parentNode.insertBefore(hm, s);\n})();\n\u003C\u002Fscript>\n","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002F2026\u002F09\u002Fc1a8f5de46584d3eb0bc762c180a5db9.png","扫码加入知识星球","2026-10-05T13:09:51.904487Z",[],{"metadata":21,"spec":24,"menuItems":35},{"name":22,"creationTimestamp":23},"primary","2026-09-12T06:13:55.024154Z",{"displayName":25,"menuItems":26},"主菜单",[27,28,29,30,31,32,33,34],"88c3f10b-321c-4092-86a8-70db00251b74","menu-item-izrtmxer","c4c814d1-0c2c-456b-8c96-4864965fee94","menu-item-tags","menu-item-column","menu-item-tools","menu-item-zsxq","menu-item-ocrxlczu",[36,45,55,64,73,82,91,100],{"displayName":37,"metadata":38,"spec":40,"status":43,"children":44},"首页",{"name":27,"creationTimestamp":39},"2026-09-12T06:13:54.422830Z",{"displayName":37,"href":41,"priority":42,"menuName":22},"\u002F",0,{"displayName":37,"href":41},[],{"displayName":46,"metadata":47,"spec":49,"status":53,"children":54},"Java面试八股",{"name":28,"creationTimestamp":48},"2026-09-13T09:42:02.854891Z",{"displayName":46,"href":50,"target":51,"priority":52,"menuName":22},"\u002Fjava-interview","_self",1,{"displayName":46,"href":50},[],{"displayName":56,"metadata":57,"spec":59,"status":62,"children":63},"文章",{"name":29,"creationTimestamp":58},"2026-09-12T06:13:54.457307Z",{"displayName":56,"href":60,"priority":61,"menuName":22},"\u002Farchives",2,{"displayName":56,"href":60},[],{"displayName":65,"metadata":66,"spec":68,"status":71,"children":72},"标签",{"name":30,"creationTimestamp":67},"2026-10-07T00:42:42.754151Z",{"displayName":65,"href":69,"priority":70,"menuName":22},"\u002Ftags",3,{"displayName":65,"href":69},[],{"displayName":74,"metadata":75,"spec":77,"status":80,"children":81},"项目实战",{"name":31,"creationTimestamp":76},"2026-09-14T00:35:08.138170Z",{"displayName":74,"href":78,"target":51,"priority":79,"menuName":22},"\u002Fcolumn",4,{"displayName":74,"href":78},[],{"displayName":83,"metadata":84,"spec":86,"status":89,"children":90},"在线工具",{"name":32,"creationTimestamp":85},"2026-09-14T00:35:08.171474Z",{"displayName":83,"href":87,"target":51,"priority":88,"menuName":22},"\u002Ftools",5,{"displayName":83,"href":87},[],{"displayName":92,"metadata":93,"spec":95,"status":98,"children":99},"知识星球",{"name":33,"creationTimestamp":94},"2026-09-14T00:35:08.199145Z",{"displayName":92,"href":96,"target":51,"priority":97,"menuName":22},"\u002Fzsxq",6,{"displayName":92,"href":96},[],{"displayName":101,"metadata":102,"spec":104,"status":107,"children":108},"特价云服务",{"name":34,"creationTimestamp":103},"2026-09-25T15:30:59.201614Z",{"displayName":101,"href":105,"target":51,"priority":106,"menuName":22},"\u002Fserver",7,{"displayName":101,"href":105},[],[110,117,124,131,138,145,152,159,166,172,178,184,191,197,203,209,215,221,227,233,239,245,251,257,263,269,275,281,287],{"metadata":111,"spec":113,"postCount":116},{"name":112},"tag-04980744",{"displayName":114,"slug":115},"面试题","interview",118,{"metadata":118,"spec":120,"postCount":123},{"name":119},"tag-93f725a0",{"displayName":121,"slug":122},"Java","java",68,{"metadata":125,"spec":127,"postCount":130},{"name":126},"tag-05b6053c",{"displayName":128,"slug":129},"Docker","docker",43,{"metadata":132,"spec":134,"postCount":137},{"name":133},"tag-1cba77c3",{"displayName":135,"slug":136},"IDEA","idea",32,{"metadata":139,"spec":141,"postCount":144},{"name":140},"tag-116a0109",{"displayName":142,"slug":143},"数字孪生","digital-twin",19,{"metadata":146,"spec":148,"postCount":151},{"name":147},"tag-a2fb95ac",{"displayName":149,"slug":150},"MyBatis Plus","mybatis-plus",18,{"metadata":153,"spec":155,"postCount":158},{"name":154},"tag-cc6220f9",{"displayName":156,"slug":157},"Lombok","lombok",15,{"metadata":160,"spec":162,"postCount":165},{"name":161},"tag-2a2d595e",{"displayName":163,"slug":164},"Spring","spring",10,{"metadata":167,"spec":169,"postCount":165},{"name":168},"tag-1d8a4975",{"displayName":170,"slug":171},"消息队列","mq",{"metadata":173,"spec":175,"postCount":165},{"name":174},"tag-17245299",{"displayName":176,"slug":177},"并发","concurrency",{"metadata":179,"spec":181,"postCount":165},{"name":180},"tag-4921c0e2",{"displayName":182,"slug":183},"AI","ai",{"metadata":185,"spec":187,"postCount":190},{"name":186},"tag-53bb7900",{"displayName":188,"slug":189},"卫星仿真","satellite",9,{"metadata":192,"spec":194,"postCount":88},{"name":193},"tag-62377bcf",{"displayName":195,"slug":196},"Spring Cloud","spring-cloud",{"metadata":198,"spec":200,"postCount":88},{"name":199},"tag-81c3b080",{"displayName":201,"slug":202},"MySQL","mysql",{"metadata":204,"spec":206,"postCount":88},{"name":205},"tag-86a1b907",{"displayName":207,"slug":208},"Redis","redis",{"metadata":210,"spec":212,"postCount":88},{"name":211},"tag-18897dcf",{"displayName":213,"slug":214},"Elasticsearch","elasticsearch",{"metadata":216,"spec":218,"postCount":88},{"name":217},"tag-6ce80d8e",{"displayName":219,"slug":220},"JVM","jvm",{"metadata":222,"spec":224,"postCount":88},{"name":223},"tag-aa4e1b8c",{"displayName":225,"slug":226},"Dubbo","dubbo",{"metadata":228,"spec":230,"postCount":88},{"name":229},"tag-9e30c249",{"displayName":231,"slug":232},"Netty","netty",{"metadata":234,"spec":236,"postCount":88},{"name":235},"tag-2199ace5",{"displayName":237,"slug":238},"ZooKeeper","zookeeper",{"metadata":240,"spec":242,"postCount":88},{"name":241},"tag-7c298a76",{"displayName":243,"slug":244},"设计模式","design-pattern",{"metadata":246,"spec":248,"postCount":88},{"name":247},"tag-6cf6cea9",{"displayName":249,"slug":250},"高可用","high-availability",{"metadata":252,"spec":254,"postCount":88},{"name":253},"tag-918786ab",{"displayName":255,"slug":256},"分库分表","sharding",{"metadata":258,"spec":260,"postCount":88},{"name":259},"tag-91e02cd2",{"displayName":261,"slug":262},"计算机网络","network",{"metadata":264,"spec":266,"postCount":88},{"name":265},"tag-dd302f94",{"displayName":267,"slug":268},"操作系统","os",{"metadata":270,"spec":272,"postCount":88},{"name":271},"tag-1b359d87",{"displayName":273,"slug":274},"Tomcat","tomcat",{"metadata":276,"spec":278,"postCount":79},{"name":277},"tag-f0d71b77",{"displayName":279,"slug":280},"MyBatis","mybatis",{"metadata":282,"spec":284,"postCount":52},{"name":283},"tag-a118a308",{"displayName":285,"slug":286},"时序数据库","tsdb",{"metadata":288,"spec":290,"postCount":42},{"name":289},"tag-34d1f91f",{"displayName":291,"slug":292},"Go","go",{"page":52,"size":294,"total":144,"items":295,"first":306,"last":306,"hasNext":311,"hasPrevious":311,"totalPages":52},20,[296,334,361,388,415,442,469,496,523,550,577,604,631,658,685,712,739,766,793],{"metadata":297,"spec":301,"status":313,"categories":318,"tags":330},{"name":298,"creationTimestamp":299,"annotations":300},"md-f9da9383732c","2026-09-21T14:03:21.131131Z",{"haloweb\u002Fseries":143},{"title":302,"slug":303,"cover":304,"excerpt":305,"publishTime":307,"categories":308,"tags":310,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十九）：面试考点全景图——30 个高频追问 Q&A","digital-twin-19-interview-cheatsheet","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999382113sz32-p1.jpg",{"raw":9,"autoGenerate":306},true,"2026-09-21T14:03:21.282887Z",[309],"project",[140],false,"PUBLIC",{"permalink":314,"excerpt":315,"lastModifyTime":316,"phase":317},"\u002Farchives\u002Fdigital-twin-19-interview-cheatsheet","数字孪生巡检平台实战（十九）：面试考点全景图——30 个高频追问 Q&A 18 章走完，这个项目从 ThingsBoard 部署到 Cesium 三维球、从 Modbus 寄存器到分布式锁全部闭环。但面试官不看你写了多少代码——他挖的是每个技术决策背后的为什么。 收官章做两件事：一张考点全景图（18","2026-09-21T14:03:21.222579Z","PUBLISHED",[319],{"metadata":320,"spec":324,"status":327,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":322},"2026-09-14T00:20:18.353502Z",{"tutorial.halo.run\u002Fstatus":323},"updating",{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},"https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Ftutorial-cover-project.png","企业级项目从 0 到 1 实战讲解：需求拆解、架构设计、编码落地到部署上线，以连载方式持续更新。",{"permalink":328,"postCount":329,"visiblePostCount":329},"\u002Fcategories\u002Fproject",29,[331],{"metadata":332,"spec":333},{"name":140},{"displayName":142,"slug":143},{"metadata":335,"spec":339,"status":347,"categories":351,"tags":357},{"name":336,"creationTimestamp":337,"annotations":338},"md-853683010f9e","2026-09-21T14:03:00.967474Z",{"haloweb\u002Fseries":143},{"title":340,"slug":341,"cover":342,"excerpt":343,"publishTime":344,"categories":345,"tags":346,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十八）：生产部署——从 compose 到\"像样的生产环境","digital-twin-18-production-deploy","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999365515rtet-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:03:01.098245Z",[309],[140],{"permalink":348,"excerpt":349,"lastModifyTime":350,"phase":317},"\u002Farchives\u002Fdigital-twin-18-production-deploy","数字孪生巡检平台实战（十八）：生产部署——从 compose 到\"像样的生产环境\" 前 17 章的成果都活在\"开发环境\"里：业务服务 mvn spring-boot:run 起在本机 8081，前端 Vite dev server 起在 5173，MySQL\u002FRedis 挂在 docker-comp","2026-09-21T14:03:01.043456Z",[352],{"metadata":353,"spec":355,"status":356,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":354},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[358],{"metadata":359,"spec":360},{"name":140},{"displayName":142,"slug":143},{"metadata":362,"spec":366,"status":374,"categories":378,"tags":384},{"name":363,"creationTimestamp":364,"annotations":365},"md-06ca2597b444","2026-09-21T14:02:42.398224Z",{"haloweb\u002Fseries":143},{"title":367,"slug":368,"cover":369,"excerpt":370,"publishTime":371,"categories":372,"tags":373,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十七）：测试金字塔——从纯单元到 Testcontainers CI","digital-twin-17-testing-ci","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999338990bjaz-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:02:42.439826Z",[309],[140],{"permalink":375,"excerpt":376,"lastModifyTime":377,"phase":317},"\u002Farchives\u002Fdigital-twin-17-testing-ci","数字孪生巡检平台实战（十七）：测试金字塔——从纯单元到 Testcontainers CI 前 16 章一直在写功能代码——状态机、告警引擎、WebSocket、Cesium 三维球。功能写完了，怎么保证它们没坏？ \"我手动测过了\" 是上线前最常见的谎言。手动测试能覆盖 happy path，但覆盖","2026-09-21T14:02:43.694787Z",[379],{"metadata":380,"spec":382,"status":383,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":381},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[385],{"metadata":386,"spec":387},{"name":140},{"displayName":142,"slug":143},{"metadata":389,"spec":393,"status":401,"categories":405,"tags":411},{"name":390,"creationTimestamp":391,"annotations":392},"md-ee41577c4f9e","2026-09-21T14:02:16.990990Z",{"haloweb\u002Fseries":143},{"title":394,"slug":395,"cover":396,"excerpt":397,"publishTime":398,"categories":399,"tags":400,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十六）：实时驱动——航线绘制 + 轨迹回放 + 告警标记","digital-twin-16-route-playback","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999316320qqef-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:02:17.122174Z",[309],[140],{"permalink":402,"excerpt":403,"lastModifyTime":404,"phase":317},"\u002Farchives\u002Fdigital-twin-16-route-playback","数字孪生巡检平台实战（十六）：实时驱动——航线绘制 + 轨迹回放 + 告警标记 上一章把 Cesium Viewer 搭起来了——三维地球、设备 Marker、WebSocket 实时推送都跑通了。但那是个\"看球\"的 demo：设备是静态的圆点点，WebSocket 推过来也只是换个位置，没有\"路线","2026-09-21T14:02:17.082042Z",[406],{"metadata":407,"spec":409,"status":410,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":408},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[412],{"metadata":413,"spec":414},{"name":140},{"displayName":142,"slug":143},{"metadata":416,"spec":420,"status":428,"categories":432,"tags":438},{"name":417,"creationTimestamp":418,"annotations":419},"md-2e4519f840df","2026-09-21T14:01:52.960238Z",{"haloweb\u002Fseries":143},{"title":421,"slug":422,"cover":423,"excerpt":424,"publishTime":425,"categories":426,"tags":427,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十五）：从零到三维球——Cesium + Vite 集成避坑记","digital-twin-15-cesium-frontend","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999285264l4ml-p1.png",{"raw":9,"autoGenerate":306},"2026-09-21T14:01:53.036543Z",[309],[140],{"permalink":429,"excerpt":430,"lastModifyTime":431,"phase":317},"\u002Farchives\u002Fdigital-twin-15-cesium-frontend","数字孪生巡检平台实战（十五）：从零到三维球——Cesium + Vite 集成避坑记 前 14 章后端闭环已经打通——设备注册、ThingsBoard 同步、巡检下发、影子同步、告警工单、WebSocket 实时推送、审计日志、数据看板。但全是后端代码，看不到效果。 本章从零建 frontend\u002F（","2026-09-21T14:01:54.389125Z",[433],{"metadata":434,"spec":436,"status":437,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":435},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[439],{"metadata":440,"spec":441},{"name":140},{"displayName":142,"slug":143},{"metadata":443,"spec":447,"status":455,"categories":459,"tags":465},{"name":444,"creationTimestamp":445,"annotations":446},"md-d91f0d25eca5","2026-09-21T14:01:23.551758Z",{"haloweb\u002Fseries":143},{"title":448,"slug":449,"cover":450,"excerpt":451,"publishTime":452,"categories":453,"tags":454,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十四）：看板数字可信——审计日志 AOP 与空值穿透防护","digital-twin-14-audit-log-dashboard","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999264639vf51-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:01:23.589040Z",[309],[140],{"permalink":456,"excerpt":457,"lastModifyTime":458,"phase":317},"\u002Farchives\u002Fdigital-twin-14-audit-log-dashboard","数字孪生巡检平台实战（十四）：看板数字可信——审计日志 AOP 与空值穿透防护 前 13 章跑通了从\"设备注册 → ThingsBoard 同步 → 巡检下发 → 影子同步 → 告警工单 → WebSocket 实时推送\"的完整业务闭环。但有两个\"运营级\"缺口没补：谁干了什么？（审计日志）和大屏数字","2026-09-21T14:01:23.755654Z",[460],{"metadata":461,"spec":463,"status":464,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":462},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[466],{"metadata":467,"spec":468},{"name":140},{"displayName":142,"slug":143},{"metadata":470,"spec":474,"status":482,"categories":486,"tags":492},{"name":471,"creationTimestamp":472,"annotations":473},"md-770bfb17ae4d","2026-09-21T14:01:03.564405Z",{"haloweb\u002Fseries":143},{"title":475,"slug":476,"cover":477,"excerpt":478,"publishTime":479,"categories":480,"tags":481,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十三）：毫秒级实时通道——WebSocket 协议补全","digital-twin-13-websocket","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999241984apkf-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:01:03.684241Z",[309],[140],{"permalink":483,"excerpt":484,"lastModifyTime":485,"phase":317},"\u002Farchives\u002Fdigital-twin-13-websocket","数字孪生巡检平台实战（十三）：毫秒级实时通道——WebSocket 协议补全 前 12 章从设备注册到告警工单闭环跑通了\"写\"链路——数据落库、状态迁移、告警触发都没问题，但\"读\"链路里实时推送这一环是空的。前端三维场景要展示设备位置，是去数据库轮询？1 秒一次太慢；还是等设备上报完再刷新页面？没有","2026-09-21T14:01:03.639979Z",[487],{"metadata":488,"spec":490,"status":491,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":489},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[493],{"metadata":494,"spec":495},{"name":140},{"displayName":142,"slug":143},{"metadata":497,"spec":501,"status":509,"categories":513,"tags":519},{"name":498,"creationTimestamp":499,"annotations":500},"md-c15def5256bd","2026-09-21T14:00:41.226555Z",{"haloweb\u002Fseries":143},{"title":502,"slug":503,"cover":504,"excerpt":505,"publishTime":506,"categories":507,"tags":508,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十二）：拔掉设备那一根——告警规则引擎与工单闭环","digital-twin-12-alert-rule-engine","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999213123iw9d-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:00:41.359653Z",[309],[140],{"permalink":510,"excerpt":511,"lastModifyTime":512,"phase":317},"\u002Farchives\u002Fdigital-twin-12-alert-rule-engine","数字孪生巡检平台实战（十二）：拔掉设备那一根——告警规则引擎与工单闭环 上一章把巡检任务的状态机显式化了，但整个项目的\"大脑\"还没搭好——告警规则引擎和工单闭环。拔掉模拟设备的网线，等 1 分钟，工单自动生成，这是全项目里\"看见效果\"最直观的一个闭环。 问题是，\"自动生成\"的链路在存量代码里是断裂的","2026-09-21T14:00:41.313456Z",[514],{"metadata":515,"spec":517,"status":518,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":516},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[520],{"metadata":521,"spec":522},{"name":140},{"displayName":142,"slug":143},{"metadata":524,"spec":528,"status":536,"categories":540,"tags":546},{"name":525,"creationTimestamp":526,"annotations":527},"md-020c29e82597","2026-09-21T14:00:10.356138Z",{"haloweb\u002Fseries":143},{"title":529,"slug":530,"cover":531,"excerpt":532,"publishTime":533,"categories":534,"tags":535,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十一）：长任务的骨架——巡检任务与设备状态机","digital-twin-11-state-machine","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999190716w80u-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T14:00:10.463087Z",[309],[140],{"permalink":537,"excerpt":538,"lastModifyTime":539,"phase":317},"\u002Farchives\u002Fdigital-twin-11-state-machine","数字孪生巡检平台实战（十一）：长任务的骨架——巡检任务与设备状态机 前两章分别解决了\"设备注册 → ThingsBoard 同步\"和\"离线设备指令暂存 → 影子同步\"。但有一个更深层的问题没碰：状态到底由谁管？ 项目里至少有两类实体带 status 字段——Device.status（online ","2026-09-21T14:00:11.505665Z",[541],{"metadata":542,"spec":544,"status":545,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":543},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[547],{"metadata":548,"spec":549},{"name":140},{"displayName":142,"slug":143},{"metadata":551,"spec":555,"status":563,"categories":567,"tags":573},{"name":552,"creationTimestamp":553,"annotations":554},"md-ec629c1d6e06","2026-09-21T13:59:48.468696Z",{"haloweb\u002Fseries":143},{"title":556,"slug":557,"cover":558,"excerpt":559,"publishTime":560,"categories":561,"tags":562,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（十）：离线设备的归宿——设备影子","digital-twin-10-shadow","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789999172044uwwq-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-21T13:59:48.669793Z",[309],[140],{"permalink":564,"excerpt":565,"lastModifyTime":566,"phase":317},"\u002Farchives\u002Fdigital-twin-10-shadow","数字孪生巡检平台实战（十）：离线设备的归宿——设备影子 上一章结尾埋了个悬而未决的问题：\"给 3 号仓库的温控设备设成 26 度\"——但这台设备此刻偏偏离线了，指令发给谁？第 09 章打通了\"设备注册 ↔ ThingsBoard\"的链路，但链路通 ≠ 链路永远能用，现场环境复杂到你想不到：厂区地下车","2026-09-21T13:59:48.587838Z",[568],{"metadata":569,"spec":571,"status":572,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":570},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[574],{"metadata":575,"spec":576},{"name":140},{"displayName":142,"slug":143},{"metadata":578,"spec":582,"status":590,"categories":594,"tags":600},{"name":579,"creationTimestamp":580,"annotations":581},"md-9934564e909c","2026-09-20T05:57:42.239479Z",{"haloweb\u002Fseries":143},{"title":583,"slug":584,"cover":585,"excerpt":586,"publishTime":587,"categories":588,"tags":589,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（九）：打通设备联动——REST 客户端加固与单一事实源","digital-twin-09-tbclient","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t17898838336016zbi-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-20T05:57:42.408258Z",[309],[140],{"permalink":591,"excerpt":592,"lastModifyTime":593,"phase":317},"\u002Farchives\u002Fdigital-twin-09-tbclient","数字孪生巡检平台实战（九）：打通设备联动——REST 客户端加固与单一事实源 上一章结尾卖了个关子：业务库里的设备目前只是\"数字分身\"——在 ThingsBoard 网页上建设备，业务库并不知情；反过来在平台建设备，TB 侧也没有感知。更扎眼的是 ThingsBoardClient.java 里硬编","2026-09-20T05:57:42.336797Z",[595],{"metadata":596,"spec":598,"status":599,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":597},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[601],{"metadata":602,"spec":603},{"name":140},{"displayName":142,"slug":143},{"metadata":605,"spec":609,"status":617,"categories":621,"tags":627},{"name":606,"creationTimestamp":607,"annotations":608},"md-f3786c05ea39","2026-09-20T05:24:41.087650Z",{"haloweb\u002Fseries":143},{"title":610,"slug":611,"cover":612,"excerpt":613,"publishTime":614,"categories":615,"tags":616,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（八）：登录与三角色权限——JWT 与多租户的完整闭环","digital-twin-08-auth","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789881859046v59a-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-20T05:24:41.205697Z",[309],[140],{"permalink":618,"excerpt":619,"lastModifyTime":620,"phase":317},"\u002Farchives\u002Fdigital-twin-08-auth","数字孪生巡检平台实战（八）：登录与三角色权限——JWT 与多租户的完整闭环 前七章我们把\"物\"的那条链路跑通了：MQTT 传感器、Modbus PLC、MAVLink 无人机、rosbridge 机器狗，数据穿过网关落进 ThingsBoard。但从这一章开始进入连载重心——自研业务层（Spring","2026-09-20T05:24:42.276388Z",[622],{"metadata":623,"spec":625,"status":626,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":624},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[628],{"metadata":629,"spec":630},{"name":140},{"displayName":142,"slug":143},{"metadata":632,"spec":636,"status":644,"categories":648,"tags":654},{"name":633,"creationTimestamp":634,"annotations":635},"md-e9e53314a36a","2026-09-20T04:50:51.401485Z",{"haloweb\u002Fseries":143},{"title":637,"slug":638,"cover":639,"excerpt":640,"publishTime":641,"categories":642,"tags":643,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（七）：机器狗上岗——rosbridge 接入","digital-twin-07-ros","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789879832497yerc-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-20T04:50:51.493374Z",[309],[140],{"permalink":645,"excerpt":646,"lastModifyTime":647,"phase":317},"\u002Farchives\u002Fdigital-twin-07-ros","数字孪生巡检平台实战（七）：机器狗上岗——rosbridge 接入 上一章的无人机讲的是\"二进制的世界\"：MAVLink 一帧 21 字节，每一 bit 都有精确语义。这一章的机器狗正好相反——ROS 是一个\"文本的世界\"，消息是 JSON，传输靠 WebSocket，连协议包名都带 self-ex","2026-09-20T04:50:52.556202Z",[649],{"metadata":650,"spec":652,"status":653,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":651},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[655],{"metadata":656,"spec":657},{"name":140},{"displayName":142,"slug":143},{"metadata":659,"spec":663,"status":671,"categories":675,"tags":681},{"name":660,"creationTimestamp":661,"annotations":662},"md-9930f0a46bea","2026-09-20T03:35:08.936577Z",{"haloweb\u002Fseries":143},{"title":664,"slug":665,"cover":666,"excerpt":667,"publishTime":668,"categories":669,"tags":670,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（六）：无人机上天——MAVLink 接入","digital-twin-06-mavlink","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789875285986kuev-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-20T03:35:08.998102Z",[309],[140],{"permalink":672,"excerpt":673,"lastModifyTime":674,"phase":317},"\u002Farchives\u002Fdigital-twin-06-mavlink","数字孪生巡检平台实战（六）：无人机上天——MAVLink 接入 上一章我们把网关的连接器机制拆到了源码层，顺手在自己的 MAVLink 连接器里抓出一颗雷（send_to_storage 少传参数）。本章兑现全部承诺：修雷、补断线重连状态机、打开从平台直达飞控的下行链路——最后让一架\"无人机\"在平台","2026-09-20T03:35:10.449710Z",[676],{"metadata":677,"spec":679,"status":680,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":678},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[682],{"metadata":683,"spec":684},{"name":140},{"displayName":142,"slug":143},{"metadata":686,"spec":690,"status":698,"categories":702,"tags":708},{"name":687,"creationTimestamp":688,"annotations":689},"md-0f21cd59f584","2026-09-20T00:12:54.322916Z",{"haloweb\u002Fseries":143},{"title":691,"slug":692,"cover":693,"excerpt":694,"publishTime":695,"categories":696,"tags":697,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（五）：连接器机制剖析——二开前置课","digital-twin-05-connectors","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789863156639vt0m-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-20T00:12:54.485661Z",[309],[140],{"permalink":699,"excerpt":700,"lastModifyTime":701,"phase":317},"\u002Farchives\u002Fdigital-twin-05-connectors","数字孪生巡检平台实战（五）：连接器机制剖析——二开前置课 上一章我们用两份 JSON 把一台 PLC 接进了平台，全程零代码。但如果你盯着那份 modbus.json 多看两秒，一个问题会自动浮出来：我往 JSON 里写的 functionCode: 3、divider: 10，是谁在逐字阅读它、把","2026-09-20T00:12:54.438949Z",[703],{"metadata":704,"spec":706,"status":707,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":705},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[709],{"metadata":710,"spec":711},{"name":140},{"displayName":142,"slug":143},{"metadata":713,"spec":717,"status":725,"categories":729,"tags":735},{"name":714,"creationTimestamp":715,"annotations":716},"md-10c756ef3aec","2026-09-19T18:07:26.700088Z",{"haloweb\u002Fseries":143},{"title":718,"slug":719,"cover":720,"excerpt":721,"publishTime":722,"categories":723,"tags":724,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（四）：网关登场——把一台 PLC 接进平台","digital-twin-04-gateway","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t17898412316930lr9-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-19T18:07:26.793706Z",[309],[140],{"permalink":726,"excerpt":727,"lastModifyTime":728,"phase":317},"\u002Farchives\u002Fdigital-twin-04-gateway","数字孪生巡检平台实战（四）：网关登场——把一台 PLC 接进平台 上一章我们拆开了 ThingsBoard 的引擎盖，看清了一条遥测在云端的完整旅程。但车间里的大部分设备——PLC、变频器、电表、老式传感器——根本不会说 MQTT。它们说的是 Modbus：一个 1979 年诞生的协议，比 MQTT","2026-09-19T18:07:27.860300Z",[730],{"metadata":731,"spec":733,"status":734,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":732},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[736],{"metadata":737,"spec":738},{"name":140},{"displayName":142,"slug":143},{"metadata":740,"spec":744,"status":752,"categories":756,"tags":762},{"name":741,"creationTimestamp":742,"annotations":743},"md-4529d8a38468","2026-09-19T18:07:06.560263Z",{"haloweb\u002Fseries":143},{"title":745,"slug":746,"cover":747,"excerpt":748,"publishTime":749,"categories":750,"tags":751,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（三）：拆开 ThingsBoard——一条遥测的源码之旅","digital-twin-03-internals","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789841210017wdnt-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-19T18:07:06.677411Z",[309],[140],{"permalink":753,"excerpt":754,"lastModifyTime":755,"phase":317},"\u002Farchives\u002Fdigital-twin-03-internals","数字孪生巡检平台实战（三）：拆开 ThingsBoard——一条遥测的源码之旅 上一章我们把\"车\"开上了高速——一条模拟器上报的温湿度遥测，穿过 MQTT 进了平台，面板曲线动了起来。但那只是把车开走，这一章我们把引擎盖拆开。 本章没有一行新代码，只做一件事：跟着上一章那条 {\"temperatur","2026-09-19T18:07:07.749749Z",[757],{"metadata":758,"spec":760,"status":761,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":759},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[763],{"metadata":764,"spec":765},{"name":140},{"displayName":142,"slug":143},{"metadata":767,"spec":771,"status":779,"categories":783,"tags":789},{"name":768,"creationTimestamp":769,"annotations":770},"md-e500d52f367c","2026-09-19T12:41:49.525687Z",{"haloweb\u002Fseries":143},{"title":772,"slug":773,"cover":774,"excerpt":775,"publishTime":776,"categories":777,"tags":778,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（二）：一条 MQTT 遥测的诞生","digital-twin-02-telemetry","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789821680511lcwa-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-19T12:41:49.695087Z",[309],[140],{"permalink":780,"excerpt":781,"lastModifyTime":782,"phase":317},"\u002Farchives\u002Fdigital-twin-02-telemetry","数字孪生巡检平台实战（二）：一条 MQTT 遥测的诞生 上一章我们说好了：这条数据链路的第一步，是让设备数据进入平台。本章交付三样东西——一个 docker-compose.yml、一个设备开通脚本、一个 30 行的 MQTT 模拟器。跑完本章，你在浏览器面板上能看到自己的曲线在动。 一、先解决镜像","2026-09-19T12:41:50.763253Z",[784],{"metadata":785,"spec":787,"status":788,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":786},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[790],{"metadata":791,"spec":792},{"name":140},{"displayName":142,"slug":143},{"metadata":794,"spec":798,"status":806,"categories":810,"tags":816},{"name":795,"creationTimestamp":796,"annotations":797},"md-88b408d4e167","2026-09-19T12:41:13.656629Z",{"haloweb\u002Fseries":143},{"title":799,"slug":800,"cover":801,"excerpt":802,"publishTime":803,"categories":804,"tags":805,"priority":42,"pinned":311,"deleted":311,"visible":312,"allowComment":306},"数字孪生巡检平台实战（一）：为什么是数字孪生巡检？","digital-twin-01-why","https:\u002F\u002Fcdn.mashangan.com\u002Fupload\u002Fstudio-t1789821654744s80r-p1.jpg",{"raw":9,"autoGenerate":306},"2026-09-19T12:41:13.716554Z",[309],[140],{"permalink":807,"excerpt":808,"lastModifyTime":809,"phase":317},"\u002Farchives\u002Fdigital-twin-01-why","数字孪生巡检平台实战（一）：为什么是数字孪生巡检？ 一、从一个尴尬的面试现场说起 先问一个问题：你简历上的项目，面试官几个月内见过多少次？ 商城、秒杀、短链接、外卖——这几个项目的教程铺天盖地，简历筛选官早已免疫。不是这些项目不好，而是同质化本身让项目失去了信息量：面试官看到\"秒杀系统\"四个字，脑子","2026-09-19T12:41:15.341974Z",[811],{"metadata":812,"spec":814,"status":815,"postCount":329},{"name":309,"creationTimestamp":321,"annotations":813},{"tutorial.halo.run\u002Fstatus":323},{"displayName":74,"slug":309,"cover":325,"description":326,"priority":190,"hideFromList":306,"preventParentPostCascadeQuery":311},{"permalink":328,"postCount":329,"visiblePostCount":329},[817],{"metadata":818,"spec":819},{"name":140},{"displayName":142,"slug":143}]