chenyc
2024-11-15 ce5e351b48a0a8bb666a579324586caeba8eba8a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# coding=utf-8
 
from driver import GPIO
import network
import ujson
import utime as time
import modem
import _thread
from  aliyunIoT import Device
import ota
import kv
 
ICCID=None
g_connect_status = False
net = None
device = None
deviceSecret = None
deviceName = None
import app_uart
productKey = ""
productSecret = ""
device_dyn_resigter_succed = False
#是否iot已连接
iot_connected=False
# 定义需要升级的模块和版本号
module_name = 'default'
default_ver = '2.0.5'
# 定义升级包的下载和安装路径,其中url,hash_type和hash 会通过服务端推送被保存下来
 
info = {
    'url': '',
    'store_path': '/data/pyamp/app.zip',
    'install_path': '/data/pyamp/',
    'length': 0,
    'hash_type': '',
    'hash': ''
}
 
 # ota 消息推送的接受函数
def on_trigger(data):
    global info
# 保存服务端推送的ota信息
    info['url'] = data['url']
    info['length'] = data['length']
    info['module_name'] = data['module_name']
    info['version'] = data['version']
    info['hash'] = data['hash']
    info['hash_type'] = data['hash_type']
# 开始ota 包下载
    dl_data = {}
    dl_data['url'] = info['url']
    dl_data['store_path'] = info['store_path']
    ota.download(dl_data)
 
 
 
 # ota 升级包下载结果回调函数
def on_download(data):
    global info
    if data >= 0:
        print('Ota download succeed')
    # 开始ota包校验
        param = {}
        param['length'] = info['length']
        param['store_path'] = info['store_path']
        param['hash_type'] = info['hash_type']
        param['hash'] = info['hash']
        ota.verify(param)
 
 # ota 升级包校验结果回调函数
def on_verify(data):
    global info
    print(data)
    if data >= 0 :
        print('Ota verify succeed')
        print('Start Upgrade')
    # 开始ota升级
        param = {}
        param['length'] = info['length']
        param['store_path'] = info['store_path']
        param['install_path'] = info['install_path']
        ota.upgrade(param)
 
 # ota 升级包结果回调函数
def on_upgrade(data):
     if data >= 0 :
        print('Ota succeed')
        #ota升完级后 重启设备
        reboot()
 
#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
    global  module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade,iot_connected
    print('***** connect lp succeed****')
    print('物联网链接成功')
    #联网成功在打印版本信息
    _thread.start_new_thread(masgDefault_ver,(3,))
    iot_connected=True
    data_handle = {}
    data_handle['device_handle'] = device.getDeviceHandle()
 # 初始化ota服务
    ota.init(data_handle)
 # ota 回调函数注册
    ota.on(1,on_trigger)
    ota.on(2,on_download)
    ota.on(3,on_verify)
    ota.on(4,on_upgrade)
    report_info = {
         "device_handle": data_handle['device_handle'],
         "product_key": productKey ,
         "device_name": deviceName ,
         "module_name": module_name ,
         "version": default_ver
         }
 # 上报本机ota相关信息,上报版本信息返回以后程序返回,知道后台推送ota升级包,才会调用on_trigger函数
    ota.report(report_info)   
#当连接断开时,触发'disconnect'事件
def on_disconnect():
    print('linkkit is disconnected')
 
#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
    params=request['params']
    print('clound req data is {}'.format(params))
    data_all=eval(params)
    if(data_all['key']==1):
        app_uart.sund_key()
    # print('clound req data is {}'.format(request))
 
#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):
    print('clound req id  is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):
    print('err msg is {} '.format(err))
 
#网络连接的回调函数
def on_4g_cb(args):
     global g_connect_status
     pdp = args[0]
     netwk_sta = args[1]
     if netwk_sta == 1:
         g_connect_status = True
     else:
         g_connect_status = False
 
#网络连接
def connect_network():
     global net,on_4g_cb,g_connect_status
     #NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.
     net = network.NetWorkClient()
     g_register_network = False
     if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:
         g_register_network = True
     else:
         g_register_network = False
     if g_register_network:
    #注册网络连接的回调函数on(self,id,func);  1代表连接,func 回调函数  ;return 0 成功
         net.on(1,on_4g_cb)    
         net.connect(None)
     else:
         print('网络注册失败')
     while True:
         if g_connect_status:
             print('网络连接成功')
             break
         time.sleep_ms(20)
 
#动态注册回调函数
def on_dynreg_cb(data):
     global deviceSecret,device_dyn_resigter_succed
     deviceSecret = data
     device_dyn_resigter_succed = True
 
 
 # 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):
    global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succed
    key = '_amp_customer_devicesecret'
    deviceSecretdict = kv.get(key)
    print("deviceSecretdict:",deviceSecretdict)
    if isinstance(deviceSecretdict,str):    
        deviceSecret = deviceSecretdict 
 
    if deviceSecretdict is None or deviceSecret is None:
        key_info = {
            'productKey': productKey  ,
            'productSecret': productSecret ,
            'deviceName': deviceName
            }
        # 动态注册一个设备,获取设备的deviceSecret
        #下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,
        if not device_dyn_resigter_succed:
            device.register(key_info,on_dynreg_cb)   
 
 
def iotInit(device_name,product_key,product_secret):
    global g_connect_status,device,deviceSecret,deviceName,productKey,productSecret,device
    deviceName=device_name
    productSecret=product_secret
    productKey=product_key
    #初始化物联网平台Device类,获取device实例
    device = Device()
    #链接参数
    key_info = {
        'region' : 'cn-shanghai' ,
        'productKey': productKey ,
        'deviceName': deviceName ,
        'deviceSecret': productSecret ,
        'keepaliveSec': 60,
    }
    #device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数
    device.on(device.ON_CONNECT,on_connect)
    device.on(device.ON_DISCONNECT,on_disconnect)
    device.on(device.ON_PROPS,on_props)
    device.on(device.ON_SERVICE,on_service)
    device.on(device.ON_ERROR,on_error)
    print('准备链接iot平台。。。')
    device.connect(key_info)
#透传
def sudDataIot(usertestdata ):
    if iot_connected:
        postdata={'param':usertestdata}
        ret = device.postRaw(postdata)
        if ret == 0 :
            print('RAW数据上报成功')
        else :
            print('RAW数据上报失败')
# 物模型上传
def sudDataPostProps(usertestdata ):
    if iot_connected:
        tem_hum_str=ujson.dumps(usertestdata)
        data={
            'params':tem_hum_str
        }
        device.postProps(data)
def get_mqtt_connect_flag():
    global iot_connected
    return iot_connected
def masgDefault_ver(id): 
    while True:
        print('当前App版本号:' + default_ver)
        print('等待Ota升级包.....')
        print('--------------------------------------------------------------------')
        time.sleep(30)