Wiki source code of 2 Script

Version 42.1 by Hunter on 2023/03/30 16:29

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