Wiki source code of 2 Script

Version 60.1 by Theodore Xu on 2023/08/24 17:17

Hide last authors
Leo Wei 1.1 1 = **1 General Script Demo** =
2
Theodore Xu 60.1 3 == **1.1 Address Operation** ==
Leo Wei 1.1 4
5 (((
Theodore Xu 60.1 6 Write/Read data from address A to B**. **For example:transfer D2 to D0
Leo Wei 1.1 7 )))
8
9 (% style="text-align:center" %)
Hunter 5.1 10 [[image:1624245865976-320.png||height="182" width="1000" class="img-thumbnail"]]
Leo Wei 1.1 11
12 Depend on diffferent format of data.V-Box use different script functions.
13 for example. addr_setshort(addr,num) Function: Write 16-bit signed decimal address
14 addr_getshort(addr) Function:Read 16-bit signed decimal address
15 addr_getword(string addr)Function: Read 16-bit unsigned decimal address
Stone Wu 21.1 16 More script function are in the second section of [[“V-BOX Script Interface Manual”>>doc:V-BOX.V-Net.Manual.04 Lua Script.01 Lua Functions.WebHome]]
Leo Wei 1.1 17
18 == **1.2 Arithmetic** ==
19
20 (% style="text-align:center" %)
Hunter 5.1 21 [[image:1624249623612-177.png||height="337" width="400" class="img-thumbnail"]]
Leo Wei 1.1 22
Hunter 5.1 23 == **1.3 Set 100 to D0~-~-D19** ==
Leo Wei 1.1 24
25 (% style="text-align:center" %)
Hunter 5.1 26 [[image:1624249693457-742.png||height="135" width="400" class="img-thumbnail"]]
Leo Wei 1.1 27
Hunter 5.1 28 == **1.4 Short message** ==
Leo Wei 1.1 29
Hunter 51.1 30 The following demo shows that when the alarm condition is reached: temp1 > 5 & temp2 >10 & temp3 < 20(lasts more than 5 seconds) , then send an "alarm trigger" sms.
Leo Wei 1.1 31
Hunter 51.1 32 When the alarm condition is released,then send an  "alarm release" sms. Script is as below:
Leo Wei 1.1 33
Hunter 51.1 34 {{code language="lua"}}
Leo Wei 1.1 35 function sms.main()
Hunter 51.1 36 ------send condition------
Leo Wei 1.1 37 local temp1 = addr_getword("@Temperature1")
38 local temp2 = addr_getword("@Temperature2")
39 local temp3 = addr_getword("@Temperature3")
40 local timer = addr_getword("@Timer")
41 local tag = addr_getbit("@Tag")
Hunter 51.1 42 ------lasting time------
Leo Wei 1.1 43 if temp1 > 5 and temp2 > 10 and temp3 < 20 then
Jim(Forgotten) 17.1 44 timer = timer + 1
45 addr_setword("@Timer",timer)
Leo Wei 1.1 46 else
Jim(Forgotten) 17.1 47 timer = 0
48 addr_setword("@Timer",timer)
Leo Wei 1.1 49 end
Hunter 51.1 50 ------send sms & output Y0------
Leo Wei 1.1 51 if timer > 5 then
Jim(Forgotten) 17.1 52 if tag == 0 then
53 send_sms_ira("19859254700","alarm trigger")
54 addr_setbit("@Tag",1)
55 end
Leo Wei 1.1 56 elseif tag == 1 then
57 send_sms_ira("19859254700","alarm release")
58 addr_setbit("@Tag",0)
59 end
60 end
Hunter 51.1 61 {{/code}}
Leo Wei 1.1 62
Hunter 5.1 63 == **1.5 Telegram notification** ==
64
65 This example shows how to use the Bot API to send message into Telegram group or channel. When monitoring bit "@HDX" changes, it will trigger and send the message. Please replace with your own Token and chat id.
66
Hunter 26.1 67 As for How to get the botToken and chatID, please check the followig videos:
68
69 [[https:~~/~~/www.youtube.com/watch?v=zh6yYlnjX7k>>https://www.youtube.com/watch?v=zh6yYlnjX7k]]
70
71 [[https:~~/~~/www.youtube.com/watch?v=Pj8mwuMZZvg>>https://www.youtube.com/watch?v=Pj8mwuMZZvg]]
72
Hunter 5.1 73 {{code language="Lua"}}
74 local tempBit = 0
75 local tempWord = 0
76
77 local botToken = "5504549693:AAEy6a5G-sOF3CINONxMNABeYnoS4ABVlfg"
78 local chatID = "-641959124"--The chat id from Channel or Group
79
80 local https = require("https")
81 local json = require("json")
82
83 -- Send http.get request and return response result
84 function getHttpsUrl(url)
85 local body = {}
86 local bodyJson = json.encode(body)
87 local header = {}
88 header["content-type"] = "application/json"
89 local result_table, code, headers, status = https.request(url, bodyJson)
90 print("code:"..code)
91 if code~= 200 then
92 return
93 else
94 return body
95 end
96 end
97
98 function sendAlarm(telegramBotToken, message, telegramChatID)
99 local url = "https://api.telegram.org/bot"..telegramBotToken.."/sendMessage?text="..message.."&chat_id="..telegramChatID
100 --local url = 'http://v-box.net'
101 --local url = 'https://www.google.com/'
102 print("Get the link:"..url)
103 getHttpsUrl(url)
104 end
105
106
107 function AlarmNotificate.main()
108 local bitValue = addr_getbit("@HDX");
109 local message = ''
110 print("b=="..bitValue)
111 if bitValue == 1 and bitValue ~= tempBit then
112 message = 'Alarm triggered, the monitoring point test value is '.. bitValue
113 sendAlarm(botToken, message, chatID)
114 print("Notification pushed of triggering alarm,"..bitValue)
115 elseif bitValue == 0 and bitValue ~= tempBit then
116 message = 'Alarm dismissed, the monitoring point test value is '.. bitValue
117 sendAlarm(botToken, message, chatID)
118 print("Notification pushed of dismissing alarm,"..bitValue)
119 end
120 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
121
122 local wordValue = addr_getword("@HDW10")
123 print("w=="..wordValue)
124 --dosomething
125 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
126 message = 'Word alarm triggered, the word value is '.. wordValue
127 sendAlarm(botToken, message, chatID)
128 print("Notification pushed of triggering alarm,"..wordValue)
129 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
130 message = 'Word alarm dismissed, the word value is '.. wordValue
131 sendAlarm(botToken, message, chatID)
132 print("Notification pushed of dismissing alarm,"..wordValue)
133 end
134 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
135 end
136 {{/code}}
137
Hunter 22.1 138 == **1.6 LINE Notify** ==
Hunter 5.1 139
Hunter 22.1 140 This example shows how to use the LINE Notify to send message into LINE group. When monitoring bit "@test" changes, it will trigger and send the message. Please replace with your own Token.
141
Hunter 50.1 142 {{code language="lua"}}
Hunter 22.1 143 local tempBit = 0
144 local tempWord = 0
145
146 local LineToken = "08XCpubkOdwGdGgRTXF0x8umiyrALtoM0v6lBFUV6PC"
147
148 local https = require("https")
149 local json = require("json")
150 local ltn12 = require("ltn12")
151
152 -- Send http.get request and return response result
153 function getHttpsUrl(url,header,reqbody)
154 local body = {}
155 local bodyJson = json.encode(body)
156 local result_table, code, headers, status = https.request{
157 method = "POST",
158 url = url,
159 source = ltn12.source.string(reqbody),
160 headers = header,
161 sink = ltn12.sink.table(body)
162 }
163 print("code:"..code)
164 if code~= 200 then
165 return
166 else
167 return body
168 end
169 end
170
171 function getMessageUrl(lineMessage)
172 local url = "https://notify-api.line.me/api/notify"
173 local reqMess = "message="..lineMessage
174 local headers =
175 {
176 ["Authorization"] = "Bearer "..LineToken,
177 ["Content-Type"] = "application/x-www-form-urlencoded",
178 ["Content-Length"] = #reqMess
179 }
180
181 print("Get the link:"..url)
182 getHttpsUrl(url, headers, reqMess)
183 end
184
185
186 function linenotify.main()
187 local bitValue = addr_getbit("@test");
188 local message = ''
189 print("b=="..bitValue)
190 if bitValue == 1 and bitValue ~= tempBit then
191 message = 'Alarm V-Box triggered, the output is '.. bitValue
192 getMessageUrl(message)
193 print("Notification pushed of triggering alarm,"..bitValue)
194 elseif bitValue == 0 and bitValue ~= tempBit then
195 message = 'Alarm V-Box dismissed, the output is '.. bitValue
196 getMessageUrl(message)
197 print("Notification pushed of dismissing alarm,"..bitValue)
198 end
199 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
200
201 local wordValue = addr_getword("@t2")
202 print("w=="..wordValue)
203 --dosomething
204 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
205 message = 'Alarm V-Box triggered, the temperature is '.. wordValue
206 getMessageUrl(message)
207 print("Notification pushed of triggering alarm,"..wordValue)
208 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
209 message = 'Alarm V-Box dismissed, the temperature is '.. wordValue
210 getMessageUrl(message)
211 print("Notification pushed of dismissing alarm,"..wordValue)
212 end
213 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
214 end
215 {{/code}}
216
Hunter 24.1 217 == **1.7 Twilio WhatsApp Messaging** ==
Hunter 23.1 218
Hunter 24.1 219 This example shows how to use the Twilio API to send WhatsApp message to private number. When monitoring bit "@testBit" changes, it will trigger and send the message. Please replace with your own SID, Token, twilioPhoneNumber and receiverPhoneNumber.
Hunter 23.1 220
Hunter 27.1 221 About how to register the Twilio API, please check the following video:
222
223 [[https:~~/~~/www.youtube.com/watch?v=Id4lKichauU>>https://www.youtube.com/watch?v=Id4lKichauU]]
224
Hunter 23.1 225 {{code language="Lua"}}
226 local tempBit = 0
227 local tempWord = 0
228
229 local https = require("https")
230 local json = require("json")
231 local ltn12 = require("ltn12")
232
Hunter 25.1 233 local SID = 'AC1703bd710ffa98006d2bcc0b********'
234 local Token = 'd3c11897623c39e538b20263ec19****'
Hunter 23.1 235
236 local twilioPhoneNumber = '+14155238886'
237 local receiverPhoneNumber = '+8615880018277'
238
239 local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
240 function encodingBase64(data)
241 return ((data:gsub('.', function(x)
242 local r,b='',x:byte()
243 for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
244 return r;
245 end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
246 if (#x < 6) then return '' end
247 local c=0
248 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
249 return b:sub(c+1,c+1)
250 end)..({ '', '==', '=' })[#data%3+1])
251 end
252
253 function encodeUrl(str)
254 str = string.gsub(str, "([^%w%.%- ])", function(c)
255 return string.format("%%%02X", string.byte(c)) end)
256 return string.gsub(str, " ", "+")
257 end
258
259
260
261
262 function requestBodySplice(message, sender, receiver)
263 local reqBody = ''
264 local encodeMess = encodeUrl(message)
265 local encodeSend = encodeUrl(sender)
266 local encodeRece = encodeUrl(receiver)
267 --reqBody = "Body=Hello%20Wecon2&From=whatsapp%3A%2B14155238886&To=whatsapp%3A%2B8615880018277"
268 reqBody = string.format("Body=%s&From=whatsapp:%s&To=whatsapp:%s", encodeMess, encodeSend, encodeRece)
269 print(reqBody)
270 return reqBody
271 end
272
273
274 -- Send http.get request and return response result
275 function getHttpsUrl(url,header,reqbody)
276 local body = {}
277 local bodyJson = json.encode(body)
278 local result_table, code, headers, status = https.request{
279 method = "POST",
280 url = url,
281 source = ltn12.source.string(reqbody),
282 headers = header,
283 sink = ltn12.sink.table(body)
284 }
285 print("code:"..code)
286 if code~= 200 then
287 return
288 else
289 return body
290 end
291 end
292
293 function getMessageUrl(whatsAppMessage)
294 local auth = SID..':'..Token
295 local url = "https://api.twilio.com/2010-04-01/Accounts/"..SID.."/Messages"
296 --local reqMess = "message="..twilioMessage
297 local reqMess = requestBodySplice(whatsAppMessage, twilioPhoneNumber, receiverPhoneNumber)
298 local headers =
299 {
300 ["Authorization"] = "Basic "..encodingBase64(auth),
301 ["Content-Type"] = "application/x-www-form-urlencoded",
302 ["Content-Length"] = #reqMess
303 }
304
305 print("Get the link:"..url)
306 getHttpsUrl(url, headers, reqMess)
307 end
308
309
310
311 function Twilio.main()
312 --dosomething
313 --local auth = SID..':'..Token
314 --print(requestBodySplice("HelloWorld", twilioPhoneNumber, receiverPhoneNumber))
315 --print(encodingBase64(auth))
316 local bitValue = addr_getbit("@testBit");
317 local message = ''
318 print("b=="..bitValue)
319 if bitValue == 1 and bitValue ~= tempBit then
320 message = 'Alarm V-Box triggered, the output is '.. bitValue
321 getMessageUrl(message)
322 print("Notification pushed of triggering alarm,"..bitValue)
323 elseif bitValue == 0 and bitValue ~= tempBit then
324 message = 'Alarm V-Box dismissed, the output is '.. bitValue
325 getMessageUrl(message)
326 print("Notification pushed of dismissing alarm,"..bitValue)
327 end
328 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
329
330 local wordValue = addr_getword("@testWord")
331 print("w=="..wordValue)
332 --dosomething
333 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
334 message = 'Alarm V-Box triggered, the temperature is '.. wordValue
335 getMessageUrl(message)
336 print("Notification pushed of triggering alarm,"..wordValue)
337 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
338 message = 'Alarm V-Box dismissed, the temperature is '.. wordValue
339 getMessageUrl(message)
340 print("Notification pushed of dismissing alarm,"..wordValue)
341 end
342 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
343 end
344 {{/code}}
345
Hunter 29.1 346 == **1.8 How to parse value from HTTP response body** ==
347
348 This example use [[https:~~/~~/www.weatherapi.com/>>https://www.weatherapi.com/]] as example, to show how to parse value from HTTP response body. When we input the city name into address "@HDW5050":
349
350 (% style="text-align:center" %)
351 [[image:InputHTTPparameter.png]]
352
353 Then the response body would be like as following:
354
355 {{code language="json"}}
356 {
357 "location": {
358 "name": "Madrid",
359 "region": "Madrid",
360 "country": "Spain",
361 "lat": 40.4,
362 "lon": -3.68,
363 "tz_id": "Europe/Madrid",
364 "localtime_epoch": 1669022636,
365 "localtime": "2022-11-21 10:23"
366 },
367 "current": {
368 "last_updated_epoch": 1669022100,
369 "last_updated": "2022-11-21 10:15",
370 "temp_c": 13.0,
371 "temp_f": 55.4,
372 "is_day": 1,
373 "condition": {
374 "text": "Partly cloudy",
375 "icon": "//cdn.weatherapi.com/weather/64x64/day/116.png",
376 "code": 1003
377 },
378 "wind_mph": 11.9,
379 "wind_kph": 19.1,
380 "wind_degree": 210,
381 "wind_dir": "SSW",
382 "pressure_mb": 1015.0,
383 "pressure_in": 29.97,
384 "precip_mm": 0.0,
385 "precip_in": 0.0,
386 "humidity": 88,
387 "cloud": 75,
388 "feelslike_c": 10.8,
389 "feelslike_f": 51.4,
390 "vis_km": 10.0,
391 "vis_miles": 6.0,
392 "uv": 3.0,
393 "gust_mph": 22.1,
394 "gust_kph": 35.6
395 }
396 }
397 {{/code}}
398
399 (% class="wikigeneratedid" %)
Hunter 30.1 400 So we decode json into lua object to assign the value into addresses HDW6060(temperature), HDW7070(humidity), the code example like follows:
Hunter 29.1 401
402 {{code language="lua"}}
403 local APIkey = '70faaecf926b4341b1974006221711'
404
405
406 local http = require("socket.http")
407 local json = require("json")
408
409 -- Send http.get request and return response result
410 function getHttpsUrl(url)
411 local result_table, code, headers, status = http.request(url)
412 print("code:"..code)
413 if code~= 200 then
414 return
415 else
416 return result_table
417 end
418 end
419
420 function sendAPI(key, city)
421 local url = "http://api.weatherapi.com/v1/current.json?key="..key.."&q="..city.."&aqi=no"
422 --local url = 'http://v-box.net'
423 --local url = 'https://www.google.com/'
424 --http://api.weatherapi.com/v1/current.json?key=70faaecf926b4341b1974006221711&q=Barcelona&aqi=no
425 print("Get the link:"..url)
426 local body = getHttpsUrl(url)
427 --print(body)
428 local jsonBody = json.decode(body)
429 --print(jsonBody["current"]["temp_c"])
430 --print(type(jsonBody["current"]["temp_c"]))
431 --print(type(jsonBody["current"]["humidity"]))
432 addr_setfloat("@HDW6060", jsonBody["current"]["temp_c"])
433 addr_setword("@HDW7070", jsonBody["current"]["humidity"])
434 end
435
436
437 function Weather.main()
438 local cityName = addr_getstring("@HDW5050",6)
439 print("cityName: "..cityName)
440 sendAPI(APIkey, cityName)
441 end
442 {{/code}}
443
Hunter 42.1 444 == **1.9 High-Low Byte Switch** ==
445
Hunter 48.1 446 The following example is converting the floating number from order 1234 to order 3412, and formating output the number with 2 decimal point. About which high-low word order corresponding to which value, please refer to the [[Address Operation Table>>doc:V-BOX.V-Net.Manual.04 Lua Script.01 Lua Functions.WebHome||anchor="H2Addressoperation"]].
Hunter 42.1 447
448 {{code language="lua"}}
449 function highLowByteSwitch(floatNumber)
450 addr_setfloat("@W_0#HDW23036",floatNumber,0,2)
451 local newFloat = addr_getfloat("@W_0#HDW23036")
452 local formattedFloat = string.format("%.2f",newFloat)
453 print("The formatted float value is the : "..formattedFloat)
454 return formattedFloat
455 end
456 {{/code}}
457
Hunter 49.1 458 == **1.10 Read 64bits Unsigned Value** ==
459
460 In our built-in function library doesn't have the function for reading 64-bit unsigned format value, so the following function is for solve this. But if the number is greater 2^53, the precision will be lost. So the final result will be a little bit different from the original value.
461
462 {{code language="lua"}}
463 function addr_getquatra(address)
464 local highAddress = addr_newnoaddr(address,2)
465 local low32 = addr_getdword(address)
466 local high32 = addr_getdword(highAddress)
467 --print("the low number is "..low32)
468 --print("the high number is "..high32)
469 local formatVal = string.format("%64.0f",2^32*high32+low32)
470 print("the format value is ".. formatVal)
471 return formatVal
472 end
473 {{/code}}
474
Theodore Xu 58.1 475 = **2 Third part server** =
Leo Wei 1.1 476
477 V-Box have two mode.One is for V-Net,User need to use WECON server to store data.We call this V-NET platform.
478
479 (% class="mark" %)1.Europe server:eu.v-box.net
480
481 (% class="mark" %)2.Asean server:asean.v-box.net
482
483 Second is for OpenCloud mode.It means V-Box data will transfer to third part server and do not want to store data to WECON server.We call OpenCloud paltform
484
485 OpenCloud platform is used in configuring the script.Then V-Box can connect with third part server.
486
487 Both mode can support script  to connect with third part server.the difference:
488
489 (% class="mark" %)1.If you want to store in WECON server ,please use V-NET.
490
491 (% class="mark" %)2.If your server requires SSL certificate to log in,please use OpenCloud.Because only OpenCloud platform can support to upload certificate
492
Hunter 38.1 493 {{info}}
Hunter 20.1 494 **✎Note: **Before program the script of MQTT, please make sure the server(MQTT broker) can be connected through MQTT Client tool.
Hunter 38.1 495 {{/info}}
Leo Wei 1.1 496
Hunter 20.1 497 (% class="wikigeneratedid" %)
498 Tool link: **[[MQTT.fx>>http://mqttfx.jensd.de/index.php/download]]**
499
Theodore Xu 56.1 500 == **2.1 Test server(General Example)** ==
Hunter 20.1 501
Hunter 41.1 502 The following example is trying to publish to the topic "testtopic/test/no1/7890", and subscribe the topic "testtopic/test/no1/123456".
503
504 And the JSON message is like follows:
505
506 {{code language="JSON"}}
507 {
508 "timestamp": 1631152760,
509 "messageId": 1,
510 "event": "test_data",
511 "mfrs": "HMI/box",
512 "data":
513 {
514 "id" : 1436217747670454274,
515 "waterlevel" : 48,
516 "temperture" : 23
517 }
518 }
519 {{/code}}
520
Hunter 20.1 521 {{code language="lua"}}
522 --MQTT configuration table
523 local MQTT_CFG={}
Hunter 53.1 524 --if there is no need the username and password, please put them as ""
Hunter 20.1 525 MQTT_CFG.username = "weconsupport"
526 MQTT_CFG.password = "123456"
527 MQTT_CFG.netway = 0
528 MQTT_CFG.keepalive = 60
529 MQTT_CFG.cleansession = 1
530 --TCP URL
531 MQTT_URL = "tcp://mq.tongxinmao.com:1883"
532 --Client ID
533 MQTT_CLIENT_ID = "V-BOXH-AG"
534
535 --Generate UUID
536 function uuid()
537 local seed = {'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
538 local tb = {}
539 for i=1, 32 do
540 table.insert(tb, seed[math.random(1,16)])
541 end
542 local sid=table.concat(tb)
543 return string.format('%s',
544 string.sub(sid,1,32)
545 )
546 end
547
548
549 --Topic name to subscribed
550 local SUBSCRIBE_TOPIC = 'testtopic/test/no1/123456'
551
552 --Topic name to be published
553 local PUBLISH_TOPIC = 'testtopic/test/no1/7890'
554
555
556 --real time
557 local LAST_TIME = 0
558
559
560 --initialize mqtt
561 function mqtt_init()
562 print(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENT_ID))
Hunter 39.1 563 if g_mq then
Hunter 52.1 564 mqtt.close(g_mq) --Close mqtt object
Hunter 39.1 565 end
Hunter 20.1 566 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENT_ID) -- create mqtt object,and declare it as a global variable
567 if g_mq then
568 g_mq:on("message", mqtt_msg_callback) -- Register a callback for receiving messages
Hunter 39.1 569 g_mq:on("offline", mqtt_msg_offline) -- Register a callback for offline
Hunter 20.1 570 print("mqtt init success")
571 else
572 print("mqtt init failed:", err)
573 end
574 end
575
576 -- connect to mqtt
577 function mqtt_connect()
578 print("mqtt connecting...")
579 local stat, err = g_mq:connect(MQTT_CFG)
580 if stat == nil then
581 print("mqtt connect failed:", err)
582 return
583 else
584 print("mqtt connected")
585 end
586 g_mq:subscribe(SUBSCRIBE_TOPIC, 0)
587 end
588
Hunter 40.1 589 --Offline callback function
590 function mqtt_msg_offline(cause)
591 print("mqtt offline, cause:", cause)
592 end
593
Hunter 20.1 594 -- Received message callback function
595 function mqtt_msg_callback(topic, msg)
596 print("topic:", topic)
597 print("msg:", msg)
598 local objMsg = json.decode(msg)
599 local water = objMsg.data.waterlevel
600 local temp = objMsg.data.temperature
601 addr_setword("@HDW20",water)
602 addr_setword("@HDW10",temp)
603 end
604
605 --Send data (data upload to platform and encapsulate it with custom functions)
606 function send_data()
607 local pub_data = {
608 timestamp = os.time(),
609 messageId = 1,
610 event = 'test_data',
611 mfrs = 'V-Box',
612 data = {
613 id = uuid(),
614 waterlevel = addr_getword("@HDW10"),
615 temperature = addr_getword("@HDW20")
616 }
617 }
618 return g_mq:publish(PUBLISH_TOPIC, json.encode(pub_data), 0, 0)
619 end
620
621
622 --main function fixed timed execution
623 function MQTT.main()
624 --dosomething
625 print(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " main start")
626 --determine the mqtt object whether exist
627 if g_mq then
628 --determine the mqtt object whether has been connected or not
629 if g_mq:isconnected() then
630 send_data()
631 else
Hunter 39.1 632 --if exceed 5 sec not connect, reconnect once
633 if os.time() - LAST_TIME > 5 then
Hunter 20.1 634 LAST_TIME = os.time()
Hunter 39.1 635 --reinitial the mqtt object
636 mqtt_init()
Hunter 20.1 637 --connect to mqtt or reconnect
638 mqtt_connect()
639 end
640 end
641 else
642 --mqtt object does not exist so create new one
643 mqtt_init()
644 end
645 print(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " main end")
646 end
647 {{/code}}
648
Theodore Xu 56.1 649 == **2.2 Customer server:grouprobotinfo.com** ==
Hunter 20.1 650
Leo Wei 1.1 651 This demo does not use SSL certification. Script is as below
652
653 Demo1:
654
Hunter 19.1 655 {{code language="lua"}}
656 -- Meta class
657 --main
Leo Wei 1.1 658 function mq.main()
Hunter 28.1 659 if not mq.m then
660 local err = ""
Leo Wei 1.1 661
Hunter 28.1 662 mq.m, err = mqtt.create("tcp://grouprobotinfo.com:1883", "ClienID") -- create connection
663 if mq.m then
664 mq.config = {
665 username = "",-- ID
666 password = "",-- password
667 netway = 1, -- Ethernet connection, WIFI=1
668 -- keepalive = 100, -- Optional, set the connection heartbeat interval for 100 seconds.
669 -- cleansession = 0, -- Optional, keep session
670 }
671 mq.m:on("message", function(topic, msg) -- Register for receiving message callbacks
672 local str = string.format("%s:%s", topic, msg)
673 -- print("mqtt msg:", str) -- Print out the received topics and content
674 end)
675 mq.m:on("offline", function (cause) -- Register for lost connection callbacks
676 -- addr_setstring("@xxx", "cause"..(cause or " got nil"))
677 end)
678 mq.m:on("arrived", function() -- Registration for sending messages to callbacks
679 print("msg arrived")
680 end)
681 else
682 print("mqtt create failed:", err) -- Create object failed
683 end
684 else
685 if mq.m:isconnected() then -- If online, post a message
686 local phaseStatus ="unknow"
687 if addr_getbit("@Standby")== 1 then
688 phaseStatus = "Standby"
689 elseif addr_getbit("@Pre-Freeze")==1 then
690 phaseStatus= "Pre-Freeze"
691 elseif addr_getbit("@Prepare")==1 then
692 phaseStatus ="Prepare"
693 elseif addr_getbit("@Primary Dry")==1 then
694 phaseStatus = "Primary dry"
695 elseif addr_getbit("@Secondary Dry")==1 then
696 phaseStatus = "Secondary Dry"
697 end
698 --print(addr_getbit("@Primary Dry"))
Hunter 19.1 699 -------------------------------------------------------------------------------------------------------------------------
Hunter 28.1 700 local activating ="unknow"
701 if addr_getbit("@Compressor")==1 then
702 activating = ",".."Compressor"
703 end
704 if addr_getbit("@Silicone Pump")==1 then
705 activating = activating..",".."Silicone Pump"
706 end
707 if addr_getbit("@Vacuum Pump")==1 then
708 activating = activating..",".."Vacuum Pump"
709 end
710 if addr_getbit("@Root Pump")==1 then
711 activating = activating..",".."Root Pump"
712 end
713 if addr_getbit("@Heater")==1 then
714 activating = activating..",".."Heater"
715 end
716 if addr_getbit("@Valve Silicone")==1 then
717 activating = activating..",".."Valve Silicone"
718 end
719 if addr_getbit("@Valve Ice Condenser")==1 then
720 activating = activating..",".."Valve Ice Condenser"
721 end
722 if addr_getbit("@Valve Vacuum Pump")==1 then
723 activating = activating..",".."Valve Vacuum Pump"
724 end
725 local pr_activating =string.sub(activating,2)
726 -- print(pr_activating)
727 local status_text ="unknow"
728 if addr_getbit("@Status Run")==1 then
729 status_text = "RUNNING"
730 else
731 status_text = "STOP"
732 end
733 -------------------------------------------------------------------------------------------------------------------------
734 local js = {type="status",
735 mc_name ="FD300",
736 status=status_text,
737 elapsed_time={
738 hour=addr_getword("@Elapsed Time (Hour)"),
739 min=addr_getword("@Elapsed Time (Minute)"),
740 sec=addr_getword("@Elapsed Time (Second)")
741 },
742 phase = phaseStatus,
743 step = addr_getword("@Step"),
744 activating_output = pr_activating,
745 sv=addr_getshort("@SV Silicone")/10,
746 pv=addr_getshort("@PV Silicone")/10,
747 product1=addr_getshort("@Product 1")/10,
Leo Wei 1.1 748
Hunter 28.1 749 product2=addr_getshort("@Product 2")/10,
750 product3=addr_getshort("@Product 3")/10,
751 product4=addr_getshort("@Product 4")/10,
752 ice1=addr_getshort("@Ice condenser 1")/10,
753 ice2=addr_getshort("@Ice condenser 2")/10,
754 vacuum=addr_getfloat("@Vacuum")
755 }
756 local jsAlarm = { HPC = addr_getbit("@B_25395#W0.00"),
757 ODPC = addr_getbit("@B_25395#W0.01"),
758 MTPC=addr_getbit("@B_25395#W0.02"),
759 HTT = addr_getbit("@B_25395#W1.03"),
760 CPC = addr_getbit("@B_25395#W0.08"),
761 CPSP =addr_getbit("@B_25395#W1.00"),
762 CPVP =addr_getbit("@B_25395#W0.10"),
763 CPRP =addr_getbit("@B_25395#W0.11"),
764 HP =addr_getbit("@B_25395#W1.01"),
765 PP= addr_getbit("@B_25395#W1.02"),
766 PO=addr_getbit("@B_25395#W0.07"),
767 FSE=addr_getbit("@B_25395#W2.04"),
768 AVVSVV=addr_getbit("@B_25395#W1.12"),
769 ICHT=addr_getbit("@B_25395#W3.06")
770 }
771 -- ("@B_25395#CIO1.02")
772 mq.m:publish("mqtt-v-box-epsilon-fd300", json.encode(js) , 0, 0)
773 mq.m:publish("mqtt-v-box-epsilon-alarm-fd300", json.encode(jsAlarm) , 0, 0)
774 else
775 local stat, err = mq.m:connect(mq.config) -- connection
776 if stat == nil then --Determine whether to connect
777 print("mqtt connect failed:", err)
778 return -- Connection failed, return directly
779 end
780 mq.m:subscribe("mqtt-v-box-epsilon", 0)-- Subscribe to topics
Hunter 19.1 781
Hunter 28.1 782 end
783 -- mq.m:unsubscribe("stc/test")
784 -- mq.m:disconnect() -- close matt
785 -- mq.m:close() -- close clase
786 end
Leo Wei 1.1 787 end
Hunter 19.1 788 {{/code}}
Leo Wei 1.1 789
Theodore Xu 56.1 790 == **2.3 Azure platform** ==
Leo Wei 1.1 791
792 In this demo,V-Box connects with Azure by SSL certification.
793
794 Video link: [[https:~~/~~/youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW>>https://youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW]]
795
796 Tool Download link: [[https:~~/~~/wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Azure/Azure%20tool.zip>>https://wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Azure/Azure%20tool.zip]]
797
798 Script is as below
799
Jim(Forgotten) 17.1 800 (% class="box infomessage" %)
801 (((
802 ~-~-https:~/~/support.huaweicloud.com/qs-IoT/iot_05_0005.html mqtt.fx monitor to connect azure iot
Leo Wei 1.1 803 sprint = print
804
Jim(Forgotten) 17.1 805 ~-~-Get custom configuration parameters (vbox custom information)
806 ~-~-local CUSTOM = bns_get_config("bind")
807 ~-~-local DS_ID = CUSTOM.DSID or "60a71ccbbbe12002c08f3a1a_WECON"
Leo Wei 1.1 808
809
Jim(Forgotten) 17.1 810 ~-~-Cloud mode interface to obtain the MQTT information configured by the cloud platform: (5 returns, namely the server address, client ID, connection table, last word table, certificate table)
Leo Wei 1.1 811 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
812
Jim(Forgotten) 17.1 813 ~-~-MQTT_CFG.username = '60a71ccbbbe12002c08f3a1a_WECON'
814 ~-~-MQTT_CFG.password='wecon123'
815 ~-~-MQTT_CLIENTID = '60a71ccbbbe12002c08f3a1a_WECON_0_0_2021052110usernxame:60a71ccbbbe12002c08f3a1a_WECONpassword:a0a951581855aa8e0262129da6cf1b43f2c0ecfac4fa56117fc5a20c90be169a'
Leo Wei 1.1 816
Jim(Forgotten) 17.1 817 ~-~-publish to topics
Leo Wei 1.1 818 local pub_RE_TOPIC = string.format('devices/wecon_02/messages/events/')
Jim(Forgotten) 17.1 819 ~-~-Subscribe topics
Leo Wei 1.1 820 local Subscribe_RE_TOPIC1 = string.format('devices/wecon_02/messages/devicebound/#')
821
Jim(Forgotten) 17.1 822 ~-~-variable
Leo Wei 1.1 823 local last_time = 0
824
825
Jim(Forgotten) 17.1 826 ~-~-Timing main function
Leo Wei 1.1 827 function Azure.main()
828
Jim(Forgotten) 17.1 829 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main start")
830 if g_mq then
831 if g_mq:isconnected() then
832 send_Data()
833 else
834 if os.time() - last_time > 20 then
835 last_time = os.time()
836 mymqtt_connect()
837 end
838 end
839 else
840 mymqtt_init()
841 end
842 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main end")
Leo Wei 1.1 843 end
844
Jim(Forgotten) 17.1 845 ~-~- Initialize MQTT
Leo Wei 1.1 846 function mymqtt_init()
Jim(Forgotten) 17.1 847 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
848 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
849 if g_mq then
850 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
851 sprint("mqtt init success")
852 else
853 sprint("mqtt init failed:", err)
854 end
Leo Wei 1.1 855 end
856
Jim(Forgotten) 17.1 857 ~-~- Connect to MQTT server
Leo Wei 1.1 858 function mymqtt_connect()
Jim(Forgotten) 17.1 859 sprint("mqtt connecting...")
860 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
861 if stat == nil then
862 sprint("mqtt connect failed:", err)
863 return
864 else
865 sprint("mqtt connected")
866 end
867 g_mq:subscribe(Subscribe_RE_TOPIC1, 0) 
Leo Wei 1.1 868 end
869
Jim(Forgotten) 17.1 870 ~-~- Receive MQTT message callback function
Leo Wei 1.1 871 function mymqtt_msg_callback(topic, msg)
Jim(Forgotten) 17.1 872 print("topic:",topic)
873 print("revdata:",msg)
874 ~-~- local revData = json.decode(msg)
875 ~-~- if topic == Subscribe_RE_TOPIC1 then ~-~-Process topic information subscribed from the cloud
876 ~-~- if string.match(topic,Subscribe_RE_TOPIC1) then
877 ~-~- print("topi11:",topic)
878 setValue(revData)
879 ~-~- end
Leo Wei 1.1 880 end
881
Jim(Forgotten) 17.1 882 ~-~-Process the received data
883 ~-~-function setValue(revData)
884 ~-~- if revData ~~=nil then 
885 ~-~- for i,v in pairs(revData) do
886 ~-~- print("Data received:",i,v)
887 ~-~- end
888 ~-~- end
889 ~-~-end
Leo Wei 1.1 890
Jim(Forgotten) 17.1 891 ~-~-Get real-time data
Leo Wei 1.1 892 function getData()
Jim(Forgotten) 17.1 893 local jdata = {}
894 local addr = bns_get_alldata()
895 print(json.encode(addr))
896 for i,v in pairs(addr) do
897 if v[2] == 1 then
898 jdata[v[3]] = v[4]
899 end
900 end
901 return jdata
902 end
Leo Wei 1.1 903
904
Jim(Forgotten) 17.1 905 ~-~-send data
Leo Wei 1.1 906 function send_Data()
Jim(Forgotten) 17.1 907 local pub_data = {100
908 ~-~- services=~{~{
909 \\ ~-~-serviceId ='Temperature',
910 ~-~- properties={
911 ~-~- value = 55
912 ~-~- },
913 ~-~- }}
Leo Wei 1.1 914 }
915 sprint(json.encode(pub_data))
916 print("..........",pub_RE_TOPIC)
Jim(Forgotten) 17.1 917 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
Leo Wei 1.1 918 end
Jim(Forgotten) 17.1 919 )))
Leo Wei 12.2 920
Theodore Xu 56.1 921 == **2.4 Huawei platform** ==
Leo Wei 1.1 922
Theodore Xu 56.1 923 {{info}}
924 **✎Note**:**Huawei IOT DA function is only in China area.If you want this function,you need to use chinese mobile to register**
925 {{/info}}
926
Leo Wei 1.1 927 1.Register a account: [[https:~~/~~/www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ>>https://www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ]]
928
929 2.log in the Huawei IOTDA
930
931 [[https:~~/~~/console.huaweicloud.com/iotdm/?region=cn-north-4&locale=en-us#/dm-portal/home>>https://console.huaweicloud.com/iotdm/?region=cn-north-4&locale=en-us#/dm-portal/home]]
932
933 3.Create product
934
935 (% style="text-align:center" %)
Hunter 5.1 936 [[image:1624433478954-859.png||height="497" width="1100" class="img-thumbnail"]]
Leo Wei 1.1 937
938 4.Product name,manufacturer,device type and industry,set according to your own needs.
939
940 Protocol: MQTT
941
942 Data Type: JSON
943
944 After finishing configuration,please click "OK"
945
946 (% style="text-align:center" %)
Hunter 5.1 947 [[image:1624433531968-337.png||height="568" width="700" class="img-thumbnail"]]
Leo Wei 1.1 948
949 5.Device
950
951 After product register,continue to configure "individual register".Click "Device"~-~->"individual register"
952
953 (% style="text-align:center" %)
954 [[image:1624434757597-117.png||class="img-thumbnail"]]
955
956 **Notes for registering device:**
957
958 Product: Previous product registration.
959
960 Node ID, Device Name: set according to your own needs.
961
962 Secret: need to be configured, will be used when connecting later
963
964 After configuration, click OK to generate a device ID and password, which will be used for device access later.
965
966 (% style="text-align:center" %)
Hunter 5.1 967 [[image:1624436421499-613.png||height="499" width="700" class="img-thumbnail"]]
Leo Wei 1.1 968
969 (% style="text-align:center" %)
Hunter 5.1 970 [[image:1624437798012-126.png||height="366" width="500" class="img-thumbnail"]]
Leo Wei 1.1 971
972 6. Connection authentication (use MQTT.fx tool to access the IoT platform)
973
974 (1)Open mqttClientIdGenerator tool Java(TM) Platform SE binary
975
976 **[[Download>>https://wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Huawei/mqttClientIdGenerator-19.2.0.zip]]**
977
978 (% style="text-align:center" %)
Hunter 5.1 979 [[image:1624437573798-815.png||height="351" width="700" class="img-thumbnail"]]
Leo Wei 1.1 980
981 (2)Fill in the device ID and secret (deviceid and secret generated when registering the device) to generate connection message
982
983 Client ID, user name, password
984
985 (% style="text-align:center" %)
Hunter 5.1 986 [[image:1624437756866-251.png||height="405" width="700" class="img-thumbnail"]]
Leo Wei 1.1 987
988 (3) Download certificate file"North-Beijing4"
989
990 [[https:~~/~~/support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html>>https://support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html]]
991
992 (% style="text-align:center" %)
Hunter 5.1 993 [[image:1624438225398-363.png||height="403" width="800" class="img-thumbnail"]]
Leo Wei 1.1 994
995 (% style="text-align:center" %)
Hunter 5.1 996 [[image:1624438260025-610.png||height="408" width="700" class="img-thumbnail"]]
Leo Wei 1.1 997
998 7.Run MQTTfx tool to connect with Huawei
999
1000 Download link: [[http:~~/~~/mqttfx.jensd.de/index.php/download>>url:http://mqttfx.jensd.de/index.php/download]]
1001
1002 (1)Click on the setting ICON
1003
1004 (% style="text-align:center" %)
Hunter 5.1 1005 [[image:1624438821280-974.png||height="198" width="500" class="img-thumbnail"]]
Leo Wei 1.1 1006
1007 (2)Fill in IIOT MQTT device access address, and configure authentication parameters.
1008 First: It is the server and port connected to Huawei IOT, which can be viewed through the overview of the interface.
1009
1010 (% style="text-align:center" %)
1011 [[image:1624439086268-985.png||class="img-thumbnail"]]
1012
1013 Domain name:iot-mqtts.cn-north-4.myhuaweicloud.com
1014
1015 Port: 8883
1016
1017 Client ID: check step 6
1018
1019 (% style="text-align:center" %)
Hunter 5.1 1020 [[image:1624439672168-492.png||height="458" width="600" class="img-thumbnail"]]
Leo Wei 1.1 1021
1022 (3)Upload SSL certificate file,check step 6
1023
1024 Select folder java~-~->DigiCertGlobalRootCA.crt.pem and click OK or apply button
1025
1026 (% style="text-align:center" %)
Hunter 5.1 1027 [[image:1624439912938-659.png||height="458" width="600" class="img-thumbnail"]]
Leo Wei 1.1 1028
1029 (4)Connect and test publish and subscribe
1030
1031 (% style="text-align:center" %)
Hunter 5.1 1032 [[image:1624440014872-688.png||height="232" width="700" class="img-thumbnail"]]
Leo Wei 1.1 1033
1034 (% style="text-align:center" %)
Hunter 5.1 1035 [[image:1624440026937-386.png||height="215" width="700" class="img-thumbnail"]]
Leo Wei 1.1 1036
1037 Huawei publish topic format: $oc/devices/{device_id}/sys/properties/report
1038
1039 (% style="text-align:center" %)
1040 [[image:1624440404119-815.png||class="img-thumbnail"]]
1041
1042 Huawei subscribe topic format: **$oc/devices/{device_id}/sys/commands/#**
1043
1044 (% style="text-align:center" %)
1045 [[image:1624447157493-672.png||class="img-thumbnail"]]
1046
1047 (% style="text-align:center" %)
1048 [[image:1624447209982-715.png||class="img-thumbnail"]]
1049
1050 (5).How to configure to view the received data format intuitively, multiple products (Huawei) are required to configure the model. The specific steps are as follows:
1051 ①Select the corresponding product from Huawei products to view
1052
1053 (% style="text-align:center" %)
1054 [[image:1624440647663-632.png||class="img-thumbnail"]]
1055
1056 ②Custom model: used to display the service ID name of the configuration report.
1057
1058 (% style="text-align:center" %)
Hunter 5.1 1059 [[image:1624440793982-974.png||height="410" width="700" class="img-thumbnail"]]
Leo Wei 1.1 1060
1061 (% style="text-align:center" %)
Hunter 5.1 1062 [[image:1624440883015-105.png||height="370" width="600" class="img-thumbnail"]]
Leo Wei 1.1 1063
1064 ③Add property, ID of monitoring point, and data format:
1065
1066 (% style="text-align:center" %)
Hunter 5.1 1067 [[image:1624441052296-108.png||height="477" width="600" class="img-thumbnail"]]
Leo Wei 1.1 1068
1069 ④After the configuration is complete, check the received data on the device
1070
1071 (% style="text-align:center" %)
Hunter 5.1 1072 [[image:1624441186851-536.png||height="434" width="700" class="img-thumbnail"]]
Leo Wei 1.1 1073
Theodore Xu 59.1 1074 === Huawei by SSL certification. ===
Leo Wei 1.1 1075
1076 1.Create a project access for Huawei IOT
1077
1078 2.configure MQTT configuration
1079
1080 (% style="text-align:center" %)
Hunter 5.1 1081 [[image:1624506363847-661.png||height="507" width="1000" class="img-thumbnail"]]
Leo Wei 1.1 1082
1083 3.Create a script with the demo as below.
1084
1085 Script is as below
1086
1087 (% class="box infomessage" %)
1088 (((
1089 (% class="box infomessage" %)
1090 (((
1091 ~-~- mqtt.fx simulated access to Huawei Cloud IoT platform refer to 2.4
1092 sprint = print
1093
1094 ~-~-Get custom configuration parameters (gateway customization information)
1095 local CUSTOM = bns_get_config("bind")
1096 local DS_ID = CUSTOM.DSID or "5dfa0700df1ae506179afb9c_wecon"
1097
1098
1099 ~-~-OpenCloud mode interface, obtain MQTT information configured on cloud platform: (5 returned, respectively server address, client ID, connection table, last word table, certificate table)
1100 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
1101
1102 MQTT_CFG.username =DS_ID
1103 MQTT_CFG.password='d030d92338fcc18cd10fabb3003a4a0f6620fa6822cd3c23b1d9bc790200c6e7'
1104 MQTT_CLIENTID = '5dfa0700df1ae506179afb9c_wecon_0_0_2019121819'
1105
1106 ~-~-publish topic format:$oc/devices/{device id}/sys/properties/report
1107
1108 local pub_RE_TOPIC = string.format('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/properties/report')
1109
1110 ~-~-variate
1111 local last_time = 0
1112
1113
1114 ~-~-Timing principal function
1115 function hwyiot.main()
1116
1117 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main start")
1118 if g_mq then
1119 if g_mq:isconnected() then
1120 send_Data()
1121 else
1122 if os.time() - last_time > 20 then
1123 last_time = os.time()
1124 mymqtt_connect()
1125 end
1126 end
1127 else
1128 mymqtt_init()
1129 end
1130 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main end")
1131 end
1132
1133 ~-~- initializationMQTT
1134 function mymqtt_init()
1135 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
1136 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
1137 if g_mq then
1138 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
1139 sprint("mqtt init success")
1140 else
1141 sprint("mqtt init failed:", err)
1142 end
1143 end
1144
1145 ~-~- Connect to the MQTT server
1146 function mymqtt_connect()
1147 sprint("mqtt connecting...")
1148 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
1149 if stat == nil then
1150 sprint("mqtt connect failed:", err)
1151 return
1152 else
1153 sprint("mqtt connected")
1154 end
1155
1156 ~-~-subscribe topic format:$oc/devices/{device_id}/sys/commands/#
1157
1158 g_mq:subscribe('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/commands/#', 0) 
1159 end
1160
1161 ~-~- Receive the message callback function
1162 function mymqtt_msg_callback(topic, msg)
1163 sprint("recv data!")
1164 sprint("topic:msg", topic,msg)
1165 print(msg)
1166 local revData = json.decode(msg)
1167 \\end
1168
1169 ~-~-Send data
1170 function send_Data()
1171 local pub_data = {
1172 msgType = 'deviceReq',
1173 data = ~{~{
1174 serviceId ='Battery',
1175 serviceData={
1176 batteryLevel = 55
1177 }
1178 }}
1179 }
1180 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
1181 end
1182 )))
1183 )))
1184
1185 4.Download project access into V-Box to test in debug page
1186
1187 (% style="text-align:center" %)
Hunter 5.1 1188 [[image:1624506710354-406.png||height="658" width="1000" class="img-thumbnail"]]
Leo Wei 1.1 1189
1190 (% style="text-align:center" %)
Hunter 5.1 1191 [[image:1624506666650-161.png||height="547" width="1000" class="img-thumbnail"]]
Leo Wei 1.1 1192
Theodore Xu 56.1 1193 == **2.6 AWS platform** ==
Leo Wei 1.1 1194
Jim(Forgotten) 6.1 1195 === **Log in AWS** ===
1196
1197 Login aws account and click“Connect an IoT device”
1198
Jim(Forgotten) 11.1 1199 [[image:image-20220709165402-1.png]]
Jim(Forgotten) 6.1 1200
Jim(Forgotten) 11.1 1201 [[image:image-20220709165402-2.png]]
Jim(Forgotten) 6.1 1202
Jim(Forgotten) 11.1 1203
Jim(Forgotten) 6.1 1204 === **Create policy** ===
1205
1206 Click “Secure”~-~-->“Policies”~-~-->“Create policy”~-~-->Click “Create”
1207
Jim(Forgotten) 11.1 1208 [[image:image-20220709165402-3.png]]
Jim(Forgotten) 6.1 1209
1210 Name the policy~-~-->Click “JSON”~-~-->Copy the following content~-~-->Click “Create”
1211
Jim(Forgotten) 11.1 1212 [[image:image-20220709165402-5.png]]
Jim(Forgotten) 6.1 1213
Jim(Forgotten) 11.1 1214 [[image:image-20220709165402-4.png]]
Jim(Forgotten) 6.1 1215
Jim(Forgotten) 12.1 1216 {{code language="java"}}
Jim(Forgotten) 6.1 1217 {
Jim(Forgotten) 11.1 1218   "Version": "2012-10-17",
1219   "Statement": [
1220     {
1221       "Effect": "Allow",
1222       "Action": [
1223         "iot:Connect",
1224         "iot:Publish",
1225         "iot:Subscribe",
1226         "iot:Receive",
1227         "greengrass:Discover"
1228       ],
1229       "Resource": "*"
1230     }
1231   ]
Jim(Forgotten) 6.1 1232 }
Jim(Forgotten) 11.1 1233 {{/code}}
Jim(Forgotten) 6.1 1234
Jim(Forgotten) 17.1 1235 === **Create things** ===
Jim(Forgotten) 6.1 1236
1237 Click “Manage”~-~-->“Things”~-~-->“Create things”~-~-->“Create single thing”
1238
Jim(Forgotten) 17.1 1239 [[image:image-20220709165402-6.png]]
Jim(Forgotten) 6.1 1240
Jim(Forgotten) 17.1 1241 [[image:image-20220709165402-7.png]]
Jim(Forgotten) 6.1 1242
1243 Name the thing~-~-->Click “Next”
1244
Jim(Forgotten) 17.1 1245 [[image:image-20220709165402-8.png]]
Jim(Forgotten) 6.1 1246
1247 Select the way to create certificate
1248
Jim(Forgotten) 17.1 1249 [[image:image-20220709165402-9.png]]
Jim(Forgotten) 6.1 1250
1251 Select policy
1252
Jim(Forgotten) 17.1 1253 [[image:image-20220709165402-10.png]]
Jim(Forgotten) 6.1 1254
Jim(Forgotten) 17.1 1255 [[image:image-20220709165402-11.png]]
Jim(Forgotten) 6.1 1256
1257
Theodore Xu 56.1 1258 === **MQTT.fx tool** ===
Jim(Forgotten) 6.1 1259
1260 Click “View Setting” to get the “Broker Adress”
1261
Jim(Forgotten) 17.1 1262 [[image:image-20220709165402-13.png]]
Jim(Forgotten) 6.1 1263
Jim(Forgotten) 17.1 1264 [[image:image-20220709165402-12.png]]
Jim(Forgotten) 6.1 1265
Jim(Forgotten) 17.1 1266 Create one connection in MQTT.fx tool, set broker port as 8883.
Jim(Forgotten) 6.1 1267
Jim(Forgotten) 17.1 1268 [[image:image-20220709165402-14.png]]
Jim(Forgotten) 11.1 1269
Jim(Forgotten) 6.1 1270 Upload the CA File, Client Certificate File, Client Key File
1271
Jim(Forgotten) 17.1 1272 [[image:image-20220709165402-15.png]]
Jim(Forgotten) 6.1 1273
1274 Publish message to topic “TEST”
1275
Jim(Forgotten) 17.1 1276 [[image:image-20220709165402-17.png]]
Jim(Forgotten) 6.1 1277
Jim(Forgotten) 17.1 1278 Click”Test”~-~-->”MQTT test client”~-~-->”Subscrible to a topic”, to get message publish from MQTT.fx tool.
Jim(Forgotten) 6.1 1279
Jim(Forgotten) 17.1 1280 [[image:image-20220709173500-1.png]]
Jim(Forgotten) 6.1 1281
1282 And we can also send message form AWS platform to MQTT.fx tool.
1283
Jim(Forgotten) 17.1 1284 [[image:image-20220709165402-18.png]]
Jim(Forgotten) 6.1 1285
Theodore Xu 56.1 1286 === **CloudTool** ===
Jim(Forgotten) 6.1 1287
1288 Copy the same setting in MQTT.fx to MQTT configuration
1289
Jim(Forgotten) 17.1 1290 [[image:image-20220709165402-19.png]]
Jim(Forgotten) 6.1 1291
1292 Add a lua script and copy the lua demo into it.
1293
Jim(Forgotten) 17.1 1294 [[image:image-20220709165402-20.png]]
Jim(Forgotten) 6.1 1295
Hunter 37.1 1296 {{info}}
1297 **✎Note:** Before using the following demo script, please make sure the V-Box firmware is newer than 22110701
1298 {{/info}}
Hunter 36.1 1299
Hunter 33.1 1300 {{code language="lua"}}
Jim(Forgotten) 6.1 1301 sprint = print
1302
Hunter 33.1 1303 --Cloud mode interface to obtain the MQTT information configured by the cloud platform: (5 returns, namely the server address, client ID, connection table, last word table, certificate table)
Jim(Forgotten) 6.1 1304
1305 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
1306
Hunter 33.1 1307 --publish to topics
Jim(Forgotten) 6.1 1308
1309 local pub_RE_TOPIC = string.format('TEST')
1310
Hunter 33.1 1311 --Subscribe topics
Jim(Forgotten) 6.1 1312
1313 local Subscribe_RE_TOPIC1 = string.format('TEST')
1314
Hunter 33.1 1315 --variable
Jim(Forgotten) 6.1 1316
1317 local last_time = 0
1318
Hunter 33.1 1319 --Timing main function
Jim(Forgotten) 6.1 1320
1321 function aws.main()
1322
Hunter 33.1 1323 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main start")
Jim(Forgotten) 6.1 1324
Hunter 33.1 1325 if g_mq then
Jim(Forgotten) 6.1 1326
Hunter 33.1 1327 if g_mq:isconnected() then
Jim(Forgotten) 6.1 1328
Hunter 33.1 1329 send_Data()
Jim(Forgotten) 6.1 1330
Hunter 33.1 1331 else
Jim(Forgotten) 6.1 1332
Hunter 33.1 1333 if os.time() - last_time > 5 then
Jim(Forgotten) 6.1 1334
Hunter 33.1 1335 last_time = os.time()
Jim(Forgotten) 6.1 1336
Hunter 33.1 1337 mymqtt_connect()
Jim(Forgotten) 6.1 1338
Hunter 33.1 1339 end
1340
Jim(Forgotten) 6.1 1341 end
1342
Hunter 33.1 1343 else
Jim(Forgotten) 6.1 1344
Hunter 33.1 1345 mymqtt_init()
Jim(Forgotten) 6.1 1346
Hunter 33.1 1347 end
Jim(Forgotten) 6.1 1348
Hunter 33.1 1349 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main end")
Jim(Forgotten) 6.1 1350
1351 end
1352
1353
1354
Hunter 33.1 1355 -- Initialize MQTT
1356
Jim(Forgotten) 6.1 1357 function mymqtt_init()
1358
Hunter 33.1 1359 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
Jim(Forgotten) 6.1 1360
Hunter 35.1 1361 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID, 1) -- Create the object and declare it as a global variable, 1 means using the domain to connect
Jim(Forgotten) 6.1 1362
Hunter 33.1 1363 if g_mq then
Jim(Forgotten) 6.1 1364
Hunter 33.1 1365 g_mq:on("message", mymqtt_msg_callback) -- Register to receive message callbacks
Jim(Forgotten) 6.1 1366
Hunter 33.1 1367 sprint("mqtt init success")
Jim(Forgotten) 6.1 1368
Hunter 33.1 1369 else
Jim(Forgotten) 6.1 1370
Hunter 33.1 1371 sprint("mqtt init failed:", err)
Jim(Forgotten) 6.1 1372
Hunter 33.1 1373 end
Jim(Forgotten) 6.1 1374
1375 end
1376
Hunter 33.1 1377 -- Connect to MQTT server
Jim(Forgotten) 6.1 1378
1379 function mymqtt_connect()
1380
Hunter 33.1 1381 sprint("mqtt connecting...")
Jim(Forgotten) 6.1 1382
Hunter 33.1 1383 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
Jim(Forgotten) 6.1 1384
Hunter 33.1 1385 if stat == nil then
Jim(Forgotten) 6.1 1386
Hunter 33.1 1387 sprint("mqtt connect failed:", err)
Jim(Forgotten) 6.1 1388
Hunter 33.1 1389 return
Jim(Forgotten) 6.1 1390
Hunter 33.1 1391 else
Jim(Forgotten) 6.1 1392
Hunter 33.1 1393 sprint("mqtt connected")
Jim(Forgotten) 6.1 1394
Hunter 33.1 1395 end
Jim(Forgotten) 6.1 1396
Hunter 34.1 1397 g_mq:subscribe(Subscribe_RE_TOPIC1, 0)
Jim(Forgotten) 6.1 1398
1399 end
1400
Hunter 33.1 1401 -- Receive MQTT message callback function
Jim(Forgotten) 6.1 1402
1403 function mymqtt_msg_callback(topic, msg)
1404
Hunter 33.1 1405 print("topic:",topic)
Jim(Forgotten) 6.1 1406
Hunter 33.1 1407 print("revdata:",msg)
Jim(Forgotten) 6.1 1408
Hunter 33.1 1409 local revData = json.decode(msg)
Jim(Forgotten) 6.1 1410
Hunter 33.1 1411 print (revData)
Jim(Forgotten) 6.1 1412
Hunter 33.1 1413 if topic == Subscribe_RE_TOPIC1 then --Process topic information subscribed from the cloud
Jim(Forgotten) 6.1 1414
Hunter 33.1 1415 if string.match(topic,Subscribe_RE_TOPIC1) then
Jim(Forgotten) 6.1 1416
Hunter 33.1 1417 --if revData ~= nil then
Jim(Forgotten) 6.1 1418
Hunter 33.1 1419 for k,v in pairs (revData) do
Jim(Forgotten) 6.1 1420
Hunter 33.1 1421 print("printing revdata after kv here")
Jim(Forgotten) 6.1 1422
Hunter 33.1 1423 print (k,v)
Jim(Forgotten) 6.1 1424
Hunter 33.1 1425 end
Jim(Forgotten) 6.1 1426
Hunter 33.1 1427 print ("current state is",fanstate)
Jim(Forgotten) 6.1 1428
Hunter 33.1 1429 --end
Jim(Forgotten) 6.1 1430
Hunter 33.1 1431 end
Jim(Forgotten) 6.1 1432
Hunter 33.1 1433 end
Jim(Forgotten) 6.1 1434
1435 end
1436
1437
1438
Hunter 33.1 1439 --Get real-time data
1440
Jim(Forgotten) 6.1 1441 function getData()
1442
Hunter 33.1 1443 local jdata = {}
Jim(Forgotten) 6.1 1444
Hunter 33.1 1445 local addr = bns_get_alldata()
Jim(Forgotten) 6.1 1446
Hunter 33.1 1447 print(json.encode(addr))
Jim(Forgotten) 6.1 1448
Hunter 33.1 1449 for i,v in pairs(addr) do
Jim(Forgotten) 6.1 1450
Hunter 33.1 1451 if v[2] == 1 then
Jim(Forgotten) 6.1 1452
Hunter 33.1 1453 jdata[v[3]] = v[4]
Jim(Forgotten) 6.1 1454
Hunter 33.1 1455 end
Jim(Forgotten) 6.1 1456
Hunter 33.1 1457 end
Jim(Forgotten) 6.1 1458
Hunter 33.1 1459 return jdata
Jim(Forgotten) 6.1 1460
1461 end
1462
Hunter 33.1 1463 --send data
Jim(Forgotten) 6.1 1464
1465 function send_Data()
1466
Hunter 33.1 1467 local pub_data =
1468 {
1469 123
1470 }
Jim(Forgotten) 6.1 1471
1472 sprint(json.encode(pub_data))
1473
1474 print("..........",pub_RE_TOPIC)
1475
Hunter 33.1 1476 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
Jim(Forgotten) 6.1 1477
1478 end
Hunter 33.1 1479 {{/code}}
Jim(Forgotten) 6.1 1480
1481 Get message in AWS
1482
Jim(Forgotten) 17.1 1483 [[image:image-20220709165402-21.png]]