Wiki source code of 2 Script

Version 27.1 by Hunter on 2022/10/25 09:39

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