main.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. PROJECT = "aliyundemo"
  2. VERSION = "1.0.0"
  3. local sys = require "sys"
  4. require "aliyun"
  5. --根据自己的服务器修改以下参数
  6. tPara = {
  7. Registration = true, --是否是预注册 已预注册为false true or false,
  8. DeviceName = "861551056421746", --设备名称
  9. ProductKey = "ht6f7kmyFFQ", --产品key
  10. ProductSecret = "dAmJgeQyBe57AkGM", --产品secret
  11. DeviceSecret = "", --设备secret
  12. InstanceId = "iot-06z00bm5n8dzc26", --如果没有注册需要填写实例id,在实例详情页面
  13. --新版已经合并, 没有了地域, 1883同时兼容加密和非加密通信,非加密会下线 阿里云资料:https://help.aliyun.com/document_detail/147356.htm?spm=a2c4g.73742.0.0.4782214ch6jkXb#section-rtu-6kn-kru
  14. mqtt_port = 1883, --mqtt端口
  15. mqtt_isssl = true, --是否使用ssl加密连接,true为无证书最简单的加密
  16. }
  17. -- 统一联网函数
  18. sys.taskInit(function()
  19. local device_id = mcu.unique_id():toHex()
  20. -----------------------------
  21. -- 统一联网函数, 可自行删减
  22. ----------------------------
  23. if wlan and wlan.connect then
  24. -- wifi 联网, ESP32系列均支持
  25. local ssid = "luatos1234"
  26. local password = "12341234"
  27. log.info("wifi", ssid, password)
  28. -- TODO 改成自动配网
  29. -- LED = gpio.setup(12, 0, gpio.PULLUP)
  30. wlan.init()
  31. wlan.setMode(wlan.STATION) -- 默认也是这个模式,不调用也可以
  32. device_id = wlan.getMac()
  33. wlan.connect(ssid, password, 1)
  34. elseif mobile then
  35. -- Air780E/Air600E系列
  36. --mobile.simid(2) -- 自动切换SIM卡
  37. -- LED = gpio.setup(27, 0, gpio.PULLUP)
  38. device_id = mobile.imei()
  39. elseif w5500 then
  40. -- w5500 以太网, 当前仅Air105支持
  41. w5500.init(spi.HSPI_0, 24000000, pin.PC14, pin.PC01, pin.PC00)
  42. w5500.config() --默认是DHCP模式
  43. w5500.bind(socket.ETH0)
  44. -- LED = gpio.setup(62, 0, gpio.PULLUP)
  45. elseif socket or mqtt then
  46. -- 适配的socket库也OK
  47. -- 没有其他操作, 单纯给个注释说明
  48. else
  49. -- 其他不认识的bsp, 循环提示一下吧
  50. while 1 do
  51. sys.wait(1000)
  52. log.info("bsp", "本bsp可能未适配网络层, 请查证")
  53. end
  54. end
  55. -- 默认都等到联网成功
  56. sys.waitUntil("IP_READY")
  57. sys.publish("net_ready", device_id)
  58. end)
  59. --阿里云客户端是否处于连接状态
  60. local sConnected
  61. local publishCnt = 1
  62. --[[
  63. 函数名:pubqos1testackcb
  64. 功能 :发布1条qos为1的消息后收到PUBACK的回调函数
  65. 参数 :
  66. usertag:调用mqttclient:publish时传入的usertag
  67. result:任意数字表示发布成功,nil表示失败
  68. 返回值:无
  69. ]]
  70. local function publishTestCb(result,para)
  71. log.info("testALiYun.publishTestCb",result,para)
  72. sys.timerStart(publishTest,20000)
  73. publishCnt = publishCnt+1
  74. end
  75. --发布一条QOS为1的消息
  76. function publishTest()
  77. if sConnected then
  78. --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
  79. -- aliyun.publish(topic,qos,payload,cbFnc,cbPara)
  80. aliyun.publish("/"..tPara.ProductKey.."/"..tPara.DeviceName.."/user/get",1,"LUATOS_CESHI",publishTestCb,"publishTest_"..publishCnt)
  81. end
  82. end
  83. ---数据接收的处理函数
  84. -- @string topic,UTF8编码的消息主题
  85. -- @string payload,原始编码的消息负载
  86. local function rcvCbFnc(topic,payload,qos)
  87. log.info("testALiYun.rcvCbFnc",topic,payload)
  88. end
  89. --- 连接结果的处理函数
  90. -- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
  91. local function connectCbFnc(result)
  92. log.info("testALiYun.connectCbFnc",result)
  93. sConnected = result
  94. if result then
  95. --订阅主题
  96. --根据自己的项目需要订阅主题,下面注释掉的一行代码中的主题是非法的,所以不能打开,一旦打开,会导致订阅失败
  97. -- aliyun.subscribe(topic,qos)
  98. -- aliyun.subscribe("/"..tPara.ProductKey.."/"..tPara.DeviceName.."/user/ceshi",1)
  99. --使用掉电不消失的kv文件区来储存的deviceSecret,deviceToken
  100. local used = fskv.get("deviceSecret")
  101. local total = fskv.get("deviceToken")
  102. local cid = fskv.get("clientid")
  103. --储存到kv分区的返回值
  104. -- log.info("kv分区的返回值",used,total,cid)
  105. local Secret = aliyun.getDeviceSecret()
  106. local Token = aliyun.getDeviceToken()
  107. local Clid = aliyun.getClientid()
  108. if not tPara.Registration then
  109. if Secret == nil then
  110. log.info("掉电重连")
  111. else
  112. fskv.set("deviceSecret",aliyun.getDeviceSecret())
  113. end
  114. else
  115. if Token == nil and Clid == nil then
  116. log.info("掉电重连")
  117. else
  118. fskv.set("deviceToken",aliyun.getDeviceToken())
  119. fskv.set("clientid",aliyun.getClientid())
  120. end
  121. end
  122. --注册数据接收的处理函数
  123. aliyun.on("receive",rcvCbFnc)
  124. --PUBLISH消息测试
  125. publishTest()
  126. end
  127. end
  128. aliyun.on("connect",connectCbFnc)
  129. --根据掉电不消失的kv文件区来储存的deviceSecret,clientid,deviceToken来判断是进行正常连接还是掉电重连
  130. sys.taskInit(function()
  131. sys.waitUntil("IP_READY")
  132. socket.sntp()
  133. sys.wait(500)
  134. log.info("已联网", "开始初始化aliyun库")
  135. fskv.init()
  136. fskv.set("DeviceName",tPara.DeviceName)
  137. local name = fskv.get("DeviceName")
  138. local used = fskv.get("deviceSecret")
  139. local total = fskv.get("deviceToken")
  140. local cid = fskv.get("clientid")
  141. local host = tPara.InstanceId..".mqtt.iothub.aliyuncs.com"
  142. --判断是否是同一DeviceName,不是的话就重新连接
  143. if name == tPara.DeviceName then
  144. -- fskv.del("deviceSecret")
  145. if not tPara.Registration then
  146. if used == nil then
  147. aliyun.setup(tPara)
  148. else
  149. aliyun.clientGetDirectDataTask(name,tPara.ProductKey,host,tPara.mqtt_port,tPara.mqtt_isssl,tPara.Registration,used,total,cid)
  150. end
  151. else
  152. if total == nil and cid == nil then
  153. aliyun.setup(tPara)
  154. else
  155. aliyun.clientGetDirectDataTask(name,tPara.ProductKey,host,tPara.mqtt_port,tPara.mqtt_isssl,tPara.Registration,used,total,cid)
  156. end
  157. end
  158. else
  159. fskv.del("deviceToken")
  160. fskv.del("clientid")
  161. fskv.del("DeviceName")
  162. fskv.del("deviceSecret")
  163. --删除kv区的数据,重新建立连接
  164. aliyun.setup(tPara)
  165. end
  166. end)
  167. -- 用户代码已结束---------------------------------------------
  168. -- 结尾总是这一句
  169. sys.run()
  170. -- sys.run()之后后面不要加任何语句!!!!!