78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| // mock.js
 | |
| const mqtt = require('mqtt')
 | |
| const Mock = require('mockjs')
 | |
| const EMQX_SERVER = 'mqtt://localhost:1883'
 | |
| const CLIENT_NUM = 10
 | |
| const STEP = 5000 // Data interval in ms
 | |
| const AWAIT = 5000 // Sleep time after data be written once to avoid data writing too fast
 | |
| const CLIENT_POOL = []
 | |
| startMock()
 | |
| function sleep(timer = 100) {
 | |
|   return new Promise(resolve => {
 | |
|     setTimeout(resolve, timer)
 | |
|   })
 | |
| }
 | |
| async function startMock() {
 | |
|   const now = Date.now()
 | |
|   for (let i = 0; i < CLIENT_NUM; i++) {
 | |
|     const client = await createClient(`mock_client_${i}`)
 | |
|     CLIENT_POOL.push(client)
 | |
|   }
 | |
|   // last 24h every 5s
 | |
|   const last = 24 * 3600 * 1000
 | |
|   for (let ts = now - last; ts <= now; ts += STEP) {
 | |
|     for (const client of CLIENT_POOL) {
 | |
|       const mockData = generateMockData()
 | |
|       const data = {
 | |
|         ...mockData,
 | |
|         id: client.clientId,
 | |
|         area: 0,
 | |
|         ts,
 | |
|       }
 | |
|       client.publish('sensor/data', JSON.stringify(data))
 | |
|     }
 | |
|     const dateStr = new Date(ts).toLocaleTimeString()
 | |
|     console.log(`${dateStr} send success.`)
 | |
|     await sleep(AWAIT)
 | |
|   }
 | |
|   console.log(`Done, use ${(Date.now() - now) / 1000}s`)
 | |
| }
 | |
| /**
 | |
|  * Init a virtual mqtt client
 | |
|  * @param {string} clientId ClientID
 | |
|  */
 | |
| function createClient(clientId) {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     const client = mqtt.connect(EMQX_SERVER, {
 | |
|       clientId,
 | |
|     })
 | |
|     client.on('connect', () => {
 | |
|       console.log(`client ${clientId} connected`)
 | |
|       resolve(client)
 | |
|     })
 | |
|     client.on('reconnect', () => {
 | |
|       console.log('reconnect')
 | |
|     })
 | |
|     client.on('error', (e) => {
 | |
|       console.error(e)
 | |
|       reject(e)
 | |
|     })
 | |
|   })
 | |
| }
 | |
| /**
 | |
| * Generate mock data
 | |
| */
 | |
| function generateMockData() {
 | |
|  return {
 | |
|    "temperature": parseFloat(Mock.Random.float(22, 100).toFixed(2)),
 | |
|    "humidity": parseFloat(Mock.Random.float(12, 86).toFixed(2)),
 | |
|    "volume": parseFloat(Mock.Random.float(20, 200).toFixed(2)),
 | |
|    "PM10": parseFloat(Mock.Random.float(0, 300).toFixed(2)),
 | |
|    "pm25": parseFloat(Mock.Random.float(0, 300).toFixed(2)),
 | |
|    "SO2": parseFloat(Mock.Random.float(0, 50).toFixed(2)),
 | |
|    "NO2": parseFloat(Mock.Random.float(0, 50).toFixed(2)),
 | |
|    "CO": parseFloat(Mock.Random.float(0, 50).toFixed(2)),
 | |
|    "area": Mock.Random.integer(0, 20),
 | |
|    "ts": 1596157444170,
 | |
|  }
 | |
| } |