)
:STEP1
-..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 914400 -i .\images\customer_fs.bin
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 716800 -i .\images\customer_fs.bin
if errorlevel 1 (
echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ316K!!!!!!!!!!!!!!!"
goto exit
project = "D10"
platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分
-# platform = ""#格物平台 不用的话选择空
+# platform = "D10"#格物平台 不用的话选择空
+# platform = "D15"#格物平台 不用的话选择空
# model = "G10W_DT_YBX_"
import ujson
import voiceCall
from misc import Power
-from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,close_led_green,close_led_white
+from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white
from machine import RTC
from queue import Queue
import _thread
self.pwkey_press = 0
self.led_state = 0
self.hsensorTest_timer = osTimer()
+ self.factoryTest_timer = osTimer()
+ self.factoryTest_count = 0
+ self.factory_timesec = 0
+ self.factoryTest_led_count = 0
+ self.factoryTest_flag = 0
self.btnInfo_queue = Queue()
_thread.stack_size(10*1024+192)
_thread.start_new_thread(self.btnInfo_queue_thread, ())
self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})
+
+ def close_factory_test(self):#关闭老化测试
+ if self.factoryTest_flag == 1:
+ self.factoryTest_flag = 0
+ close_led_white()
+ close_led_red()
+ close_led_green()
+ self.factoryTest_led_count = 0
+ self.factoryTest_count = 0
+ self.aud.stopPlayStream()
+ self.factoryTest_timer.stop()
+
+ def factoryTest_timer_cb(self,e):
+ # self.factoryTest_count+=1
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+
+ if time_tmp - self.factory_timesec > 60*60*2:#老化测试2小时自动退出
+ # self.factoryTest_count = 0
+ self.close_factory_test()
+ return
+ #播放音频
+ str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+ if EventMesh.publish("get_audio_state") == 0:
+ self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+ #led灯常亮
+ self.factoryTest_led_count+=1
+ if self.factoryTest_led_count == 1:#1 4 7 10
+ open_led_red()
+ close_led_green()
+ close_led_white()
+ elif self.factoryTest_led_count == 2:
+ open_led_green()
+ close_led_red()
+ close_led_white()
+ elif self.factoryTest_led_count == 3: #3 6 9 12
+ open_led_white()
+ close_led_red()
+ close_led_green()
+ if self.factoryTest_led_count >= 3+1:
+ self.factoryTest_led_count = 0
+
+
+
+
+ pass
def sosKey_timeout_cb(self, data):#
open_power = EventMesh.publish("get_power_on_state")#获取开机标识
open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
self.sosKey_long_press = 0
self.sosKey_press_count = 0
return
+ factory_count = EventMesh.publish("get_factory_test_time")
+ print("factory_count:%d",factory_count)
+ try :
+ if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
+ #EventMesh.debug_log("boot_count:{}".format(boot_count))
+ if self.sosKey_press_count >= 15:
+ self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ self.factory_timesec = time_tmp
+ self.sosKey_press_count = 0
+ self.factoryTest_led_count = 0
+ self.factoryTest_flag = 1
+ return
+
+ except Exception as e:
+ usys.print_exception(e)
+
# EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
pass
elif self.sosKey_press_count == 6:#
self.sosKey_press_count = 0
+ self.close_factory_test()
pass
elif self.sosKey_press_count == 5:#功能暂时屏蔽
self.sosKey_press_count = 0
from Gsensor import SC7A20
NEW_ENABLE = 0 #1代表旧的按键功能定义 0代表新的按键功能定义
if EventMesh.model == "D15" :
- from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,close_led_green,close_led_white
+ from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,open_led_white,close_led_red,open_led_green,close_led_green,close_led_white
motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)
self.pwkey_press = 0
self.led_state = 0
self.hsensorTest_timer = osTimer()
+ self.factoryTest_timer = osTimer()
+ self.factoryTest_count = 0
+ self.factoryTest_led_count = 0
+ self.factoryTest_flag = 0
+ self.factory_timesec = 0
self.btnInfo_queue = Queue()
_thread.stack_size(10*1024+192)
_thread.start_new_thread(self.btnInfo_queue_thread, ())
# 3、短按三下,发起视频通话(默认第一个)
# 4、短按六次,播报IMEI号
# 5、短按十次,解绑APP,同时恢复出厂设置
+ def close_factory_test(self):#关闭老化测试
+ if self.factoryTest_flag == 1:
+ self.factoryTest_flag = 0
+ close_led_white()
+ close_led_red()
+ close_led_green()
+ self.factoryTest_led_count = 0
+ self.aud.stopPlayStream()
+ self.factoryTest_timer.stop()
+ EventMesh.publish("close_motor_infor")
+
+ def factoryTest_timer_cb(self,e):
+ # self.factoryTest_count+=1
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ # print("time_tmp - self.factory_timesec :%d time_tmp:%d self.factory_timesec %d\r\n",time_tmp - self.factory_timesec,time_tmp,self.factory_timesec)
+ if time_tmp - self.factory_timesec > 60*60*2:
+ # if self.factoryTest_count > 60*60*2:#老化测试2小时自动退出
+ # self.factoryTest_count = 0
+ self.close_factory_test()
+ return
+ #播放音频
+ str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+ if EventMesh.publish("get_audio_state") == 0:
+ self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+ #led灯常亮
+ self.factoryTest_led_count+=1
+ if self.factoryTest_led_count == 1:#1 4 7 10
+ open_led_red()
+ close_led_green()
+ close_led_white()
+ elif self.factoryTest_led_count == 2:
+ open_led_green()
+ close_led_red()
+ close_led_white()
+ elif self.factoryTest_led_count == 3: #3 6 9 12
+ open_led_white()
+ close_led_red()
+ close_led_green()
+ if self.factoryTest_led_count >= 3+1:
+ self.factoryTest_led_count = 0
+
+ EventMesh.publish("set_motor_time",[1,2,10*1,10,5])#设置马达参数
+
def sosKey_timeout_cb(self, data):#
# print("sosKey_timeout_cb",self.sosKey_press_count)
open_power = EventMesh.publish("get_power_on_state")#获取开机标识
self.sosKey_long_press = 0
self.sosKey_press_count = 0
return
+ factory_count = EventMesh.publish("get_factory_test_time")
+ print("factory_count:%d",factory_count)
+ try :
+ if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
+ #EventMesh.debug_log("boot_count:{}".format(boot_count))
+ if self.sosKey_press_count >= 15:
+ self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
+ self.sosKey_press_count = 0
+ self.factoryTest_led_count = 0
+ self.factoryTest_flag = 1
+ date_tmp = utime.localtime()
+ time_tmp = utime.mktime(date_tmp)
+ self.factory_timesec = time_tmp
+ return
+
+ except Exception as e:
+ usys.print_exception(e)
+
if NEW_ENABLE == 1:#旧的按键定义
# EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
flag = EventMesh.publish("get_call_state")#获取通话状态
fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
- if self.sosKey_press_count > 1:#短按十次解绑app
+ if self.sosKey_press_count > 1:#
if fall_down != None:
if fall_down != 0 or flag != 0:
self.sosKey_press_count = 0
pass
elif self.sosKey_press_count == 6:#
self.sosKey_press_count = 0
+ self.close_factory_test()
pass
elif self.sosKey_press_count == 5:#功能暂时屏蔽
self.sosKey_press_count = 0
pass
elif self.sosKey_press_count == 6:#播报IMEI号
self.sosKey_press_count = 0
+ self.close_factory_test()
EventMesh.publish("stop_led_timer")#设置参数
EventMesh.publish("play_imei_event")#播報imei号
pass
_thread.start_new_thread(self.DeviceInfo_queue_thread, ())
_thread.stack_size(8*1024)
self.boot_time_count = 0
+ self.factory_test_time = 0
EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
self.key = ""
self.imei = ""
EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
+ EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
EventMesh.subscribe("get_dev_state", self.get_dev_state)
EventMesh.subscribe("set_dev_state", self.set_dev_state)
def get_boot_time_count(self, event, msg):
return self.boot_time_count
+ def get_factory_test_time(self, event, msg):
+ return self.factory_test_time
+
def get_dev_state(self, event, msg):
return self.dev_state
def set_dev_state(self, event, msg):
self.dev_state = msg
def publish_event_cb(self, *args, **kwargs):
- if self.boot_time_count < 50000000:
- self.boot_time_count += 10
+
+ open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+ if open_power != None:
+ if open_power == 1:
+ if self.boot_time_count < 50000000:
+ self.boot_time_count += 10
+ if self.factory_test_time < 300:
+ self.factory_test_time+=10
#EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})
def optimize_temp(self,temp):
_thread.start_new_thread(self.DeviceInfo_queue_thread, ())
_thread.stack_size(8*1024)
self.boot_time_count = 0
+ self.factory_test_time = 0
EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
self.key = ""
self.imei = ""
EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
+ EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
EventMesh.subscribe("get_dev_state", self.get_dev_state)
EventMesh.subscribe("set_dev_state", self.set_dev_state)
def get_boot_time_count(self, event, msg):
return self.boot_time_count
+ def get_factory_test_time(self, event, msg):
+ return self.factory_test_time
+
def get_dev_state(self, event, msg):
return self.dev_state
def set_dev_state(self, event, msg):
self.dev_state = msg
def publish_event_cb(self, *args, **kwargs):
- if self.boot_time_count < 50000000:
- self.boot_time_count += 10
+ open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+ if open_power != None:
+ if open_power == 1:
+ if self.boot_time_count < 50000000:
+ self.boot_time_count += 10
+
+ if self.factory_test_time < 300:
+ self.factory_test_time+=10
#EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})
def optimize_temp(self,temp):
Client_id = "{}|{}|0|1|0".format(deviceId,productKey) #
# print(Client_id)
- server = "dmp-mqtt.cuiot.cn"
- port = 1883
+ server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn"
+ port = 8883
# {deviceKey}|{productKey} mqttUsername
userName = "{}|{}".format(deviceKey,productKey)
userpassword = checkpassword
# print(userpassword)
# client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09")
# client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242")
- client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False)
+ client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True)
# client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
# 设置消息回调
client.set_callback(mqttsub_cb)
checkpassword = get_hmac_sha256(deviceSecret,data)
print(checkpassword)
# {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式
- Client_id = "{}|{}|0|0|0".format(deviceId,productKey) #
- server = "dmp-mqtt.cuiot.cn"
- port = 1883
+ Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0
+ server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn"
+ port = 8883
# {deviceKey}|{productKey} mqttUsername
userName = "{}|{}".format(deviceKey,productKey)
userpassword = checkpassword
- client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False)
+ client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True)
# client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
# 设置消息回调
client.set_callback(mqttsub_cb)
import camera
import jrtc
-jrtc.init()
-jrtc.config_server("119.3.54.56:1050")
-jrtc.config("e99697f86096a74dbf635096", "us144a", "1234567890abcdef", "")
-jrtc.open("us145c", "",[],[15,120,240,320])
+# jrtc.init()
+# jrtc.config_server("119.3.54.56:1050")
+# jrtc.config("e99697f86096a74dbf635096", "us144a", "1234567890abcdef", "")
+# jrtc.open("us145c", "",[],[15,120,240,320])
# jrtc.init()
# jrtc.config_server("119.3.54.56:1050")
# jrtc.config("e99697f86096a74dbf635096", "us145a", "1234567890abcdef", "")
# jrtc.open("us144a", "",[],[15,129,128,128])
-jrtc.set_cam_angle(jrtc.CAM_ROTATE_180)
+# jrtc.set_cam_angle(jrtc.CAM_ROTATE_180)
+
+'''
+@Author: Baron
+@Date: 2020-04-24
+@LastEditTime: 2020-04-24 17:06:08
+@Description: example for module umqtt
+@FilePath: example_mqtt_file.py
+'''
+# from umqtt import MQTTClient
+# import utime
+# import log
+# import checkNet
+# import uhashlib
+# import hmac
+# import ubinascii
+# import base64
+# import ujson
+# SHA1 = uhashlib.sha256
+# '''
+# 下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值
+# '''
+# PROJECT_NAME = "QuecPython_MQTT_example"
+# PROJECT_VERSION = "1.0.0"
+
+# checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
+
+# # 设置日志输出级别
+# log.basicConfig(level=log.INFO)
+# mqtt_log = log.getLogger("MQTT")
+
+# state = 0
+
+# def sub_cb(topic, msg):
+# global state
+# mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode()))
+# jsload_data = ujson.loads(msg.decode())
+# if "code" in jsload_data:
+# code = int(jsload_data["code"])
+# if code == 0:#合法设备 发送成功数据
+# mqtt_log.info("publish ok Recv!!!!")
+
+# state = 1
+# class gewu_conn_client:
+
+# def __init__(self, host_name: str, port: int,deviceId:str,deviceKey:str,productKey:str,deviceSecret:str):
+# self.host_name = host_name
+# self.port = port
+# self.deviceId = deviceId
+# self.deviceKey = deviceKey
+# self.productKey = productKey
+# self.deviceSecret = deviceSecret
+# pass
+# def HMAC(self,k, m):
+# SHA1_BLOCK_SIZE = 256
+# KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k)))
+# KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+# KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+# inner_message = KEY_INNER + m
+# outer_message = KEY_OUTER + SHA1(inner_message).digest()
+# return SHA1(outer_message)
+
+
+# def get_hmac_sha1(self,k, m):
+# data = self.HMAC(k, m).digest()
+# print("HMAC(k, m).digest():", data)
+# print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+# hex_data = ubinascii.hexlify(data)
+# hex_data = hex_data.decode('ascii')
+# return hex_data
+
+# def __get_auth(self) ->dict:
+# time = utime.localtime()#本地时间戳
+# t = utime.mktime(time)
+
+# string = "{}|{}|{}".format(self.deviceId,self.deviceKey,self.productKey)
+
+
+# md5_str = uhashlib.md5(string)
+# res = md5_str.digest()
+# # 转成十六进制表示
+# MD5_head = ubinascii.hexlify(res)#
+# MD5_head = MD5_head.decode('ascii')
+# # print("uri!!",MD5_head)
+# signature = self.get_hmac_sha1(self.deviceSecret, MD5_head)#对api_key进行再加密
+# print("signature:%s",signature)
+
+# if __name__ == '__main__':
+
+# def HMAC(k, m):
+# SHA1_BLOCK_SIZE = 64
+# KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k)))
+# KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+# KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+# inner_message = KEY_INNER + m
+# outer_message = KEY_OUTER + SHA1(inner_message).digest()
+# return SHA1(outer_message)
+
+
+# def get_hmac_sha1(k, m):
+# data = HMAC(k, m).digest()
+# print("HMAC(k, m).digest():", data)
+# print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+# hex_data = ubinascii.hexlify(data)
+# hex_data = hex_data.decode('ascii')
+# return hex_data
+
+# # def hmac_sha256(key, data):
+# # return uhmac.new(key.encode('utf-8'), data.encode('utf-8'), uhashlib.sha256).hexdigest()
+
+
+# # import hashlib
+# # 需要加密的数据
+# data = "{}{}{}".format("DD86000000001","DD86000000001","cu1r1rjjrjdhz0lx")
+# # data = b"The data to encrypt"
+# # 密钥
+# secret_key = b"93FEEC6D16D30E2B90FE0DBC2FFCDB14"
+
+
+# signature = get_hmac_sha1(secret_key,data)
+# print(signature)
+# # 创建一个mqtt实例
+# c = MQTTClient("DD86000000001|cu1r1rjjrjdhz0lx|0|0|0", "dmp-mqtt.cuiot.cn", 1883, "DD86000000001|cu1r1rjjrjdhz0lx","{}".format(signature))
+# # 设置消息回调
+# c.set_callback(sub_cb)
+# #建立连接
+# connect_state = c.connect()
+# print(connect_state)
+# # 订阅主题
+# if connect_state == 0:#连接成功mqtt
+
+# c.subscribe(b"$sys/cu1r1rjjrjdhz0lx/DD86000000001/property/batch_reply",0)#订阅消息主题
+# print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+# # 发布消息
+# data = {
+# "messageId":"54691",
+# "params": {
+# "data": [
+# {
+# "key":"deviceOffOn",
+# "value": {
+# "deviceStatus":"2",
+# "updateTime":"1711962300000",
+# "Imei":"860132060346475"
+# },
+
+# },
+# {
+# "key":"HeartRate",
+# "value":{
+# "heartRate":70,
+# "updateTme":"1711962300000",
+# "Imei":"860132060346475"
+# }
+# },
+# {
+# "key":"geoLocation",
+# "value":{
+# "longitude": 118.763334,
+# "latitude": 32.0175,
+# "altitude": 3.9
+# },
+# },
+# {
+# "key":"powerSavingMode",
+# "value":20
+# }
+
+# ]
+# }
+# }
+# data_json = ujson.dumps(data)
+# c.publish(b"$sys/cu1r1rjjrjdhz0lx/DD86000000001/event/batch",data_json)#publis主题内容
+# print("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython")
+
+# while True:
+# c.wait_msg() # 阻塞函数,监听消息
+# if state == 1:
+# break
+# else:
+# c.disconnect()
+
+
+ # c = MqttClient("DD86000000001|cu1r1rjjrjdhz0lx|0|0|0", "dmp-mqtt.cuiot.cn", 1883, "DD86000000001|cu1r1rjjrjdhz0lx","4d616b40ca8ed4e823221c6d0ee0f04ad20170096e10206dadcebeb6b31713db")
+
+import utime
+import log
+import net
+import _thread
+import checkNet
+import ujson
+import dataCall
+from umqtt import MQTTClient
+import utime
+import log
+import uhashlib
+import ubinascii
+import base64
+import ujson
+SHA256 = uhashlib.sha256
+PROJECT_NAME = "QuecPython_MQTT_example"
+PROJECT_VERSION = "1.0.0"
+
+checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
+
+# 调用disconnect后会通过该状态回收线程资源
+TaskEnable = True
+# 设置日志输出级别
+log.basicConfig(level=log.INFO)
+mqtt_log = log.getLogger("MQTT")
+
+
+# 封装mqtt,使其可以支持更多自定义逻辑
+class MqttClient():
+ '''
+ mqtt init
+ '''
+
+ # 说明:reconn该参数用于控制使用或关闭umqtt内部的重连机制,默认为True,使用内部重连机制。
+ # 如需测试或使用外部重连机制可参考此示例代码,测试前需将reconn=False,否则默认会使用内部重连机制!
+ def __init__(self, clientid, server, port, user=None, password=None, keepalive=0, ssl=False, ssl_params={},
+ reconn=False):
+ self.__clientid = clientid
+ self.__pw = password
+ self.__server = server
+ self.__port = port
+ self.__uasename = user
+ self.__keepalive = keepalive
+ self.__ssl = ssl
+ self.__ssl_params = ssl_params
+ self.topic = None
+ self.qos = None
+ # 网络状态标志
+ self.__nw_flag = True
+ # 创建互斥锁
+ self.mp_lock = _thread.allocate_lock()
+ # 创建类的时候初始化出mqtt对象
+ self.client = MQTTClient(self.__clientid, self.__server, self.__port, self.__uasename, self.__pw,
+ keepalive=self.__keepalive, ssl=self.__ssl, ssl_params=self.__ssl_params,
+ reconn=reconn)
+
+ def connect(self):
+ '''
+ 连接mqtt Server
+ '''
+ self.client.connect()
+ # 注册网络回调函数,网络状态发生变化时触发
+ flag = dataCall.setCallback(self.nw_cb)
+ if flag != 0:
+ # 回调注册失败
+ raise Exception("Network callback registration failed")
+
+ def set_callback(self, sub_cb):
+ '''
+ 设置mqtt回调消息函数
+ '''
+ self.client.set_callback(sub_cb)
+
+ def error_register_cb(self, func):
+ '''
+ 注册一个接收umqtt内线程异常的回调函数
+ '''
+ self.client.error_register_cb(func)
+
+ def subscribe(self, topic, qos=0):
+ '''
+ 订阅Topic
+ '''
+ self.topic = topic # 保存topic ,多个topic可使用list保存
+ self.qos = qos # 保存qos
+ self.client.subscribe(topic, qos)
+
+ def publish(self, topic, msg, qos=0):
+ '''
+ 发布消息
+ '''
+ self.client.publish(topic, msg, qos)
+
+ def disconnect(self):
+ '''
+ 关闭连接
+ '''
+ global TaskEnable
+ # 关闭wait_msg的监听线程
+ TaskEnable = False
+ # 关闭之前的连接,释放资源
+ self.client.disconnect()
+
+ def reconnect(self):
+ '''
+ mqtt 重连机制(该示例仅提供mqtt重连参考,根据实际情况调整)
+ PS:1.如有其他业务需要在mqtt重连后重新开启,请先考虑是否需要释放之前业务上的资源再进行业务重启
+ 2.该部分需要自己根据实际业务逻辑添加,此示例只包含mqtt重连后重新订阅Topic
+ '''
+ # 判断锁是否已经被获取
+ if self.mp_lock.locked():
+ return
+ self.mp_lock.acquire()
+ # 重新连接前关闭之前的连接,释放资源(注意区别disconnect方法,close只释放socket资源,disconnect包含mqtt线程等资源)
+ self.client.close()
+ # 重新建立mqtt连接
+ while True:
+ net_sta = net.getState() # 获取网络注册信息
+ if net_sta != -1 and net_sta[1][0] == 1:
+ call_state = dataCall.getInfo(1, 0) # 获取拨号信息
+ if (call_state != -1) and (call_state[2][0] == 1):
+ try:
+ # 网络正常,重新连接mqtt
+ self.connect()
+ except Exception as e:
+ # 重连mqtt失败, 5s继续尝试下一次
+ self.client.close()
+ utime.sleep(5)
+ continue
+ else:
+ # 网络未恢复,等待恢复
+ utime.sleep(10)
+ continue
+ # 重新连接mqtt成功,订阅Topic
+ try:
+ # 多个topic采用list保存,遍历list重新订阅
+ if self.topic is not None:
+ self.client.subscribe(self.topic, self.qos)
+ self.mp_lock.release()
+ except:
+ # 订阅失败,重新执行重连逻辑
+ self.client.close()
+ utime.sleep(5)
+ continue
+ else:
+ utime.sleep(5)
+ continue
+ break # 结束循环
+ # 退出重连
+ return True
+
+ def nw_cb(self, args):
+ '''
+ dataCall 网络回调
+ '''
+ nw_sta = args[1]
+ if nw_sta == 1:
+ # 网络连接
+ mqtt_log.info("*** network connected! ***")
+ self.__nw_flag = True
+ else:
+ # 网络断线
+ mqtt_log.info("*** network not connected! ***")
+ self.__nw_flag = False
+
+ def __listen(self):
+ while True:
+ try:
+ if not TaskEnable:
+ break
+ self.client.wait_msg()
+ except OSError as e:
+ # 判断网络是否断线
+ if not self.__nw_flag:
+ # 网络断线等待恢复进行重连
+ self.reconnect()
+ # 在socket状态异常情况下进行重连
+ elif self.client.get_mqttsta() != 0 and TaskEnable:
+ self.reconnect()
+ else:
+ # 这里可选择使用raise主动抛出异常或者返回-1
+ return -1
+
+ def loop_forever(self):
+ _thread.start_new_thread(self.__listen, ())
+
+
+
+if __name__ == '__main__':
+ '''
+ 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时,
+ 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息
+ '''
+ utime.sleep(5)
+ checknet.poweron_print_once()
+ '''
+ 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功);
+ 如果是网络无关代码,可以屏蔽 wait_network_connected()
+ 【本例程必须保留下面这一行!】
+ '''
+ checknet.wait_network_connected()
+
+ def sub_cb(topic, msg):
+ # global state
+ mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode()))
+
+ # c = MqttClient("umqtt_client_753", "mq.tongxinmao.com", 18830, reconn=False)
+
+ def err_cb(error):
+ '''
+ 接收umqtt线程内异常的回调函数
+ '''
+ mqtt_log.info(error)
+ c.reconnect() # 可根据异常进行重连
+
+ def HMAC(k, m):
+ SHA1_BLOCK_SIZE = 64
+ KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k)))
+ KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+ KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+ inner_message = KEY_INNER + m
+ outer_message = KEY_OUTER + SHA256(inner_message).digest()
+ return SHA256(outer_message)
+
+
+ def get_hmac_sha256(k, m):
+ data = HMAC(k, m).digest()
+ print("HMAC(k, m).digest():", data)
+ print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+ hex_data = ubinascii.hexlify(data)
+ hex_data = hex_data.decode('ascii')
+ return hex_data
+
+
+ # 需要加密的数据
+ data = "{}{}{}".format("lxRXQayZ4poQz8G","lxRXQayZ4poQz8G","cujg06l29iav591b")
+ # data = b"The data to encrypt"
+ # 密钥
+ secret_key = b"6766A891EAAC855F62C05608CDA8E083"
+
+
+ checkpassword = get_hmac_sha256(secret_key,data)
+ print(checkpassword)
+ # 创建一个mqtt实例
+#
+ # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息
+ # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId
+ deviceId = "lxRXQayZ4poQz8G"
+ deviceKey = "lxRXQayZ4poQz8G"
+ productKey = "cujg06l29iav591b"
+ # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式
+ Client_id = "{}|{}|0|0|0".format(deviceId,productKey)
+ server = "dmp-mqtt.cuiot.cn"
+ port = 1883
+ # {deviceKey}|{productKey} mqttUsername
+ userName = "{}|{}".format(deviceKey,productKey)
+ userpassword = checkpassword
+ c = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
+ # 设置消息回调
+ c.set_callback(sub_cb)
+ # 设置异常回调
+ c.error_register_cb(err_cb)
+ # 建立连接
+ c.connect()
+ # 订阅主题
+ c.subscribe(b"$sys/cujg06l29iav591b/lxRXQayZ4poQz8G/property/batch_reply",0)#订阅消息主题
+ mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic")
+ # 发布消息
+ # UnicodeHexStr_To_Utf8Str(str_data)
+ data_info = {
+ "messageId":"0",
+ "params": {
+ "data": [
+ {
+ "key":"deviceOffOn",
+ "value": {
+ "deviceStatus":"Poweron",
+ "updateTime":"1711962300000",
+ "Imei":"860132060346475"
+ }
+
+ },
+ {
+ "key":"HeartRate",
+ "value":{
+ "heartRate":98,
+ "updateTme":"1711962300000",
+ "Imei":"860132060346475"
+ }
+ },
+ {
+ "key":"geoLocation",
+ "value":{
+ "longitude": 118.763334,
+ "latitude": 32.0175,
+ "altitude": 3.87
+ }
+ },
+ {
+ "key":"powerSavingMode",
+ "value":0
+ },
+ {
+ "key":"IMEI",
+ "value":"860132060346475"
+ },
+ {
+ "key":"DEVICE_TIME",
+ "value":"1712049829"
+ },
+ {
+ "key":"MANUFACTURER",
+ "value":"fengda"
+ },
+ {
+ "key":"REMAINING_POWER",
+ "value":60
+ },
+ {
+ "key":"DeviceState",
+ "value":"online"
+ }
+ ]
+ }
+ }
+
+ data_json = ujson.dumps(data_info)
+ print("data_json:{}",data_json)
+ c.publish(b"$sys/cujg06l29iav591b/lxRXQayZ4poQz8G/property/batch",data_json)#publis主题内容
+
+ mqtt_log.info("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+ # 监听mqtt消息
+ # c.loop_forever()
+ # 等待5s接收消息
+ # PS:如果需要测试重连,包括服务器断开连接等情况,请注释掉c.disconnect()和utime.sleep(5)
+ # utime.sleep(5)
+ # # 关闭连接
+ # c.disconnect()
+
+
+
+
-print("jrtc closed !!!!...")
Version="V1.0"
-Build_Time="2024-01-02 11:48:13"
+Build_Time="2024-04-24 17:47:35"
#define MICROPY_QPY_MODULE_VFS_THREADSAFE (1)
#if CONFIG_MBEDTLS
- #define MICROPY_QPY_MODULE_USSL (0)
+ #define MICROPY_QPY_MODULE_USSL (1)
#define MICROPY_QPY_SSL_MBEDTLS (1)
#endif
#ifndef __APP_LINK_START_ADDR_H__
#define __APP_LINK_START_ADDR_H__
-#define APP_LINK_START_ADDR 0x80520000
-#define APP_FLASH_MAX_SIZE 0x190000
+#define APP_LINK_START_ADDR 0x80521000
+#define APP_FLASH_MAX_SIZE 0x1BA800
#define APP_RAM_START 0x7E3E0000
#define APP_RAM_MAX_SIZE 0x180000