jWrite global control switched off, updated web ui

This commit is contained in:
Bogdan Pilyugin 2023-08-15 15:42:33 +02:00
parent fd21f72fc9
commit a933c08229
27 changed files with 839 additions and 834 deletions

1542
.project

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
import{_ as t,V as o,W as s,a5 as a,af as e,Z as r,a4 as n}from"./index.5a55b413.js";const c=o({name:"ErrorNotFound"}),l={class:"fullscreen bg-blue text-white text-center q-pa-md flex flex-center"},d=e("div",{style:{"font-size":"30vh"}}," 404 ",-1),i=e("div",{class:"text-h2",style:{opacity:".4"}}," Oops. Nothing here... four-ow-four ",-1);function _(f,p,u,h,x,m){return s(),a("div",l,[e("div",null,[d,i,r(n,{class:"q-mt-xl",color:"white","text-color":"blue",unelevated:"",to:"/",label:"Go Home","no-caps":""})])])}var N=t(c,[["render",_]]);export{N as default};
import{_ as t,V as o,W as s,a5 as a,af as e,Z as r,a4 as n}from"./index.e9fa4ce2.js";const c=o({name:"ErrorNotFound"}),l={class:"fullscreen bg-blue text-white text-center q-pa-md flex flex-center"},d=e("div",{style:{"font-size":"30vh"}}," 404 ",-1),i=e("div",{class:"text-h2",style:{opacity:".4"}}," Oops. Nothing here... four-ow-four ",-1);function _(f,p,u,h,x,m){return s(),a("div",l,[e("div",null,[d,i,r(n,{class:"q-mt-xl",color:"white","text-color":"blue",unelevated:"",to:"/",label:"Go Home","no-caps":""})])])}var N=t(c,[["render",_]]);export{N as default};

View File

@ -1 +1 @@
import{S as f,o as v,T as C,a as d,W as _,X as h,Y as s,ad as H,Z as o,ae as m,af as t,a2 as i,_ as g,V as S,a3 as q,a5 as x}from"./index.5a55b413.js";import{S as l}from"./network.24b6c36f.js";import{s as $}from"./helpers.b8861d56.js";import"./axios.be6b1d04.js";const k=t("div",{class:"text-h6"},"Home",-1),y={class:"q-pa-md"},B={class:"q-gutter-md q-pa-none q-pb-none"},I=Object.assign({name:"HomeCard"},{__name:"HomeCard",setup(p){const e=f({time:0,uptime:0});l(e,2,0,"mykey",!1);let a;v(()=>{a=setInterval(()=>{l(e,2,0,"mykey",!1)},1e3)}),C(()=>clearInterval(a));const n=d({get(){return new Date(e.time*1e3).toISOString()}}),r=d({get(){return $(e.uptime)}});return(c,D)=>(_(),h(H,{flat:"",bordered:"",class:"card"},{default:s(()=>[o(m,null,{default:s(()=>[k]),_:1}),o(m,{class:"q-pt-none"},{default:s(()=>[t("div",y,[t("div",B,[t("div",null,i(n.value),1),t("div",null,"Uptime: "+i(r.value),1)])])]),_:1})]),_:1}))}}),b=S({name:"HomePage",components:{HomeCard:I}}),V={class:"cardholder"};function w(p,u,e,a,n,r){const c=q("HomeCard");return _(),x("div",V,[o(c)])}var U=g(b,[["render",w]]);export{U as default};
import{S as f,o as v,T as C,a as d,W as _,X as h,Y as s,ad as H,Z as o,ae as m,af as t,a2 as i,_ as g,V as S,a3 as q,a5 as x}from"./index.e9fa4ce2.js";import{S as l}from"./network.b806b67f.js";import{s as $}from"./helpers.86b52205.js";import"./axios.aa321329.js";const k=t("div",{class:"text-h6"},"Home",-1),y={class:"q-pa-md"},B={class:"q-gutter-md q-pa-none q-pb-none"},I=Object.assign({name:"HomeCard"},{__name:"HomeCard",setup(p){const e=f({time:0,uptime:0});l(e,2,0,"mykey",!1);let a;v(()=>{a=setInterval(()=>{l(e,2,0,"mykey",!1)},1e3)}),C(()=>clearInterval(a));const n=d({get(){return new Date(e.time*1e3).toISOString()}}),r=d({get(){return $(e.uptime)}});return(c,D)=>(_(),h(H,{flat:"",bordered:"",class:"card"},{default:s(()=>[o(m,null,{default:s(()=>[k]),_:1}),o(m,{class:"q-pt-none"},{default:s(()=>[t("div",y,[t("div",B,[t("div",null,i(n.value),1),t("div",null,"Uptime: "+i(r.value),1)])])]),_:1})]),_:1}))}}),b=S({name:"HomePage",components:{HomeCard:I}}),V={class:"cardholder"};function w(p,u,e,a,n,r){const c=q("HomeCard");return _(),x("div",V,[o(c)])}var U=g(b,[["render",w]]);export{U as default};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
import{a9 as L,c as v,a as i,h as c,d as q,u as S,aa as I,q as R,ab as E,r as b,g as Q,ac as A,D as K,p as D}from"./index.5a55b413.js";function $(){if(window.getSelection!==void 0){const e=window.getSelection();e.empty!==void 0?e.empty():e.removeAllRanges!==void 0&&(e.removeAllRanges(),L.is.mobile!==!0&&e.addRange(document.createRange()))}else document.selection!==void 0&&document.selection.empty()}function j(e,a,n){return n<=a?a:Math.min(n,Math.max(a,e))}function M(e,a,n){if(n<=a)return a;const u=n-a+1;let l=a+(e-a)%u;return l<a&&(l=u+l),l===0?0:l}var N=v({name:"QItemSection",props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(e,{slots:a}){const n=i(()=>`q-item__section column q-item__section--${e.avatar===!0||e.side===!0||e.thumbnail===!0?"side":"main"}`+(e.top===!0?" q-item__section--top justify-start":" justify-center")+(e.avatar===!0?" q-item__section--avatar":"")+(e.thumbnail===!0?" q-item__section--thumbnail":"")+(e.noWrap===!0?" q-item__section--nowrap":""));return()=>c("div",{class:n.value},q(a.default))}}),T=v({name:"QItemLabel",props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(e,{slots:a}){const n=i(()=>parseInt(e.lines,10)),u=i(()=>"q-item__label"+(e.overline===!0?" q-item__label--overline text-overline":"")+(e.caption===!0?" q-item__label--caption text-caption":"")+(e.header===!0?" q-item__label--header":"")+(n.value===1?" ellipsis":"")),l=i(()=>e.lines!==void 0&&n.value>1?{overflow:"hidden",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":n.value}:null);return()=>c("div",{style:l.value,class:u.value},q(a.default))}}),z=v({name:"QItem",props:{...S,...I,tag:{type:String,default:"div"},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:["click","keyup"],setup(e,{slots:a,emit:n}){const{proxy:{$q:u}}=Q(),l=R(e,u),{hasLink:d,linkAttrs:k,linkClass:g,linkTag:y,navigateOnClick:h}=E(),s=b(null),r=b(null),m=i(()=>e.clickable===!0||d.value===!0||e.tag==="label"),o=i(()=>e.disable!==!0&&m.value===!0),_=i(()=>"q-item q-item-type row no-wrap"+(e.dense===!0?" q-item--dense":"")+(l.value===!0?" q-item--dark":"")+(d.value===!0&&e.active===null?g.value:e.active===!0?` q-item--active${e.activeClass!==void 0?` ${e.activeClass}`:""}`:"")+(e.disable===!0?" disabled":"")+(o.value===!0?" q-item--clickable q-link cursor-pointer "+(e.manualFocus===!0?"q-manual-focusable":"q-focusable q-hoverable")+(e.focused===!0?" q-manual-focusable--focused":""):"")),w=i(()=>{if(e.insetLevel===void 0)return null;const t=u.lang.rtl===!0?"Right":"Left";return{["padding"+t]:16+e.insetLevel*56+"px"}});function B(t){o.value===!0&&(r.value!==null&&(t.qKeyEvent!==!0&&document.activeElement===s.value?r.value.focus():document.activeElement===r.value&&s.value.focus()),h(t))}function x(t){if(o.value===!0&&A(t,13)===!0){K(t),t.qKeyEvent=!0;const f=new MouseEvent("click",t);f.qKeyEvent=!0,s.value.dispatchEvent(f)}n("keyup",t)}function C(){const t=D(a.default,[]);return o.value===!0&&t.unshift(c("div",{class:"q-focus-helper",tabindex:-1,ref:r})),t}return()=>{const t={ref:s,class:_.value,style:w.value,role:"listitem",onClick:B,onKeyup:x};return o.value===!0?(t.tabindex=e.tabindex||"0",Object.assign(t,k.value)):m.value===!0&&(t["aria-disabled"]="true"),c(y.value,t,C())}}});export{N as Q,T as a,j as b,$ as c,z as d,M as n};
import{a9 as L,c as v,a as i,h as c,d as q,u as S,aa as I,q as R,ab as E,r as b,g as Q,ac as A,D as K,p as D}from"./index.e9fa4ce2.js";function $(){if(window.getSelection!==void 0){const e=window.getSelection();e.empty!==void 0?e.empty():e.removeAllRanges!==void 0&&(e.removeAllRanges(),L.is.mobile!==!0&&e.addRange(document.createRange()))}else document.selection!==void 0&&document.selection.empty()}function j(e,a,n){return n<=a?a:Math.min(n,Math.max(a,e))}function M(e,a,n){if(n<=a)return a;const u=n-a+1;let l=a+(e-a)%u;return l<a&&(l=u+l),l===0?0:l}var N=v({name:"QItemSection",props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(e,{slots:a}){const n=i(()=>`q-item__section column q-item__section--${e.avatar===!0||e.side===!0||e.thumbnail===!0?"side":"main"}`+(e.top===!0?" q-item__section--top justify-start":" justify-center")+(e.avatar===!0?" q-item__section--avatar":"")+(e.thumbnail===!0?" q-item__section--thumbnail":"")+(e.noWrap===!0?" q-item__section--nowrap":""));return()=>c("div",{class:n.value},q(a.default))}}),T=v({name:"QItemLabel",props:{overline:Boolean,caption:Boolean,header:Boolean,lines:[Number,String]},setup(e,{slots:a}){const n=i(()=>parseInt(e.lines,10)),u=i(()=>"q-item__label"+(e.overline===!0?" q-item__label--overline text-overline":"")+(e.caption===!0?" q-item__label--caption text-caption":"")+(e.header===!0?" q-item__label--header":"")+(n.value===1?" ellipsis":"")),l=i(()=>e.lines!==void 0&&n.value>1?{overflow:"hidden",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":n.value}:null);return()=>c("div",{style:l.value,class:u.value},q(a.default))}}),z=v({name:"QItem",props:{...S,...I,tag:{type:String,default:"div"},active:{type:Boolean,default:null},clickable:Boolean,dense:Boolean,insetLevel:Number,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:["click","keyup"],setup(e,{slots:a,emit:n}){const{proxy:{$q:u}}=Q(),l=R(e,u),{hasLink:d,linkAttrs:k,linkClass:g,linkTag:y,navigateOnClick:h}=E(),s=b(null),r=b(null),m=i(()=>e.clickable===!0||d.value===!0||e.tag==="label"),o=i(()=>e.disable!==!0&&m.value===!0),_=i(()=>"q-item q-item-type row no-wrap"+(e.dense===!0?" q-item--dense":"")+(l.value===!0?" q-item--dark":"")+(d.value===!0&&e.active===null?g.value:e.active===!0?` q-item--active${e.activeClass!==void 0?` ${e.activeClass}`:""}`:"")+(e.disable===!0?" disabled":"")+(o.value===!0?" q-item--clickable q-link cursor-pointer "+(e.manualFocus===!0?"q-manual-focusable":"q-focusable q-hoverable")+(e.focused===!0?" q-manual-focusable--focused":""):"")),w=i(()=>{if(e.insetLevel===void 0)return null;const t=u.lang.rtl===!0?"Right":"Left";return{["padding"+t]:16+e.insetLevel*56+"px"}});function B(t){o.value===!0&&(r.value!==null&&(t.qKeyEvent!==!0&&document.activeElement===s.value?r.value.focus():document.activeElement===r.value&&s.value.focus()),h(t))}function x(t){if(o.value===!0&&A(t,13)===!0){K(t),t.qKeyEvent=!0;const f=new MouseEvent("click",t);f.qKeyEvent=!0,s.value.dispatchEvent(f)}n("keyup",t)}function C(){const t=D(a.default,[]);return o.value===!0&&t.unshift(c("div",{class:"q-focus-helper",tabindex:-1,ref:r})),t}return()=>{const t={ref:s,class:_.value,style:w.value,role:"listitem",onClick:B,onKeyup:x};return o.value===!0?(t.tabindex=e.tabindex||"0",Object.assign(t,k.value)):m.value===!0&&(t["aria-disabled"]="true"),c(y.value,t,C())}}});export{N as Q,T as a,j as b,$ as c,z as d,M as n};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
import{ah as l}from"./index.5a55b413.js";function i(e){e=Number(e);var o=Math.floor(e/86400),r=Math.floor(e%86400/3600),t=Math.floor(e%3600/60),a=Math.floor(e%3600%60);return" "+o+"d "+(r<10?"0":"")+r+":"+(t<10?"0":"")+t+":"+(a<10?"0":"")+a}function f(e,o,r){const t=l.create({message:"",progress:!0,persistent:!0,ok:!1});let a=0;const s=setInterval(()=>{a=Math.min(100,a+1e4/o),t.update({message:`${e} ${a}%`}),a===100&&(clearInterval(s),setTimeout(()=>{t.hide(),r()},350))},100)}export{f as S,i as s};
import{ah as l}from"./index.e9fa4ce2.js";function i(e){e=Number(e);var o=Math.floor(e/86400),r=Math.floor(e%86400/3600),t=Math.floor(e%3600/60),a=Math.floor(e%3600%60);return" "+o+"d "+(r<10?"0":"")+r+":"+(t<10?"0":"")+t+":"+(a<10?"0":"")+a}function f(e,o,r){const t=l.create({message:"",progress:!0,persistent:!0,ok:!1});let a=0;const s=setInterval(()=>{a=Math.min(100,a+1e4/o),t.update({message:`${e} ${a}%`}),a===100&&(clearInterval(s),setTimeout(()=>{t.hide(),r()},350))},100)}export{f as S,i as s};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,26 +1,26 @@
assets
assets/ErrorNotFound.beef36b1.js
assets/Home.a12934ef.js
assets/IndexPage2.59d6f1bf.js
assets/InterfacesSettings.17e856a4.js
assets/ErrorNotFound.931a913c.js
assets/Home.01dae3c0.js
assets/IndexPage2.70bc6c4c.js
assets/InterfacesSettings.f5ee0d72.js
assets/KFOkCnqEu92Fr1MmgVxIIzQ.34e9582c.woff
assets/KFOlCnqEu92Fr1MmEU9fBBc-.9ce7f3ac.woff
assets/KFOlCnqEu92Fr1MmSU5fBBc-.bf14c7d7.woff
assets/KFOlCnqEu92Fr1MmWUlfBBc-.e0fd57c0.woff
assets/KFOlCnqEu92Fr1MmYUtfBBc-.f6537e32.woff
assets/KFOmCnqEu92Fr1Mu4mxM.f2abf7fb.woff
assets/MainLayout.0ba2659c.js
assets/MainLayout.257eb545.js
assets/MainLayout.c9e97164.css
assets/QItem.87d9d9e8.js
assets/ServicesPage.0cda0773.js
assets/SystemPage.62338cb0.js
assets/axios.be6b1d04.js
assets/QItem.1a2115bf.js
assets/ServicesPage.fc10b3d5.js
assets/SystemPage.a476f674.js
assets/axios.aa321329.js
assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.fd84f88b.woff
assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.4a4dbc62.woff2
assets/helpers.b8861d56.js
assets/index.5a55b413.js
assets/helpers.86b52205.js
assets/index.6b461d14.css
assets/network.24b6c36f.js
assets/index.e9fa4ce2.js
assets/network.b806b67f.js
favicon.ico
index.html
test.json

View File

@ -1,3 +1,3 @@
<!DOCTYPE html><html><head><title>ESP32 web interface</title><meta charset=utf-8><meta name=description content="Web interface for ESP32 devices"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width"><link rel=icon type=image/ico href="/favicon.ico"> <script type="module" crossorigin src="/assets/index.5a55b413.js"></script>
<!DOCTYPE html><html><head><title>ESP32 web interface</title><meta charset=utf-8><meta name=description content="Web interface for ESP32 devices"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width"><link rel=icon type=image/ico href="/favicon.ico"> <script type="module" crossorigin src="/assets/index.e9fa4ce2.js"></script>
<link rel="stylesheet" href="/assets/index.6b461d14.css">
</head><body><div id=q-app></div></body></html>

@ -1 +1 @@
Subproject commit 3df345a09deb49a3334c049d5dd7163485391bb5
Subproject commit e8150202106520873416794e0bce0f505b8d79d2

View File

@ -109,25 +109,26 @@ void PrepareResponsePayloadType1(data_message_t *MSG)
{
const char *err_br;
const char *err_desc;
jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY);
jwObj_int("msgid", MSG->parsedData.msgID);
struct jWriteControl jwc;
jwOpen(&jwc, MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY);
jwObj_int(&jwc, "msgid", MSG->parsedData.msgID);
char time[RFC3339_TIMESTAMP_LENGTH];
GetRFC3339Time(time);
jwObj_string("time", time);
jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE);
jwObj_int("payloadtype", 1);
jwObj_string(&jwc, "time", time);
jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE);
jwObj_int(&jwc, "payloadtype", 1);
//PAYLOAD BEGIN
jwObj_object("payload");
jwObj_object(&jwc, "payload");
jwObj_string("param1", "value1");
jwObj_string("param2", "value2");
jwObj_string(&jwc, "param1", "value1");
jwObj_string(&jwc, "param2", "value2");
jwEnd();
jwEnd(&jwc);
GetAppErrorDetales((app_error_code) MSG->err_code, &err_br, &err_desc);
jwObj_string("error", (char*) err_br);
jwObj_string("error_descr", (char*) err_desc);
jwEnd();
jwClose();
jwObj_string(&jwc, "error", (char*) err_br);
jwObj_string(&jwc, "error_descr", (char*) err_desc);
jwEnd(&jwc);
jwClose(&jwc);
}
@ -268,19 +269,20 @@ esp_err_t AppServiceDataHandler(data_message_t *MSG)
MSG->err_code = (int) AppDataParser(MSG);
if (MSG->err_code)
{
jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY);
jwObj_int("msgid", MSG->parsedData.msgID);
struct jWriteControl jwc;
jwOpen(&jwc, MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY);
jwObj_int(&jwc, "msgid", MSG->parsedData.msgID);
char time[RFC3339_TIMESTAMP_LENGTH];
GetRFC3339Time(time);
jwObj_string("time", time);
jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE);
jwObj_string(&jwc, "time", time);
jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE);
const char *err_br;
const char *err_desc;
GetAppErrorDetales((app_error_code) MSG->err_code, &err_br, &err_desc);
jwObj_string("error", (char*) err_br);
jwObj_string("error_descr", (char*) err_desc);
jwEnd();
jwClose();
jwObj_string(&jwc, "error", (char*) err_br);
jwObj_string(&jwc, "error_descr", (char*) err_desc);
jwEnd(&jwc);
jwClose(&jwc);
}
return ESP_OK;

View File

@ -33,17 +33,18 @@ static void HTTPPrint_crontmr(char *VarData, void *arg)
char data[MAX_DYNVAR_LENGTH];
cron_timer_t T;
memcpy(&T, &GetAppConf()->Timers[idx], sizeof(cron_timer_t));
jwOpen(data, sizeof(data), JW_OBJECT, JW_COMPACT);
jwObj_int("num", (unsigned int) T.num);
jwObj_int("del", (T.del)?1:0);
jwObj_int("enab", (T.enab)?1:0);
jwObj_int("prev", (T.prev)?1:0);
jwObj_string("name", T.name);
jwObj_int("obj", (unsigned int) T.obj);
jwObj_int("act", (unsigned int) T.act);
jwObj_string("cron", T.cron);
jwEnd();
jwClose();
struct jWriteControl jwc;
jwOpen(&jwc, data, sizeof(data), JW_OBJECT, JW_COMPACT);
jwObj_int(&jwc, "num", (unsigned int) T.num);
jwObj_int(&jwc, "del", (T.del)?1:0);
jwObj_int(&jwc, "enab", (T.enab)?1:0);
jwObj_int(&jwc, "prev", (T.prev)?1:0);
jwObj_string(&jwc, "name", T.name);
jwObj_int(&jwc, "obj", (unsigned int) T.obj);
jwObj_int(&jwc, "act", (unsigned int) T.act);
jwObj_string(&jwc, "cron", T.cron);
jwEnd(&jwc);
jwClose(&jwc);
snprintf(VarData, MAX_DYNVAR_LENGTH, "%s", data);
}
}
@ -58,11 +59,12 @@ static void HTTPPrint_cronobjs(char *VarData, void *arg)
int idx = *((int*)(arg));
if(idx < CRON_OBJECTS_NUMBER)
{
jwOpen(data, sizeof(data), JW_OBJECT, JW_COMPACT);
jwObj_string("name", GetAppConf()->CronObjects[idx].objname);
jwObj_raw("acts", GetCronActAvail(idx));
jwEnd();
jwClose();
struct jWriteControl jwc;
jwOpen(&jwc, data, sizeof(data), JW_OBJECT, JW_COMPACT);
jwObj_string(&jwc, "name", GetAppConf()->CronObjects[idx].objname);
jwObj_raw(&jwc, "acts", GetCronActAvail(idx));
jwEnd(&jwc);
jwClose(&jwc);
snprintf(VarData, MAX_DYNVAR_LENGTH, "%s", data);
}
}

View File

@ -153,22 +153,23 @@ void PublishTestApp(int idx)
char tmp[10];
char resp[256];
char data[512];
jwOpen(data, sizeof(data), JW_OBJECT, JW_PRETTY);
struct jWriteControl jwc;
jwOpen(&jwc, data, sizeof(data), JW_OBJECT, JW_PRETTY);
time_t now;
time(&now);
jwObj_int("time", (unsigned int) now);
jwObj_string("event", "APP_TEST_MESSAGE");
jwObj_int(&jwc,"time", (unsigned int) now);
jwObj_string(&jwc,"event", "APP_TEST_MESSAGE");
strcpy(resp, "mqtt://");
strcat(resp, GetSysConf()->mqttStation[idx].ServerAddr);
itoa(GetSysConf()->mqttStation[idx].ServerPort, tmp, 10);
strcat(resp, ":");
strcat(resp, tmp);
jwObj_string("url", resp);
jwObj_string(&jwc,"url", resp);
ComposeTopic(resp, idx, "APP", "UPLINK");
jwObj_string("tx_topic", resp);
jwObj_string(&jwc,"tx_topic", resp);
ComposeTopic(resp, idx, "APP", "DWLINK");
jwObj_string("rx_topic", resp);
jwEnd();
jwClose();
jwObj_string(&jwc,"rx_topic", resp);
jwEnd(&jwc);
jwClose(&jwc);
AppServiceMQTTSend(data, strlen(data), idx);
}