ec600串口透传-二次开发

7 篇文章 0 订阅
4 篇文章 0 订阅

也就是使用python把串口数据透传到服务器,目前还是取代不了单片机,先做适配,替代单片机是迟早的事,先慢慢熟悉,下一步通过4g模块给单片机升级,isp模式刷单片机程序。
20210810自动重连已经实现;
20210812原理图绘制完成;
开发环境已确认;
20210817,OTA http 升级服务器发送完升级文件,需要关闭客户端,目前全量升级,自定义参数会被擦除
20210827,http get携带参数有问题,群里讨论了几乎一天,没有完全解决,折中解决,踩坑,像极了2017年8266踩坑,2019年合宙踩坑,2020年觉得坑很大,等待了一年,还是有点坑。
ota

# 导入模块
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),需要搭建服务器了,需要搭建服务器的可以找我。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值