Wiki source code of 2 Script

Version 19.1 by Hunter on 2022/07/29 15:56

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.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 {{code language="Lua"}}
74 local tempBit = 0
75 local tempWord = 0
76
77 local botToken = "5504549693:AAEy6a5G-sOF3CINONxMNABeYnoS4ABVlfg"
78 local chatID = "-641959124"--The chat id from Channel or Group
79
80 local https = require("https")
81 local json = require("json")
82
83 -- Send http.get request and return response result
84 function getHttpsUrl(url)
85 local body = {}
86 local bodyJson = json.encode(body)
87 local header = {}
88 header["content-type"] = "application/json"
89 local result_table, code, headers, status = https.request(url, bodyJson)
90 print("code:"..code)
91 if code~= 200 then
92 return
93 else
94 return body
95 end
96 end
97
98 function sendAlarm(telegramBotToken, message, telegramChatID)
99 local url = "https://api.telegram.org/bot"..telegramBotToken.."/sendMessage?text="..message.."&chat_id="..telegramChatID
100 --local url = 'http://v-box.net'
101 --local url = 'https://www.google.com/'
102 print("Get the link:"..url)
103 getHttpsUrl(url)
104 end
105
106
107 function AlarmNotificate.main()
108 local bitValue = addr_getbit("@HDX");
109 local message = ''
110 print("b=="..bitValue)
111 if bitValue == 1 and bitValue ~= tempBit then
112 message = 'Alarm triggered, the monitoring point test value is '.. bitValue
113 sendAlarm(botToken, message, chatID)
114 print("Notification pushed of triggering alarm,"..bitValue)
115 elseif bitValue == 0 and bitValue ~= tempBit then
116 message = 'Alarm dismissed, the monitoring point test value is '.. bitValue
117 sendAlarm(botToken, message, chatID)
118 print("Notification pushed of dismissing alarm,"..bitValue)
119 end
120 tempBit = bitValue----Prevent monitoring values from continuous being sent to the platform
121
122 local wordValue = addr_getword("@HDW10")
123 print("w=="..wordValue)
124 --dosomething
125 if wordValue >= 100 and wordValue ~= tempWord and tempWord <= 100 then
126 message = 'Word alarm triggered, the word value is '.. wordValue
127 sendAlarm(botToken, message, chatID)
128 print("Notification pushed of triggering alarm,"..wordValue)
129 elseif wordValue < 100 and wordValue ~= tempWord and tempWord >= 100 then
130 message = 'Word alarm dismissed, the word value is '.. wordValue
131 sendAlarm(botToken, message, chatID)
132 print("Notification pushed of dismissing alarm,"..wordValue)
133 end
134 tempWord = wordValue----Prevent monitoring values from continuous being sent to the platform
135 end
136 {{/code}}
137
138
139 = **2 V-Box connect with third part server** =
140
141 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.
142
143 (% class="mark" %)1.Europe server:eu.v-box.net
144
145 (% class="mark" %)2.Asean server:asean.v-box.net
146
147 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
148
149 OpenCloud platform is used in configuring the script.Then V-Box can connect with third part server.
150
151 Both mode can support script  to connect with third part server.the difference:
152
153 (% class="mark" %)1.If you want to store in WECON server ,please use V-NET.
154
155 (% class="mark" %)2.If your server requires SSL certificate to log in,please use OpenCloud.Because only OpenCloud platform can support to upload certificate
156
157 == **2.1 V-Box connect with customer server:grouprobotinfo.com** ==
158
159 This demo does not use SSL certification. Script is as below
160
161 Demo1:
162
163 {{code language="lua"}}
164 -- Meta class
165 --main
166 function mq.main()
167  if not mq.m then
168   local err = ""
169
170   mq.m, err = mqtt.create("tcp://grouprobotinfo.com:1883", "ClienID")  -- create connection
171   if mq.m then
172    mq.config = {
173     username = "",-- ID
174     password = "",-- password
175     netway = 1, -- Ethernet connection, WIFI=1
176     -- keepalive = 100, -- Optional, set the connection heartbeat interval for 100 seconds.
177     -- cleansession = 0, -- Optional, keep session
178    }
179    mq.m:on("message", function(topic, msg) -- Register for receiving message callbacks
180     local str = string.format("%s:%s", topic, msg)
181     -- print("mqtt msg:", str) -- Print out the received topics and content
182    end
183    )
184    mq.m:on("offline", function (cause) -- Register for lost connection callbacks
185     -- addr_setstring("@xxx", "cause"..(cause or " got nil"))
186    end)
187    mq.m:on("arrived", function() -- Registration for sending messages to callbacks 
188     print("msg arrived")
189    end)
190   else
191    print("mqtt create failed:", err) -- Create object failed
192   end
193  else
194   if mq.m:isconnected() then -- If online, post a message
195      local phaseStatus ="unknow"
196      if addr_getbit("@Standby")== 1 then
197          phaseStatus = "Standby"
198      elseif addr_getbit("@Pre-Freeze")==1 then
199          phaseStatus= "Pre-Freeze"
200      elseif addr_getbit("@Prepare")==1 then
201          phaseStatus ="Prepare"
202      elseif addr_getbit("@Primary Dry")==1 then
203          phaseStatus = "Primary dry"
204      elseif addr_getbit("@Secondary Dry")==1 then
205          phaseStatus = "Secondary Dry"
206      end
207 --   print(addr_getbit("@Primary Dry"))
208 -------------------------------------------------------------------------------------------------------------------------
209      local activating ="unknow"
210      if addr_getbit("@Compressor")==1 then
211          activating = ",".."Compressor"
212      end
213      if addr_getbit("@Silicone Pump")==1 then
214          activating = activating..",".."Silicone Pump"
215      end
216      if addr_getbit("@Vacuum Pump")==1 then
217          activating = activating..",".."Vacuum Pump"
218      end
219      if addr_getbit("@Root Pump")==1 then
220          activating = activating..",".."Root Pump"
221      end
222      if addr_getbit("@Heater")==1 then
223          activating = activating..",".."Heater"
224      end
225      if addr_getbit("@Valve Silicone")==1 then
226          activating = activating..",".."Valve Silicone"
227      end
228      if addr_getbit("@Valve Ice Condenser")==1 then
229          activating = activating..",".."Valve Ice Condenser"
230      end
231      if addr_getbit("@Valve Vacuum Pump")==1 then
232          activating = activating..",".."Valve Vacuum Pump"
233      end
234      local pr_activating =string.sub(activating,2)
235     --  print(pr_activating)  
236
237
238
239      local status_text ="unknow"
240      if addr_getbit("@Status Run")==1 then
241          status_text = "RUNNING"
242      else
243          status_text = "STOP"
244      end
245 -------------------------------------------------------------------------------------------------------------------------      
246
247      local js =  {type="status",
248                   mc_name ="FD300",
249                   status=status_text,
250                   elapsed_time={
251                                 hour=addr_getword("@Elapsed Time (Hour)"),
252                                 min=addr_getword("@Elapsed Time (Minute)"),
253                                 sec=addr_getword("@Elapsed Time (Second)")
254                                 },
255                    phase = phaseStatus,
256                    step = addr_getword("@Step"),
257                    activating_output = pr_activating,
258                    sv=addr_getshort("@SV Silicone")/10,
259                    pv=addr_getshort("@PV Silicone")/10,
260                    product1=addr_getshort("@Product 1")/10,
261
262                    product2=addr_getshort("@Product 2")/10,
263                    product3=addr_getshort("@Product 3")/10,
264                    product4=addr_getshort("@Product 4")/10,
265                    ice1=addr_getshort("@Ice condenser 1")/10,
266                    ice2=addr_getshort("@Ice condenser 2")/10,
267                    vacuum=addr_getfloat("@Vacuum")
268
269                 }
270      local jsAlarm = {  HPC = addr_getbit("@B_25395#W0.00"),
271                         ODPC = addr_getbit("@B_25395#W0.01"),
272                         MTPC=addr_getbit("@B_25395#W0.02"),
273                         HTT = addr_getbit("@B_25395#W1.03"),
274                         CPC = addr_getbit("@B_25395#W0.08"),
275                         CPSP =addr_getbit("@B_25395#W1.00"),
276                         CPVP =addr_getbit("@B_25395#W0.10"),
277                         CPRP =addr_getbit("@B_25395#W0.11"),
278                         HP =addr_getbit("@B_25395#W1.01"),
279                         PP= addr_getbit("@B_25395#W1.02"),
280                         PO=addr_getbit("@B_25395#W0.07"),
281                         FSE=addr_getbit("@B_25395#W2.04"),
282                         AVVSVV=addr_getbit("@B_25395#W1.12"),
283                         ICHT=addr_getbit("@B_25395#W3.06")
284
285                 }
286
287     -- ("@B_25395#CIO1.02")
288      mq.m:publish("mqtt-v-box-epsilon-fd300", json.encode(js) , 0, 0)
289      mq.m:publish("mqtt-v-box-epsilon-alarm-fd300", json.encode(jsAlarm) , 0, 0)
290   else
291    local stat, err = mq.m:connect(mq.config) -- connection
292    if stat == nil then --Determine whether to connect
293     print("mqtt connect failed:", err)
294     return -- Connection failed, return directly
295    end
296    mq.m:subscribe("mqtt-v-box-epsilon", 0)-- Subscribe to topics
297
298   end
299   -- mq.m:unsubscribe("stc/test")
300   -- mq.m:disconnect() -- close matt
301   -- mq.m:close() -- close clase
302  end
303 end
304 {{/code}}
305
306 == **2.2 V-Box connect with Azure platform** ==
307
308 In this demo,V-Box connects with Azure by SSL certification.
309
310 Video link: [[https:~~/~~/youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW>>https://youtu.be/cdI6rIQcpMY?list=PL_Bpnb2RgaksCic9HCcVAZhU9sYwCRKzW]]
311
312 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]]
313
314 Script is as below
315
316 (% class="box infomessage" %)
317 (((
318 ~-~-https:~/~/support.huaweicloud.com/qs-IoT/iot_05_0005.html mqtt.fx monitor to connect azure iot
319 sprint = print
320
321 ~-~-Get custom configuration parameters (vbox custom information)
322 ~-~-local CUSTOM = bns_get_config("bind")
323 ~-~-local DS_ID = CUSTOM.DSID or "60a71ccbbbe12002c08f3a1a_WECON"
324
325
326 ~-~-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)
327 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
328
329 ~-~-MQTT_CFG.username = '60a71ccbbbe12002c08f3a1a_WECON'
330 ~-~-MQTT_CFG.password='wecon123'
331 ~-~-MQTT_CLIENTID = '60a71ccbbbe12002c08f3a1a_WECON_0_0_2021052110usernxame:60a71ccbbbe12002c08f3a1a_WECONpassword:a0a951581855aa8e0262129da6cf1b43f2c0ecfac4fa56117fc5a20c90be169a'
332
333 ~-~-publish to topics
334 local pub_RE_TOPIC = string.format('devices/wecon_02/messages/events/')
335 ~-~-Subscribe topics
336 local Subscribe_RE_TOPIC1 = string.format('devices/wecon_02/messages/devicebound/#')
337
338 ~-~-variable
339 local last_time = 0
340
341
342 ~-~-Timing main function
343 function Azure.main()
344
345 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main start")
346 if g_mq then
347 if g_mq:isconnected() then
348 send_Data()
349 else
350 if os.time() - last_time > 20 then
351 last_time = os.time()
352 mymqtt_connect()
353 end
354 end
355 else
356 mymqtt_init()
357 end
358 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " Azureiot.main end")
359 end
360
361 ~-~- Initialize MQTT
362 function mymqtt_init()
363 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
364 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
365 if g_mq then
366 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
367 sprint("mqtt init success")
368 else
369 sprint("mqtt init failed:", err)
370 end
371 end
372
373 ~-~- Connect to MQTT server
374 function mymqtt_connect()
375 sprint("mqtt connecting...")
376 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
377 if stat == nil then
378 sprint("mqtt connect failed:", err)
379 return
380 else
381 sprint("mqtt connected")
382 end
383 g_mq:subscribe(Subscribe_RE_TOPIC1, 0) 
384 end
385
386 ~-~- Receive MQTT message callback function
387 function mymqtt_msg_callback(topic, msg)
388 print("topic:",topic)
389 print("revdata:",msg)
390 ~-~- local revData = json.decode(msg)
391 ~-~- if topic == Subscribe_RE_TOPIC1 then ~-~-Process topic information subscribed from the cloud
392 ~-~- if string.match(topic,Subscribe_RE_TOPIC1) then
393 ~-~- print("topi11:",topic)
394 setValue(revData)
395 ~-~- end
396 end
397
398 ~-~-Process the received data
399 ~-~-function setValue(revData)
400 ~-~- if revData ~~=nil then 
401 ~-~- for i,v in pairs(revData) do
402 ~-~- print("Data received:",i,v)
403 ~-~- end
404 ~-~- end
405 ~-~-end
406
407 ~-~-Get real-time data
408 function getData()
409 local jdata = {}
410 local addr = bns_get_alldata()
411 print(json.encode(addr))
412 for i,v in pairs(addr) do
413 if v[2] == 1 then
414 jdata[v[3]] = v[4]
415 end
416 end
417 return jdata
418 end
419
420
421 ~-~-send data
422 function send_Data()
423 local pub_data = {100
424 ~-~- services=~{~{
425 \\ ~-~-serviceId ='Temperature',
426 ~-~- properties={
427 ~-~- value = 55
428 ~-~- },
429 ~-~- }}
430 }
431 sprint(json.encode(pub_data))
432 print("..........",pub_RE_TOPIC)
433 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
434 end
435 )))
436
437 == **2.3 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)** ==
438
439 1.Register a account: [[https:~~/~~/www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ>>https://www.huaweicloud.com/intl/en-us/s/JUlPVERNJQ]]
440
441 2.log in the Huawei IOTDA
442
443 [[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]]
444
445 3.Create product
446
447 (% style="text-align:center" %)
448 [[image:1624433478954-859.png||height="497" width="1100" class="img-thumbnail"]]
449
450 4.Product name,manufacturer,device type and industry,set according to your own needs.
451
452 Protocol: MQTT
453
454 Data Type: JSON
455
456 After finishing configuration,please click "OK"
457
458 (% style="text-align:center" %)
459 [[image:1624433531968-337.png||height="568" width="700" class="img-thumbnail"]]
460
461 5.Device
462
463 After product register,continue to configure "individual register".Click "Device"~-~->"individual register"
464
465 (% style="text-align:center" %)
466 [[image:1624434757597-117.png||class="img-thumbnail"]]
467
468 **Notes for registering device:**
469
470 Product: Previous product registration.
471
472 Node ID, Device Name: set according to your own needs.
473
474 Secret: need to be configured, will be used when connecting later
475
476 After configuration, click OK to generate a device ID and password, which will be used for device access later.
477
478 (% style="text-align:center" %)
479 [[image:1624436421499-613.png||height="499" width="700" class="img-thumbnail"]]
480
481 (% style="text-align:center" %)
482 [[image:1624437798012-126.png||height="366" width="500" class="img-thumbnail"]]
483
484 6. Connection authentication (use MQTT.fx tool to access the IoT platform)
485
486 (1)Open mqttClientIdGenerator tool Java(TM) Platform SE binary
487
488 **[[Download>>https://wecon-disk.oss-ap-southeast-1.aliyuncs.com/Download/WIKI/V-BOX/Demo/Huawei/mqttClientIdGenerator-19.2.0.zip]]**
489
490 (% style="text-align:center" %)
491 [[image:1624437573798-815.png||height="351" width="700" class="img-thumbnail"]]
492
493 (2)Fill in the device ID and secret (deviceid and secret generated when registering the device) to generate connection message
494
495 Client ID, user name, password
496
497 (% style="text-align:center" %)
498 [[image:1624437756866-251.png||height="405" width="700" class="img-thumbnail"]]
499
500 (3) Download certificate file"North-Beijing4"
501
502 [[https:~~/~~/support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html>>https://support.huaweicloud.com/en-us/devg-iothub/iot_02_1004.html]]
503
504 (% style="text-align:center" %)
505 [[image:1624438225398-363.png||height="403" width="800" class="img-thumbnail"]]
506
507 (% style="text-align:center" %)
508 [[image:1624438260025-610.png||height="408" width="700" class="img-thumbnail"]]
509
510 7.Run MQTTfx tool to connect with Huawei
511
512 Download link: [[http:~~/~~/mqttfx.jensd.de/index.php/download>>url:http://mqttfx.jensd.de/index.php/download]]
513
514 (1)Click on the setting ICON
515
516 (% style="text-align:center" %)
517 [[image:1624438821280-974.png||height="198" width="500" class="img-thumbnail"]]
518
519 (2)Fill in IIOT MQTT device access address, and configure authentication parameters.
520 First: It is the server and port connected to Huawei IOT, which can be viewed through the overview of the interface.
521
522 (% style="text-align:center" %)
523 [[image:1624439086268-985.png||class="img-thumbnail"]]
524
525 Domain name:iot-mqtts.cn-north-4.myhuaweicloud.com
526
527 Port: 8883
528
529 Client ID: check step 6
530
531 (% style="text-align:center" %)
532 [[image:1624439672168-492.png||height="458" width="600" class="img-thumbnail"]]
533
534 (3)Upload SSL certificate file,check step 6
535
536 Select folder java~-~->DigiCertGlobalRootCA.crt.pem and click OK or apply button
537
538 (% style="text-align:center" %)
539 [[image:1624439912938-659.png||height="458" width="600" class="img-thumbnail"]]
540
541 (4)Connect and test publish and subscribe
542
543 (% style="text-align:center" %)
544 [[image:1624440014872-688.png||height="232" width="700" class="img-thumbnail"]]
545
546 (% style="text-align:center" %)
547 [[image:1624440026937-386.png||height="215" width="700" class="img-thumbnail"]]
548
549 Huawei publish topic format: $oc/devices/{device_id}/sys/properties/report
550
551 (% style="text-align:center" %)
552 [[image:1624440404119-815.png||class="img-thumbnail"]]
553
554 Huawei subscribe topic format: **$oc/devices/{device_id}/sys/commands/#**
555
556 (% style="text-align:center" %)
557 [[image:1624447157493-672.png||class="img-thumbnail"]]
558
559 (% style="text-align:center" %)
560 [[image:1624447209982-715.png||class="img-thumbnail"]]
561
562 (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:
563 ①Select the corresponding product from Huawei products to view
564
565 (% style="text-align:center" %)
566 [[image:1624440647663-632.png||class="img-thumbnail"]]
567
568 ②Custom model: used to display the service ID name of the configuration report.
569
570 (% style="text-align:center" %)
571 [[image:1624440793982-974.png||height="410" width="700" class="img-thumbnail"]]
572
573 (% style="text-align:center" %)
574 [[image:1624440883015-105.png||height="370" width="600" class="img-thumbnail"]]
575
576 ③Add property, ID of monitoring point, and data format:
577
578 (% style="text-align:center" %)
579 [[image:1624441052296-108.png||height="477" width="600" class="img-thumbnail"]]
580
581 ④After the configuration is complete, check the received data on the device
582
583 (% style="text-align:center" %)
584 [[image:1624441186851-536.png||height="434" width="700" class="img-thumbnail"]]
585
586 == **2.4 V-Box connect with Huawei platform** ==
587
588 In this demo,V-Box connects with Huawei by SSL certification.
589
590 1.Create a project access for Huawei IOT
591
592 2.configure MQTT configuration
593
594 (% style="text-align:center" %)
595 [[image:1624506363847-661.png||height="507" width="1000" class="img-thumbnail"]]
596
597 3.Create a script with the demo as below.
598
599 Script is as below
600
601 (% class="box infomessage" %)
602 (((
603 (% class="box infomessage" %)
604 (((
605 ~-~- mqtt.fx simulated access to Huawei Cloud IoT platform refer to 2.4
606 sprint = print
607
608 ~-~-Get custom configuration parameters (gateway customization information)
609 local CUSTOM = bns_get_config("bind")
610 local DS_ID = CUSTOM.DSID or "5dfa0700df1ae506179afb9c_wecon"
611
612
613 ~-~-OpenCloud mode interface, obtain MQTT information configured on cloud platform: (5 returned, respectively server address, client ID, connection table, last word table, certificate table)
614 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
615
616 MQTT_CFG.username =DS_ID
617 MQTT_CFG.password='d030d92338fcc18cd10fabb3003a4a0f6620fa6822cd3c23b1d9bc790200c6e7'
618 MQTT_CLIENTID = '5dfa0700df1ae506179afb9c_wecon_0_0_2019121819'
619
620 ~-~-publish topic format:$oc/devices/{device id}/sys/properties/report
621
622 local pub_RE_TOPIC = string.format('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/properties/report')
623
624 ~-~-variate
625 local last_time = 0
626
627
628 ~-~-Timing principal function
629 function hwyiot.main()
630
631 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main start")
632 if g_mq then
633 if g_mq:isconnected() then
634 send_Data()
635 else
636 if os.time() - last_time > 20 then
637 last_time = os.time()
638 mymqtt_connect()
639 end
640 end
641 else
642 mymqtt_init()
643 end
644 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " hwyiot.main end")
645 end
646
647 ~-~- initializationMQTT
648 function mymqtt_init()
649 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
650 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
651 if g_mq then
652 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
653 sprint("mqtt init success")
654 else
655 sprint("mqtt init failed:", err)
656 end
657 end
658
659 ~-~- Connect to the MQTT server
660 function mymqtt_connect()
661 sprint("mqtt connecting...")
662 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
663 if stat == nil then
664 sprint("mqtt connect failed:", err)
665 return
666 else
667 sprint("mqtt connected")
668 end
669
670 ~-~-subscribe topic format:$oc/devices/{device_id}/sys/commands/#
671
672 g_mq:subscribe('$oc/devices/60a71ccbbbe12002c08f3a1a_WECON/sys/commands/#', 0) 
673 end
674
675 ~-~- Receive the message callback function
676 function mymqtt_msg_callback(topic, msg)
677 sprint("recv data!")
678 sprint("topic:msg", topic,msg)
679 print(msg)
680 local revData = json.decode(msg)
681 \\end
682
683 ~-~-Send data
684 function send_Data()
685 local pub_data = {
686 msgType = 'deviceReq',
687 data = ~{~{
688 serviceId ='Battery',
689 serviceData={
690 batteryLevel = 55
691 }
692 }}
693 }
694 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
695 end
696 )))
697 )))
698
699 4.Download project access into V-Box to test in debug page
700
701 (% style="text-align:center" %)
702 [[image:1624506710354-406.png||height="658" width="1000" class="img-thumbnail"]]
703
704 (% style="text-align:center" %)
705 [[image:1624506666650-161.png||height="547" width="1000" class="img-thumbnail"]]
706
707 == **2.5 V-Box connect with AWS platform** ==
708
709 === **Log in AWS** ===
710
711 Login aws account and click“Connect an IoT device”
712
713 [[image:image-20220709165402-1.png]]
714
715 [[image:image-20220709165402-2.png]]
716
717
718 === **Create policy** ===
719
720 Click “Secure”~-~-->“Policies”~-~-->“Create policy”~-~-->Click “Create”
721
722 [[image:image-20220709165402-3.png]]
723
724 Name the policy~-~-->Click “JSON”~-~-->Copy the following content~-~-->Click “Create”
725
726 [[image:image-20220709165402-5.png]]
727
728 [[image:image-20220709165402-4.png]]
729
730 {{code language="java"}}
731 {
732
733   "Version": "2012-10-17",
734
735   "Statement": [
736
737     {
738
739       "Effect": "Allow",
740
741       "Action": [
742
743         "iot:Connect",
744
745         "iot:Publish",
746
747         "iot:Subscribe",
748
749         "iot:Receive",
750
751         "greengrass:Discover"
752
753       ],
754
755       "Resource": "*"
756
757     }
758
759   ]
760
761 }
762 {{/code}}
763
764 === **Create things** ===
765
766 Click “Manage”~-~-->“Things”~-~-->“Create things”~-~-->“Create single thing”
767
768 [[image:image-20220709165402-6.png]]
769
770 [[image:image-20220709165402-7.png]]
771
772 Name the thing~-~-->Click “Next”
773
774 [[image:image-20220709165402-8.png]]
775
776 Select the way to create certificate
777
778 [[image:image-20220709165402-9.png]]
779
780 Select policy
781
782 [[image:image-20220709165402-10.png]]
783
784 [[image:image-20220709165402-11.png]]
785
786
787 === **Test with MQTT.fx tool** ===
788
789 Click “View Setting” to get the “Broker Adress”
790
791 [[image:image-20220709165402-13.png]]
792
793 [[image:image-20220709165402-12.png]]
794
795 Create one connection in MQTT.fx tool, set broker port as 8883.
796
797 [[image:image-20220709165402-14.png]]
798
799 Upload the CA File, Client Certificate File, Client Key File
800
801 [[image:image-20220709165402-15.png]]
802
803 Publish message to topic “TEST”
804
805 [[image:image-20220709165402-17.png]]
806
807 Click”Test”~-~-->”MQTT test client”~-~-->”Subscrible to a topic”, to get message publish from MQTT.fx tool.
808
809 [[image:image-20220709173500-1.png]]
810
811 And we can also send message form AWS platform to MQTT.fx tool.
812
813 [[image:image-20220709165402-18.png]]
814
815 === **Configurate in CloudTool** ===
816
817 Copy the same setting in MQTT.fx to MQTT configuration
818
819 [[image:image-20220709165402-19.png]]
820
821 Add a lua script and copy the lua demo into it.
822
823 [[image:image-20220709165402-20.png]]
824
825 sprint = print
826
827 ~-~-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)
828
829 local MQTT_URL, MQTT_CLIENTID, MQTT_CFG, MQTT_LWT, MQTT_CART = mqtt.setup_cfg()
830
831 ~-~-publish to topics
832
833 local pub_RE_TOPIC = string.format('TEST')
834
835 ~-~-Subscribe topics
836
837 local Subscribe_RE_TOPIC1 = string.format('TEST')
838
839 ~-~-variable
840
841 local last_time = 0
842
843 ~-~-Timing main function
844
845 function aws.main()
846
847 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main start")
848
849 if g_mq then
850
851 if g_mq:isconnected() then
852
853 send_Data()
854
855 else
856
857 if os.time() - last_time > 5 then
858
859 last_time = os.time()
860
861 mymqtt_connect()
862
863 end
864
865 end
866
867 else
868
869 mymqtt_init()
870
871 end
872
873 sprint(os.date("%Y-%m-%d %H:%M %S", os.time()) .. " aws.main end")
874
875 end
876
877
878 ~-~- Initialize MQTT
879
880 function mymqtt_init()
881
882 sprint(string.format("mqtt init mqtt_url:%s mqtt_clientid:%s", MQTT_URL, MQTT_CLIENTID))
883
884 g_mq, err = mqtt.create(MQTT_URL, MQTT_CLIENTID) ~-~- Create the object and declare it as a global variable
885
886 if g_mq then
887
888 g_mq:on("message", mymqtt_msg_callback) ~-~- Register to receive message callbacks
889
890 sprint("mqtt init success")
891
892 else
893
894 sprint("mqtt init failed:", err)
895
896 end
897
898 end
899
900 ~-~- Connect to MQTT server
901
902 function mymqtt_connect()
903
904 sprint("mqtt connecting...")
905
906 local stat, err = g_mq:connect(MQTT_CFG,MQTT_LWT, MQTT_CART)
907
908 if stat == nil then
909
910 sprint("mqtt connect failed:", err)
911
912 return
913
914 else
915
916 sprint("mqtt connected")
917
918 end
919
920 g_mq:subscribe(TEST, 0)
921
922 end
923
924 ~-~- Receive MQTT message callback function
925
926 function mymqtt_msg_callback(topic, msg)
927
928 print("topic:",topic)
929
930 print("revdata:",msg)
931
932 local revData = json.decode(msg)
933
934 print (revData)
935
936 if topic == Subscribe_RE_TOPIC1 then ~-~-Process topic information subscribed from the cloud
937
938 if string.match(topic,Subscribe_RE_TOPIC1) then
939
940 ~-~-if revData ~~= nil then
941
942 for k,v in pairs (revData) do
943
944 print("printing revdata after kv here")
945
946 print (k,v)
947
948 end
949
950 print ("current state is",fanstate)
951
952 ~-~-end
953
954 end
955
956 end
957
958 end
959
960
961 ~-~-Get real-time data
962
963 function getData()
964
965 local jdata = {}
966
967 local addr = bns_get_alldata()
968
969 print(json.encode(addr))
970
971 for i,v in pairs(addr) do
972
973 if v[2] == 1 then
974
975 jdata[v[3]] = v[4]
976
977 end
978
979 end
980
981 return jdata
982
983 end
984
985 ~-~-send data
986
987 function send_Data()
988
989 local pub_data =
990
991 {
992
993 123
994
995 }
996
997 sprint(json.encode(pub_data))
998
999 print("..........",pub_RE_TOPIC)
1000
1001 return g_mq:publish(pub_RE_TOPIC, json.encode(pub_data), 0, 0)
1002
1003 end
1004
1005 Get message in AWS
1006
1007 [[image:image-20220709165402-21.png]]