Wiki source code of 2 Script

Version 49.1 by Hunter on 2023/05/06 10:09

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