add:添加OTA上报记录结果并新增OTA上报结果查询
parent
c15c7a307d
commit
e772f90e08
|
@ -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)))<<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/#
|
||||
!function (n) {
|
||||
"use strict";
|
||||
|
||||
子设备注册:
|
||||
/sys/hbtgIA0SuVw9lxjB/AA:BB:CC:DD:10/s/register
|
||||
{
|
||||
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;
|
||||
/**
|
||||
网关上线
|
||||
订阅:/sys/hbtgIA0SuVw9lxjB/AA:BB:CC:DD:10/c/#
|
||||
|
||||
子设备注册:
|
||||
/sys/hbtgIA0SuVw9lxjB/AA:BB:CC:DD:10/s/register
|
||||
{
|
||||
"id": "6",
|
||||
"params":{
|
||||
"productKey":"Rf4QSjbm65X45753",
|
||||
|
@ -14,203 +89,231 @@ 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("_");
|
||||
return {
|
||||
pk:arr[0],
|
||||
dn:arr[1]
|
||||
};
|
||||
function getPkDn(clientId) {
|
||||
var arr = clientId.split("_");
|
||||
return {
|
||||
pk: arr[0],
|
||||
dn: arr[1]
|
||||
};
|
||||
}
|
||||
|
||||
function register(payload){
|
||||
var auth= JSON.parse(payload);
|
||||
var arr= auth.clientid.split("_");
|
||||
if(arr.length<3){
|
||||
throw new Error("incorrect clientid");
|
||||
}
|
||||
function register(payload) {
|
||||
var auth = JSON.parse(payload);
|
||||
var arr = auth.clientid.split("_");
|
||||
if (arr.length < 3) {
|
||||
throw new Error("incorrect clientid");
|
||||
}
|
||||
|
||||
var pk=arr[0];
|
||||
var dn=arr[1];
|
||||
var model=arr[2];
|
||||
var pwd=md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"+auth.clientid);
|
||||
if(pwd.toLocaleLowerCase()!=auth.password.toLocaleLowerCase()){
|
||||
throw new Error("incorrect password");
|
||||
}
|
||||
return {
|
||||
type:"register",
|
||||
data:{
|
||||
productKey:pk,
|
||||
deviceName:dn,
|
||||
model:model
|
||||
}
|
||||
};
|
||||
var pk = arr[0];
|
||||
var dn = arr[1];
|
||||
var model = arr[2];
|
||||
var pwd = md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU" + auth.clientid);
|
||||
if (pwd.toLocaleLowerCase() != auth.password.toLocaleLowerCase()) {
|
||||
throw new Error("incorrect password");
|
||||
}
|
||||
return {
|
||||
type: "register",
|
||||
data: {
|
||||
productKey: pk,
|
||||
deviceName: dn,
|
||||
model: 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
|
||||
}
|
||||
})
|
||||
}
|
||||
};
|
||||
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)
|
||||
}
|
||||
};
|
||||
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);
|
||||
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 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
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 disconnect(clientId) {
|
||||
var device = getPkDn(clientId);
|
||||
return {
|
||||
type: "state",
|
||||
data: {
|
||||
productKey: device.pk,
|
||||
deviceName: device.dn,
|
||||
state: "offline"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ota(head, payload) {
|
||||
payload = JSON.parse(payload);
|
||||
var topic = head.topic;
|
||||
var arr = topic.split('/');
|
||||
if (arr.length < 6) {
|
||||
throw new Error("incorrect topic")
|
||||
}
|
||||
|
||||
var pk = arr[2];
|
||||
var dn = arr[3];
|
||||
return {
|
||||
type: "ota",
|
||||
data: {
|
||||
productKey: pk,
|
||||
deviceName: dn,
|
||||
mid: payload.id,
|
||||
content: {
|
||||
topic: topic,
|
||||
payload: payload
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//必须提供onReceive方法
|
||||
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")
|
||||
}
|
||||
if (type == 'ota') {
|
||||
return ota(head, 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);
|
||||
var topic = head['topic'];
|
||||
if (!topic) {
|
||||
throw new Error("topic is blank")
|
||||
}
|
||||
|
||||
//子设备注册
|
||||
if(topic.endsWith('/register')){
|
||||
return subRegister(topic,{productKey:pk,deviceName:dn},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);
|
||||
|
||||
//数据上报
|
||||
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,
|
||||
})
|
||||
}
|
||||
};
|
||||
//子设备注册
|
||||
if (topic.endsWith('/register')) {
|
||||
return subRegister(topic, {productKey: pk, deviceName: dn}, payload);
|
||||
}
|
||||
|
||||
var action={};
|
||||
if(!topic.endsWith("_reply")){
|
||||
//数据上报
|
||||
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")) {
|
||||
//需要回复的消息
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
this.onRegistered=function(regInfo,result){
|
||||
this.onRegistered = function (regInfo, result) {
|
||||
}
|
|
@ -1,194 +1,205 @@
|
|||
var mid = 1;
|
||||
|
||||
var mid=1;
|
||||
|
||||
function getMid(){
|
||||
mid++;
|
||||
if(mid>10000){
|
||||
mid=1;
|
||||
}
|
||||
return mid+"";
|
||||
function getMid() {
|
||||
mid++;
|
||||
if (mid > 10000) {
|
||||
mid = 1;
|
||||
}
|
||||
return mid + "";
|
||||
}
|
||||
|
||||
this.decode = function (msg) {
|
||||
//对msg进行解析,并返回物模型数据
|
||||
var content=msg.content;
|
||||
var topic = content.topic;
|
||||
var payload = content.payload;
|
||||
var identifier = topic.substring(topic.lastIndexOf("/") + 1);
|
||||
|
||||
//透传上报
|
||||
if(topic.endsWith("/event/rawReport")){
|
||||
var rst= component.transparentDecode(payload.params);
|
||||
if(!rst){
|
||||
return null;
|
||||
}
|
||||
rst.occur=new Date().getTime();
|
||||
rst.time=new Date().getTime();
|
||||
return rst;
|
||||
}
|
||||
//对msg进行解析,并返回物模型数据
|
||||
var content = msg.content;
|
||||
var topic = content.topic;
|
||||
var payload = content.payload;
|
||||
var identifier = topic.substring(topic.lastIndexOf("/") + 1);
|
||||
|
||||
if (topic.endsWith("/property/post")) {
|
||||
//属性上报
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type:"property",
|
||||
identifier: "report", //属性上报
|
||||
occur: new Date().getTime(), //时间戳,设备上的事件或数据产生的本地时间
|
||||
time: new Date().getTime(), //时间戳,消息上报时间
|
||||
data: payload.params,
|
||||
};
|
||||
} else if (topic.indexOf("/event/") > 0) {
|
||||
//事件上报
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type:"event",
|
||||
identifier: identifier,
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
data: payload.params,
|
||||
};
|
||||
}else if(topic.endsWith("/service/property/set_reply")){
|
||||
//属性设置回复
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type:"property",
|
||||
identifier: identifier,
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
code: payload.code
|
||||
};
|
||||
}else if(topic.endsWith("/config/set_reply")){
|
||||
//设备配置设置回复
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type:"config",
|
||||
identifier: "set_reply",
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
code: payload.code
|
||||
};
|
||||
}else if(topic.endsWith("/config/get")){
|
||||
//设备配置获取
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type:"config",
|
||||
identifier: "get",
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
data: {},
|
||||
};
|
||||
} else if (topic.endsWith("_reply")) {
|
||||
//服务回复
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type:"service",
|
||||
identifier: identifier,
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
code: payload.code,
|
||||
data: payload.data,
|
||||
};
|
||||
}
|
||||
return null;
|
||||
//透传上报
|
||||
if (topic.endsWith("/event/rawReport")) {
|
||||
var rst = component.transparentDecode(payload.params);
|
||||
if (!rst) {
|
||||
return null;
|
||||
}
|
||||
rst.occur = new Date().getTime();
|
||||
rst.time = new Date().getTime();
|
||||
return rst;
|
||||
}
|
||||
|
||||
if (topic.endsWith("/property/post")) {
|
||||
//属性上报
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "property",
|
||||
identifier: "report", //属性上报
|
||||
occur: new Date().getTime(), //时间戳,设备上的事件或数据产生的本地时间
|
||||
time: new Date().getTime(), //时间戳,消息上报时间
|
||||
data: payload.params,
|
||||
};
|
||||
} else if (topic.indexOf("/ota/") >= 0) {
|
||||
//事件上报
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "ota",
|
||||
identifier: "ota",
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
data: payload.params,
|
||||
};
|
||||
} else if (topic.indexOf("/event/") > 0) {
|
||||
//事件上报
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "event",
|
||||
identifier: identifier,
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
data: payload.params,
|
||||
};
|
||||
} else if (topic.endsWith("/service/property/set_reply")) {
|
||||
//属性设置回复
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "property",
|
||||
identifier: identifier,
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
code: payload.code
|
||||
};
|
||||
} else if (topic.endsWith("/config/set_reply")) {
|
||||
//设备配置设置回复
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "config",
|
||||
identifier: "set_reply",
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
code: payload.code
|
||||
};
|
||||
} else if (topic.endsWith("/config/get")) {
|
||||
//设备配置获取
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "config",
|
||||
identifier: "get",
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
data: {},
|
||||
};
|
||||
} else if (topic.endsWith("_reply")) {
|
||||
//服务回复
|
||||
return {
|
||||
mid: msg.mid,
|
||||
productKey: msg.productKey,
|
||||
deviceName: msg.deviceName,
|
||||
type: "service",
|
||||
identifier: identifier,
|
||||
occur: new Date().getTime(),
|
||||
time: new Date().getTime(),
|
||||
code: payload.code,
|
||||
data: payload.data,
|
||||
};
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
this.encode = function (service,device) {
|
||||
var deviceMid=getMid();
|
||||
var method="thing.service.";
|
||||
var topic="/sys/"+service.productKey+"/"+service.deviceName+"/c/service/";
|
||||
var params={};
|
||||
this.encode = function (service, device) {
|
||||
var deviceMid = getMid();
|
||||
var method = "thing.service.";
|
||||
var topic = "/sys/" + service.productKey + "/" + service.deviceName + "/c/service/";
|
||||
var params = {};
|
||||
|
||||
//透传下发
|
||||
if(device.transparent){
|
||||
var rst=component.transparentEncode(service,device);
|
||||
topic="/sys/"+rst.productKey+"/"+rst.deviceName+"/c/service/rawSend";
|
||||
params.model=rst.content.model;
|
||||
params.deviceName=rst.content.deviceName;
|
||||
params.data=rst.content.data;
|
||||
|
||||
return {
|
||||
productKey:rst.productKey,
|
||||
deviceName:rst.deviceName,
|
||||
mid:rst.mid,
|
||||
content:{
|
||||
topic:topic,
|
||||
payload:JSON.stringify({
|
||||
id:rst.mid,
|
||||
method:method+"rawSend",
|
||||
params:params
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var type=service.type;
|
||||
var identifier=service.identifier;
|
||||
//透传下发
|
||||
if (device.transparent) {
|
||||
var rst = component.transparentEncode(service, device);
|
||||
topic = "/sys/" + rst.productKey + "/" + rst.deviceName + "/c/service/rawSend";
|
||||
params.model = rst.content.model;
|
||||
params.deviceName = rst.content.deviceName;
|
||||
params.data = rst.content.data;
|
||||
|
||||
return {
|
||||
productKey: rst.productKey,
|
||||
deviceName: rst.deviceName,
|
||||
mid: rst.mid,
|
||||
content: {
|
||||
topic: topic,
|
||||
payload: JSON.stringify({
|
||||
id: rst.mid,
|
||||
method: method + "rawSend",
|
||||
params: params
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var type = service.type;
|
||||
var identifier = service.identifier;
|
||||
|
||||
if (type == "property") {
|
||||
method += "property." + identifier;
|
||||
topic += "property/" + identifier;
|
||||
} else if (type == "service") {
|
||||
method += identifier;
|
||||
topic += identifier;
|
||||
} else if (type == "config") {
|
||||
//设备配置下发
|
||||
method += identifier;
|
||||
topic = "/sys/" + service.productKey + "/" + service.deviceName + "/c/config/" + identifier;
|
||||
} else if (type = "lifetime") {
|
||||
//子设备注销下发
|
||||
method += identifier;
|
||||
topic = "/sys/" + service.productKey + "/" + service.deviceName + "/c/deregister";
|
||||
}
|
||||
if (type == "property" && identifier == "get") {
|
||||
var listParams = []
|
||||
for (var p in service.params) {
|
||||
listParams.push(service.params[p]);
|
||||
}
|
||||
return {
|
||||
productKey: service.productKey,
|
||||
deviceName: service.deviceName,
|
||||
mid: deviceMid,
|
||||
content: {
|
||||
topic: topic,
|
||||
payload: JSON.stringify({
|
||||
id: deviceMid,
|
||||
method: method,
|
||||
params: listParams
|
||||
})
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (var p in service.params) {
|
||||
params[p] = service.params[p];
|
||||
}
|
||||
return {
|
||||
productKey: service.productKey,
|
||||
deviceName: service.deviceName,
|
||||
mid: deviceMid,
|
||||
content: {
|
||||
topic: topic,
|
||||
payload: JSON.stringify({
|
||||
id: deviceMid,
|
||||
method: method,
|
||||
params: params
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(type=="property"){
|
||||
method+="property."+identifier;
|
||||
topic+="property/"+identifier;
|
||||
}else if(type=="service"){
|
||||
method+=identifier;
|
||||
topic+=identifier;
|
||||
}else if(type=="config"){
|
||||
//设备配置下发
|
||||
method+=identifier;
|
||||
topic="/sys/"+service.productKey+"/"+service.deviceName+"/c/config/"+identifier;
|
||||
}else if(type="lifetime"){
|
||||
//子设备注销下发
|
||||
method+=identifier;
|
||||
topic="/sys/"+service.productKey+"/"+service.deviceName+"/c/deregister";
|
||||
}
|
||||
if(type=="property" && identifier=="get" ){
|
||||
var listParams = []
|
||||
for(var p in service.params){
|
||||
listParams.push(service.params[p]);
|
||||
}
|
||||
return {
|
||||
productKey:service.productKey,
|
||||
deviceName:service.deviceName,
|
||||
mid:deviceMid,
|
||||
content:{
|
||||
topic:topic,
|
||||
payload:JSON.stringify({
|
||||
id:deviceMid,
|
||||
method:method,
|
||||
params: listParams
|
||||
})
|
||||
}
|
||||
}
|
||||
}else{
|
||||
for(var p in service.params){
|
||||
params[p]=service.params[p];
|
||||
}
|
||||
return {
|
||||
productKey:service.productKey,
|
||||
deviceName:service.deviceName,
|
||||
mid:deviceMid,
|
||||
content:{
|
||||
topic:topic,
|
||||
payload:JSON.stringify({
|
||||
id:deviceMid,
|
||||
method:method,
|
||||
params:params
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
};
|
|
@ -15,6 +15,7 @@ import lombok.SneakyThrows;
|
|||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* JSON 工具类
|
||||
|
@ -118,5 +119,11 @@ public class JsonUtils {
|
|||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
public static <T> T objectToJavaBean(Object obj, Class<T> clazz) {
|
||||
if (Objects.isNull(obj)) {
|
||||
return null;
|
||||
}
|
||||
return OBJECT_MAPPER.convertValue(obj,clazz);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,11 +13,23 @@ import lombok.*;
|
|||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class DeviceOtaInfo implements Id<String> {
|
||||
private String id;
|
||||
public class DeviceOtaInfo implements Id<Long> {
|
||||
|
||||
private Long id;
|
||||
|
||||
private Integer step;
|
||||
|
||||
private String taskId;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String version;
|
||||
|
||||
private String module;
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private String productKey;
|
||||
|
||||
private String deviceName;
|
||||
}
|
||||
|
|
|
@ -8,5 +8,5 @@ import cc.iotkit.model.ota.DeviceOtaInfo;
|
|||
* @Date: 2023/6/15 22:14
|
||||
* @Description:
|
||||
*/
|
||||
public interface IDeviceOtaInfoData extends ICommonData<DeviceOtaInfo, String> {
|
||||
public interface IDeviceOtaInfoData extends ICommonData<DeviceOtaInfo, Long> {
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package cc.iotkit.data.model;
|
||||
|
||||
import cc.iotkit.model.ota.DeviceOtaInfo;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
|
@ -19,10 +20,26 @@ import javax.persistence.Table;
|
|||
@Entity
|
||||
@Table(name = "device_ota_info")
|
||||
@ApiModel(value = "设备信息")
|
||||
@AutoMapper(target = TbDeviceOtaInfo.class)
|
||||
@AutoMapper(target = DeviceOtaInfo.class)
|
||||
public class TbDeviceOtaInfo {
|
||||
@Id
|
||||
@GeneratedValue(generator = "SnowflakeIdGenerator")
|
||||
@GenericGenerator(name = "SnowflakeIdGenerator", strategy = "cc.iotkit.data.config.id.SnowflakeIdGenerator")
|
||||
private String id;
|
||||
private Long id;
|
||||
|
||||
private Integer step;
|
||||
|
||||
private String taskId;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String version;
|
||||
|
||||
private String module;
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private String productKey;
|
||||
|
||||
private String deviceName;
|
||||
}
|
||||
|
|
|
@ -19,9 +19,9 @@ import org.springframework.stereotype.Service;
|
|||
@Primary
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class DeviceOtaInfoDataImpl implements IDeviceOtaInfoData, IJPACommData<DeviceOtaInfo, String> {
|
||||
public class DeviceOtaInfoDataImpl implements IDeviceOtaInfoData, IJPACommData<DeviceOtaInfo, Long> {
|
||||
|
||||
private DeviceOtaInfoRepository deviceOtaInfoRepository;
|
||||
private final DeviceOtaInfoRepository deviceOtaInfoRepository;
|
||||
|
||||
private final JPAQueryFactory jpaQueryFactory;
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ import cc.iotkit.common.enums.ErrCode;
|
|||
import cc.iotkit.common.exception.BizException;
|
||||
import cc.iotkit.common.utils.DeviceUtil;
|
||||
import cc.iotkit.common.utils.JsonUtils;
|
||||
import cc.iotkit.common.utils.MapstructUtils;
|
||||
import cc.iotkit.common.utils.UniqueIdUtil;
|
||||
import cc.iotkit.comp.model.DeviceState;
|
||||
import cc.iotkit.comp.model.RegisterInfo;
|
||||
|
@ -33,9 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
|
@ -274,8 +273,25 @@ public class DeviceBehaviourService {
|
|||
}
|
||||
|
||||
public void deviceOta(ThingModelMessage message) {
|
||||
DeviceOtaInfo otaInfo = (DeviceOtaInfo)message.getData();
|
||||
otaInfo.setDeviceId(message.getDeviceId());
|
||||
deviceOtaInfoData.save(otaInfo);
|
||||
DeviceOtaInfo deviceOtaInfoTemp = JsonUtils.objectToJavaBean(message.getData(), DeviceOtaInfo.class);
|
||||
if (Objects.isNull(deviceOtaInfoTemp)) {
|
||||
log.debug("device ota upload data is null deviceId:{}", message.getDeviceId());
|
||||
return;
|
||||
}
|
||||
deviceOtaInfoTemp.setTaskId(message.getMid());
|
||||
deviceOtaInfoTemp.setDeviceId(message.getDeviceId());
|
||||
deviceOtaInfoTemp.setDeviceName(message.getDeviceName());
|
||||
deviceOtaInfoTemp.setProductKey(message.getProductKey());
|
||||
DeviceOtaInfo deviceOtaInfo = deviceOtaInfoData.findOneByCondition(DeviceOtaInfo.builder()
|
||||
.taskId(message.getMid())
|
||||
.productKey(message.getProductKey())
|
||||
.deviceName(message.getDeviceName())
|
||||
.deviceId(message.getDeviceId()).build());
|
||||
if (Objects.nonNull(deviceOtaInfo)) {
|
||||
deviceOtaInfo.setStep(deviceOtaInfoTemp.getStep());
|
||||
}else{
|
||||
deviceOtaInfo = deviceOtaInfoTemp;
|
||||
}
|
||||
deviceOtaInfoData.save(deviceOtaInfo);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,9 @@ package cc.iotkit.manager.controller;
|
|||
import cc.iotkit.common.api.PageRequest;
|
||||
import cc.iotkit.common.api.Paging;
|
||||
import cc.iotkit.common.api.Request;
|
||||
import cc.iotkit.manager.dto.bo.ota.DeviceOtaInfoBo;
|
||||
import cc.iotkit.manager.dto.bo.ota.DeviceUpgradeBo;
|
||||
import cc.iotkit.manager.dto.vo.ota.DeviceOtaInfoVO;
|
||||
import cc.iotkit.manager.service.OtaService;
|
||||
import cc.iotkit.model.alert.AlertConfig;
|
||||
import cc.iotkit.model.ota.DeviceOta;
|
||||
|
@ -66,10 +69,17 @@ public class OtaController {
|
|||
return otaService.getOtaPackagePageList(request);
|
||||
}
|
||||
|
||||
@ApiOperation("设备获取升级包")
|
||||
@ApiOperation("设备升级")
|
||||
@PostMapping("/device/upgrade")
|
||||
public void deviceUpgrade(@RequestBody Request<DeviceOta> deviceOtaRequest) {
|
||||
DeviceOta deviceOta = deviceOtaRequest.getData();
|
||||
otaService.findByVersionGreaterThan(deviceOta.getCurrentVersion(), deviceOta.getDeviceId());
|
||||
public void deviceUpgrade(@RequestBody Request<DeviceUpgradeBo> request) {
|
||||
otaService.startUpgrade(request.getData().getOtaId(), request.getData().getDeviceId());
|
||||
}
|
||||
|
||||
@ApiOperation("设备升级结果查询")
|
||||
@PostMapping("/result")
|
||||
public Paging<DeviceOtaInfoVO> otaResult(@RequestBody PageRequest<DeviceOtaInfoBo> request) {
|
||||
return otaService.otaResult(request);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
package cc.iotkit.manager.dto.bo.ota;
|
||||
|
||||
import cc.iotkit.common.api.BaseDto;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* @Author: 石恒
|
||||
* @Date: 2023/6/17 20:45
|
||||
* @Description:
|
||||
*/
|
||||
@Data
|
||||
@ApiModel(value = "DeviceOtaInfoBo")
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = DeviceOtaInfoBo.class, reverseConvertGenerate = false)
|
||||
public class DeviceOtaInfoBo extends BaseDto {
|
||||
|
||||
private String taskId;
|
||||
|
||||
private String version;
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private String productKey;
|
||||
|
||||
private String deviceName;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package cc.iotkit.manager.dto.bo.ota;
|
||||
|
||||
import cc.iotkit.common.api.BaseDto;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* @Author: 石恒
|
||||
* @Date: 2023/6/16 21:13
|
||||
* @Description:
|
||||
*/
|
||||
@ApiModel(value = "DeviceUpgradeBo")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = DeviceUpgradeBo.class, reverseConvertGenerate = false)
|
||||
public class DeviceUpgradeBo extends BaseDto {
|
||||
private static final long serialVersionUID = -1L;
|
||||
private String deviceId;
|
||||
private String otaId;
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
package cc.iotkit.manager.dto.vo.ota;
|
||||
|
||||
import cc.iotkit.model.device.DeviceInfo;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Author: 石恒
|
||||
* @Date: 2023/6/17 20:49
|
||||
* @Description:
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@ApiModel(value = "DeviceOtaInfoVO")
|
||||
@AutoMapper(target = DeviceOtaInfoVO.class)
|
||||
public class DeviceOtaInfoVO implements Serializable {
|
||||
private Long id;
|
||||
|
||||
private Integer step;
|
||||
|
||||
private String taskId;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String version;
|
||||
|
||||
private String module;
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private String productKey;
|
||||
|
||||
private String deviceName;
|
||||
}
|
|
@ -76,7 +76,7 @@ public class DeviceService {
|
|||
public String otaUpgrade(String deviceId, boolean checkOwner, Object data) {
|
||||
DeviceInfo device = getAndCheckDevice(deviceId, checkOwner);
|
||||
return send(deviceId, device.getProductKey(), device.getDeviceName(),
|
||||
data, ThingModelMessage.TYPE_OTA, "OTA");
|
||||
data, ThingModelMessage.TYPE_OTA, "ota");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2,16 +2,25 @@ package cc.iotkit.manager.service;
|
|||
|
||||
import cc.iotkit.common.api.PageRequest;
|
||||
import cc.iotkit.common.api.Paging;
|
||||
import cc.iotkit.common.api.Request;
|
||||
import cc.iotkit.comps.ApiTool;
|
||||
import cc.iotkit.data.manager.IDeviceOtaInfoData;
|
||||
import cc.iotkit.data.manager.IOtaDeviceData;
|
||||
import cc.iotkit.data.manager.IOtaPackageData;
|
||||
import cc.iotkit.data.service.DeviceOtaInfoDataImpl;
|
||||
import cc.iotkit.manager.dto.bo.ota.DeviceOtaInfoBo;
|
||||
import cc.iotkit.manager.dto.vo.channel.ChannelTemplateVo;
|
||||
import cc.iotkit.manager.dto.vo.ota.DeviceOtaInfoVO;
|
||||
import cc.iotkit.model.alert.AlertConfig;
|
||||
import cc.iotkit.model.notify.ChannelTemplate;
|
||||
import cc.iotkit.model.ota.DeviceOtaInfo;
|
||||
import cc.iotkit.model.ota.OtaPackage;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.UUID;
|
||||
|
@ -29,6 +38,7 @@ public class OtaService {
|
|||
private final IOtaPackageData iOtaPackageData;
|
||||
private final IOtaDeviceData iOtaDeviceData;
|
||||
private final DeviceService deviceService;
|
||||
private final IDeviceOtaInfoData deviceOtaInfoData;
|
||||
|
||||
|
||||
@Value("${oss.region}")
|
||||
|
@ -87,4 +97,8 @@ public class OtaService {
|
|||
return ota;
|
||||
}
|
||||
|
||||
public Paging<DeviceOtaInfoVO> otaResult(PageRequest<DeviceOtaInfoBo> request) {
|
||||
return deviceOtaInfoData.findAll(request.to(DeviceOtaInfo.class)).to(DeviceOtaInfoVO.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue