怎么做样网站自己开发网站需要什么技术
2026/2/15 18:07:03 网站建设 项目流程
怎么做样网站,自己开发网站需要什么技术,室内装修设计公司简介,做百度还是阿里网站好通过mqtt使用webhook转发消息实现远程查看单片机日志 背景 我做的一个开机棒放在办公室#xff0c;我在家里想远程唤醒开机#xff0c;结果没开唤醒成功#xff0c;mqtt也没回复唤醒结果#xff0c;就想远程看一下开机棒的状态#xff0c;开机棒又是用esp32做的#xff…通过mqtt使用webhook转发消息实现远程查看单片机日志背景我做的一个开机棒放在办公室我在家里想远程唤醒开机结果没开唤醒成功mqtt也没回复唤醒结果就想远程看一下开机棒的状态开机棒又是用esp32做的当然没法像ssh这种远程就想可以把日志或者自身的状态发送给服务器在服务器上查看信息。最后发现是同事把我的开机棒连接的插座断电了o(╥﹏╥)o像这种后续还要加一个掉电检测需要资源只需一个公网服务器即可当然你如果你都是在局域网下也可以不过这样也就没有远程查看的需求了。公网服务器搭建mqtt服务器然后配置webhook转发最后再写一个脚本监听webhook的转发达到存取日志的目的。mqtt服务器搭建搭建mqtt服务器没什么好说的记得搭建好之后写一个开机自启的服务,这样就能使用systemctl去控制了/lib/systemd/system/emqx.service[Unit]DescriptionemqxautostartAfternetwork.target[Service]TypeforkingEnvironmentHOME/root/app/emqx# 换成自己的emqx路径ExecStart/root/app/emqx/bin/emqx start# 换成自己的emqx路径#ExecReload/root/app/emqx/bin/emqxt restart # 换成自己的emqx路径ExecStop/root/app/emqx/bin/emqx stop# 换成自己的emqx路径PrivateTmptrue[Install]WantedBymulti-user.target配置webhookhttp://服务器地址:端口号/url规则监听服务验证了js和py两种版本的实现效果完全一样看自己的喜好py版本importosimportjsonfromdatetimeimportdatetimefromflaskimportFlask,requestimportloggingfromlogging.handlersimportRotatingFileHandler appFlask(__name__)defensure_log_directory(date_str):确保日志目录存在script_diros.path.dirname(os.path.abspath(__file__))log_diros.path.join(script_dir,logPy,date_str[:6])# 使用年月作为子目录名ifnotos.path.exists(log_dir):os.makedirs(log_dir,exist_okTrue)returnlog_dirapp.route(/py_webhook,methods[POST])defpy_webhook():# 获取请求体数据ifrequest.is_json:received_datarequest.get_json()else:received_datajson.loads(request.data.decode(utf-8))# 提取时间戳和有效载荷timestamp_msreceived_data.get(timestamp)payloadreceived_data.get(payload)iftimestamp_ms:# 将毫秒时间戳转换为datetime对象timestampdatetime.fromtimestamp(timestamp_ms/1000.0)else:# 如果没有提供时间戳使用当前时间timestampdatetime.now()log_timetimestamp.strftime(%Y-%m-%d %H:%M:%S)# 使用年月格式作为目录名如 202601month_strtimestamp.strftime(%Y%m)# 使用年月日格式作为文件名如 20260121.logdate_strtimestamp.strftime(%Y%m%d)# 确保日志目录存在log_dirensure_log_directory(month_str)log_file_pathos.path.join(log_dir,f{date_str}.log)# 创建日志条目ifisinstance(payload,str):log_entryf[{log_time}]{payload}\nelse:log_entryf[{log_time}]{json.dumps(payload)}\n# 写入日志文件try:withopen(log_file_path,a,encodingutf-8)aslog_file:log_file.write(log_entry)print(f日志已写入:{log_file_path},flushTrue)exceptExceptionase:print(f写入日志文件失败:{e},flushTrue)print(fReceived webhook payload:{payload},flushTrue)print(fReceived webhook timeStamp:{log_time},flushTrue)# 返回响应response_data{status:success,message:Webhook received successfully}returnjson.dumps(response_data),200,{Content-Type:application/json}if__name____main__:# 确保主日志目录存在script_diros.path.dirname(os.path.abspath(__file__))main_log_diros.path.join(script_dir,logPy)ifnotos.path.exists(main_log_dir):os.makedirs(main_log_dir)app.run(host0.0.0.0,port3001,debugFalse)# 使用localhost不行js版本constexpressrequire(express);constmysqlrequire(mysql);constfsrequire(fs);constpathrequire(path);constbodyParserrequire(body-parser);constappexpress();// 使用 raw body parser 来捕获原始请求体 既能处理json又能文本app.use(express.raw({type:()true,limit:10mb}));// 中间件将原始 body 转换为适当的格式app.use((req,res,next){// 尝试解析为 JSONtry{req.bodyJSON.parse(req.body.toString());}catch(e){// 如果不是 JSON保持原始字符串console.log(e : e req.body)req.bodyreq.body.toString();}next();});// 创建日志目录的函数functionensureLogDirectory(dateStr){constlogDirpath.join(__dirname,logJs,dateStr);if(!fs.existsSync(logDir)){fs.mkdirSync(logDir,{recursive:true});}returnlogDir;}// 处理Webhook请求的路由处理程序app.post(/js_webhook,(req,res){constreceivedDatareq.body;// 获取Webhook请求正文中的数据// 提取时间戳和有效载荷consttimestampMsreceivedData.timestamp;constpayloadreceivedData.payload;lettimeStamp0;if(timestampMs){// 使用接收到的时间戳timeStampnewDate(timestampMs);}else{timeStampnewDate();console.log(timestamp is null! body : receivedData);}// 将时间戳转换为日志格式 (yyyy-MM-dd HH:mm:ss)constlogTimetimeStamp.getFullYear()-String(timeStamp.getMonth()1).padStart(2,0)-String(timeStamp.getDate()).padStart(2,0) String(timeStamp.getHours()).padStart(2,0):String(timeStamp.getMinutes()).padStart(2,0):String(timeStamp.getSeconds()).padStart(2,0);// 使用年月格式作为目录名如 202601constmonthStrtimeStamp.getFullYear()String(timeStamp.getMonth()1).padStart(2,0);// 使用年月日格式作为文件名如 20260121.logconstdateStrtimeStamp.getFullYear()String(timeStamp.getMonth()1).padStart(2,0)String(timeStamp.getDate()).padStart(2,0);// 确保日志目录存在constlogDirensureLogDirectory(monthStr);constlogFilePathpath.join(logDir,${dateStr}.log);// 文件名格式为 YYYYMMDD.log// 创建日志条目constlogEntry[${logTime}]${JSON.stringify(payload)}\n;// 写入日志文件fs.appendFile(logFilePath,logEntry,(err){if(err){console.error(写入日志文件失败:,err);}else{console.log(日志已写入:${logFilePath});}});console.log(Received webhook payload:,payload);console.log(Received webhook timeStamp:logTime timestampMs);res.status(200).json({status:success,message:Webhook received successfully});});// 启动服务器监听指定端口例如3000app.listen(3000,(){console.log(Server started on port 3000);});开机自启可以跟emqx那种服务也行也可以配置rc.local脚本也行看自己喜好我这里提供了rc.local方式rc.local存放到/etc/rc.local位置# 都换成自己的路径# 我用的是nvm的node系统自带的版本太低nohup/root/.nvm/versions/node/v24.13.0/bin/node /root/sh/emqx_webhook/main.js/root/sh/emqx_webhook/outputJs.log21nohuppython3 /root/sh/emqx_webhook/main.py/root/sh/emqx_webhook/outputPy.log21效果可以看脚本运行的效果outputJs.log、outputPy.logmqtt转发的日志按照日期文件夹存放到相应的文件夹注意都是血的教训配置webhook时注意不要写成http://服务器地址/url:端口号接收wenhook的脚本不运行你在emqx的后台看webhook的状态一定是未连接的py脚本存放的路径一定要是绝对路径

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询