也就是使用python把串口数据透传到服务器,目前还是取代不了单片机,先做适配,替代单片机是迟早的事,先慢慢熟悉,下一步通过4g模块给单片机升级,isp模式刷单片机程序。
20210810自动重连已经实现;
20210812原理图绘制完成;
开发环境已确认;
20210817,OTA http 升级服务器发送完升级文件,需要关闭客户端,目前全量升级,自定义参数会被擦除
20210827,http get携带参数有问题,群里讨论了几乎一天,没有完全解决,折中解决,踩坑,像极了2017年8266踩坑,2019年合宙踩坑,2020年觉得坑很大,等待了一年,还是有点坑。
# 导入模块
import request
import usocket
import ujson
import log
import utime
import checkNet
import _thread
from machine import Pin
from machine import UART
from misc import Power
from machine import WDT
from machine import Timer
import ntptime
import modem
import sim
import net
timer1 = Timer(Timer.Timer1)
def feed(t):
wdt.feed()
sock = None
uart2 = None
uart0 = None
state = 1
# 下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值,
# 在执行用户代码前,会先打印这两个变量的值。
PROJECT_NAME = "PXW_Socket<=>UART"
PROJECT_VERSION = "1.0.0"
checknet = checkNet.CheckNetwork(PROJECT_NAME,PROJECT_VERSION)
log.basicConfig(level=log.NOTSET) # 设置日志输出级别
pxw_log = log.getLogger("pxw")
FILE_DIR_NAME = '/usr/main1.py'
#定时查询固件
def download():
utime.sleep_ms(50)
DEF_URL = ('http://xxx.xxx.xxx.xxx:12010/?&uid={}&imei={}&iccid={}&csq={}'.format(modem.getDevSN(),modem.getDevImei(),sim.getIccid(),net.csqQueryPoll()))
while True:
stagecode, subcode = checknet.wait_network_connected(30)
if stagecode == 3 and subcode == 1:
while True:
try:
response = request.get(DEF_URL)
pxw_log.info('http net ok!')
except:
utime.sleep(2)
pxw_log.info('http connect failed!')
else:
break
con = response.content
#response.close()
if response.status_code == 200 and con:
f = open(FILE_DIR_NAME,'w')
while True:
try:
c = next(con)
length = len(c)
for i in range(0, length, 4096):
f.write(c[i:i + 4096])
except:
f.close()
response.close()
break;
pxw_log.info('File download successfully')
#Power.powerRestart() # 重启模块
else:
pxw_log.info('no download')
else:
pxw_log.info('connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))
tupe_t = utime.localtime()
pxw_log.info(tupe_t)
utime.sleep(20)
def debug():
global state
global sock
run_mun = 0
while state:
run_mun += 1
pxw_log.info('Print run: {:04d}'.format(run_mun))
utime.sleep(1)
def send_data():
global sock
global uart2
global state
data ="send data\r\n"
while True:
utime.sleep(5)
try:
uart2.write(data.decode())
sock.send("{}".format(data))
except:
break
def socket_read():
global sock
global uart2
global state
while True:
checknet.wait_network_connected()
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建一个Socket实例
while True:
try:
sock.connect(('xxx.xyz',12002)) # 连接平台
except:
utime.sleep(1)
else:
break
sock.setblocking(True)
pxw_log.info('TCP client connect')
while 1:
try:
data = sock.recv(1024)
except:
break
else:
if data != b'':
print("tcp: {}".format(data.decode()))
uart2.write(data.decode())
else:
print("disconnected!")
break
utime.sleep_ms(10)
pxw_log.info('TCP status:{: 04d}'.format(sock.getsocketsta()))
sock.close() # 断开Socket连接
pxw_log.info('TCP Client END')
def uart2_read():
global sock
global uart2
global state
while True:
uart2 = UART(UART.UART2, 115200, 8, 0, 1, 0) # EC600S/EC600N使用
while state:
msglen = uart2.any() # 返回是否有可读取的数据长度
if state == 0:
break
# 当有数据时进行读取
if msglen:
msg = uart2.read(msglen)
utf8_msg = msg.decode()
if "Usart End" in utf8_msg:
state = 0
else:
pxw_log.info('uart2 Recv Data')
pxw_log.info('uart2 Recv: {} Len: {:03d}'.format(utf8_msg, len(utf8_msg)))
try:
sock.send("{}".format(utf8_msg)) # TCP发送json数据
except:
uart2.write(utf8_msg.decode())
else:
utime.sleep_ms(1)
else:
utime.sleep_ms(10)
continue
uart2.close()
pxw_log.info('uart2 END\r\n')
if __name__ == "__main__":
checknet.poweron_print_once()
pxw_log.info('main Init')
gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PU, 0) # EC600S/EC600N使用
gpio11.write(0) # EC600S/EC600N使用
# 查看默认ntp服务
pxw_log.info(ntptime.host)
ntptime.sethost('cn.ntp.org.cn')#设置ntp服务
ntptime.settime()#同步ntp服务时间
_thread.start_new_thread(socket_read, ()) # 创建一个线程
_thread.start_new_thread(uart2_read, ()) # 创建一个线程
_thread.start_new_thread(send_data, ()) # 创建一个线程
_thread.start_new_thread(download, ()) # 创建一个线程
wdt = WDT(20) # 启动看门狗,间隔时长
timer1.start(period=15000, mode=timer1.PERIODIC, callback=feed) # 使用定时器喂狗
pxw_log.info('Init Config OK')
while 1:
if state:
pass
else:
break
pxw_log.info('Main END')
以上代码做个简单透传还是没有问题的,定时更新代码(ota),需要搭建服务器了,需要搭建服务器的可以找我。