{"id":21803121,"url":"https://github.com/litongjava/go-emqx-to-tdengine","last_synced_at":"2026-05-05T00:33:06.175Z","repository":{"id":216010415,"uuid":"740228962","full_name":"litongjava/go-emqx-to-tdengine","owner":"litongjava","description":"go-emqx-to-tdengine","archived":false,"fork":false,"pushed_at":"2024-01-07T23:30:01.000Z","size":16,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-21T07:16:13.822Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/litongjava.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2024-01-07T22:12:23.000Z","updated_at":"2024-05-05T13:21:17.000Z","dependencies_parsed_at":"2024-01-07T23:50:21.748Z","dependency_job_id":null,"html_url":"https://github.com/litongjava/go-emqx-to-tdengine","commit_stats":null,"previous_names":["litongjava/go-emqx-to-tdengine"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/litongjava/go-emqx-to-tdengine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fgo-emqx-to-tdengine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fgo-emqx-to-tdengine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fgo-emqx-to-tdengine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fgo-emqx-to-tdengine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/litongjava","download_url":"https://codeload.github.com/litongjava/go-emqx-to-tdengine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/litongjava%2Fgo-emqx-to-tdengine/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261771193,"owners_count":23207223,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-27T11:38:35.932Z","updated_at":"2026-05-05T00:33:01.151Z","avatar_url":"https://github.com/litongjava.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# go-emqx-to-tdengine\n\n从emqx订阅消息并插入到td engine\n\n## 主要功能\n- 从emqx订阅消息并插入到td engine\n- eqmx 自动重连\n- 支持任意json格式\n- td engine 自动重连\n- 插入语句支持sql模块\n\n## 注意\n如果传输的报文是二进制格式,暂不支持,需要自行修改源码进行解码\n\n\n## 如何使用\nconfig.toml\n```shell\nemqxBroker = \"192.168.3.9\"\nemqxPort = 1883\nemqxUsername = \"emqx\"\nemqxPassword = \"public\"\nemqxTopic = \"sensor/data\"\ntdDriverName =\"taosSql\"\ntdDataSourceName= \"root:taosdata@tcp(192.168.3.9:6030)/test\"\ncreateSql= \"create.sql\"\ninsertSql= \"insert.sql\"\n```\n\ncreate.sql\n```shell\nCREATE TABLE IF NOT EXISTS sensor_data\n(\n    ts          timestamp,\n    temperature float,\n    humidity    float,\n    volume      float,\n    PM10        float,\n    pm25        float,\n    SO2         float,\n    NO2         float,\n    CO          float,\n    sensor_id   NCHAR(255),\n    area        TINYINT,\n    coll_time   timestamp\n);\n```\ninsert.sql\n```shell\nINSERT INTO test.sensor_data\nVALUES (now,\n        ${payload.temperature},\n        ${payload.humidity},\n        ${payload.volume},\n        ${payload.PM10},\n        ${payload.pm25},\n        ${payload.SO2},\n        ${payload.NO2},\n        ${payload.CO},\n        '${payload.id}',\n        ${payload.area},\n        ${payload.ts});\n```\n启动程序测试\n```shell\ngo-emqx-to-tdengine\n```\n\n## 使用mockjs发送模拟消息\n```shell script\nyarn add mqtt mockjs\nnode mock.js\n```\n\n```javascript\n// mock.js\nconst mqtt = require('mqtt');\nconst Mock = require('mockjs');\n\nconst EMQX_SERVER = 'mqtt://192.168.3.9:1883';\nconst topic = 'sensor/data';\nconst CLIENT_NUM = 100;\nconst STEP = 5000; // 模拟采集时间间隔 ms\nconst AWAIT = 5000; // 每次发送完后休眠时间，防止消息速率过快 ms\nconst CLIENT_POOL = [];\n\nstartMock();\n\n\nfunction sleep(timer = 100) {\n  return new Promise(resolve =\u003e {\n    setTimeout(resolve, timer)\n  })\n}\n\nasync function startMock() {\n  const now = Date.now();\n  for (let i = 0; i \u003c CLIENT_NUM; i++) {\n    const client = await createClient(`mock_client_${i}`);\n    CLIENT_POOL.push(client)\n  }\n  // last 24h every 5s\n  const last = 24 * 3600 * 1000;\n  for (let ts = now - last; ts \u003c= now; ts += STEP) {\n    for (const client of CLIENT_POOL) {\n      const mockData = generateMockData();\n      const data = {\n        ...mockData,\n        id: client.options.clientId,\n        ts,\n      };\n\n      client.publish(topic, JSON.stringify(data))\n    }\n    const dateStr = new Date(ts).toLocaleTimeString();\n    console.log(`${dateStr} send success.`);\n    await sleep(AWAIT)\n  }\n  console.log(`Done, use ${(Date.now() - now) / 1000}s`)\n}\n\n/**\n * Init a virtual mqtt client\n * @param {string} clientId ClientID\n */\nfunction createClient(clientId) {\n  return new Promise((resolve, reject) =\u003e {\n    const client = mqtt.connect(EMQX_SERVER, {\n      clientId,\n    });\n    client.on('connect', () =\u003e {\n      console.log(`client ${clientId} connected`);\n      resolve(client)\n    });\n    client.on('reconnect', () =\u003e {\n      console.log('reconnect')\n    });\n    client.on('error', (e) =\u003e {\n      console.error(e);\n      reject(e)\n    })\n  })\n}\n\n/**\n * Generate mock data\n */\nfunction generateMockData() {\n  return {\n    \"temperature\": parseFloat(Mock.Random.float(22, 100).toFixed(2)),\n    \"humidity\": parseFloat(Mock.Random.float(12, 86).toFixed(2)),\n    \"volume\": parseFloat(Mock.Random.float(20, 200).toFixed(2)),\n    \"PM10\": parseFloat(Mock.Random.float(0, 300).toFixed(2)),\n    \"pm25\": parseFloat(Mock.Random.float(0, 300).toFixed(2)),\n    \"SO2\": parseFloat(Mock.Random.float(0, 50).toFixed(2)),\n    \"NO2\": parseFloat(Mock.Random.float(0, 50).toFixed(2)),\n    \"CO\": parseFloat(Mock.Random.float(0, 50).toFixed(2)),\n    \"area\": Mock.Random.integer(0, 20),\n    \"ts\": 1596157444170,\n  }\n}\n```\n\n## docker\n```shell\ndocker build -t litongjava/go-emqx-to-tdengine .\n```\n测试运行\n```shell\ndocker run --rm litongjava/go-emqx-to-tdengine\n```\n\n自定义 config.toml create.sql insert.sql\n```\ndocker run --rm -v /path/to/local/config.toml:/app/config.toml \\\n                -v /path/to/local/create.sql:/app/create.sql \\\n                -v /path/to/local/insert.sql:/app/insert.sql \\\n                litongjava/go-emqx-to-tdengine\n```\n\n```shell\ndocker build -t litongjava/go-emqx-to-tdengine:slim .\n```\n\n```shell\ndocker run --rm litongjava/go-emqx-to-tdengine:slim\n```\n\nslim镜像的/app目录不包含TDengine-client文件,总体积是141MB","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fgo-emqx-to-tdengine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flitongjava%2Fgo-emqx-to-tdengine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitongjava%2Fgo-emqx-to-tdengine/lists"}