!function(n){"use strict";function d(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function f(n,t,r,e,o,u){return d((u=d(d(t,n),d(e,u)))<>>32-o,r)}function l(n,t,r,e,o,u,c){return f(t&r|~t&e,n,t,o,u,c)}function g(n,t,r,e,o,u,c){return f(t&e|r&~e,n,t,o,u,c)}function v(n,t,r,e,o,u,c){return f(t^r^e,n,t,o,u,c)}function m(n,t,r,e,o,u,c){return f(r^(t|~e),n,t,o,u,c)}function c(n,t){var r,e,o,u;n[t>>5]|=128<>>9<<4)]=t;for(var c=1732584193,f=-271733879,i=-1732584194,a=271733878,h=0;h>5]>>>e%32&255);return t}function a(n){var t=[];for(t[(n.length>>2)-1]=void 0,e=0;e>5]|=(255&n.charCodeAt(e/8))<>>4&15)+r.charAt(15&t);return e}function r(n){return unescape(encodeURIComponent(n))}function o(n){return i(c(a(n=r(n)),8*n.length))}function u(n,t){return function(n,t){var r,e=a(n),o=[],u=[];for(o[15]=u[15]=void 0,16 -1 } function getPkDn(clientId){ var arr=clientId.split("_"); return { pk:arr[0], dn:arr[1] }; } function auth(head,type,payload){ if(isServerId(payload.clientid)){ return { type:"serverAuth", data:{ productKey:"pd", deviceName:"dn", } }; } var arr= payload.clientid.split("_"); if(arr.length<3){ throw new Error("incorrect clientid:" + payload.clientid); } var pk=arr[0]; var dn=arr[1]; var model=arr[2]; var pwd=md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"+payload.clientid); if(pwd!=payload.password){ throw new Error("incorrect password:" + pwd); } return { type:"register", data:{ productKey:pk, deviceName:dn, model:model } }; } function acl(head,type,payload){ var _topic = payload.topic; if(isServerId(payload.clientid)){ return { type: "acl", data:{ productKey:"pd", deviceName:"dn", } }; } // 客户端订阅处理 if (/^\/sys\/.+\/.+\/c\/#/i.test(_topic)) { return subscribe(head,type,payload); } // 服务端订阅处理 if (/^\/sys\/.+\/.+\/s\/.*/i.test(_topic)) { return subscribe(head,type,payload); } } function register(head,type,payload){ var auth= payload; var arr= auth.clientid.split("_"); if(arr.length<3){ throw new Error("incorrect clientid:" + auth.clientid); } var pk=arr[0]; var dn=arr[1]; var model=arr[2]; var pwd=md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"+auth.clientid); if(pwd!=auth.password){ throw new Error("incorrect password:" + pwd); } return { type:"register", data:{ productKey:pk, deviceName:dn, model:model } }; } function subRegister(topic,parent, payload){ if(!topic){ throw new Error("topic is blank") } var params= payload.params; var reply= { productKey: parent.productKey, deviceName: parent.deviceName, mid: "0", content:{ topic: topic.replace("/s/","/c/")+"_reply", payload: JSON.stringify({ id: payload.id, code: 0, data: { "productKey":params.productKey, "deviceName":params.deviceName } }) } }; return { type:"register", data:{ productKey:parent.productKey, deviceName:parent.deviceName, subDevices:[{ productKey:params.productKey, deviceName:params.deviceName, model:params.model }] }, action:{ type:"ack", content:JSON.stringify(reply) } }; } function disconnect(head,type,payload){ var clientId = payload.clientid var device=getPkDn(clientId); return { type:"state", data:{ productKey:device.pk, deviceName:device.dn, state:"offline" } } } function connect(head,type,payload) { var clientId = payload.clientid var device = getPkDn(clientId); return { type: "state", data: { productKey: device.pk, deviceName: device.dn, state: "online" } } } function unsubscribe(head,type,payload){ var topic = payload.topic; if(isServerId(payload.clientid)){ return { type: "acl", data:{ productKey:"pd", deviceName:"dn", } }; } var arr= topic.split('/'); if(arr.length<6){ throw new Error("incorrect topic: "+topic) } var pk=arr[2]; var dn=arr[3]; return { type:"state", data:{ productKey: pk, deviceName: dn, state:"offline" } } } function subscribe(head,type,payload){ var topic = payload.topic; if(isServerId(payload.clientid)){ return { type: "acl", data:{ productKey:"pd", deviceName:"dn", } }; } var arr= topic.split('/'); if(arr.length<6){ throw new Error("incorrect topic: "+topic) } var pk=arr[2]; var dn=arr[3]; return { type: "state", data: { productKey: pk, deviceName: dn, state: "online" } } } var messageHandler = { "/sys/client/connected":connect, "/sys/client/disconnected":disconnect, "/mqtt/auth":auth, "/mqtt/acl":acl, "/sys/session/subscribed":subscribe, "/sys/session/unsubscribed":unsubscribe } //必须提供onReceive方法 this.onReceive=function(head,type,payload){ payload=JSON.parse(payload); var result = {}; var topic = head.topic; if(!topic) { return result; } var fun = messageHandler[topic]; if(fun){ result = fun(head,type,payload) }else{ var arr= topic.split('/'); if(arr.length<6){ throw new Error("incorrect topic: "+topic) } var pk=arr[2]; var dn=arr[3]; //子设备注册 if(topic.endsWith('/register')){ result = subRegister(topic,{productKey:pk,deviceName:dn}, payload); } else { //数据上报 result = { type: "report", data: { productKey: pk, deviceName: dn, mid: payload.id, content: { topic: topic, payload: payload } } } } } return result; } this.onRegistered=function(regInfo,result){ }