testALiYun.lua 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. --- 模块功能:阿里云功能测试.
  2. -- 支持数据传输和OTA功能
  3. -- @author openLuat
  4. -- @module aLiYun.testALiYun
  5. -- @license MIT
  6. -- @copyright openLuat
  7. -- @release 2018.04.14
  8. module(...,package.seeall)
  9. require"aLiYun"
  10. require"misc"
  11. require"pm"
  12. --三元组信息,根据实际值自行修改
  13. --注意:这里默认的三元组无法连接上阿里云
  14. local PRODUCT_KEY = "yourProductKey"
  15. local DEVICE_NAME = "862991234567890"
  16. local DEVICE_SECRET = "7b0012b7997c62cd985d4913785d02e7"
  17. --企业版实例ID,根据实际值自行修改
  18. --注意:这里实例ID无法连接上阿里云
  19. local INSTANCE_ID = "yourInstanceId"
  20. --[[
  21. 函数名:getDeviceName
  22. 功能 :获取设备名称
  23. 参数 :无
  24. 返回值:设备名称
  25. ]]
  26. local function getDeviceName()
  27. return DEVICE_NAME
  28. end
  29. --[[
  30. 函数名:getDeviceSecret
  31. 功能 :获取设备密钥
  32. 参数 :无
  33. 返回值:设备密钥
  34. ]]
  35. local function getDeviceSecret()
  36. return DEVICE_SECRET
  37. end
  38. --阿里云客户端是否处于连接状态
  39. local sConnected
  40. local publishCnt = 1
  41. --[[
  42. 函数名:pubqos1testackcb
  43. 功能 :发布1条qos为1的消息后收到PUBACK的回调函数
  44. 参数 :
  45. usertag:调用mqttclient:publish时传入的usertag
  46. result:true表示发布成功,false或者nil表示失败
  47. 返回值:无
  48. ]]
  49. local function publishTestCb(result,para)
  50. log.info("testALiYun.publishTestCb",result,para)
  51. sys.timerStart(publishTest,20000)
  52. publishCnt = publishCnt+1
  53. end
  54. --发布一条QOS为1的消息
  55. function publishTest()
  56. if sConnected then
  57. --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
  58. aLiYun.publish("/"..PRODUCT_KEY.."/"..getDeviceName().."/update","qos1data",1,publishTestCb,"publishTest_"..publishCnt)
  59. end
  60. end
  61. ---数据接收的处理函数
  62. -- @string topic,UTF8编码的消息主题
  63. -- @number qos,消息质量等级
  64. -- @string payload,原始编码的消息负载
  65. local function rcvCbFnc(topic,qos,payload)
  66. log.info("testALiYun.rcvCbFnc",topic,qos,payload)
  67. end
  68. --- 连接结果的处理函数
  69. -- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
  70. local function connectCbFnc(result)
  71. log.info("testALiYun.connectCbFnc",result)
  72. sConnected = result
  73. if result then
  74. --订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
  75. --根据自己的项目需要订阅主题,下面注释掉的一行代码中的主题是非法的,所以不能打开,一旦打开,会导致订阅失败
  76. --aLiYun.subscribe({["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
  77. --注册数据接收的处理函数
  78. aLiYun.on("receive",rcvCbFnc)
  79. --PUBLISH消息测试
  80. publishTest()
  81. end
  82. end
  83. aLiYun.on("connect",connectCbFnc)
  84. --setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
  85. --aLiYun.setMqtt(0)
  86. aLiYun.setConnectMode("direct",INSTANCE_ID..".mqtt.iothub.aliyuncs.com",1883)
  87. aLiYun.setup(PRODUCT_KEY,nil,getDeviceName,getDeviceSecret)
  88. --要使用阿里云OTA功能,必须参考本文件124或者126行aLiYun.setup去配置参数
  89. --然后加载阿里云OTA功能模块(打开下面的代码注释)
  90. require"aLiYunOta"
  91. --如果利用阿里云OTA功能去下载升级合宙模块的新固件,默认的固件版本号格式为:_G.PROJECT.."_".._G.VERSION.."_"..sys.getcorever(),下载结束后,直接重启,则到此为止,不需要再看下文说明
  92. --如果下载升级合宙模块的新固件,下载结束后,自己控制是否重启
  93. --如果利用阿里云OTA功能去下载其他升级包,例如模块外接的MCU升级包,则根据实际情况,打开下面的代码注释,调用设置接口进行配置和处理
  94. --设置MCU当前运行的固件版本号
  95. --aLiYunOta.setVer("MCU_VERSION_1.0.0")
  96. --设置新固件下载后保存的文件名
  97. --aLiYunOta.setName("MCU_FIRMWARE.bin")
  98. --[[
  99. 函数名:otaCb
  100. 功能 :新固件文件下载结束后的回调函数
  101. 通过uart1(115200,8,uart.PAR_NONE,uart.STOP_1)把下载成功的文件,发送到MCU,发送成功后,删除此文件
  102. 参数 :
  103. result:下载结果,true为成功,false为失败
  104. filePath:新固件文件保存的完整路径,只有result为true时,此参数才有意义
  105. 返回值:无
  106. ]]
  107. local function otaCb(result,filePath)
  108. log.info("testALiYun.otaCb",result,filePath)
  109. if result then
  110. local uartID = 1
  111. sys.taskInit(
  112. function()
  113. local fileHandle = io.open(filePath,"rb")
  114. if not fileHandle then
  115. log.error("testALiYun.otaCb open file error")
  116. if filePath then os.remove(filePath) end
  117. return
  118. end
  119. pm.wake("UART_SENT2MCU")
  120. uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
  121. uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
  122. while true do
  123. local data = fileHandle:read(1460)
  124. if not data then break end
  125. uart.write(uartID,data)
  126. sys.waitUntil("UART_SENT2MCU_OK")
  127. end
  128. --此处上报新固件版本号(仅供测试使用)
  129. --用户开发自己的程序时,根据下载下来的新固件,执行升级动作
  130. --升级成功后,调用aLiYunOta.setVer上报新固件版本号
  131. --如果升级失败,调用aLiYunOta.setVer上报旧固件版本号
  132. aLiYunOta.setVer("MCU_VERSION_1.0.1")
  133. uart.close(uartID)
  134. pm.sleep("UART_SENT2MCU")
  135. fileHandle:close()
  136. if filePath then os.remove(filePath) end
  137. end
  138. )
  139. else
  140. --文件使用完之后,如果以后不再需求,需要自行删除
  141. if filePath then os.remove(filePath) end
  142. end
  143. end
  144. --设置新固件下载结果的回调函数
  145. --aLiYunOta.setCb(otaCb)