Wiki source code of 2 Script

Version 52.1 by Hunter on 2023/06/07 15:45

Show last authors
1 = **1 General Script Demo** =
2
3 == **1.1 Address Operation:Write/Read data from address A to B** ==
4
5 (((
6 For example:transfer D2 to D0
7 )))
8
9 (% style="text-align:center" %)
10 [[image:1624245865976-320.png||height="182" width="1000" class="img-thumbnail"]]
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
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]]
17
18 == **1.2 Arithmetic** ==
19
20 (% style="text-align:center" %)
21 [[image:1624249623612-177.png||height="337" width="400" class="img-thumbnail"]]
22
23 == **1.3 Set 100 to D0~-~-D19** ==
24
25 (% style="text-align:center" %)
26 [[image:1624249693457-742.png||height="135" width="400" class="img-thumbnail"]]
27
28 == **1.4 Short message** ==
29
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.
31
32 When the alarm condition is released,then send an  "alarm release" sms. Script is as below:
33
34 {{code language="lua"}}
35 function sms.main()
36 ------send condition------
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")
42 ------lasting time------
43 if temp1 > 5 and temp2 > 10 and temp3 < 20 then
44 timer = timer + 1
45 addr_setword("@Timer",timer)
46 else
47 timer = 0
48 addr_setword("@Timer",timer)
49 end
50 ------send sms & output Y0------
51 if timer > 5 then
52 if tag == 0 then
53 send_sms_ira("19859254700","alarm trigger")
54 addr_setbit("@Tag",1)
55 end
56 elseif tag == 1 then
57 send_sms_ira("19859254700","alarm release")
58 addr_setbit("@Tag",0)
59 end
60 end
61 {{/code}}
62
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
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
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
138 == **1.6 LINE Notify** ==
139
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
142 {{code language="lua"}}
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
217 == **1.7 Twilio WhatsApp Messaging** ==
218
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.
220
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
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
233 local SID = 'AC1703bd710ffa98006d2bcc0b********'
234 local Token = 'd3c11897623c39e538b20263ec19****'
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
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" %)
400 So we decode json into lua object to assign the value into addresses HDW6060(temperature), HDW7070(humidity), the code example like follows:
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
444 == **1.9 High-Low Byte Switch** ==
445
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"]].
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
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
475 = **2 V-Box connect with third part server** =
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
493 {{info}}
494 **✎Note: **Before program the script of MQTT, please make sure the server(MQTT broker) can be connected through MQTT Client tool.
495 {{/info}}
496
497 (% class="wikigeneratedid" %)
498 Tool link: **[[MQTT.fx>>http://mqttfx.jensd.de/index.php/download]]**
499
500 == **2.1 V-Box connect with test server(General Example)** ==
501
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
521 {{code language="lua"}}
522 --MQTT configuration table
523 local MQTT_CFG={}
524 MQTT_CFG.username = "weconsupport"
525 MQTT_CFG.password = "123456"
526 MQTT_CFG.netway = 0
527 MQTT_CFG.keepalive = 60
528 MQTT_CFG.cleansession = 1
529 --TCP URL
530 MQTT_URL = "tcp://mq.tongxinmao.com:1883"
531 --Client ID
532 MQTT_CLIENT_ID = "V-BOXH-AG"
533
534 --Generate UUID
535 function uuid()
536 local seed = {'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
537 local tb = {}
538 for i=1, 32 do
539 table.insert(tb, seed[math.random(1,16)])
540 end
541 local sid=table.concat(tb)
542 return string.format('%s',
543 string.sub(sid,1,32)
544 )
545 end
546
547
548 --Topic name to subscribed
549 local SUBSCRIBE_TOPIC = 'testtopic/test/no1/123456'
550
551 --Topic name to be published
552 local PUBLISH_TOPIC = 'testtopic/test/no1/7890'
553
554
555 --real time
556 local LAST_TIME = 0
557
558
559 --initialize mqtt
560 function mqtt_init()
561 print(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENT_ID))
562 if g_mq then
563 mqtt.close(g_mq) --Close mqtt object
564 end
565 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENT_ID) -- create mqtt object,and declare it as a global variable
566 if g_mq then
567 g_mq:on("message", mqtt_msg_callback) -- Register a callback for receiving messages
568 g_mq:on("offline", mqtt_msg_offline) -- Register a callback for offline
569 print("mqtt init success")
570 else
571 print("mqtt init failed:", err)
572 end
573 end
574
575 -- connect to mqtt
576 function mqtt_connect()
577 print("mqtt connecting...")
578 local stat, err = g_mq:connect(MQTT_CFG)
579 if stat == nil then
580 print("mqtt connect failed:", err)
581 return
582 else
583 print("mqtt connected")
584 end
585 g_mq:subscribe(SUBSCRIBE_TOPIC, 0)
586 end
587
588 --Offline callback function
589 function mqtt_msg_offline(cause)
590 print("mqtt offline, cause:", cause)
591 end
592
593 -- Received message callback function
594 function mqtt_msg_callback(topic, msg)
595 print("topic:", topic)
596 print("msg:", msg)
597 local objMsg = json.decode(msg)
598 local water = objMsg.data.waterlevel
599 local temp = objMsg.data.temperature
600 addr_setword("@HDW20",water)
601 addr_setword("@HDW10",temp)
602 end
603
604 --Send data (data upload to platform and encapsulate it with custom functions)
605 function send_data()
606 local pub_data = {
607 timestamp = os.time(),
608 messageId = 1,
609 event = 'test_data',
610 mfrs = 'V-Box',
611 data = {
612 id = uuid(),
613 waterlevel = addr_getword("@HDW10"),
614 temperature = addr_getword("@HDW20")
615 }
616 }
617 return g_mq:publish(PUBLISH_TOPIC, json.encode(pub_data), 0, 0)
618 end
619
620
621 --main function fixed timed execution
622 function MQTT.main()
623 --dosomething
624 print(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " main start")
625 --determine the mqtt object whether exist
626 if g_mq then
627 --determine the mqtt object whether has been connected or not
628 if g_mq:isconnected() then
629 send_data()
630 else
631 --if exceed 5 sec not connect, reconnect once
632 if os.time() - LAST_TIME > 5 then
633 LAST_TIME = os.time()
634 --reinitial the mqtt object
635 mqtt_init()
636 --connect to mqtt or reconnect
637 mqtt_connect()
638 end
639 end
640 else
641 --mqtt object does not exist so create new one
642 mqtt_init()
643 end
644 print(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " main end")
645 end
646 {{/code}}
647
648 == **2.2 V-Box connect with customer server:grouprobotinfo.com** ==
649
650 This demo does not use SSL certification. Script is as below
651
652 Demo1:
653
654 {{code language="lua"}}
655 -- Meta class
656 --main
657 function mq.main()
658 if not mq.m then
659 local err = ""
660
661 mq.m, err = mqtt.create("tcp://grouprobotinfo.com:1883", "ClienID") -- create connection
662 if mq.m then
663 mq.config = {
664 username = "",-- ID
665 password = "",-- password
666 netway = 1, -- Ethernet connection, WIFI=1
667 -- keepalive = 100, -- Optional, set the connection heartbeat interval for 100 seconds.
668 -- cleansession = 0, -- Optional, keep session
669 }
670 mq.m:on("message", function(topic, msg) -- Register for receiving message callbacks
671 local str = string.format("%s:%s", topic, msg)
672 -- print("mqtt msg:", str) -- Print out the received topics and content
673 end)
674 mq.m:on("offline", function (cause) -- Register for lost connection callbacks
675 -- addr_setstring("@xxx", "cause"..(cause or " got nil"))
676 end)
677 mq.m:on("arrived", function() -- Registration for sending messages to callbacks
678 print("msg arrived")
679 end)
680 else
681 print("mqtt create failed:", err) -- Create object failed
682 end
683 else
684 if mq.m:isconnected() then -- If online, post a message
685 local phaseStatus ="unknow"
686 if addr_getbit("@Standby")== 1 then
687 phaseStatus = "Standby"
688 elseif addr_getbit("@Pre-Freeze")==1 then
689 phaseStatus= "Pre-Freeze"
690 elseif addr_getbit("@Prepare")==1 then
691 phaseStatus ="Prepare"
692 elseif addr_getbit("@Primary Dry")==1 then
693 phaseStatus = "Primary dry"
694 elseif addr_getbit("@Secondary Dry")==1 then
695 phaseStatus = "Secondary Dry"
696 end
697 --print(addr_getbit("@Primary Dry"))
698 -------------------------------------------------------------------------------------------------------------------------
699 local activating ="unknow"
700 if addr_getbit("@Compressor")==1 then
701 activating = ",".."Compressor"
702 end
703 if addr_getbit("@Silicone Pump")==1 then
704 activating = activating..",".."Silicone Pump"
705 end
706 if addr_getbit("@Vacuum Pump")==1 then
707 activating = activating..",".."Vacuum Pump"
708 end
709 if addr_getbit("@Root Pump")==1 then
710 activating = activating..",".."Root Pump"
711 end
712 if addr_getbit("@Heater")==1 then
713 activating = activating..",".."Heater"
714 end
715 if addr_getbit("@Valve Silicone")==1 then
716 activating = activating..",".."Valve Silicone"
717 end
718 if addr_getbit("@Valve Ice Condenser")==1 then
719 activating = activating..",".."Valve Ice Condenser"
720 end
721 if addr_getbit("@Valve Vacuum Pump")==1 then
722 activating = activating..",".."Valve Vacuum Pump"
723 end
724 local pr_activating =string.sub(activating,2)
725 -- print(pr_activating)
726 local status_text ="unknow"
727 if addr_getbit("@Status Run")==1 then
728 status_text = "RUNNING"
729 else
730 status_text = "STOP"
731 end
732 -------------------------------------------------------------------------------------------------------------------------
733 local js = {type="status",
734 mc_name ="FD300",
735 status=status_text,
736 elapsed_time={
737 hour=addr_getword("@Elapsed Time (Hour)"),
738 min=addr_getword("@Elapsed Time (Minute)"),
739 sec=addr_getword("@Elapsed Time (Second)")
740 },
741 phase = phaseStatus,
742 step = addr_getword("@Step"),
743 activating_output = pr_activating,
744 sv=addr_getshort("@SV Silicone")/10,
745 pv=addr_getshort("@PV Silicone")/10,
746 product1=addr_getshort("@Product 1")/10,
747
748 product2=addr_getshort("@Product 2")/10,
749 product3=addr_getshort("@Product 3")/10,
750 product4=addr_getshort("@Product 4")/10,
751 ice1=addr_getshort("@Ice condenser 1")/10,
752 ice2=addr_getshort("@Ice condenser 2")/10,
753 vacuum=addr_getfloat("@Vacuum")
754 }
755 local jsAlarm = { HPC = addr_getbit("@B_25395#W0.00"),
756 ODPC = addr_getbit("@B_25395#W0.01"),
757 MTPC=addr_getbit("@B_25395#W0.02"),
758 HTT = addr_getbit("@B_25395#W1.03"),
759 CPC = addr_getbit("@B_25395#W0.08"),
760 CPSP =addr_getbit("@B_25395#W1.00"),
761 CPVP =addr_getbit("@B_25395#W0.10"),
762 CPRP =addr_getbit("@B_25395#W0.11"),
763 HP =addr_getbit("@B_25395#W1.01"),
764 PP= addr_getbit("@B_25395#W1.02"),
765 PO=addr_getbit("@B_25395#W0.07"),
766 FSE=addr_getbit("@B_25395#W2.04"),
767 AVVSVV=addr_getbit("@B_25395#W1.12"),
768 ICHT=addr_getbit("@B_25395#W3.06")
769 }
770 -- ("@B_25395#CIO1.02")
771 mq.m:publish("mqtt-v-box-epsilon-fd300", json.encode(js) , 0, 0)
772 mq.m:publish("mqtt-v-box-epsilon-alarm-fd300", json.encode(jsAlarm) , 0, 0)
773 else
774 local stat, err = mq.m:connect(mq.config) -- connection
775 if stat == nil then --Determine whether to connect
776 print("mqtt connect failed:", err)
777 return -- Connection failed, return directly
778 end
779 mq.m:subscribe("mqtt-v-box-epsilon", 0)-- Subscribe to topics
780
781 end
782 -- mq.m:unsubscribe("stc/test")
783 -- mq.m:disconnect() -- close matt
784 -- mq.m:close() -- close clase
785 end
786 end
787 {{/code}}
788
789 == **2.3 V-Box connect with Azure platform** ==
790
791 In this demo,V-Box connects with Azure by SSL certification.
792
793 Video link: [[https:~~/~~/youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW>>https://youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW]]
794
795 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]]
796
797 Script is as below
798
799 (% class="box infomessage" %)
800 (((
801 ~-~-https:~/~/support.huaweicloud.com/qs-IoT/iot_05_0005.html mqtt.fx monitor to connect azure iot
802 sprint = print
803
804 ~-~-Get custom configuration parameters (vbox custom information)
805 ~-~-local CUSTOM = bns_get_config("bind")
806 ~-~-local DS_ID = CUSTOM.DSID or "60a71ccbbbe12002c08f3a1a_WECON"
807
808
809 ~-~-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)
810 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
811
812 ~-~-MQTT_CFG.username = '60a71ccbbbe12002c08f3a1a_WECON'
813 ~-~-MQTT_CFG.password='wecon123'
814 ~-~-MQTT_CLIENTID = '60a71ccbbbe12002c08f3a1a_WECON_0_0_2021052110usernxame:60a71ccbbbe12002c08f3a1a_WECONpassword:a0a951581855aa8e0262129da6cf1b43f2c0ecfac4fa56117fc5a20c90be169a'
815
816 ~-~-publish to topics
817 local pub_RE_TOPIC = string.format('devices/wecon_02/messages/events/')
818 ~-~-Subscribe topics
819 local Subscribe_RE_TOPIC1 = string.format('devices/wecon_02/messages/devicebound/#')
820
821 ~-~-variable
822 local last_time = 0
823
824
825 ~-~-Timing main function
826 function Azure.main()
827
828 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main start")
829 if g_mq then
830 if g_mq:isconnected() then
831 send_Data()
832 else
833 if os.time() - last_time > 20 then
834 last_time = os.time()
835 mymqtt_connect()
836 end
837 end
838 else
839 mymqtt_init()
840 end
841 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main end")
842 end
843
844 ~-~- Initialize MQTT
845 function mymqtt_init()
846 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
847 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
848 if g_mq then
849 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
850 sprint("mqtt init success")
851 else
852 sprint("mqtt init failed:", err)
853 end
854 end
855
856 ~-~- Connect to MQTT server
857 function mymqtt_connect()
858 sprint("mqtt connecting...")
859 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
860 if stat == nil then
861 sprint("mqtt connect failed:", err)
862 return
863 else
864 sprint("mqtt connected")
865 end
866 g_mq:subscribe(Subscribe_RE_TOPIC1, 0) 
867 end
868
869 ~-~- Receive MQTT message callback function
870 function mymqtt_msg_callback(topic, msg)
871 print("topic:",topic)
872 print("revdata:",msg)
873 ~-~- local revData = json.decode(msg)
874 ~-~- if topic == Subscribe_RE_TOPIC1 then ~-~-Process topic information subscribed from the cloud
875 ~-~- if string.match(topic,Subscribe_RE_TOPIC1) then
876 ~-~- print("topi11:",topic)
877 setValue(revData)
878 ~-~- end
879 end
880
881 ~-~-Process the received data
882 ~-~-function setValue(revData)
883 ~-~- if revData ~~=nil then 
884 ~-~- for i,v in pairs(revData) do
885 ~-~- print("Data received:",i,v)
886 ~-~- end
887 ~-~- end
888 ~-~-end
889
890 ~-~-Get real-time data
891 function getData()
892 local jdata = {}
893 local addr = bns_get_alldata()
894 print(json.encode(addr))
895 for i,v in pairs(addr) do
896 if v[2] == 1 then
897 jdata[v[3]] = v[4]
898 end
899 end
900 return jdata
901 end
902
903
904 ~-~-send data
905 function send_Data()
906 local pub_data = {100
907 ~-~- services=~{~{
908 \\ ~-~-serviceId ='Temperature',
909 ~-~- properties={
910 ~-~- value = 55
911 ~-~- },
912 ~-~- }}
913 }
914 sprint(json.encode(pub_data))
915 print("..........",pub_RE_TOPIC)
916 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
917 end
918 )))
919
920 == **2.4 How to configure the Huawei platform?(✎Note: Huawei IOT DA function is only in China area.If you want this function,you need to use chinese mobile to register)** ==
921
922 1.Register a account: [[https:~~/~~/www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ>>https://www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ]]
923
924 2.log in the Huawei IOTDA
925
926 [[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]]
927
928 3.Create product
929
930 (% style="text-align:center" %)
931 [[image:1624433478954-859.png||height="497" width="1100" class="img-thumbnail"]]
932
933 4.Product name,manufacturer,device type and industry,set according to your own needs.
934
935 Protocol: MQTT
936
937 Data Type: JSON
938
939 After finishing configuration,please click "OK"
940
941 (% style="text-align:center" %)
942 [[image:1624433531968-337.png||height="568" width="700" class="img-thumbnail"]]
943
944 5.Device
945
946 After product register,continue to configure "individual register".Click "Device"~-~->"individual register"
947
948 (% style="text-align:center" %)
949 [[image:1624434757597-117.png||class="img-thumbnail"]]
950
951 **Notes for registering device:**
952
953 Product: Previous product registration.
954
955 Node ID, Device Name: set according to your own needs.
956
957 Secret: need to be configured, will be used when connecting later
958
959 After configuration, click OK to generate a device ID and password, which will be used for device access later.
960
961 (% style="text-align:center" %)
962 [[image:1624436421499-613.png||height="499" width="700" class="img-thumbnail"]]
963
964 (% style="text-align:center" %)
965 [[image:1624437798012-126.png||height="366" width="500" class="img-thumbnail"]]
966
967 6. Connection authentication (use MQTT.fx tool to access the IoT platform)
968
969 (1)Open mqttClientIdGenerator tool Java(TM) Platform SE binary
970
971 **[[Download>>https://wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Huawei/mqttClientIdGenerator-19.2.0.zip]]**
972
973 (% style="text-align:center" %)
974 [[image:1624437573798-815.png||height="351" width="700" class="img-thumbnail"]]
975
976 (2)Fill in the device ID and secret (deviceid and secret generated when registering the device) to generate connection message
977
978 Client ID, user name, password
979
980 (% style="text-align:center" %)
981 [[image:1624437756866-251.png||height="405" width="700" class="img-thumbnail"]]
982
983 (3) Download certificate file"North-Beijing4"
984
985 [[https:~~/~~/support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html>>https://support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html]]
986
987 (% style="text-align:center" %)
988 [[image:1624438225398-363.png||height="403" width="800" class="img-thumbnail"]]
989
990 (% style="text-align:center" %)
991 [[image:1624438260025-610.png||height="408" width="700" class="img-thumbnail"]]
992
993 7.Run MQTTfx tool to connect with Huawei
994
995 Download link: [[http:~~/~~/mqttfx.jensd.de/index.php/download>>url:http://mqttfx.jensd.de/index.php/download]]
996
997 (1)Click on the setting ICON
998
999 (% style="text-align:center" %)
1000 [[image:1624438821280-974.png||height="198" width="500" class="img-thumbnail"]]
1001
1002 (2)Fill in IIOT MQTT device access address, and configure authentication parameters.
1003 First: It is the server and port connected to Huawei IOT, which can be viewed through the overview of the interface.
1004
1005 (% style="text-align:center" %)
1006 [[image:1624439086268-985.png||class="img-thumbnail"]]
1007
1008 Domain name:iot-mqtts.cn-north-4.myhuaweicloud.com
1009
1010 Port: 8883
1011
1012 Client ID: check step 6
1013
1014 (% style="text-align:center" %)
1015 [[image:1624439672168-492.png||height="458" width="600" class="img-thumbnail"]]
1016
1017 (3)Upload SSL certificate file,check step 6
1018
1019 Select folder java~-~->DigiCertGlobalRootCA.crt.pem and click OK or apply button
1020
1021 (% style="text-align:center" %)
1022 [[image:1624439912938-659.png||height="458" width="600" class="img-thumbnail"]]
1023
1024 (4)Connect and test publish and subscribe
1025
1026 (% style="text-align:center" %)
1027 [[image:1624440014872-688.png||height="232" width="700" class="img-thumbnail"]]
1028
1029 (% style="text-align:center" %)
1030 [[image:1624440026937-386.png||height="215" width="700" class="img-thumbnail"]]
1031
1032 Huawei publish topic format: $oc/devices/{device_id}/sys/properties/report
1033
1034 (% style="text-align:center" %)
1035 [[image:1624440404119-815.png||class="img-thumbnail"]]
1036
1037 Huawei subscribe topic format: **$oc/devices/{device_id}/sys/commands/#**
1038
1039 (% style="text-align:center" %)
1040 [[image:1624447157493-672.png||class="img-thumbnail"]]
1041
1042 (% style="text-align:center" %)
1043 [[image:1624447209982-715.png||class="img-thumbnail"]]
1044
1045 (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:
1046 ①Select the corresponding product from Huawei products to view
1047
1048 (% style="text-align:center" %)
1049 [[image:1624440647663-632.png||class="img-thumbnail"]]
1050
1051 ②Custom model: used to display the service ID name of the configuration report.
1052
1053 (% style="text-align:center" %)
1054 [[image:1624440793982-974.png||height="410" width="700" class="img-thumbnail"]]
1055
1056 (% style="text-align:center" %)
1057 [[image:1624440883015-105.png||height="370" width="600" class="img-thumbnail"]]
1058
1059 ③Add property, ID of monitoring point, and data format:
1060
1061 (% style="text-align:center" %)
1062 [[image:1624441052296-108.png||height="477" width="600" class="img-thumbnail"]]
1063
1064 ④After the configuration is complete, check the received data on the device
1065
1066 (% style="text-align:center" %)
1067 [[image:1624441186851-536.png||height="434" width="700" class="img-thumbnail"]]
1068
1069 == **2.5 V-Box connect with Huawei platform** ==
1070
1071 In this demo,V-Box connects with Huawei by SSL certification.
1072
1073 1.Create a project access for Huawei IOT
1074
1075 2.configure MQTT configuration
1076
1077 (% style="text-align:center" %)
1078 [[image:1624506363847-661.png||height="507" width="1000" class="img-thumbnail"]]
1079
1080 3.Create a script with the demo as below.
1081
1082 Script is as below
1083
1084 (% class="box infomessage" %)
1085 (((
1086 (% class="box infomessage" %)
1087 (((
1088 ~-~- mqtt.fx simulated access to Huawei Cloud IoT platform refer to 2.4
1089 sprint = print
1090
1091 ~-~-Get custom configuration parameters (gateway customization information)
1092 local CUSTOM = bns_get_config("bind")
1093 local DS_ID = CUSTOM.DSID or "5dfa0700df1ae506179afb9c_wecon"
1094
1095
1096 ~-~-OpenCloud mode interface, obtain MQTT information configured on cloud platform: (5 returned, respectively server address, client ID, connection table, last word table, certificate table)
1097 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
1098
1099 MQTT_CFG.username =DS_ID
1100 MQTT_CFG.password='d030d92338fcc18cd10fabb3003a4a0f6620fa6822cd3c23b1d9bc790200c6e7'
1101 MQTT_CLIENTID = '5dfa0700df1ae506179afb9c_wecon_0_0_2019121819'
1102
1103 ~-~-publish topic format:$oc/devices/{device id}/sys/properties/report
1104
1105 local pub_RE_TOPIC = string.format('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/properties/report')
1106
1107 ~-~-variate
1108 local last_time = 0
1109
1110
1111 ~-~-Timing principal function
1112 function hwyiot.main()
1113
1114 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main start")
1115 if g_mq then
1116 if g_mq:isconnected() then
1117 send_Data()
1118 else
1119 if os.time() - last_time > 20 then
1120 last_time = os.time()
1121 mymqtt_connect()
1122 end
1123 end
1124 else
1125 mymqtt_init()
1126 end
1127 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main end")
1128 end
1129
1130 ~-~- initializationMQTT
1131 function mymqtt_init()
1132 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
1133 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
1134 if g_mq then
1135 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
1136 sprint("mqtt init success")
1137 else
1138 sprint("mqtt init failed:", err)
1139 end
1140 end
1141
1142 ~-~- Connect to the MQTT server
1143 function mymqtt_connect()
1144 sprint("mqtt connecting...")
1145 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
1146 if stat == nil then
1147 sprint("mqtt connect failed:", err)
1148 return
1149 else
1150 sprint("mqtt connected")
1151 end
1152
1153 ~-~-subscribe topic format:$oc/devices/{device_id}/sys/commands/#
1154
1155 g_mq:subscribe('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/commands/#', 0) 
1156 end
1157
1158 ~-~- Receive the message callback function
1159 function mymqtt_msg_callback(topic, msg)
1160 sprint("recv data!")
1161 sprint("topic:msg", topic,msg)
1162 print(msg)
1163 local revData = json.decode(msg)
1164 \\end
1165
1166 ~-~-Send data
1167 function send_Data()
1168 local pub_data = {
1169 msgType = 'deviceReq',
1170 data = ~{~{
1171 serviceId ='Battery',
1172 serviceData={
1173 batteryLevel = 55
1174 }
1175 }}
1176 }
1177 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
1178 end
1179 )))
1180 )))
1181
1182 4.Download project access into V-Box to test in debug page
1183
1184 (% style="text-align:center" %)
1185 [[image:1624506710354-406.png||height="658" width="1000" class="img-thumbnail"]]
1186
1187 (% style="text-align:center" %)
1188 [[image:1624506666650-161.png||height="547" width="1000" class="img-thumbnail"]]
1189
1190 == **2.6 V-Box connect with AWS platform** ==
1191
1192 === **Log in AWS** ===
1193
1194 Login aws account and click“Connect an IoT device”
1195
1196 [[image:image-20220709165402-1.png]]
1197
1198 [[image:image-20220709165402-2.png]]
1199
1200
1201 === **Create policy** ===
1202
1203 Click “Secure”~-~-->“Policies”~-~-->“Create policy”~-~-->Click “Create”
1204
1205 [[image:image-20220709165402-3.png]]
1206
1207 Name the policy~-~-->Click “JSON”~-~-->Copy the following content~-~-->Click “Create”
1208
1209 [[image:image-20220709165402-5.png]]
1210
1211 [[image:image-20220709165402-4.png]]
1212
1213 {{code language="java"}}
1214 {
1215   "Version": "2012-10-17",
1216   "Statement": [
1217     {
1218       "Effect": "Allow",
1219       "Action": [
1220         "iot:Connect",
1221         "iot:Publish",
1222         "iot:Subscribe",
1223         "iot:Receive",
1224         "greengrass:Discover"
1225       ],
1226       "Resource": "*"
1227     }
1228   ]
1229 }
1230 {{/code}}
1231
1232 === **Create things** ===
1233
1234 Click “Manage”~-~-->“Things”~-~-->“Create things”~-~-->“Create single thing”
1235
1236 [[image:image-20220709165402-6.png]]
1237
1238 [[image:image-20220709165402-7.png]]
1239
1240 Name the thing~-~-->Click “Next”
1241
1242 [[image:image-20220709165402-8.png]]
1243
1244 Select the way to create certificate
1245
1246 [[image:image-20220709165402-9.png]]
1247
1248 Select policy
1249
1250 [[image:image-20220709165402-10.png]]
1251
1252 [[image:image-20220709165402-11.png]]
1253
1254
1255 === **Test with MQTT.fx tool** ===
1256
1257 Click “View Setting” to get the “Broker Adress”
1258
1259 [[image:image-20220709165402-13.png]]
1260
1261 [[image:image-20220709165402-12.png]]
1262
1263 Create one connection in MQTT.fx tool, set broker port as 8883.
1264
1265 [[image:image-20220709165402-14.png]]
1266
1267 Upload the CA File, Client Certificate File, Client Key File
1268
1269 [[image:image-20220709165402-15.png]]
1270
1271 Publish message to topic “TEST”
1272
1273 [[image:image-20220709165402-17.png]]
1274
1275 Click”Test”~-~-->”MQTT test client”~-~-->”Subscrible to a topic”, to get message publish from MQTT.fx tool.
1276
1277 [[image:image-20220709173500-1.png]]
1278
1279 And we can also send message form AWS platform to MQTT.fx tool.
1280
1281 [[image:image-20220709165402-18.png]]
1282
1283 === **Configurate in CloudTool** ===
1284
1285 Copy the same setting in MQTT.fx to MQTT configuration
1286
1287 [[image:image-20220709165402-19.png]]
1288
1289 Add a lua script and copy the lua demo into it.
1290
1291 [[image:image-20220709165402-20.png]]
1292
1293 {{info}}
1294 **✎Note:** Before using the following demo script, please make sure the V-Box firmware is newer than 22110701
1295 {{/info}}
1296
1297 {{code language="lua"}}
1298 sprint = print
1299
1300 --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)
1301
1302 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
1303
1304 --publish to topics
1305
1306 local pub_RE_TOPIC = string.format('TEST')
1307
1308 --Subscribe topics
1309
1310 local Subscribe_RE_TOPIC1 = string.format('TEST')
1311
1312 --variable
1313
1314 local last_time = 0
1315
1316 --Timing main function
1317
1318 function aws.main()
1319
1320 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main start")
1321
1322 if g_mq then
1323
1324 if g_mq:isconnected() then
1325
1326 send_Data()
1327
1328 else
1329
1330 if os.time() - last_time > 5 then
1331
1332 last_time = os.time()
1333
1334 mymqtt_connect()
1335
1336 end
1337
1338 end
1339
1340 else
1341
1342 mymqtt_init()
1343
1344 end
1345
1346 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main end")
1347
1348 end
1349
1350
1351
1352 -- Initialize MQTT
1353
1354 function mymqtt_init()
1355
1356 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
1357
1358 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
1359
1360 if g_mq then
1361
1362 g_mq:on("message", mymqtt_msg_callback) -- Register to receive message callbacks
1363
1364 sprint("mqtt init success")
1365
1366 else
1367
1368 sprint("mqtt init failed:", err)
1369
1370 end
1371
1372 end
1373
1374 -- Connect to MQTT server
1375
1376 function mymqtt_connect()
1377
1378 sprint("mqtt connecting...")
1379
1380 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
1381
1382 if stat == nil then
1383
1384 sprint("mqtt connect failed:", err)
1385
1386 return
1387
1388 else
1389
1390 sprint("mqtt connected")
1391
1392 end
1393
1394 g_mq:subscribe(Subscribe_RE_TOPIC1, 0)
1395
1396 end
1397
1398 -- Receive MQTT message callback function
1399
1400 function mymqtt_msg_callback(topic, msg)
1401
1402 print("topic:",topic)
1403
1404 print("revdata:",msg)
1405
1406 local revData = json.decode(msg)
1407
1408 print (revData)
1409
1410 if topic == Subscribe_RE_TOPIC1 then --Process topic information subscribed from the cloud
1411
1412 if string.match(topic,Subscribe_RE_TOPIC1) then
1413
1414 --if revData ~= nil then
1415
1416 for k,v in pairs (revData) do
1417
1418 print("printing revdata after kv here")
1419
1420 print (k,v)
1421
1422 end
1423
1424 print ("current state is",fanstate)
1425
1426 --end
1427
1428 end
1429
1430 end
1431
1432 end
1433
1434
1435
1436 --Get real-time data
1437
1438 function getData()
1439
1440 local jdata = {}
1441
1442 local addr = bns_get_alldata()
1443
1444 print(json.encode(addr))
1445
1446 for i,v in pairs(addr) do
1447
1448 if v[2] == 1 then
1449
1450 jdata[v[3]] = v[4]
1451
1452 end
1453
1454 end
1455
1456 return jdata
1457
1458 end
1459
1460 --send data
1461
1462 function send_Data()
1463
1464 local pub_data =
1465 {
1466 123
1467 }
1468
1469 sprint(json.encode(pub_data))
1470
1471 print("..........",pub_RE_TOPIC)
1472
1473 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
1474
1475 end
1476 {{/code}}
1477
1478 Get message in AWS
1479
1480 [[image:image-20220709165402-21.png]]