diff --git a/data/components/6c095554-35e7-4e9d-a8d2-bb919e9479f4/component.js b/data/components/6c095554-35e7-4e9d-a8d2-bb919e9479f4/component.js index 0526a613..484396d8 100644 --- a/data/components/6c095554-35e7-4e9d-a8d2-bb919e9479f4/component.js +++ b/data/components/6c095554-35e7-4e9d-a8d2-bb919e9479f4/component.js @@ -1,159 +1,238 @@ -!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 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))) << o | 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 << t % 32, n[14 + (t + 64 >>> 9 << 4)] = t; + for (var c = 1732584193, f = -271733879, i = -1732584194, a = 271733878, h = 0; h < n.length; h += 16) c = l(r = c, e = f, o = i, u = a, n[h], 7, -680876936), a = l(a, c, f, i, n[h + 1], 12, -389564586), i = l(i, a, c, f, n[h + 2], 17, 606105819), f = l(f, i, a, c, n[h + 3], 22, -1044525330), c = l(c, f, i, a, n[h + 4], 7, -176418897), a = l(a, c, f, i, n[h + 5], 12, 1200080426), i = l(i, a, c, f, n[h + 6], 17, -1473231341), f = l(f, i, a, c, n[h + 7], 22, -45705983), c = l(c, f, i, a, n[h + 8], 7, 1770035416), a = l(a, c, f, i, n[h + 9], 12, -1958414417), i = l(i, a, c, f, n[h + 10], 17, -42063), f = l(f, i, a, c, n[h + 11], 22, -1990404162), c = l(c, f, i, a, n[h + 12], 7, 1804603682), a = l(a, c, f, i, n[h + 13], 12, -40341101), i = l(i, a, c, f, n[h + 14], 17, -1502002290), c = g(c, f = l(f, i, a, c, n[h + 15], 22, 1236535329), i, a, n[h + 1], 5, -165796510), a = g(a, c, f, i, n[h + 6], 9, -1069501632), i = g(i, a, c, f, n[h + 11], 14, 643717713), f = g(f, i, a, c, n[h], 20, -373897302), c = g(c, f, i, a, n[h + 5], 5, -701558691), a = g(a, c, f, i, n[h + 10], 9, 38016083), i = g(i, a, c, f, n[h + 15], 14, -660478335), f = g(f, i, a, c, n[h + 4], 20, -405537848), c = g(c, f, i, a, n[h + 9], 5, 568446438), a = g(a, c, f, i, n[h + 14], 9, -1019803690), i = g(i, a, c, f, n[h + 3], 14, -187363961), f = g(f, i, a, c, n[h + 8], 20, 1163531501), c = g(c, f, i, a, n[h + 13], 5, -1444681467), a = g(a, c, f, i, n[h + 2], 9, -51403784), i = g(i, a, c, f, n[h + 7], 14, 1735328473), c = v(c, f = g(f, i, a, c, n[h + 12], 20, -1926607734), i, a, n[h + 5], 4, -378558), a = v(a, c, f, i, n[h + 8], 11, -2022574463), i = v(i, a, c, f, n[h + 11], 16, 1839030562), f = v(f, i, a, c, n[h + 14], 23, -35309556), c = v(c, f, i, a, n[h + 1], 4, -1530992060), a = v(a, c, f, i, n[h + 4], 11, 1272893353), i = v(i, a, c, f, n[h + 7], 16, -155497632), f = v(f, i, a, c, n[h + 10], 23, -1094730640), c = v(c, f, i, a, n[h + 13], 4, 681279174), a = v(a, c, f, i, n[h], 11, -358537222), i = v(i, a, c, f, n[h + 3], 16, -722521979), f = v(f, i, a, c, n[h + 6], 23, 76029189), c = v(c, f, i, a, n[h + 9], 4, -640364487), a = v(a, c, f, i, n[h + 12], 11, -421815835), i = v(i, a, c, f, n[h + 15], 16, 530742520), c = m(c, f = v(f, i, a, c, n[h + 2], 23, -995338651), i, a, n[h], 6, -198630844), a = m(a, c, f, i, n[h + 7], 10, 1126891415), i = m(i, a, c, f, n[h + 14], 15, -1416354905), f = m(f, i, a, c, n[h + 5], 21, -57434055), c = m(c, f, i, a, n[h + 12], 6, 1700485571), a = m(a, c, f, i, n[h + 3], 10, -1894986606), i = m(i, a, c, f, n[h + 10], 15, -1051523), f = m(f, i, a, c, n[h + 1], 21, -2054922799), c = m(c, f, i, a, n[h + 8], 6, 1873313359), a = m(a, c, f, i, n[h + 15], 10, -30611744), i = m(i, a, c, f, n[h + 6], 15, -1560198380), f = m(f, i, a, c, n[h + 13], 21, 1309151649), c = m(c, f, i, a, n[h + 4], 6, -145523070), a = m(a, c, f, i, n[h + 11], 10, -1120210379), i = m(i, a, c, f, n[h + 2], 15, 718787259), f = m(f, i, a, c, n[h + 9], 21, -343485551), c = d(c, r), f = d(f, e), i = d(i, o), a = d(a, u); + return [c, f, i, a] + } + + function i(n) { + for (var t = "", r = 32 * n.length, e = 0; e < r; e += 8) t += String.fromCharCode(n[e >> 5] >>> e % 32 & 255); + return t + } + + function a(n) { + var t = []; + for (t[(n.length >> 2) - 1] = void 0, e = 0; e < t.length; e += 1) t[e] = 0; + for (var r = 8 * n.length, e = 0; e < r; e += 8) t[e >> 5] |= (255 & n.charCodeAt(e / 8)) << e % 32; + return t + } + + function e(n) { + for (var t, r = "0123456789abcdef", e = "", o = 0; o < n.length; o += 1) t = n.charCodeAt(o), e += r.charAt(t >>> 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 < e.length && (e = c(e, 8 * n.length)), r = 0; r < 16; r += 1) o[r] = 909522486 ^ e[r], u[r] = 1549556828 ^ e[r]; + return t = c(o.concat(a(t)), 512 + 8 * t.length), i(c(u.concat(t), 640)) + }(r(n), r(t)) + } + + function t(n, t, r) { + return t ? r ? u(t, n) : e(u(t, n)) : r ? o(n) : e(o(n)) + } + + "function" == typeof define && define.amd ? define(function () { + return t + }) : "object" == typeof module && module.exports ? module.exports = t : n.md5 = t +}(this); +var md5 = this.md5; + +function isServerId(clientId) { + return JSON.parse(component.getCompMqttClientIdList()).indexOf(clientId) > -1 } -function getPkDn(clientId){ - var arr=clientId.split("_"); +function getPkDn(clientId) { + var arr = clientId.split("_"); return { - pk:arr[0], - dn:arr[1] + pk: arr[0], + dn: arr[1] }; } -function auth(head,type,payload){ - if(isServerId(payload.clientid)){ +function auth(head, type, payload) { + if (isServerId(payload.clientid)) { return { - type:"serverAuth", - data:{ - productKey:"pd", - deviceName:"dn", + type: "serverAuth", + data: { + productKey: "pd", + deviceName: "dn", } }; } - var arr= payload.clientid.split("_"); - if(arr.length<3){ + 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); + var pk = arr[0]; + var dn = arr[1]; + var model = arr[2]; + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + payload.clientid); + + if (pwd.toLocaleLowerCase() != payload.password.toLocaleLowerCase()) { + throw new Error("incorrect password"); } return { - type:"register", - data:{ - productKey:pk, - deviceName:dn, - model:model + type: "register", + data: { + productKey: pk, + deviceName: dn, + model: model } }; } -function acl(head,type,payload){ +function acl(head, type, payload) { var _topic = payload.topic; - if(isServerId(payload.clientid)){ + if (isServerId(payload.clientid)) { return { type: "acl", - data:{ - productKey:"pd", - deviceName:"dn", + data: { + productKey: "pd", + deviceName: "dn", } }; } // 客户端订阅处理 if (/^\/sys\/.+\/.+\/c\/#/i.test(_topic)) { - return subscribe(head,type,payload); + return subscribe(head, type, payload); } // 服务端订阅处理 if (/^\/sys\/.+\/.+\/s\/.*/i.test(_topic)) { - return subscribe(head,type,payload); + return subscribe(head, type, payload); } } -function register(head,type,payload){ - var auth= payload; - var arr= auth.clientid.split("_"); - if(arr.length<3){ +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); + var pk = arr[0]; + var dn = arr[1]; + var model = arr[2]; + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + auth.clientid); + + if (pwd.toLocaleLowerCase() != auth.password.toLocaleLowerCase()) { + throw new Error("incorrect password"); } return { - type:"register", - data:{ - productKey:pk, - deviceName:dn, - model:model + type: "register", + data: { + productKey: pk, + deviceName: dn, + model: model } }; } -function subRegister(topic,parent, payload){ - if(!topic){ +function subRegister(topic, parent, payload) { + if (!topic) { throw new Error("topic is blank") } - var params= payload.params; + var params = payload.params; - var reply= + var reply = { productKey: parent.productKey, deviceName: parent.deviceName, mid: "0", - content:{ - topic: topic.replace("/s/","/c/")+"_reply", + content: { + topic: topic.replace("/s/", "/c/") + "_reply", payload: JSON.stringify({ id: payload.id, code: 0, data: { - "productKey":params.productKey, - "deviceName":params.deviceName + "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 + 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) + action: { + type: "ack", + content: JSON.stringify(reply) } }; } -function disconnect(head,type,payload){ +function disconnect(head, type, payload) { var clientId = payload.clientid - var device=getPkDn(clientId); + var device = getPkDn(clientId); return { - type:"state", - data:{ - productKey:device.pk, - deviceName:device.dn, - state:"offline" + type: "state", + data: { + productKey: device.pk, + deviceName: device.dn, + state: "offline" } } } -function connect(head,type,payload) { +function connect(head, type, payload) { var clientId = payload.clientid var device = getPkDn(clientId); return { @@ -166,56 +245,56 @@ function connect(head,type,payload) { } } -function unsubscribe(head,type,payload){ +function unsubscribe(head, type, payload) { var topic = payload.topic; - if(isServerId(payload.clientid)){ + if (isServerId(payload.clientid)) { return { type: "acl", - data:{ - productKey:"pd", - deviceName:"dn", + data: { + productKey: "pd", + deviceName: "dn", } }; } - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic: "+topic) + var arr = topic.split('/'); + if (arr.length < 6) { + throw new Error("incorrect topic: " + topic) } - var pk=arr[2]; - var dn=arr[3]; + var pk = arr[2]; + var dn = arr[3]; return { - type:"state", - data:{ + type: "state", + data: { productKey: pk, deviceName: dn, - state:"offline" + state: "offline" } } } -function subscribe(head,type,payload){ +function subscribe(head, type, payload) { var topic = payload.topic; - if(isServerId(payload.clientid)){ + if (isServerId(payload.clientid)) { return { type: "acl", - data:{ - productKey:"pd", - deviceName:"dn", + data: { + productKey: "pd", + deviceName: "dn", } }; } - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic: "+topic) + var arr = topic.split('/'); + if (arr.length < 6) { + throw new Error("incorrect topic: " + topic) } - var pk=arr[2]; - var dn=arr[3]; + var pk = arr[2]; + var dn = arr[3]; return { type: "state", @@ -228,84 +307,84 @@ function subscribe(head,type,payload){ } var messageHandler = { - "/sys/client/connected":connect, - "/sys/client/disconnected":disconnect, - "/mqtt/auth":auth, - "/mqtt/acl":acl, - "/sys/session/subscribed":subscribe, - "/sys/session/unsubscribed":unsubscribe + "/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); +this.onReceive = function (head, type, payload) { + payload = JSON.parse(payload); var result = {}; var topic = head.topic; - if(!topic) { + if (!topic) { return result; } var fun = messageHandler[topic]; - if(fun){ - return fun(head,type,payload) - }else{ - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic: "+topic) + if (fun) { + return 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]; + var pk = arr[2]; + var dn = arr[3]; //子设备注册 - if(topic.endsWith('/register')){ - return subRegister(topic,{productKey:pk,deviceName:dn}, payload); + if (topic.endsWith('/register')) { + return subRegister(topic, {productKey: pk, deviceName: dn}, payload); } - //数据上报 - var reply= - { - productKey:pk, - deviceName:dn, - mid:payload.id, - content:{ - topic:topic.replace("/s/","/c/")+"_reply", - payload:JSON.stringify({ - id:payload.id, - method: payload.method+"_reply", - code:0, - }) - } - }; + //数据上报 + var reply = + { + productKey: pk, + deviceName: dn, + mid: payload.id, + content: { + topic: topic.replace("/s/", "/c/") + "_reply", + payload: JSON.stringify({ + id: payload.id, + method: payload.method + "_reply", + code: 0, + }) + } + }; - var action={}; - if(!topic.endsWith("_reply")){ + var action = {}; + if (!topic.endsWith("_reply")) { //需要回复的消息 - action={ - type:"ack", - content:JSON.stringify(reply) + action = { + type: "ack", + content: JSON.stringify(reply) } } - return { - type:"report", - data:{ - productKey:pk, - deviceName:dn, - mid:payload.id, - content:{ - topic:topic, - payload:payload - } - }, - action:action - } + return { + type: "report", + data: { + productKey: pk, + deviceName: dn, + mid: payload.id, + content: { + topic: topic, + payload: payload + } + }, + action: action + } } return result; } -this.onRegistered=function(regInfo,result){ +this.onRegistered = function (regInfo, result) { } \ No newline at end of file diff --git a/data/components/eabb131d-8fd1-43a8-88d9-a198abfd3d42/component.js b/data/components/eabb131d-8fd1-43a8-88d9-a198abfd3d42/component.js index 4c6c218e..f6664183 100755 --- a/data/components/eabb131d-8fd1-43a8-88d9-a198abfd3d42/component.js +++ b/data/components/eabb131d-8fd1-43a8-88d9-a198abfd3d42/component.js @@ -122,10 +122,13 @@ function register(payload) { var pk = arr[0]; var dn = arr[1]; var model = arr[2]; - var pwd = md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU" + auth.clientid); + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + auth.clientid); + if (pwd.toLocaleLowerCase() != auth.password.toLocaleLowerCase()) { throw new Error("incorrect password"); } + return { type: "register", data: { diff --git a/data/init/product.json b/data/init/product.json index 5c938393..60160b77 100755 --- a/data/init/product.json +++ b/data/init/product.json @@ -1,6 +1,7 @@ [ { "productKey": "xpsYHExTKPFaQMS7", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "调光灯", "category": "light", "nodeType": 1, @@ -11,6 +12,7 @@ }, { "productKey": "hdX3PCMcFrCYpesJ", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "code": "hdX3PCMcFrCYpesJ", "name": "智能风扇", "category": "fan", @@ -21,6 +23,7 @@ }, { "productKey": "hbtgIA0SuVw9lxjB", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "GW01网关", "category": "gateway", "nodeType": 0, @@ -32,6 +35,7 @@ }, { "productKey": "eDhXKwEzwFybM5R7", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "三路开关", "category": "switch", "nodeType": 1, @@ -43,6 +47,7 @@ }, { "productKey": "cGCrkK7Ex4FESAwe", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "插座", "category": "SmartPlug", "nodeType": 1, @@ -54,6 +59,7 @@ }, { "productKey": "Rf4QSjbm65X45753", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "一路开关", "category": "switch", "nodeType": 1, @@ -65,6 +71,7 @@ }, { "productKey": "PN3EDmkBZDD8whDd", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "门磁", "category": "door", "nodeType": 1, @@ -75,6 +82,7 @@ }, { "productKey": "N523nWsCiG3CAn6X", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "ZGW01", "category": "gateway", "nodeType": 0, @@ -86,6 +94,7 @@ }, { "productKey": "Eit3kmGJtxSHfCKT", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "燃气表", "category": "meter", "nodeType": 2, @@ -96,6 +105,7 @@ }, { "productKey": "DSGxxKk6E8mmDk6C", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "通断器", "category": "switch", "nodeType": 1, @@ -107,6 +117,7 @@ }, { "productKey": "D8c5pXFmt2KJDxNm", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "四路场景面板", "category": "switch", "nodeType": 1, @@ -116,6 +127,7 @@ }, { "productKey": "AWcJnf7ymGSkaz5M", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "smart pulg", "category": "SmartPlug", "nodeType": 1, @@ -127,6 +139,7 @@ }, { "productKey": "6kYp6jszrDns2yh4", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "温湿度传感器", "category": "sensor", "nodeType": 1, @@ -136,6 +149,7 @@ }, { "productKey": "bGdZt8ffBETtsirm", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "新风", "category": "FreshAir", "nodeType": 1, @@ -145,6 +159,7 @@ }, { "productKey": "BRD3x4fkKxkaxXFt", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "智能电表采集器", "category": "gateway", "nodeType": 0, @@ -154,6 +169,7 @@ }, { "productKey": "PwMfpXmp4ZWkGahn", + "productSecret": "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "name": "智能电表", "category": "SmartMeter", "nodeType": 1, diff --git a/iot-common/iot-common-core/src/main/java/cc/iotkit/common/constant/Constants.java b/iot-common/iot-common-core/src/main/java/cc/iotkit/common/constant/Constants.java index f19b78c6..6a36a4b2 100644 --- a/iot-common/iot-common-core/src/main/java/cc/iotkit/common/constant/Constants.java +++ b/iot-common/iot-common-core/src/main/java/cc/iotkit/common/constant/Constants.java @@ -77,9 +77,6 @@ public interface Constants { */ Long TOP_PARENT_ID = 0L; - - String PRODUCT_SECRET = "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"; - String ACCOUNT_SECRET = "3n1z33kzvpgz1foijpkepyd3e8tw84us"; String CACHE_PRODUCT = "product_cache"; diff --git a/iot-components/iot-component-server/src/main/java/cc/iotkit/comps/service/DeviceBehaviourService.java b/iot-components/iot-component-server/src/main/java/cc/iotkit/comps/service/DeviceBehaviourService.java index c85264ec..4f2b197e 100755 --- a/iot-components/iot-component-server/src/main/java/cc/iotkit/comps/service/DeviceBehaviourService.java +++ b/iot-components/iot-component-server/src/main/java/cc/iotkit/comps/service/DeviceBehaviourService.java @@ -165,7 +165,8 @@ public class DeviceBehaviourService { if (deviceInfo == null) { throw new BizException(ErrCode.DEVICE_NOT_FOUND); } - if (!Constants.PRODUCT_SECRET.equals(productSecret)) { + Product product = getProductKey(productKey); + if (!product.getProductSecret().equals(productSecret)) { throw new BizException(ErrCode.PRODUCT_SECRET_ERROR); } @@ -284,14 +285,18 @@ public class DeviceBehaviourService { deviceOtaInfoTemp.setProductKey(message.getProductKey()); DeviceOtaInfo deviceOtaInfo = deviceOtaInfoData.findOneByCondition(DeviceOtaInfo.builder() .taskId(message.getMid()) - .productKey(message.getProductKey()) - .deviceName(message.getDeviceName()) + .productKey(message.getProductKey()) + .deviceName(message.getDeviceName()) .deviceId(message.getDeviceId()).build()); if (Objects.nonNull(deviceOtaInfo)) { deviceOtaInfo.setStep(deviceOtaInfoTemp.getStep()); - }else{ + } else { deviceOtaInfo = deviceOtaInfoTemp; } deviceOtaInfoData.save(deviceOtaInfo); } + + public Product getProductKey(String productKey) { + return productData.findByProductKey(productKey); + } } diff --git a/iot-components/iot-emqx-component/src/main/resources/component.js b/iot-components/iot-emqx-component/src/main/resources/component.js index 3109fa5f..c1b1db41 100755 --- a/iot-components/iot-emqx-component/src/main/resources/component.js +++ b/iot-components/iot-emqx-component/src/main/resources/component.js @@ -1,156 +1,240 @@ -!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 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))) << o | 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 << t % 32, n[14 + (t + 64 >>> 9 << 4)] = t; + for (var c = 1732584193, f = -271733879, i = -1732584194, a = 271733878, h = 0; h < n.length; h += 16) c = l(r = c, e = f, o = i, u = a, n[h], 7, -680876936), a = l(a, c, f, i, n[h + 1], 12, -389564586), i = l(i, a, c, f, n[h + 2], 17, 606105819), f = l(f, i, a, c, n[h + 3], 22, -1044525330), c = l(c, f, i, a, n[h + 4], 7, -176418897), a = l(a, c, f, i, n[h + 5], 12, 1200080426), i = l(i, a, c, f, n[h + 6], 17, -1473231341), f = l(f, i, a, c, n[h + 7], 22, -45705983), c = l(c, f, i, a, n[h + 8], 7, 1770035416), a = l(a, c, f, i, n[h + 9], 12, -1958414417), i = l(i, a, c, f, n[h + 10], 17, -42063), f = l(f, i, a, c, n[h + 11], 22, -1990404162), c = l(c, f, i, a, n[h + 12], 7, 1804603682), a = l(a, c, f, i, n[h + 13], 12, -40341101), i = l(i, a, c, f, n[h + 14], 17, -1502002290), c = g(c, f = l(f, i, a, c, n[h + 15], 22, 1236535329), i, a, n[h + 1], 5, -165796510), a = g(a, c, f, i, n[h + 6], 9, -1069501632), i = g(i, a, c, f, n[h + 11], 14, 643717713), f = g(f, i, a, c, n[h], 20, -373897302), c = g(c, f, i, a, n[h + 5], 5, -701558691), a = g(a, c, f, i, n[h + 10], 9, 38016083), i = g(i, a, c, f, n[h + 15], 14, -660478335), f = g(f, i, a, c, n[h + 4], 20, -405537848), c = g(c, f, i, a, n[h + 9], 5, 568446438), a = g(a, c, f, i, n[h + 14], 9, -1019803690), i = g(i, a, c, f, n[h + 3], 14, -187363961), f = g(f, i, a, c, n[h + 8], 20, 1163531501), c = g(c, f, i, a, n[h + 13], 5, -1444681467), a = g(a, c, f, i, n[h + 2], 9, -51403784), i = g(i, a, c, f, n[h + 7], 14, 1735328473), c = v(c, f = g(f, i, a, c, n[h + 12], 20, -1926607734), i, a, n[h + 5], 4, -378558), a = v(a, c, f, i, n[h + 8], 11, -2022574463), i = v(i, a, c, f, n[h + 11], 16, 1839030562), f = v(f, i, a, c, n[h + 14], 23, -35309556), c = v(c, f, i, a, n[h + 1], 4, -1530992060), a = v(a, c, f, i, n[h + 4], 11, 1272893353), i = v(i, a, c, f, n[h + 7], 16, -155497632), f = v(f, i, a, c, n[h + 10], 23, -1094730640), c = v(c, f, i, a, n[h + 13], 4, 681279174), a = v(a, c, f, i, n[h], 11, -358537222), i = v(i, a, c, f, n[h + 3], 16, -722521979), f = v(f, i, a, c, n[h + 6], 23, 76029189), c = v(c, f, i, a, n[h + 9], 4, -640364487), a = v(a, c, f, i, n[h + 12], 11, -421815835), i = v(i, a, c, f, n[h + 15], 16, 530742520), c = m(c, f = v(f, i, a, c, n[h + 2], 23, -995338651), i, a, n[h], 6, -198630844), a = m(a, c, f, i, n[h + 7], 10, 1126891415), i = m(i, a, c, f, n[h + 14], 15, -1416354905), f = m(f, i, a, c, n[h + 5], 21, -57434055), c = m(c, f, i, a, n[h + 12], 6, 1700485571), a = m(a, c, f, i, n[h + 3], 10, -1894986606), i = m(i, a, c, f, n[h + 10], 15, -1051523), f = m(f, i, a, c, n[h + 1], 21, -2054922799), c = m(c, f, i, a, n[h + 8], 6, 1873313359), a = m(a, c, f, i, n[h + 15], 10, -30611744), i = m(i, a, c, f, n[h + 6], 15, -1560198380), f = m(f, i, a, c, n[h + 13], 21, 1309151649), c = m(c, f, i, a, n[h + 4], 6, -145523070), a = m(a, c, f, i, n[h + 11], 10, -1120210379), i = m(i, a, c, f, n[h + 2], 15, 718787259), f = m(f, i, a, c, n[h + 9], 21, -343485551), c = d(c, r), f = d(f, e), i = d(i, o), a = d(a, u); + return [c, f, i, a] + } + + function i(n) { + for (var t = "", r = 32 * n.length, e = 0; e < r; e += 8) t += String.fromCharCode(n[e >> 5] >>> e % 32 & 255); + return t + } + + function a(n) { + var t = []; + for (t[(n.length >> 2) - 1] = void 0, e = 0; e < t.length; e += 1) t[e] = 0; + for (var r = 8 * n.length, e = 0; e < r; e += 8) t[e >> 5] |= (255 & n.charCodeAt(e / 8)) << e % 32; + return t + } + + function e(n) { + for (var t, r = "0123456789abcdef", e = "", o = 0; o < n.length; o += 1) t = n.charCodeAt(o), e += r.charAt(t >>> 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 < e.length && (e = c(e, 8 * n.length)), r = 0; r < 16; r += 1) o[r] = 909522486 ^ e[r], u[r] = 1549556828 ^ e[r]; + return t = c(o.concat(a(t)), 512 + 8 * t.length), i(c(u.concat(t), 640)) + }(r(n), r(t)) + } + + function t(n, t, r) { + return t ? r ? u(t, n) : e(u(t, n)) : r ? o(n) : e(o(n)) + } + + "function" == typeof define && define.amd ? define(function () { + return t + }) : "object" == typeof module && module.exports ? module.exports = t : n.md5 = t +}(this); +var md5 = this.md5; + +function isServerId(clientId) { + return JSON.parse(component.getCompMqttClientIdList()).indexOf(clientId) > -1 } -function getPkDn(clientId){ - var arr=clientId.split("_"); +function getPkDn(clientId) { + var arr = clientId.split("_"); return { - pk:arr[0], - dn:arr[1] + pk: arr[0], + dn: arr[1] }; } -function auth(head,type,payload){ - if(isServerId(payload.clientid)){ +function auth(head, type, payload) { + if (isServerId(payload.clientid)) { return { - type:"serverAuth", - data:{ - productKey:"pd", - deviceName:"dn", + type: "serverAuth", + data: { + productKey: "pd", + deviceName: "dn", } }; } - var arr= payload.clientid.split("_"); - if(arr.length<3){ + 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); + var pk = arr[0]; + var dn = arr[1]; + var model = arr[2]; + + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + payload.clientid); + + if (pwd.toLocaleLowerCase() != payload.password.toLocaleLowerCase()) { + throw new Error("incorrect password"); } + + return { - type:"register", - data:{ - productKey:pk, - deviceName:dn, - model:model + type: "register", + data: { + productKey: pk, + deviceName: dn, + model: model } }; } -function acl(head,type,payload){ +function acl(head, type, payload) { var _topic = payload.topic; - if(isServerId(payload.clientid)){ + if (isServerId(payload.clientid)) { return { type: "acl", - data:{ - productKey:"pd", - deviceName:"dn", + data: { + productKey: "pd", + deviceName: "dn", } }; } if (/^\/sys\/.+\/.+\/c\/#/i.test(_topic)) { - return subscribe(head,type,payload); + return subscribe(head, type, payload); } if (/^\/sys\/.+\/.+\/s\/.*/i.test(_topic)) { - return subscribe(head,type,payload); + return subscribe(head, type, payload); } } -function register(head,type,payload){ - var auth= payload; - var arr= auth.clientid.split("_"); - if(arr.length<3){ +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); + var pk = arr[0]; + var dn = arr[1]; + var model = arr[2]; + + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + auth.clientid); + + if (pwd.toLocaleLowerCase() != auth.password.toLocaleLowerCase()) { + throw new Error("incorrect password"); } + return { - type:"register", - data:{ - productKey:pk, - deviceName:dn, - model:model + type: "register", + data: { + productKey: pk, + deviceName: dn, + model: model } }; } -function subRegister(topic,parent, payload){ - if(!topic){ +function subRegister(topic, parent, payload) { + if (!topic) { throw new Error("topic is blank") } - var params= payload.params; + var params = payload.params; - var reply= + var reply = { productKey: parent.productKey, deviceName: parent.deviceName, mid: "0", - content:{ - topic: topic.replace("/s/","/c/")+"_reply", + content: { + topic: topic.replace("/s/", "/c/") + "_reply", payload: JSON.stringify({ id: payload.id, code: 0, data: { - "productKey":params.productKey, - "deviceName":params.deviceName + "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 + 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) + action: { + type: "ack", + content: JSON.stringify(reply) } }; } -function disconnect(head,type,payload){ +function disconnect(head, type, payload) { var clientId = payload.clientid - var device=getPkDn(clientId); + var device = getPkDn(clientId); return { - type:"state", - data:{ - productKey:device.pk, - deviceName:device.dn, - state:"offline" + type: "state", + data: { + productKey: device.pk, + deviceName: device.dn, + state: "offline" } } } -function connect(head,type,payload) { +function connect(head, type, payload) { var clientId = payload.clientid var device = getPkDn(clientId); return { @@ -163,56 +247,56 @@ function connect(head,type,payload) { } } -function unsubscribe(head,type,payload){ +function unsubscribe(head, type, payload) { var topic = payload.topic; - if(isServerId(payload.clientid)){ + if (isServerId(payload.clientid)) { return { type: "acl", - data:{ - productKey:"pd", - deviceName:"dn", + data: { + productKey: "pd", + deviceName: "dn", } }; } - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic: "+topic) + var arr = topic.split('/'); + if (arr.length < 6) { + throw new Error("incorrect topic: " + topic) } - var pk=arr[2]; - var dn=arr[3]; + var pk = arr[2]; + var dn = arr[3]; return { - type:"state", - data:{ + type: "state", + data: { productKey: pk, deviceName: dn, - state:"offline" + state: "offline" } } } -function subscribe(head,type,payload){ +function subscribe(head, type, payload) { var topic = payload.topic; - if(isServerId(payload.clientid)){ + if (isServerId(payload.clientid)) { return { type: "acl", - data:{ - productKey:"pd", - deviceName:"dn", + data: { + productKey: "pd", + deviceName: "dn", } }; } - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic: "+topic) + var arr = topic.split('/'); + if (arr.length < 6) { + throw new Error("incorrect topic: " + topic) } - var pk=arr[2]; - var dn=arr[3]; + var pk = arr[2]; + var dn = arr[3]; return { type: "state", @@ -225,31 +309,29 @@ function subscribe(head,type,payload){ } - - var messageHandler = { - "/sys/client/connected":connect, - "/sys/client/disconnected":disconnect, - "/mqtt/auth":auth, - "/mqtt/acl":acl, - "/sys/session/subscribed":subscribe, - "/sys/session/unsubscribed":unsubscribe + "/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); +this.onReceive = function (head, type, payload) { + payload = JSON.parse(payload); print("======================================================================= "); - print("【message from】: " + (isServerId(payload.clientid)?"Server":"Device") ); - print("onReceive head: "+JSON.stringify(head)); - print("onReceive type: "+JSON.stringify(type)); - print("onReceive payload: "+ JSON.stringify(payload)); + print("【message from】: " + (isServerId(payload.clientid) ? "Server" : "Device")); + print("onReceive head: " + JSON.stringify(head)); + print("onReceive type: " + JSON.stringify(type)); + print("onReceive payload: " + JSON.stringify(payload)); //print("onReceive compMqttClientIdList: "+ component.getCompMqttClientIdList()); var result = {}; var topic = head.topic; - if(!topic) { + if (!topic) { print("【result】: " + JSON.stringify(result)); print("======================================================================= "); @@ -259,23 +341,20 @@ this.onReceive=function(head,type,payload){ 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) + 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]; + var pk = arr[2]; + var dn = arr[3]; //子设备注册 - if(topic.endsWith('/register')){ - result = subRegister(topic,{productKey:pk,deviceName:dn}, payload); - } - else { + if (topic.endsWith('/register')) { + result = subRegister(topic, {productKey: pk, deviceName: dn}, payload); + } else { //数据上报 result = { type: "report", @@ -298,5 +377,5 @@ this.onReceive=function(head,type,payload){ } -this.onRegistered=function(regInfo,result){ +this.onRegistered = function (regInfo, result) { } \ No newline at end of file diff --git a/iot-components/iot-mqtt-component/src/main/resources/ali-component.js b/iot-components/iot-mqtt-component/src/main/resources/ali-component.js index 116852c9..79f8c3ac 100644 --- a/iot-components/iot-mqtt-component/src/main/resources/ali-component.js +++ b/iot-components/iot-mqtt-component/src/main/resources/ali-component.js @@ -1,12 +1,87 @@ -!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> 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))) << o | 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 << t % 32, n[14 + (t + 64 >>> 9 << 4)] = t; + for (var c = 1732584193, f = -271733879, i = -1732584194, a = 271733878, h = 0; h < n.length; h += 16) c = l(r = c, e = f, o = i, u = a, n[h], 7, -680876936), a = l(a, c, f, i, n[h + 1], 12, -389564586), i = l(i, a, c, f, n[h + 2], 17, 606105819), f = l(f, i, a, c, n[h + 3], 22, -1044525330), c = l(c, f, i, a, n[h + 4], 7, -176418897), a = l(a, c, f, i, n[h + 5], 12, 1200080426), i = l(i, a, c, f, n[h + 6], 17, -1473231341), f = l(f, i, a, c, n[h + 7], 22, -45705983), c = l(c, f, i, a, n[h + 8], 7, 1770035416), a = l(a, c, f, i, n[h + 9], 12, -1958414417), i = l(i, a, c, f, n[h + 10], 17, -42063), f = l(f, i, a, c, n[h + 11], 22, -1990404162), c = l(c, f, i, a, n[h + 12], 7, 1804603682), a = l(a, c, f, i, n[h + 13], 12, -40341101), i = l(i, a, c, f, n[h + 14], 17, -1502002290), c = g(c, f = l(f, i, a, c, n[h + 15], 22, 1236535329), i, a, n[h + 1], 5, -165796510), a = g(a, c, f, i, n[h + 6], 9, -1069501632), i = g(i, a, c, f, n[h + 11], 14, 643717713), f = g(f, i, a, c, n[h], 20, -373897302), c = g(c, f, i, a, n[h + 5], 5, -701558691), a = g(a, c, f, i, n[h + 10], 9, 38016083), i = g(i, a, c, f, n[h + 15], 14, -660478335), f = g(f, i, a, c, n[h + 4], 20, -405537848), c = g(c, f, i, a, n[h + 9], 5, 568446438), a = g(a, c, f, i, n[h + 14], 9, -1019803690), i = g(i, a, c, f, n[h + 3], 14, -187363961), f = g(f, i, a, c, n[h + 8], 20, 1163531501), c = g(c, f, i, a, n[h + 13], 5, -1444681467), a = g(a, c, f, i, n[h + 2], 9, -51403784), i = g(i, a, c, f, n[h + 7], 14, 1735328473), c = v(c, f = g(f, i, a, c, n[h + 12], 20, -1926607734), i, a, n[h + 5], 4, -378558), a = v(a, c, f, i, n[h + 8], 11, -2022574463), i = v(i, a, c, f, n[h + 11], 16, 1839030562), f = v(f, i, a, c, n[h + 14], 23, -35309556), c = v(c, f, i, a, n[h + 1], 4, -1530992060), a = v(a, c, f, i, n[h + 4], 11, 1272893353), i = v(i, a, c, f, n[h + 7], 16, -155497632), f = v(f, i, a, c, n[h + 10], 23, -1094730640), c = v(c, f, i, a, n[h + 13], 4, 681279174), a = v(a, c, f, i, n[h], 11, -358537222), i = v(i, a, c, f, n[h + 3], 16, -722521979), f = v(f, i, a, c, n[h + 6], 23, 76029189), c = v(c, f, i, a, n[h + 9], 4, -640364487), a = v(a, c, f, i, n[h + 12], 11, -421815835), i = v(i, a, c, f, n[h + 15], 16, 530742520), c = m(c, f = v(f, i, a, c, n[h + 2], 23, -995338651), i, a, n[h], 6, -198630844), a = m(a, c, f, i, n[h + 7], 10, 1126891415), i = m(i, a, c, f, n[h + 14], 15, -1416354905), f = m(f, i, a, c, n[h + 5], 21, -57434055), c = m(c, f, i, a, n[h + 12], 6, 1700485571), a = m(a, c, f, i, n[h + 3], 10, -1894986606), i = m(i, a, c, f, n[h + 10], 15, -1051523), f = m(f, i, a, c, n[h + 1], 21, -2054922799), c = m(c, f, i, a, n[h + 8], 6, 1873313359), a = m(a, c, f, i, n[h + 15], 10, -30611744), i = m(i, a, c, f, n[h + 6], 15, -1560198380), f = m(f, i, a, c, n[h + 13], 21, 1309151649), c = m(c, f, i, a, n[h + 4], 6, -145523070), a = m(a, c, f, i, n[h + 11], 10, -1120210379), i = m(i, a, c, f, n[h + 2], 15, 718787259), f = m(f, i, a, c, n[h + 9], 21, -343485551), c = d(c, r), f = d(f, e), i = d(i, o), a = d(a, u); + return [c, f, i, a] + } + + function i(n) { + for (var t = "", r = 32 * n.length, e = 0; e < r; e += 8) t += String.fromCharCode(n[e >> 5] >>> e % 32 & 255); + return t + } + + function a(n) { + var t = []; + for (t[(n.length >> 2) - 1] = void 0, e = 0; e < t.length; e += 1) t[e] = 0; + for (var r = 8 * n.length, e = 0; e < r; e += 8) t[e >> 5] |= (255 & n.charCodeAt(e / 8)) << e % 32; + return t + } + + function e(n) { + for (var t, r = "0123456789abcdef", e = "", o = 0; o < n.length; o += 1) t = n.charCodeAt(o), e += r.charAt(t >>> 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 < e.length && (e = c(e, 8 * n.length)), r = 0; r < 16; r += 1) o[r] = 909522486 ^ e[r], u[r] = 1549556828 ^ e[r]; + return t = c(o.concat(a(t)), 512 + 8 * t.length), i(c(u.concat(t), 640)) + }(r(n), r(t)) + } + + function t(n, t, r) { + return t ? r ? u(t, n) : e(u(t, n)) : r ? o(n) : e(o(n)) + } + + "function" == typeof define && define.amd ? define(function () { + return t + }) : "object" == typeof module && module.exports ? module.exports = t : n.md5 = t +}(this); +var md5 = this.md5; +/** + 网关上线 + 订阅:/sys/hbtgIA0SuVw9lxjB/AA:BB:CC:DD:10/c/# + + 子设备注册: + /sys/hbtgIA0SuVw9lxjB/AA:BB:CC:DD:10/s/register + { "id": "6", "params":{ "productKey":"Rf4QSjbm65X45753", @@ -14,138 +89,139 @@ var md5=this.md5; "model":"S1" } } - 子设备上线 - 订阅:/sys/Rf4QSjbm65X45753/ABC12400001/c/# + 子设备上线 + 订阅:/sys/Rf4QSjbm65X45753/ABC12400001/c/# - 数据上报: - /sys/Rf4QSjbm65X45753/ABC12400001/s/event/property/post - { + 数据上报: + /sys/Rf4QSjbm65X45753/ABC12400001/s/event/property/post + { "id": "6", "params":{ "powerstate": 1 } } - */ + */ -var registered={}; +var registered = {}; -function getPkDn(clientId){ - var arr=clientId.split("|")[0].split("&"); +function getPkDn(clientId) { + var arr = clientId.split("|")[0].split("&"); - if(arr.length<2){ + if (arr.length < 2) { throw new Error("incorrect clientid"); } - var model=""; - if(arr.length3=2){ - model=arr[2]; + var model = ""; + if (arr.length3 = 2) { + model = arr[2]; } - return { - pk:arr[0], - dn:arr[1], - model: model - }; -} - -function register(payload){ - var auth= JSON.parse(payload); - // 兼容ali - var device= getPkDn(auth.clientid); - - var pwd=md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"+auth.clientid); - // if(pwd.toLocaleLowerCase()!=auth.password.toLocaleLowerCase()){ - // throw new Error("incorrect password"); - // } - return { - type:"register", - data:{ - productKey:device.pk, - deviceName:device.dn, - model:device.model - } - }; -} - -function subRegister(topic,parent,payload){ - 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:"0", - 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 deviceStateChange(head,clientId,state){ - var topic=head.topic; - var device=getPkDn(clientId); - - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic") - } - - var pk=arr[2]; - var dn=arr[3]; - return { - type:"state", - data:{ - productKey:pk, - deviceName:dn, - state:state, - parent:{ - productKey:device.pk, - deviceName:device.dn, - } - } - } -} - -function disconnect(clientId){ - var device=getPkDn(clientId); - return { - type:"state", - data:{ - productKey:device.pk, - deviceName:device.dn, - state:"offline" - } - } -} - -function ignore(){ return { + pk: arr[0], + dn: arr[1], + model: model + }; +} + +function register(payload) { + var auth = JSON.parse(payload); + // 兼容ali + var device = getPkDn(auth.clientid); + + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + auth.clientid); + + /*if (pwd.toLocaleLowerCase() != auth.password.toLocaleLowerCase()) { + throw new Error("incorrect password"); + }*/ + return { + type: "register", + data: { + productKey: device.pk, + deviceName: device.dn, + model: device.model + } + }; +} + +function subRegister(topic, parent, payload) { + 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: "0", + 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 deviceStateChange(head, clientId, state) { + var topic = head.topic; + var device = getPkDn(clientId); + + var arr = topic.split('/'); + if (arr.length < 6) { + throw new Error("incorrect topic") + } + + var pk = arr[2]; + var dn = arr[3]; + return { + type: "state", + data: { + productKey: pk, + deviceName: dn, + state: state, + parent: { + productKey: device.pk, + deviceName: device.dn, + } + } } } -function aliDeviceInfoUpdate(pk, dn, payload){ +function disconnect(clientId) { + var device = getPkDn(clientId); + return { + type: "state", + data: { + productKey: device.pk, + deviceName: device.dn, + state: "offline" + } + } +} + +function ignore() { + return {} +} + +function aliDeviceInfoUpdate(pk, dn, payload) { return ignore(); // return { // type:"report", @@ -164,87 +240,87 @@ function aliDeviceInfoUpdate(pk, dn, payload){ //必须提供onReceive方法 // todo: if else改成map -this.onReceive=function(head,type,payload){ - if(type=='auth'){ - return register(payload); - } +this.onReceive = function (head, type, payload) { + if (type == 'auth') { + return register(payload); + } - if(type=='subscribe'){ - return deviceStateChange(head,payload,'online'); - } + if (type == 'subscribe') { + return deviceStateChange(head, payload, 'online'); + } - if(type=='unsubscribe'){ - return deviceStateChange(head,payload,'offline'); - } + if (type == 'unsubscribe') { + return deviceStateChange(head, payload, 'offline'); + } - if(type=='disconnect'){ - return disconnect(payload); - } + if (type == 'disconnect') { + return disconnect(payload); + } - var topic=head['topic']; - if(!topic){ - throw new Error("topic is blank") - } + var topic = head['topic']; + if (!topic) { + throw new Error("topic is blank") + } - var arr= topic.split('/'); - if(arr.length<6){ - throw new Error("incorrect topic") - } - var pk=arr[2]; - var dn=arr[3]; - payload=JSON.parse(payload); + var arr = topic.split('/'); + if (arr.length < 6) { + throw new Error("incorrect topic") + } + var pk = arr[2]; + var dn = arr[3]; + payload = JSON.parse(payload); - //子设备注册 - if(topic.endsWith('/register')){ - return subRegister(topic,{productKey:pk,deviceName:dn},payload); - } + //子设备注册 + if (topic.endsWith('/register')) { + return subRegister(topic, {productKey: pk, deviceName: dn}, payload); + } - // 阿里设备信息上传 + // 阿里设备信息上传 // Received message:{"id": "1", "version": "1.0", "params": [{"domain": "SYSTEM", "attrKey": "SYS_SDK_LANGUAGE", "attrValue": "Python"}, {"domain": "SYSTEM", "attrKey": "SYS_LP_SDK_VERSION", "attrValue": "1.0.0"}, {"domain": "SYSTEM", "attrKey": "SYS_SDK_IF_INFO", "attrValue": "Eth|03ACDEFF0032|Eth|03ACDEFF0031"}], "method": "thing.deviceinfo.update"}, with QoS AT_MOST_ONCE // topic":"/sys/JfGrfkfPXpBCEb6k/test_sc_001/thing/deviceinfo/update - if(topic.endsWith("/thing/deviceinfo/update")){ - return aliDeviceInfoUpdate(pk, dn, payload); - } + if (topic.endsWith("/thing/deviceinfo/update")) { + return aliDeviceInfoUpdate(pk, dn, payload); + } - //数据上报 - var reply= - { - productKey:pk, - deviceName:dn, - mid:payload.id, - content:{ - topic:topic.replace("/s/","/c/")+"_reply", - payload:JSON.stringify({ - id:payload.id, - method: payload.method+"_reply", - code:0, - }) - } - }; + //数据上报 + var reply = + { + productKey: pk, + deviceName: dn, + mid: payload.id, + content: { + topic: topic.replace("/s/", "/c/") + "_reply", + payload: JSON.stringify({ + id: payload.id, + method: payload.method + "_reply", + code: 0, + }) + } + }; - var action={}; - if(!topic.endsWith("_reply")){ + var action = {}; + if (!topic.endsWith("_reply")) { //需要回复的消息 - action={ - type:"ack", - content:JSON.stringify(reply) + action = { + type: "ack", + content: JSON.stringify(reply) } } - return { - type:"report", - data:{ - productKey:pk, - deviceName:dn, - mid:payload.id, - content:{ - topic:topic, - payload:payload.params - } - }, - action:action - } + return { + type: "report", + data: { + productKey: pk, + deviceName: dn, + mid: payload.id, + content: { + topic: topic, + payload: payload.params + } + }, + action: action + } } -this.onRegistered=function(regInfo,result){ +this.onRegistered = function (regInfo, result) { } \ No newline at end of file diff --git a/iot-components/iot-mqtt-component/src/main/resources/component.js b/iot-components/iot-mqtt-component/src/main/resources/component.js index 4c6c218e..098535bc 100755 --- a/iot-components/iot-mqtt-component/src/main/resources/component.js +++ b/iot-components/iot-mqtt-component/src/main/resources/component.js @@ -122,7 +122,10 @@ function register(payload) { var pk = arr[0]; var dn = arr[1]; var model = arr[2]; - var pwd = md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU" + auth.clientid); + + var product = deviceBehaviour.getProductKey(pk) + var pwd = md5(product.productSecret + auth.clientid); + if (pwd.toLocaleLowerCase() != auth.password.toLocaleLowerCase()) { throw new Error("incorrect password"); } diff --git a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/example/TransparentTest.java b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/example/TransparentTest.java index 140b0ec3..a3842871 100644 --- a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/example/TransparentTest.java +++ b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/example/TransparentTest.java @@ -41,10 +41,10 @@ public class TransparentTest { } log.info("start gateway "); - Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB", + Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB", "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "TEST:GW:T0001"); - gateway.addSubDevice("", + gateway.addSubDevice("hbtgIA0SuVw9lxjB", "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "TEST_LIGHT_0001", "M1"); @@ -54,7 +54,7 @@ public class TransparentTest { //设备上线后添加上报定时任务 ReportTask reportTask = new ReportTask(gateway.getClient()); reportTask.addTask(String.format("/sys/%s/%s/s/event/rawReport", - pk, device.getDeviceName()), + pk, device.getDeviceName()), () -> { Request request = new Request(); request.setId(UUID.randomUUID().toString()); diff --git a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ConnectionTest.java b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ConnectionTest.java index 1f6e93b3..f40b6bac 100755 --- a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ConnectionTest.java +++ b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ConnectionTest.java @@ -43,7 +43,7 @@ public class ConnectionTest { int finalI = i; executor.submit(() -> { log.info("start gateway " + (finalI + 1)); - Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB", + Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB","xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "TEST:GW:T" + StringUtils.leftPad(finalI + "", 6, "0")); // gateway.addSubDevice("Rf4QSjbm65X45753", diff --git a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ReportTest.java b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ReportTest.java index 90a6459e..147ba931 100755 --- a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ReportTest.java +++ b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/performance/ReportTest.java @@ -51,14 +51,14 @@ public class ReportTest { int finalI = i; executor.submit(() -> { log.info("start gateway " + (finalI + 1)); - Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB", + Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB", "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "TEST:GW:" + StringUtils.leftPad(finalI + "", 6, "0")); - gateway.addSubDevice("Rf4QSjbm65X45753", + gateway.addSubDevice("Rf4QSjbm65X45753", "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "TEST_SW_" + StringUtils.leftPad(finalI + "", 6, "0"), "S01"); - gateway.addSubDevice("cGCrkK7Ex4FESAwe", + gateway.addSubDevice("cGCrkK7Ex4FESAwe", "xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU", "TEST_SC_" + StringUtils.leftPad(finalI + "", 6, "0"), "S01"); @@ -71,7 +71,7 @@ public class ReportTest { //设备上线后添加上报定时任务 ReportTask reportTask = new ReportTask(gateway.getClient()); reportTask.addTask(String.format("/sys/%s/%s/s/event/property/post", - pk, device.getDeviceName()), + pk, device.getDeviceName()), () -> { Request request = new Request(); request.setId(UUID.randomUUID().toString()); diff --git a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Device.java b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Device.java index c3c8e299..d37f0763 100755 --- a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Device.java +++ b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Device.java @@ -20,6 +20,8 @@ public class Device { protected String productKey; + private String productSecret ; + protected String deviceName; private String model; diff --git a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Gateway.java b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Gateway.java index 9a34c233..442a2f5f 100755 --- a/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Gateway.java +++ b/iot-test-tool/iot-test-mqtt/src/main/java/cc/iotkit/test/mqtt/service/Gateway.java @@ -49,8 +49,8 @@ public class Gateway extends Device { private boolean isConnecting; - public Gateway(String productKey, String deviceName) { - super(productKey, deviceName, "GW01"); + public Gateway(String productKey, String productSecret, String deviceName) { + super(productKey, productSecret, deviceName, "GW01"); } @SneakyThrows @@ -74,7 +74,7 @@ public class Gateway extends Device { isConnecting = true; MqttClientOptions options = new MqttClientOptions(); options.setUsername(this.deviceName); - options.setPassword(DigestUtils.md5Hex(Constants.PRODUCT_SECRET + clientId)); + options.setPassword(DigestUtils.md5Hex(getProductSecret() + clientId)); options.setCleanSession(true); options.setKeepAliveInterval(30); options.setClientId(clientId); @@ -134,8 +134,8 @@ public class Gateway extends Device { } } - public void addSubDevice(String productKey, String deviceName, String model) { - subDevices.add(new Device(productKey, deviceName, model)); + public void addSubDevice(String productKey, String productSecret, String deviceName, String model) { + subDevices.add(new Device(productKey, productSecret, deviceName, model)); } public void onDeviceOnline(Consumer listener) {