Wiki source code of 2 Script

Version 13.1 by Leo Wei on 2022/07/09 17:41

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