Wiki source code of 2 Script

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